@riverbankcms/sdk 0.77.0 → 0.78.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 (237) hide show
  1. package/README.md +69 -0
  2. package/dist/{PreviewEditorSidebar-XSX7QKHQ.mjs → PreviewEditorSidebar-RIKFQ72L.mjs} +4916 -4847
  3. package/dist/{PreviewEditorUI-YZNEZ3QD.mjs → PreviewEditorUI-XO7TUWKK.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-LAGYMPNF.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +194 -184
  6. package/dist/_dts/api/src/accessAdmin.d.ts +5 -0
  7. package/dist/_dts/api/src/billing.d.ts +3 -26
  8. package/dist/_dts/api/src/bookingVerticals.d.ts +4 -0
  9. package/dist/_dts/api/src/content-editor.d.ts +1 -0
  10. package/dist/_dts/api/src/demoDashboardMutationSurfaces.d.ts +46 -0
  11. package/dist/_dts/api/src/endpoints.d.ts +8 -0
  12. package/dist/_dts/api/src/index.d.ts +14 -2
  13. package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +87 -0
  14. package/dist/_dts/api/src/navigation/dashboardDemoNav.d.ts +5 -0
  15. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +45 -0
  16. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +42 -0
  17. package/dist/_dts/api/src/navigation/dashboardTeamMemberNav.d.ts +24 -0
  18. package/dist/_dts/api/src/navigation/linkUrlType.d.ts +3 -0
  19. package/dist/_dts/api/src/navigation.d.ts +12 -0
  20. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +55 -26
  21. package/dist/_dts/api/src/staffAccess.d.ts +79 -0
  22. package/dist/_dts/api/src/types.d.ts +3 -1
  23. package/dist/_dts/api/src/workflows/automaticWorkflowTriggers.d.ts +21 -0
  24. package/dist/_dts/blocks/src/client/site-chrome.d.ts +4 -1
  25. package/dist/_dts/blocks/src/customBlockRegistry.d.ts +20 -1
  26. package/dist/_dts/blocks/src/index.d.ts +3 -2
  27. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  28. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  29. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  30. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  32. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +2 -2
  33. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +294 -289
  34. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  35. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  36. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +21 -21
  37. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  38. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  39. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  40. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +2 -2
  41. package/dist/_dts/blocks/src/system/data/index.d.ts +5 -3
  42. package/dist/_dts/blocks/src/system/data/previewResolvedDataState.d.ts +45 -0
  43. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +2 -1
  44. package/dist/_dts/blocks/src/system/fragments/library/faqAccordion.d.ts +5 -0
  45. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +5 -0
  46. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +29 -29
  47. package/dist/_dts/blocks/src/system/node/fragments/headingDecoration.d.ts +10 -0
  48. package/dist/_dts/blocks/src/system/node/fragments/index.d.ts +1 -0
  49. package/dist/_dts/blocks/src/system/node/fragments/styledSection.d.ts +9 -0
  50. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +3 -2
  51. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +8 -0
  52. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  53. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +43 -8
  54. package/dist/_dts/blocks/src/system/runtime/components/multi-step/runtimeFormValidation.d.ts +28 -0
  55. package/dist/_dts/blocks/src/system/runtime/header/shared.d.ts +8 -7
  56. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventCompactRow.d.ts +1 -4
  57. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +7 -0
  58. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.client.d.ts +2 -8
  59. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.server.d.ts +2 -9
  60. package/dist/_dts/blocks/src/system/runtime/nodes/shop-cart-discount-ui.d.ts +5 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout-form.d.ts +76 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout.state.d.ts +1 -4
  63. package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce-store.d.ts +2 -0
  64. package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce.shared.d.ts +1 -0
  65. package/dist/_dts/blocks/src/system/runtime/nodes/shop-discount-apply.state.d.ts +52 -0
  66. package/dist/_dts/blocks/src/system/runtime/nodes/shop.state.d.ts +2 -4
  67. package/dist/_dts/blocks/src/system/runtime/nodes/useDiscountApply.d.ts +21 -0
  68. package/dist/_dts/blocks/src/system/runtime/shared/components/DiscountCodeDisclosure.d.ts +54 -0
  69. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -0
  70. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  71. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +4 -4
  72. package/dist/_dts/blocks/src/system/transforms/registry/ui.d.ts +1 -1
  73. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +1 -1
  74. package/dist/_dts/content-editor/src/contentTypeEditorContentState.d.ts +26 -0
  75. package/dist/_dts/content-editor/src/definitions/factory.d.ts +75 -0
  76. package/dist/_dts/content-editor/src/entryWorkflows.d.ts +2 -0
  77. package/dist/_dts/content-editor/src/footerBlocksEditorState.d.ts +76 -0
  78. package/dist/_dts/content-editor/src/index.d.ts +5 -0
  79. package/dist/_dts/content-editor/src/pageWorkflowContent.d.ts +29 -0
  80. package/dist/_dts/content-model/src/content-types/schema.d.ts +3 -3
  81. package/dist/_dts/content-model/src/index.d.ts +1 -0
  82. package/dist/_dts/content-model/src/routeTemplate.d.ts +4 -0
  83. package/dist/_dts/content-model/src/templates/editorState.d.ts +25 -0
  84. package/dist/_dts/core/src/csv-cells.d.ts +10 -0
  85. package/dist/_dts/core/src/csv-date-filter.d.ts +27 -0
  86. package/dist/_dts/core/src/csv-escape.d.ts +1 -0
  87. package/dist/_dts/core/src/csv-filename.d.ts +18 -0
  88. package/dist/_dts/core/src/csv-render.d.ts +4 -0
  89. package/dist/_dts/core/src/csv-types.d.ts +116 -0
  90. package/dist/_dts/core/src/currency-format.d.ts +4 -0
  91. package/dist/_dts/core/src/demo-capability-policy.d.ts +29 -0
  92. package/dist/_dts/core/src/demo-claim-access.d.ts +14 -0
  93. package/dist/_dts/core/src/demo-lifecycle-status.d.ts +11 -0
  94. package/dist/_dts/core/src/demo-runtime.d.ts +47 -0
  95. package/dist/_dts/core/src/duration.d.ts +14 -0
  96. package/dist/_dts/core/src/email-format.d.ts +10 -0
  97. package/dist/_dts/core/src/field-errors.d.ts +1 -0
  98. package/dist/_dts/core/src/form-submission-preview.d.ts +24 -0
  99. package/dist/_dts/core/src/index.d.ts +20 -0
  100. package/dist/_dts/core/src/number-input.d.ts +22 -0
  101. package/dist/_dts/core/src/public-url-validation.d.ts +12 -0
  102. package/dist/_dts/core/src/slug.d.ts +39 -0
  103. package/dist/_dts/core/src/string.d.ts +19 -0
  104. package/dist/_dts/core/src/uuid.d.ts +6 -0
  105. package/dist/_dts/db/src/schemas/forms.d.ts +50 -50
  106. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +34 -0
  107. package/dist/_dts/media-core/src/bulkDeletePlanning.d.ts +24 -0
  108. package/dist/_dts/media-core/src/canonicalCropReview.d.ts +66 -0
  109. package/dist/_dts/media-core/src/classifyAllPlanning.d.ts +48 -0
  110. package/dist/_dts/media-core/src/filename.d.ts +1 -0
  111. package/dist/_dts/media-core/src/index.d.ts +10 -0
  112. package/dist/_dts/media-core/src/mediaAssetUsageStatus.d.ts +47 -0
  113. package/dist/_dts/media-core/src/mediaSettingsState.d.ts +3 -0
  114. package/dist/_dts/media-core/src/portableMediaReferences.d.ts +38 -0
  115. package/dist/_dts/media-core/src/uploadVerificationContract.d.ts +28 -0
  116. package/dist/_dts/media-core/src/videoAssetRepair.d.ts +38 -0
  117. package/dist/_dts/media-editor/src/mediaEditorDebug.d.ts +1 -0
  118. package/dist/_dts/path-utils/src/index.d.ts +8 -0
  119. package/dist/_dts/path-utils/src/redirectPaths.d.ts +26 -0
  120. package/dist/_dts/path-utils/src/safeAppPath.d.ts +26 -0
  121. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +2 -1
  122. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -0
  123. package/dist/_dts/preview-next/src/client/preview/previewDocumentFrame.d.ts +31 -0
  124. package/dist/_dts/sdk/src/client/error.d.ts +3 -0
  125. package/dist/_dts/sdk/src/client/index.d.ts +2 -2
  126. package/dist/_dts/sdk/src/client/types.d.ts +37 -19
  127. package/dist/_dts/sdk/src/contracts/theme.d.ts +1 -1
  128. package/dist/_dts/sdk/src/index.d.ts +2 -2
  129. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +16 -16
  130. package/dist/_dts/sdk/src/next/content-load-failure.d.ts +51 -0
  131. package/dist/_dts/sdk/src/next/index.d.ts +2 -1
  132. package/dist/_dts/sdk/src/next/types.d.ts +19 -0
  133. package/dist/_dts/sdk/src/portal/redirects.d.ts +1 -1
  134. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +2 -2
  135. package/dist/_dts/sdk/src/routing/index.d.ts +3 -2
  136. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +71 -6
  137. package/dist/_dts/sdk/src/version.d.ts +1 -1
  138. package/dist/_dts/site-commands/src/commands.d.ts +12 -12
  139. package/dist/_dts/site-commands/src/index.d.ts +1 -0
  140. package/dist/_dts/site-commands/src/pagePaths.d.ts +6 -0
  141. package/dist/_dts/theme-core/src/accordions/siteStyleDefaults.d.ts +26 -0
  142. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -0
  143. package/dist/_dts/theme-core/src/blocks/vars/index.d.ts +1 -0
  144. package/dist/_dts/theme-core/src/fonts/index.d.ts +1 -0
  145. package/dist/_dts/theme-core/src/fonts/uploadFormat.d.ts +44 -0
  146. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  147. package/dist/_dts/theme-core/src/index.d.ts +3 -1
  148. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +63 -51
  149. package/dist/_dts/theme-core/src/navigation/generateNavLinkCSS.d.ts +6 -1
  150. package/dist/_dts/theme-core/src/navigation/types.d.ts +12 -0
  151. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +3 -3
  152. package/dist/_dts/theme-core/src/runtime/themeCssVarNames.d.ts +7 -0
  153. package/dist/_dts/theme-core/src/schema.d.ts +90 -48
  154. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +214 -34
  155. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +5 -2
  156. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +214 -34
  157. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +25 -1
  158. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +35 -7
  159. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -4
  160. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +96 -34
  161. package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +4 -2
  162. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +9 -1
  163. package/dist/_dts/theme-core/src/site-styles/types.d.ts +27 -2
  164. package/dist/_dts/theme-core/src/siteChrome.d.ts +17 -34
  165. package/dist/_dts/theme-core/src/siteChromeOverlayClearance.d.ts +22 -0
  166. package/dist/_dts/theme-core/src/siteChromePlacement.d.ts +22 -0
  167. package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +32 -0
  168. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -2
  169. package/dist/{chunk-EAWHBECW.mjs → chunk-F7RTCZYN.mjs} +229 -50
  170. package/dist/{chunk-GSQX43EZ.mjs → chunk-NIDXI46P.mjs} +22 -41
  171. package/dist/{chunk-WLQBJN2Z.mjs → chunk-OECWLDHN.mjs} +4538 -1911
  172. package/dist/{chunk-VX7B5VAC.mjs → chunk-SVMMM2NA.mjs} +8 -0
  173. package/dist/{chunk-6SMUFTXD.mjs → chunk-SXOLGNMX.mjs} +1 -1
  174. package/dist/{chunk-ANKDYZ2E.mjs → chunk-TXDES5P2.mjs} +2 -2
  175. package/dist/cli/index.mjs +2036 -594
  176. package/dist/client/{accordion-RZMQSYLR.mjs → accordion-EVDEOUPR.mjs} +2 -2
  177. package/dist/client/{bookingForm-NF4ASVNV.mjs → bookingForm-DIHBLC64.mjs} +27 -30
  178. package/dist/client/bookings.mjs +3707 -259
  179. package/dist/client/{carousel-LDX47ZIK.mjs → carousel-FEBQHIWI.mjs} +3 -4
  180. package/dist/client/{cart-RGXDS5F4.mjs → cart-7CKSXAE4.mjs} +8 -8
  181. package/dist/client/{checkout-P7WWSNNY.mjs → checkout-WKYCANLV.mjs} +8 -8
  182. package/dist/client/{chunk-JNC7CGHX.mjs → chunk-2SAVKN2M.mjs} +2 -2
  183. package/dist/client/{chunk-TQ5MSPDX.mjs → chunk-36WJCERQ.mjs} +1 -1
  184. package/dist/client/{chunk-R56FQ3RR.mjs → chunk-65F47D7Y.mjs} +280 -71
  185. package/dist/client/{chunk-L3DNHIJX.mjs → chunk-GUK2FPXQ.mjs} +23 -45
  186. package/dist/client/{chunk-PMAIXMAB.mjs → chunk-IVNCUVAV.mjs} +26 -21
  187. package/dist/client/{chunk-II7O4XN3.mjs → chunk-OFMSCGNY.mjs} +2 -2
  188. package/dist/client/chunk-PD6NBCEY.mjs +66 -0
  189. package/dist/client/{chunk-GMVTOKYG.mjs → chunk-RV6FX7UH.mjs} +510 -64
  190. package/dist/client/{chunk-E2TDNXCL.mjs → chunk-RZDWX7QW.mjs} +2 -1
  191. package/dist/client/{chunk-M3L3KYYR.mjs → chunk-UDNSI5PY.mjs} +12 -0
  192. package/dist/client/{chunk-JEZECJ3W.mjs → chunk-VPPMNXCF.mjs} +129 -3
  193. package/dist/client/{chunk-UFSWADAO.mjs → chunk-YDSEG6GZ.mjs} +5 -66
  194. package/dist/client/client.mjs +8983 -6152
  195. package/dist/client/{courseRegistration-7F65K5ZR.mjs → courseRegistration-5QF2PHKM.mjs} +14 -11
  196. package/dist/client/{eventCalendar-GLSC5KTL.mjs → eventCalendar-4ZOSETDU.mjs} +9 -9
  197. package/dist/client/{eventCombined-ZHK4WKUR.mjs → eventCombined-WQGU7JUX.mjs} +9 -9
  198. package/dist/client/{eventDetails-E3PJYBIN.mjs → eventDetails-AYWVUJ5Y.mjs} +9 -9
  199. package/dist/client/{eventListing-EMS3WC3E.mjs → eventListing-NT7C6UT5.mjs} +9 -9
  200. package/dist/client/{eventRegistration-NZOTVNPI.mjs → eventRegistration-OH24F4ZJ.mjs} +9 -9
  201. package/dist/client/{form-ETFZFATW.mjs → form-7L42SRBB.mjs} +6 -6
  202. package/dist/client/{headerSection-4LBP7ULT.mjs → headerSection-OZRZNZ52.mjs} +3 -3
  203. package/dist/client/hooks.mjs +1388 -427
  204. package/dist/client/{locationMap-5M655YSJ.mjs → locationMap-ZBXRPQ7C.mjs} +2 -2
  205. package/dist/client/{newsletterForm-QOUYW44O.mjs → newsletterForm-SNAGFF2I.mjs} +3 -3
  206. package/dist/client/{productDetail-O4DOCWQG.mjs → productDetail-I46BOFGV.mjs} +8 -8
  207. package/dist/client/{productList-A5RO5WIS.mjs → productList-BOYHTYI6.mjs} +8 -8
  208. package/dist/client/rendering/client.mjs +7090 -2645
  209. package/dist/client/rendering/islands.mjs +19 -19
  210. package/dist/client/rendering.mjs +7395 -4767
  211. package/dist/client/{shop-L4MZH4I2.mjs → shop-XTXPZTKR.mjs} +8 -8
  212. package/dist/preview-next/before-render.mjs +8 -0
  213. package/dist/preview-next/client/runtime.mjs +5 -5
  214. package/dist/preview-next/editor-chrome.css +10 -0
  215. package/dist/preview-next/middleware.mjs +8 -0
  216. package/dist/{sdk-runtime-Q6MTR4KL.mjs → sdk-runtime-ZJLKC6DR.mjs} +6 -6
  217. package/dist/server/components.mjs +4175 -2480
  218. package/dist/server/config-validation.mjs +1619 -658
  219. package/dist/server/config.mjs +1619 -658
  220. package/dist/server/data.mjs +1388 -427
  221. package/dist/server/index.mjs +488 -246
  222. package/dist/server/next.mjs +5607 -3354
  223. package/dist/server/page-converter.mjs +912 -259
  224. package/dist/server/prebuild.mjs +1 -1
  225. package/dist/server/rendering/server.mjs +4176 -2481
  226. package/dist/server/rendering.mjs +4194 -2486
  227. package/dist/server/routing.mjs +2078 -639
  228. package/dist/server/server.mjs +1886 -685
  229. package/dist/server/theme-bridge.mjs +4441 -1300
  230. package/dist/server/theme.mjs +89 -12
  231. package/dist/styles/index.css +1576 -1083
  232. package/package.json +2 -1
  233. package/dist/SdkPreviewModeRuntime-5FS5E6BI.mjs +0 -8
  234. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/DiscountCodeSection.d.ts +0 -7
  235. package/dist/_dts/preview-next/src/client/widgets/PreviewMediaField.d.ts +0 -4
  236. package/dist/client/chunk-OJPZEZU2.mjs +0 -31
  237. package/dist/client/chunk-RTZ3JKKX.mjs +0 -178
@@ -44,7 +44,7 @@ function fallbackBinding(...sources) {
44
44
  }
45
45
 
46
46
  // src/config/validation.ts
47
- import { z as z69 } from "zod";
47
+ import { z as z70 } from "zod";
48
48
 
49
49
  // ../api/src/apiEndpointTypes.ts
50
50
  function blockedDemoMutationPolicy(classification, publicMessage) {
@@ -3948,6 +3948,14 @@ var ENDPOINT_DEFINITIONS = {
3948
3948
  responseKind: "json",
3949
3949
  errors: []
3950
3950
  },
3951
+ applyDiscountCode: {
3952
+ path: "/public/sites/{siteId}/bookings/discounts/apply",
3953
+ method: "POST",
3954
+ tags: ["site-{siteId}", "booking-discounts"],
3955
+ auth: "public",
3956
+ responseKind: "json",
3957
+ errors: ["validation:invalid_input", "rate_limit:exceeded"]
3958
+ },
3951
3959
  // Batch endpoint for block loader requests (reduces SSR fan-out)
3952
3960
  batchBlockLoaders: {
3953
3961
  path: "/public/sites/{siteId}/block-loaders/batch",
@@ -6287,6 +6295,27 @@ var ENDPOINT_DEFINITIONS = {
6287
6295
  }
6288
6296
  };
6289
6297
 
6298
+ // ../core/src/location.ts
6299
+ function normalizeLocationAddressText(value) {
6300
+ if (typeof value !== "string") {
6301
+ return null;
6302
+ }
6303
+ const trimmed = value.trim();
6304
+ return trimmed ? trimmed : null;
6305
+ }
6306
+ function hasLocationCoordinates(value) {
6307
+ return typeof value?.lat === "number" && typeof value?.lng === "number";
6308
+ }
6309
+ function toLocationCoordinates(value) {
6310
+ if (!hasLocationCoordinates(value)) {
6311
+ return null;
6312
+ }
6313
+ return {
6314
+ lat: value.lat,
6315
+ lng: value.lng
6316
+ };
6317
+ }
6318
+
6290
6319
  // ../api/src/accessAdmin.ts
6291
6320
  import { z } from "zod";
6292
6321
  var managedDomainAddOnPricingSnapshotSchema = z.object({
@@ -6429,27 +6458,6 @@ function formatKeyAsLabel(key) {
6429
6458
  // ../blocks/src/system/manifest/schema.ts
6430
6459
  import { z as z4 } from "zod";
6431
6460
 
6432
- // ../core/src/location.ts
6433
- function normalizeLocationAddressText(value) {
6434
- if (typeof value !== "string") {
6435
- return null;
6436
- }
6437
- const trimmed = value.trim();
6438
- return trimmed ? trimmed : null;
6439
- }
6440
- function hasLocationCoordinates(value) {
6441
- return typeof value?.lat === "number" && typeof value?.lng === "number";
6442
- }
6443
- function toLocationCoordinates(value) {
6444
- if (!hasLocationCoordinates(value)) {
6445
- return null;
6446
- }
6447
- return {
6448
- lat: value.lat,
6449
- lng: value.lng
6450
- };
6451
- }
6452
-
6453
6461
  // ../media-core/src/transformRect.ts
6454
6462
  function isValidTransformRectStructure(rect) {
6455
6463
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -7574,6 +7582,9 @@ function makeBoundaryId(previousBlockId, nextBlockId) {
7574
7582
  const next = encodeURIComponent(nextBlockId);
7575
7583
  return asDesignBoundaryId(`boundary:${previous}:${next}`);
7576
7584
  }
7585
+ function assertNever(value, message = "Unhandled Theme V2 variant") {
7586
+ throw new Error(`${message}: ${String(value)}`);
7587
+ }
7577
7588
  function brandNonEmptyString(value, label) {
7578
7589
  if (value.length === 0) {
7579
7590
  throw new Error(`${label} must be a non-empty string.`);
@@ -7601,6 +7612,10 @@ var tileTreatmentValues = [
7601
7612
  "quiet",
7602
7613
  "brand-depth"
7603
7614
  ];
7615
+ var eventListTreatmentValues = [
7616
+ "plain",
7617
+ "lined-panel"
7618
+ ];
7604
7619
  var eyebrowTreatmentValues = [
7605
7620
  "plain",
7606
7621
  "pill",
@@ -7658,6 +7673,7 @@ function defineBlockDesignCapability(capability) {
7658
7673
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7659
7674
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7660
7675
  tileTreatments: capability.tileTreatments ?? ["default"],
7676
+ eventListTreatments: capability.eventListTreatments ?? ["plain"],
7661
7677
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
7662
7678
  ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
7663
7679
  ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
@@ -7682,9 +7698,98 @@ var blockAppearancePresets = [
7682
7698
  transitionAfter: "soft-fade-short",
7683
7699
  emphasis: "high",
7684
7700
  sectionHeight: "hero",
7701
+ heroComposition: "center",
7702
+ heroTypographyScale: "display",
7685
7703
  imageSurfaceTreatment: { kind: "neutral-wash" }
7686
7704
  }
7687
7705
  }),
7706
+ defineBlockAppearancePreset({
7707
+ kind: "block-design",
7708
+ id: "hero-bottom-left-panel",
7709
+ target: "hero",
7710
+ label: "Bottom-left panel hero",
7711
+ blockKinds: ["block.hero"],
7712
+ constraints: {
7713
+ layoutFamilies: ["centered", "compact"]
7714
+ },
7715
+ optionGroups: [
7716
+ {
7717
+ id: "image-surface-treatment",
7718
+ label: "Treatment",
7719
+ selectedOptionId: "neutral-scrim",
7720
+ options: [
7721
+ {
7722
+ id: "neutral-scrim",
7723
+ label: "Neutral scrim",
7724
+ designPatch: {
7725
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7726
+ }
7727
+ },
7728
+ {
7729
+ id: "brand-scrim-primary",
7730
+ label: "Brand scrim",
7731
+ designPatch: {
7732
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "balanced" }
7733
+ }
7734
+ }
7735
+ ]
7736
+ }
7737
+ ],
7738
+ layoutPatches: [
7739
+ {
7740
+ constraints: {
7741
+ layoutVariantKeys: ["micro"]
7742
+ },
7743
+ designPatch: {
7744
+ sectionHeight: "banner",
7745
+ heroTypographyScale: "editorial"
7746
+ }
7747
+ }
7748
+ ],
7749
+ design: {
7750
+ sectionSurface: "hero-image",
7751
+ contentFrame: panelFrame("raised"),
7752
+ itemSurface: "none",
7753
+ transitionAfter: "soft-fade-short",
7754
+ emphasis: "high",
7755
+ sectionHeight: "immersive",
7756
+ heroComposition: "bottom-left",
7757
+ heroTypographyScale: "display",
7758
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7759
+ }
7760
+ }),
7761
+ defineBlockAppearancePreset({
7762
+ kind: "block-design",
7763
+ id: "hero-poster-image",
7764
+ target: "hero",
7765
+ label: "Poster image hero",
7766
+ blockKinds: ["block.hero"],
7767
+ constraints: {
7768
+ layoutFamilies: ["centered", "compact"]
7769
+ },
7770
+ layoutPatches: [
7771
+ {
7772
+ constraints: {
7773
+ layoutVariantKeys: ["micro"]
7774
+ },
7775
+ designPatch: {
7776
+ sectionHeight: "banner",
7777
+ heroTypographyScale: "display"
7778
+ }
7779
+ }
7780
+ ],
7781
+ design: {
7782
+ sectionSurface: "hero-image",
7783
+ contentFrame: plainFrame,
7784
+ itemSurface: "none",
7785
+ transitionAfter: "soft-fade-short",
7786
+ emphasis: "high",
7787
+ sectionHeight: "immersive",
7788
+ heroComposition: "center",
7789
+ heroTypographyScale: "poster",
7790
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "strong" }
7791
+ }
7792
+ }),
7688
7793
  defineBlockAppearancePreset({
7689
7794
  kind: "block-design",
7690
7795
  id: "hero-brand-scrim",
@@ -7734,6 +7839,8 @@ var blockAppearancePresets = [
7734
7839
  transitionAfter: "soft-fade-short",
7735
7840
  emphasis: "high",
7736
7841
  sectionHeight: "immersive",
7842
+ heroComposition: "center",
7843
+ heroTypographyScale: "display",
7737
7844
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7738
7845
  }
7739
7846
  }),
@@ -7786,6 +7893,8 @@ var blockAppearancePresets = [
7786
7893
  transitionAfter: "soft-fade-short",
7787
7894
  emphasis: "high",
7788
7895
  sectionHeight: "immersive",
7896
+ heroComposition: "center",
7897
+ heroTypographyScale: "display",
7789
7898
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7790
7899
  imageSurfaceMotion: "fixed-frame",
7791
7900
  eyebrowTreatment: "accent-pill-bounce"
@@ -7806,6 +7915,8 @@ var blockAppearancePresets = [
7806
7915
  itemSurface: "none",
7807
7916
  transitionAfter: "soft-fade-short",
7808
7917
  emphasis: "high",
7918
+ heroComposition: "center",
7919
+ heroTypographyScale: "editorial",
7809
7920
  eyebrowTreatment: "accent-pill-bounce"
7810
7921
  }
7811
7922
  }),
@@ -7820,7 +7931,82 @@ var blockAppearancePresets = [
7820
7931
  contentFrame: panelFrame("inset"),
7821
7932
  itemSurface: "none",
7822
7933
  transitionAfter: "none",
7823
- emphasis: "high"
7934
+ emphasis: "high",
7935
+ heroComposition: "center",
7936
+ heroTypographyScale: "editorial"
7937
+ }
7938
+ }),
7939
+ defineBlockAppearancePreset({
7940
+ kind: "block-design",
7941
+ id: "hero-split-editorial",
7942
+ target: "hero",
7943
+ label: "Editorial split hero",
7944
+ blockKinds: ["block.hero"],
7945
+ constraints: {
7946
+ layoutFamilies: ["split"]
7947
+ },
7948
+ design: {
7949
+ sectionSurface: "base",
7950
+ contentFrame: plainFrame,
7951
+ itemSurface: "none",
7952
+ transitionAfter: "soft-fade-short",
7953
+ emphasis: "high",
7954
+ heroTypographyScale: "editorial"
7955
+ }
7956
+ }),
7957
+ defineBlockAppearancePreset({
7958
+ kind: "block-design",
7959
+ id: "hero-split-brand",
7960
+ target: "hero",
7961
+ label: "Brand split hero",
7962
+ blockKinds: ["block.hero"],
7963
+ constraints: {
7964
+ layoutFamilies: ["split"]
7965
+ },
7966
+ design: {
7967
+ sectionSurface: "brand-depth-band",
7968
+ contentFrame: plainFrame,
7969
+ itemSurface: "none",
7970
+ transitionAfter: "soft-fade-short",
7971
+ emphasis: "high",
7972
+ heroTypographyScale: "display",
7973
+ eyebrowTreatment: "accent-pill-bounce"
7974
+ }
7975
+ }),
7976
+ defineBlockAppearancePreset({
7977
+ kind: "block-design",
7978
+ id: "hero-split-soft-panel",
7979
+ target: "hero",
7980
+ label: "Soft panel split hero",
7981
+ blockKinds: ["block.hero"],
7982
+ constraints: {
7983
+ layoutFamilies: ["split"]
7984
+ },
7985
+ design: {
7986
+ sectionSurface: "muted-band",
7987
+ contentFrame: panelFrame("raised"),
7988
+ itemSurface: "none",
7989
+ transitionAfter: "soft-fade-short",
7990
+ emphasis: "high",
7991
+ heroTypographyScale: "editorial"
7992
+ }
7993
+ }),
7994
+ defineBlockAppearancePreset({
7995
+ kind: "block-design",
7996
+ id: "hero-split-accent",
7997
+ target: "hero",
7998
+ label: "Accent split hero",
7999
+ blockKinds: ["block.hero"],
8000
+ constraints: {
8001
+ layoutFamilies: ["split"]
8002
+ },
8003
+ design: {
8004
+ sectionSurface: "accent-band",
8005
+ contentFrame: panelFrame("raised"),
8006
+ itemSurface: "none",
8007
+ transitionAfter: "soft-fade-short",
8008
+ emphasis: "high",
8009
+ heroTypographyScale: "display"
7824
8010
  }
7825
8011
  }),
7826
8012
  defineBlockAppearancePreset({
@@ -7853,9 +8039,9 @@ var blockAppearancePresets = [
7853
8039
  }),
7854
8040
  defineBlockAppearancePreset({
7855
8041
  kind: "block-design",
7856
- id: "intro-soft-earth-statement",
8042
+ id: "intro-organic-statement",
7857
8043
  target: "intro",
7858
- label: "Soft Earth intro statement",
8044
+ label: "Organic intro statement",
7859
8045
  blockKinds: ["block.intro"],
7860
8046
  design: {
7861
8047
  sectionSurface: "base",
@@ -7886,9 +8072,9 @@ var blockAppearancePresets = [
7886
8072
  }),
7887
8073
  defineBlockAppearancePreset({
7888
8074
  kind: "block-design",
7889
- id: "feature-cards-soft-earth-offerings",
8075
+ id: "feature-cards-raised-rule",
7890
8076
  target: "feature-cards",
7891
- label: "Soft Earth offering cards",
8077
+ label: "Raised cards with rule",
7892
8078
  blockKinds: ["block.feature-cards"],
7893
8079
  design: {
7894
8080
  sectionSurface: "base",
@@ -7917,6 +8103,21 @@ var blockAppearancePresets = [
7917
8103
  emphasis: "medium"
7918
8104
  }
7919
8105
  }),
8106
+ defineBlockAppearancePreset({
8107
+ kind: "block-design",
8108
+ id: "events-lined-panel",
8109
+ target: "events",
8110
+ label: "Lined event panel",
8111
+ blockKinds: ["block.event-calendar", "block.event-listing"],
8112
+ design: {
8113
+ sectionSurface: "base",
8114
+ contentFrame: plainFrame,
8115
+ itemSurface: "none",
8116
+ transitionAfter: "none",
8117
+ emphasis: "medium",
8118
+ eventListTreatment: "lined-panel"
8119
+ }
8120
+ }),
7920
8121
  defineBlockAppearancePreset({
7921
8122
  kind: "block-design",
7922
8123
  id: "schedule-details-accent-section",
@@ -7976,9 +8177,9 @@ var blockAppearancePresets = [
7976
8177
  }),
7977
8178
  defineBlockAppearancePreset({
7978
8179
  kind: "block-design",
7979
- id: "testimonials-carded-proof",
8180
+ id: "testimonials-simple-cards",
7980
8181
  target: "testimonials",
7981
- label: "Carded social proof",
8182
+ label: "Simple testimonial cards",
7982
8183
  blockKinds: ["block.testimonials"],
7983
8184
  design: {
7984
8185
  sectionSurface: "base",
@@ -7990,9 +8191,9 @@ var blockAppearancePresets = [
7990
8191
  }),
7991
8192
  defineBlockAppearancePreset({
7992
8193
  kind: "block-design",
7993
- id: "testimonials-contained-proof",
8194
+ id: "testimonials-raised-panel",
7994
8195
  target: "testimonials",
7995
- label: "Contained social proof",
8196
+ label: "Raised testimonial panel",
7996
8197
  blockKinds: ["block.testimonials"],
7997
8198
  design: {
7998
8199
  sectionSurface: "muted-band",
@@ -8004,9 +8205,9 @@ var blockAppearancePresets = [
8004
8205
  }),
8005
8206
  defineBlockAppearancePreset({
8006
8207
  kind: "block-design",
8007
- id: "testimonials-dark-proof",
8208
+ id: "testimonials-accent-panel",
8008
8209
  target: "testimonials",
8009
- label: "Dark proof panel",
8210
+ label: "Accent testimonial panel",
8010
8211
  blockKinds: ["block.testimonials"],
8011
8212
  design: {
8012
8213
  sectionSurface: "accent-band",
@@ -8018,9 +8219,9 @@ var blockAppearancePresets = [
8018
8219
  }),
8019
8220
  defineBlockAppearancePreset({
8020
8221
  kind: "block-design",
8021
- id: "testimonials-accent-quote-proof",
8222
+ id: "testimonials-accent-quote-cards",
8022
8223
  target: "testimonials",
8023
- label: "Accent quote proof",
8224
+ label: "Accent quote cards",
8024
8225
  blockKinds: ["block.testimonials"],
8025
8226
  design: {
8026
8227
  sectionSurface: "accent-band",
@@ -8033,9 +8234,9 @@ var blockAppearancePresets = [
8033
8234
  }),
8034
8235
  defineBlockAppearancePreset({
8035
8236
  kind: "block-design",
8036
- id: "testimonials-soft-earth-proof-band",
8237
+ id: "testimonials-brand-background-quotes",
8037
8238
  target: "testimonials",
8038
- label: "Soft Earth proof band",
8239
+ label: "Brand background quotes",
8039
8240
  blockKinds: ["block.testimonials"],
8040
8241
  design: {
8041
8242
  sectionSurface: "brand-depth-band",
@@ -8079,25 +8280,6 @@ var blockAppearancePresets = [
8079
8280
  emphasis: "low"
8080
8281
  }
8081
8282
  }),
8082
- defineBlockAppearancePreset({
8083
- kind: "block-design",
8084
- id: "faq-soft-earth-two-column",
8085
- target: "faq",
8086
- label: "Soft Earth two-column FAQ",
8087
- blockKinds: ["block.faq"],
8088
- design: {
8089
- sectionSurface: "base",
8090
- contentFrame: plainFrame,
8091
- itemSurface: "flat",
8092
- transitionAfter: "none",
8093
- emphasis: "medium",
8094
- accordionIconTreatment: {
8095
- iconSet: "plus",
8096
- colorToken: "primary",
8097
- motion: "swap"
8098
- }
8099
- }
8100
- }),
8101
8283
  defineBlockAppearancePreset({
8102
8284
  kind: "block-design",
8103
8285
  id: "contact-form-panel",
@@ -9476,7 +9658,8 @@ var accordionSystemSchema = z12.object({
9476
9658
  icon: z12.object({
9477
9659
  style: accordionIconSchema,
9478
9660
  position: z12.enum(["left", "right"]),
9479
- size: z12.enum(["sm", "md", "lg"])
9661
+ size: z12.enum(["sm", "md", "lg"]),
9662
+ colorToken: themeColorTokenSchema.optional()
9480
9663
  }),
9481
9664
  // Trigger (question) styling
9482
9665
  trigger: z12.object({
@@ -9610,6 +9793,7 @@ var navLinkPaddingXSchema = z16.enum(["none", "tight", "compact", "default", "re
9610
9793
  var navLinkBorderRadiusSchema = z16.enum(["none", "sm", "md", "full"]);
9611
9794
  var navLinkTextSizeSchema = z16.enum(["xs", "sm", "base", "lg"]);
9612
9795
  var navLinkLetterSpacingSchema = z16.enum(["normal", "wide", "wider", "widest"]);
9796
+ var navLinkContrastTreatmentSchema = z16.enum(["none", "soft-glow"]);
9613
9797
  var navLinkStyleSchema = z16.object({
9614
9798
  /** Display name for the style */
9615
9799
  name: z16.string().min(1).max(30).optional(),
@@ -9621,6 +9805,8 @@ var navLinkStyleSchema = z16.object({
9621
9805
  textSize: navLinkTextSizeSchema.optional(),
9622
9806
  /** Optional letter spacing override */
9623
9807
  letterSpacing: navLinkLetterSpacingSchema.optional(),
9808
+ /** Optional text-only contrast treatment for transparent/overlay navigation */
9809
+ contrastTreatment: navLinkContrastTreatmentSchema.optional(),
9624
9810
  /** Hover/active color token (for color-change effects) */
9625
9811
  hoverColorToken: themeColorTokenSchema.nullable().optional(),
9626
9812
  /** Padding preset */
@@ -9974,8 +10160,19 @@ var headingTypographyStyleSchema = typographyStyleSchema.extend({
9974
10160
  colorToken: themeColorTokenSchema.nullable().optional()
9975
10161
  });
9976
10162
  var proseLinkUnderlineStyleSchema = z21.enum(["solid", "dotted", "dashed"]);
9977
- var proseLinkUnderlineThicknessSchema = z21.enum(["auto", "fromFont", "thin", "medium", "thick"]);
9978
- var proseLinkUnderlineOffsetSchema = z21.enum(["auto", "tight", "normal", "loose"]);
10163
+ var proseLinkUnderlineThicknessSchema = z21.enum([
10164
+ "auto",
10165
+ "fromFont",
10166
+ "thin",
10167
+ "medium",
10168
+ "thick"
10169
+ ]);
10170
+ var proseLinkUnderlineOffsetSchema = z21.enum([
10171
+ "auto",
10172
+ "tight",
10173
+ "normal",
10174
+ "loose"
10175
+ ]);
9979
10176
  var proseLinkStyleSchema = z21.object({
9980
10177
  colorToken: themeColorTokenSchema.optional(),
9981
10178
  hoverColorToken: themeColorTokenSchema.optional(),
@@ -9986,7 +10183,14 @@ var proseLinkStyleSchema = z21.object({
9986
10183
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9987
10184
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9988
10185
  });
9989
- var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
10186
+ var semanticSpacingSchema = z21.enum([
10187
+ "none",
10188
+ "compact",
10189
+ "cozy",
10190
+ "medium",
10191
+ "comfortable",
10192
+ "spacious"
10193
+ ]);
9990
10194
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9991
10195
  var boxBackgroundOverlaySchema = z21.object({
9992
10196
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -10032,6 +10236,7 @@ var sectionStylesOverrideSchema = z21.object({
10032
10236
  spacing: semanticSpacingSchema.nullable().optional(),
10033
10237
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
10034
10238
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
10239
+ eventListTreatment: z21.enum(eventListTreatmentValues).nullable().optional(),
10035
10240
  eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
10036
10241
  headingDecoration: headingDecorationSchema.nullable().optional(),
10037
10242
  // Author-level override consumed by later block/editor rendering phases.
@@ -10130,9 +10335,17 @@ var inputStyle = z21.object({
10130
10335
  focus: z21.enum(["glow", "ring", "underline"]),
10131
10336
  label: z21.enum(["inside", "above"])
10132
10337
  });
10133
- var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
10338
+ var headerVariant = z21.enum(["classic", "centered", "transparent", "floating"]);
10134
10339
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
10135
- var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
10340
+ var headerNavStyle = z21.enum([
10341
+ "minimal",
10342
+ "underline",
10343
+ "underline-grow",
10344
+ "capsule",
10345
+ "scale",
10346
+ "frosted",
10347
+ "solid"
10348
+ ]);
10136
10349
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
10137
10350
  var headerMaxWidth = z21.enum(["container", "full"]);
10138
10351
  var headerContainerSchema = z21.object({
@@ -10180,8 +10393,22 @@ var dropdownStyleSchema = z21.object({
10180
10393
  textSize: z21.enum(["xs", "sm", "base", "lg"]).optional()
10181
10394
  // optional = no override (browser default)
10182
10395
  }).optional();
10183
- var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
10184
- var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
10396
+ var headerCtaGapSchema = z21.enum([
10397
+ "none",
10398
+ "tight",
10399
+ "compact",
10400
+ "default",
10401
+ "relaxed",
10402
+ "spacious"
10403
+ ]);
10404
+ var headerCtaTreatmentSchema = z21.enum([
10405
+ "default",
10406
+ "primary",
10407
+ "secondary",
10408
+ "inverted",
10409
+ "outline",
10410
+ "ghost"
10411
+ ]);
10185
10412
  var navContainerSchema = z21.object({
10186
10413
  type: z21.enum(["none", "pill", "glass"]).default("none"),
10187
10414
  tint: z21.string().nullable().optional(),
@@ -10236,7 +10463,14 @@ var footerMaxWidth = z21.enum(["container", "full"]);
10236
10463
  var footerMode = z21.enum(["default", "blocks", "default+blocks", "none"]);
10237
10464
  var footerNavLayoutMode = z21.enum(["stack", "inline", "inline-wrap"]);
10238
10465
  var footerNavLayoutAlign = z21.enum(["start", "center", "end", "space-between"]);
10239
- var footerSpacing = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
10466
+ var footerSpacing = z21.enum([
10467
+ "none",
10468
+ "tight",
10469
+ "compact",
10470
+ "default",
10471
+ "relaxed",
10472
+ "spacious"
10473
+ ]);
10240
10474
  var footerLogoPlacement = z21.enum(["left", "right", "above", "below"]);
10241
10475
  var footerLogoSize = z21.enum(["sm", "md", "lg", "xl"]);
10242
10476
  var footerLogoMaxHeight = z21.enum(["sm", "md", "lg", "xl"]);
@@ -10301,7 +10535,12 @@ var footerSchema = z21.object({
10301
10535
  logo: footerLogoSchema.optional(),
10302
10536
  bottomBar: footerBottomBarSchema.optional()
10303
10537
  });
10304
- var containerPaddingPresetSchema = z21.enum(["tight", "compact", "default", "relaxed"]);
10538
+ var containerPaddingPresetSchema = z21.enum([
10539
+ "tight",
10540
+ "compact",
10541
+ "default",
10542
+ "relaxed"
10543
+ ]);
10305
10544
  var layoutSchema = z21.object({
10306
10545
  containerPadding: z21.object({
10307
10546
  mobile: containerPaddingPresetSchema.optional(),
@@ -10309,8 +10548,24 @@ var layoutSchema = z21.object({
10309
10548
  desktop: containerPaddingPresetSchema.optional()
10310
10549
  }).optional()
10311
10550
  }).optional();
10312
- var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
10313
- var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
10551
+ var heroTypographySizeSchema = z21.enum([
10552
+ "sm",
10553
+ "base",
10554
+ "lg",
10555
+ "xl",
10556
+ "2xl",
10557
+ "3xl",
10558
+ "4xl",
10559
+ "5xl",
10560
+ "6xl",
10561
+ "editorial"
10562
+ ]);
10563
+ var heroTypographyLineHeightSchema = z21.enum([
10564
+ "tight",
10565
+ "snug",
10566
+ "normal",
10567
+ "relaxed"
10568
+ ]);
10314
10569
  var heroResponsiveTypographySchema = z21.object({
10315
10570
  headlineSize: heroTypographySizeSchema.optional(),
10316
10571
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
@@ -10815,6 +11070,34 @@ var paletteVariantsById = new Map(
10815
11070
  paletteVariants.map((v) => [v.id, v])
10816
11071
  );
10817
11072
 
11073
+ // ../theme-core/src/accordions/siteStyleDefaults.ts
11074
+ var softEarthAccordionSystem = {
11075
+ background: {
11076
+ type: "solid",
11077
+ colorToken: "background"
11078
+ },
11079
+ spacing: "comfortable",
11080
+ corners: "square",
11081
+ border: null,
11082
+ shadow: null,
11083
+ icon: {
11084
+ style: "plus-minus",
11085
+ position: "right",
11086
+ size: "md",
11087
+ colorToken: "primary"
11088
+ },
11089
+ trigger: {
11090
+ textColorToken: "text",
11091
+ fontWeight: "medium"
11092
+ },
11093
+ hover: {
11094
+ textColorToken: "primary"
11095
+ },
11096
+ content: {
11097
+ textColorToken: "neutral-700"
11098
+ }
11099
+ };
11100
+
10818
11101
  // ../theme-core/src/site-styles/headerLooks.ts
10819
11102
  function asHeaderLookId(value) {
10820
11103
  return value;
@@ -10864,23 +11147,13 @@ var headerLayoutCatalog = [
10864
11147
  maxRecommendedNavItems: 5,
10865
11148
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
10866
11149
  },
10867
- {
10868
- id: asHeaderLayoutId("editorial"),
10869
- label: "Editorial",
10870
- description: "A composed, magazine-like stacked header treatment.",
10871
- structure: "editorial-stack",
10872
- variant: "editorial",
10873
- defaultPositioning: "static",
10874
- shrinkOnScroll: false,
10875
- maxRecommendedNavItems: 6
10876
- },
10877
11150
  {
10878
11151
  id: asHeaderLayoutId("floating"),
10879
11152
  label: "Floating",
10880
11153
  description: "Detached header chrome that sits over the opening section.",
10881
11154
  structure: "floating-shell",
10882
11155
  variant: "floating",
10883
- defaultPositioning: "fixed",
11156
+ defaultPositioning: "sticky",
10884
11157
  shrinkOnScroll: true,
10885
11158
  maxRecommendedNavItems: 5,
10886
11159
  allowedLogoShapes: ["none", "text-only", "horizontal"]
@@ -10894,17 +11167,23 @@ var headerStyleCatalog = [
10894
11167
  id: asHeaderStyleId("minimal"),
10895
11168
  label: "Minimal",
10896
11169
  description: "Quiet surface with simple color-change navigation.",
10897
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
11170
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10898
11171
  navInteraction: "color-change",
10899
- surface: "neutral"
11172
+ surface: "neutral",
11173
+ defaultDepth: "none",
11174
+ navTypography: "plain",
11175
+ moods: ["calm", "professional", "editorial"]
10900
11176
  },
10901
11177
  {
10902
11178
  id: asHeaderStyleId("fine-line"),
10903
11179
  label: "Fine Line",
10904
11180
  description: "Light surface with a crisp lower rule and underline hover.",
10905
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
11181
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10906
11182
  navInteraction: "underline-grow",
10907
- surface: "bordered"
11183
+ surface: "bordered",
11184
+ defaultDepth: "line",
11185
+ navTypography: "plain",
11186
+ moods: ["calm", "professional", "editorial"]
10908
11187
  },
10909
11188
  {
10910
11189
  id: asHeaderStyleId("soft-bar"),
@@ -10912,7 +11191,10 @@ var headerStyleCatalog = [
10912
11191
  description: "Soft tinted surface with gentle pill hover states.",
10913
11192
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10914
11193
  navInteraction: "pill-background",
10915
- surface: "soft"
11194
+ surface: "soft",
11195
+ defaultDepth: "line",
11196
+ navTypography: "plain",
11197
+ moods: ["calm", "professional"]
10916
11198
  },
10917
11199
  {
10918
11200
  id: asHeaderStyleId("pill-nav"),
@@ -10920,23 +11202,32 @@ var headerStyleCatalog = [
10920
11202
  description: "A calm pill navigation rail over a neutral header.",
10921
11203
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10922
11204
  navInteraction: "pill-background",
10923
- surface: "soft"
11205
+ surface: "soft",
11206
+ defaultDepth: "none",
11207
+ navTypography: "plain",
11208
+ moods: ["calm"]
10924
11209
  },
10925
11210
  {
10926
11211
  id: asHeaderStyleId("brand-bar"),
10927
11212
  label: "Brand Bar",
10928
11213
  description: "Solid brand surface with high-contrast navigation.",
10929
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
11214
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10930
11215
  navInteraction: "color-change",
10931
- surface: "brand-solid"
11216
+ surface: "brand-solid",
11217
+ defaultDepth: "none",
11218
+ navTypography: "brand-caps",
11219
+ moods: ["professional", "expressive", "utility"]
10932
11220
  },
10933
11221
  {
10934
11222
  id: asHeaderStyleId("brand-underline"),
10935
11223
  label: "Brand Underline",
10936
11224
  description: "Brand surface with underline-grow navigation.",
10937
- supportedLayoutIds: supportedLayouts(["classic", "editorial"]),
11225
+ supportedLayoutIds: supportedLayouts(["classic"]),
10938
11226
  navInteraction: "underline-grow",
10939
- surface: "brand-solid"
11227
+ surface: "brand-solid",
11228
+ defaultDepth: "none",
11229
+ navTypography: "brand-caps",
11230
+ moods: ["expressive"]
10940
11231
  },
10941
11232
  {
10942
11233
  id: asHeaderStyleId("brand-pill"),
@@ -10944,41 +11235,54 @@ var headerStyleCatalog = [
10944
11235
  description: "Solid brand surface with rounded active and hover states.",
10945
11236
  supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
10946
11237
  navInteraction: "pill-background",
10947
- surface: "brand-solid"
11238
+ surface: "brand-solid",
11239
+ defaultDepth: "none",
11240
+ navTypography: "brand-caps",
11241
+ moods: ["expressive"]
10948
11242
  },
10949
11243
  {
10950
- id: asHeaderStyleId("editorial-line"),
10951
- label: "Editorial Line",
11244
+ id: asHeaderStyleId("serif-line"),
11245
+ label: "Serif Line",
10952
11246
  description: "Typographic logo treatment with understated underline navigation.",
10953
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
11247
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10954
11248
  navInteraction: "underline-grow",
10955
- surface: "bordered"
11249
+ surface: "bordered",
11250
+ defaultDepth: "line",
11251
+ navTypography: "heading",
11252
+ moods: ["editorial", "calm"]
10956
11253
  },
10957
11254
  {
10958
11255
  id: asHeaderStyleId("flat-tabs"),
10959
11256
  label: "Flat Tabs",
10960
11257
  description: "Flat block hover and active states with a Swiss utility feel.",
10961
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
11258
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10962
11259
  navInteraction: "flat-block",
10963
- surface: "bordered"
11260
+ surface: "bordered",
11261
+ defaultDepth: "shadow",
11262
+ navTypography: "quiet-caps",
11263
+ moods: ["professional", "utility", "expressive"]
10964
11264
  },
10965
11265
  {
10966
11266
  id: asHeaderStyleId("glass"),
10967
11267
  label: "Glass",
10968
- description: "Floating translucent chrome with frosted navigation backing.",
11268
+ description: "Translucent chrome with frosted navigation backing.",
10969
11269
  supportedLayoutIds: supportedLayouts(["floating"]),
10970
11270
  navInteraction: "glass-backed",
10971
11271
  surface: "floating",
10972
- requiresFloatingLayout: true
11272
+ defaultDepth: "shadow",
11273
+ navTypography: "plain",
11274
+ moods: ["expressive", "calm"]
10973
11275
  },
10974
11276
  {
10975
11277
  id: asHeaderStyleId("minimal-surface"),
10976
- label: "Minimal Surface",
10977
- description: "Floating chrome with a restrained translucent surface.",
11278
+ label: "Clear Split",
11279
+ description: "Floating logo with transparent navigation and no shared shell.",
10978
11280
  supportedLayoutIds: supportedLayouts(["floating"]),
10979
11281
  navInteraction: "color-change",
10980
11282
  surface: "floating",
10981
- requiresFloatingLayout: true
11283
+ defaultDepth: "none",
11284
+ navTypography: "plain",
11285
+ moods: ["editorial", "calm"]
10982
11286
  },
10983
11287
  {
10984
11288
  id: asHeaderStyleId("soft-shell"),
@@ -10987,7 +11291,31 @@ var headerStyleCatalog = [
10987
11291
  supportedLayoutIds: supportedLayouts(["floating"]),
10988
11292
  navInteraction: "pill-background",
10989
11293
  surface: "floating",
10990
- requiresFloatingLayout: true
11294
+ defaultDepth: "shadow",
11295
+ navTypography: "plain",
11296
+ moods: ["calm", "professional"]
11297
+ },
11298
+ {
11299
+ id: asHeaderStyleId("split-glass"),
11300
+ label: "Split Glass",
11301
+ description: "Logo floats independently while the navigation sits in a glass rail.",
11302
+ supportedLayoutIds: supportedLayouts(["floating"]),
11303
+ navInteraction: "glass-backed",
11304
+ surface: "floating",
11305
+ defaultDepth: "shadow",
11306
+ navTypography: "quiet-caps",
11307
+ moods: ["expressive"]
11308
+ },
11309
+ {
11310
+ id: asHeaderStyleId("split-pill"),
11311
+ label: "Split Pill",
11312
+ description: "Logo floats independently with a soft pill-backed navigation rail.",
11313
+ supportedLayoutIds: supportedLayouts(["floating"]),
11314
+ navInteraction: "pill-background",
11315
+ surface: "floating",
11316
+ defaultDepth: "shadow",
11317
+ navTypography: "heading",
11318
+ moods: ["calm", "editorial"]
10991
11319
  }
10992
11320
  ];
10993
11321
  var headerLayoutsById = new Map(
@@ -11007,7 +11335,7 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11007
11335
  "brand-bar",
11008
11336
  "brand-underline",
11009
11337
  "brand-pill",
11010
- "editorial-line",
11338
+ "serif-line",
11011
11339
  "flat-tabs"
11012
11340
  ])
11013
11341
  ],
@@ -11020,19 +11348,7 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11020
11348
  "pill-nav",
11021
11349
  "brand-bar",
11022
11350
  "brand-pill",
11023
- "editorial-line",
11024
- "flat-tabs"
11025
- ])
11026
- ],
11027
- [
11028
- asHeaderLayoutId("editorial"),
11029
- headerStyleRepairChain([
11030
- "minimal",
11031
- "fine-line",
11032
- "soft-bar",
11033
- "brand-bar",
11034
- "brand-underline",
11035
- "editorial-line",
11351
+ "serif-line",
11036
11352
  "flat-tabs"
11037
11353
  ])
11038
11354
  ],
@@ -11041,6 +11357,8 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11041
11357
  headerStyleRepairChain([
11042
11358
  "glass",
11043
11359
  "minimal-surface",
11360
+ "split-glass",
11361
+ "split-pill",
11044
11362
  "soft-shell",
11045
11363
  "brand-pill"
11046
11364
  ])
@@ -11049,20 +11367,69 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11049
11367
  function headerStyleRepairChain(values) {
11050
11368
  return values.map(asHeaderStyleId);
11051
11369
  }
11052
- var headerStyleRepairOrder = /* @__PURE__ */ new Map([
11053
- [asHeaderStyleId("brand-bar"), headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])],
11054
- [asHeaderStyleId("brand-underline"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
11055
- [asHeaderStyleId("brand-pill"), headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])],
11056
- [asHeaderStyleId("pill-nav"), headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])],
11057
- [asHeaderStyleId("flat-tabs"), headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])],
11058
- [asHeaderStyleId("editorial-line"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
11059
- [asHeaderStyleId("glass"), headerStyleRepairChain(["glass", "minimal-surface", "minimal"])],
11060
- [asHeaderStyleId("soft-shell"), headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])],
11061
- [asHeaderStyleId("minimal-surface"), headerStyleRepairChain(["minimal-surface", "minimal"])],
11062
- [asHeaderStyleId("fine-line"), headerStyleRepairChain(["fine-line", "minimal"])],
11063
- [asHeaderStyleId("soft-bar"), headerStyleRepairChain(["soft-bar", "minimal"])],
11064
- [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
11065
- ]);
11370
+ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
11371
+ [
11372
+ [
11373
+ asHeaderStyleId("brand-bar"),
11374
+ headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])
11375
+ ],
11376
+ [
11377
+ asHeaderStyleId("brand-underline"),
11378
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
11379
+ ],
11380
+ [
11381
+ asHeaderStyleId("brand-pill"),
11382
+ headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])
11383
+ ],
11384
+ [
11385
+ asHeaderStyleId("pill-nav"),
11386
+ headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])
11387
+ ],
11388
+ [
11389
+ asHeaderStyleId("flat-tabs"),
11390
+ headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])
11391
+ ],
11392
+ [
11393
+ asHeaderStyleId("serif-line"),
11394
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
11395
+ ],
11396
+ [
11397
+ asHeaderStyleId("glass"),
11398
+ headerStyleRepairChain([
11399
+ "glass",
11400
+ "soft-shell",
11401
+ "fine-line",
11402
+ "minimal-surface",
11403
+ "minimal"
11404
+ ])
11405
+ ],
11406
+ [
11407
+ asHeaderStyleId("soft-shell"),
11408
+ headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])
11409
+ ],
11410
+ [
11411
+ asHeaderStyleId("minimal-surface"),
11412
+ headerStyleRepairChain(["minimal-surface", "minimal"])
11413
+ ],
11414
+ [
11415
+ asHeaderStyleId("split-glass"),
11416
+ headerStyleRepairChain(["split-glass", "glass", "minimal-surface"])
11417
+ ],
11418
+ [
11419
+ asHeaderStyleId("split-pill"),
11420
+ headerStyleRepairChain(["split-pill", "soft-shell", "brand-pill"])
11421
+ ],
11422
+ [
11423
+ asHeaderStyleId("fine-line"),
11424
+ headerStyleRepairChain(["fine-line", "minimal"])
11425
+ ],
11426
+ [
11427
+ asHeaderStyleId("soft-bar"),
11428
+ headerStyleRepairChain(["soft-bar", "minimal"])
11429
+ ],
11430
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
11431
+ ]
11432
+ );
11066
11433
  var legacyHeaderLookAliases = [
11067
11434
  {
11068
11435
  lookId: asHeaderLookId("clean-base"),
@@ -11079,10 +11446,10 @@ var legacyHeaderLookAliases = [
11079
11446
  }
11080
11447
  },
11081
11448
  {
11082
- lookId: asHeaderLookId("editorial-line"),
11449
+ lookId: asHeaderLookId("serif-line"),
11083
11450
  selection: {
11084
- layoutId: asHeaderLayoutId("editorial"),
11085
- styleId: asHeaderStyleId("editorial-line")
11451
+ layoutId: asHeaderLayoutId("centered"),
11452
+ styleId: asHeaderStyleId("serif-line")
11086
11453
  }
11087
11454
  },
11088
11455
  {
@@ -11121,9 +11488,7 @@ var legacyHeaderLookAliases = [
11121
11488
  }
11122
11489
  }
11123
11490
  ];
11124
- var legacyHeaderLookAliasesById = new Map(
11125
- legacyHeaderLookAliases.map((alias) => [alias.lookId, alias])
11126
- );
11491
+ var legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
11127
11492
  function getHeaderStyle(id) {
11128
11493
  return headerStylesById.get(id) ?? null;
11129
11494
  }
@@ -11141,10 +11506,29 @@ function resolveLegacyHeaderLookAlias(lookId) {
11141
11506
  return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
11142
11507
  }
11143
11508
  function getCompatibleHeaderStyleIds(layoutId) {
11144
- return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
11145
- const style = getHeaderStyleOrThrow(styleId);
11146
- return isHeaderStyleCompatibleWithLayout(style, layoutId);
11147
- });
11509
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter(
11510
+ (styleId) => {
11511
+ const style = getHeaderStyleOrThrow(styleId);
11512
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
11513
+ }
11514
+ );
11515
+ }
11516
+ function themedHeaderShadow(theme) {
11517
+ switch (theme.shadow.elevation) {
11518
+ case "none":
11519
+ return void 0;
11520
+ case "low":
11521
+ return { elevation: "sm" };
11522
+ case "medium":
11523
+ return { elevation: "md" };
11524
+ case "high":
11525
+ return { elevation: "lg" };
11526
+ default:
11527
+ return assertNever(
11528
+ theme.shadow.elevation,
11529
+ "Unhandled theme shadow elevation"
11530
+ );
11531
+ }
11148
11532
  }
11149
11533
  function solidBrandHeader(theme) {
11150
11534
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
@@ -11175,8 +11559,14 @@ function solidBrandHeader(theme) {
11175
11559
  borderRadius: "none",
11176
11560
  effects: {
11177
11561
  hover: [
11178
- { effectId: "text-color-change", options: { hoverColorToken: "secondary" } },
11179
- { effectId: "nav-underline", options: { style: "grow", colorToken: "secondary" } }
11562
+ {
11563
+ effectId: "text-color-change",
11564
+ options: { hoverColorToken: "secondary" }
11565
+ },
11566
+ {
11567
+ effectId: "nav-underline",
11568
+ options: { style: "grow", colorToken: "secondary" }
11569
+ }
11180
11570
  ]
11181
11571
  }
11182
11572
  },
@@ -11232,10 +11622,10 @@ function cleanBaseHeader(theme) {
11232
11622
  ctaGap: "default"
11233
11623
  };
11234
11624
  }
11235
- function editorialLineHeader(theme) {
11625
+ function serifLineHeader(theme) {
11236
11626
  return {
11237
11627
  ...baseHeader(theme),
11238
- variant: "editorial",
11628
+ variant: "centered",
11239
11629
  positioning: "sticky",
11240
11630
  shrinkOnScroll: false,
11241
11631
  background: {
@@ -11289,9 +11679,7 @@ function practicalUtilityHeader(theme) {
11289
11679
  navColor: "text",
11290
11680
  navStyle: "solid",
11291
11681
  navWeight: "semibold",
11292
- shadow: {
11293
- elevation: "sm"
11294
- },
11682
+ shadow: themedHeaderShadow(theme),
11295
11683
  border: {
11296
11684
  style: "solid",
11297
11685
  width: "thin",
@@ -11360,6 +11748,7 @@ function floatingGlassHeader(theme) {
11360
11748
  return {
11361
11749
  ...transparentOverlayHeader(theme),
11362
11750
  variant: "floating",
11751
+ positioning: "sticky",
11363
11752
  navStyle: "frosted",
11364
11753
  navContainer: {
11365
11754
  type: "glass",
@@ -11404,27 +11793,27 @@ var headerLookCatalog = [
11404
11793
  compile: solidBrandHeader
11405
11794
  },
11406
11795
  {
11407
- id: asHeaderLookId("editorial-line"),
11408
- label: "Editorial line",
11409
- visualTreatment: "light-editorial",
11796
+ id: asHeaderLookId("serif-line"),
11797
+ label: "Serif line",
11798
+ visualTreatment: "light-serif",
11410
11799
  layoutBehavior: "sticky",
11411
11800
  configuration: {
11412
- structure: "editorial-stack",
11413
- treatment: "light-editorial",
11801
+ structure: "centered-stack",
11802
+ treatment: "light-serif",
11414
11803
  behavior: "sticky"
11415
11804
  },
11416
11805
  openingRequirement: "none",
11417
11806
  maxRecommendedNavItems: 6,
11418
- compile: editorialLineHeader
11807
+ compile: serifLineHeader
11419
11808
  },
11420
11809
  {
11421
11810
  id: asHeaderLookId("centered-calm"),
11422
11811
  label: "Centered calm",
11423
- visualTreatment: "light-editorial",
11812
+ visualTreatment: "light-serif",
11424
11813
  layoutBehavior: "normal-flow",
11425
11814
  configuration: {
11426
11815
  structure: "centered-stack",
11427
- treatment: "light-editorial",
11816
+ treatment: "light-serif",
11428
11817
  behavior: "normal-flow"
11429
11818
  },
11430
11819
  openingRequirement: "none",
@@ -11875,7 +12264,7 @@ var typographyPresets = [
11875
12264
  heroTypography: {
11876
12265
  headlineSize: "6xl",
11877
12266
  headlineLineHeight: "tight",
11878
- subheadlineSize: "editorial",
12267
+ subheadlineSize: "2xl",
11879
12268
  subheadlineLineHeight: "normal",
11880
12269
  microHeadlineSize: "6xl",
11881
12270
  microHeadlineLineHeight: "tight",
@@ -11893,6 +12282,8 @@ var typographyPresetsById = new Map(
11893
12282
  );
11894
12283
 
11895
12284
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
12285
+ var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
12286
+ var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
11896
12287
  var curatedSiteStyleIdValues = [
11897
12288
  "site-style:calm-studio",
11898
12289
  "site-style:clear-professional",
@@ -11904,7 +12295,7 @@ var curatedSiteStyleIdValues = [
11904
12295
  "site-style:personal-retreat-journal",
11905
12296
  "site-style:tactile-workshop",
11906
12297
  "site-style:modern-wellness",
11907
- "site-style:soft-earth",
12298
+ SOFT_EARTH_SITE_STYLE_ID_VALUE,
11908
12299
  "site-style:bold-launch",
11909
12300
  "site-style:south-west-twerk-school"
11910
12301
  ];
@@ -11970,22 +12361,31 @@ var expressiveUnderlineInputs = {
11970
12361
  }
11971
12362
  };
11972
12363
  function uniqueContentFrameKinds() {
11973
- const kinds = [...new Set(
11974
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
11975
- )];
12364
+ const kinds = [
12365
+ ...new Set(
12366
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
12367
+ )
12368
+ ];
11976
12369
  const firstKind = kinds[0];
11977
12370
  if (!firstKind) {
11978
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
12371
+ throw new Error(
12372
+ "Expected generated design option catalog to expose at least one content frame kind."
12373
+ );
11979
12374
  }
11980
12375
  return [firstKind, ...kinds.slice(1)];
11981
12376
  }
11982
12377
  var generatedContentFrameKinds = uniqueContentFrameKinds();
11983
12378
  function defineCuratedSiteStyle(input) {
11984
12379
  const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
11985
- const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
12380
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(
12381
+ legacyHeaderLookIds,
12382
+ input.tokenRecipes
12383
+ );
11986
12384
  const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
11987
12385
  const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
11988
- if (!typographyPresetChoices.some((choice) => choice.id === defaultTypographyPresetId)) {
12386
+ if (!typographyPresetChoices.some(
12387
+ (choice) => choice.id === defaultTypographyPresetId
12388
+ )) {
11989
12389
  throw new Error(
11990
12390
  `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
11991
12391
  );
@@ -11996,9 +12396,13 @@ function defineCuratedSiteStyle(input) {
11996
12396
  description: input.description,
11997
12397
  generationBrief: input.generationBrief,
11998
12398
  selectionKeywordRules: input.selectionKeywordRules ?? [],
11999
- siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
12399
+ siteCreatorSelection: input.siteCreatorSelection ?? {
12400
+ kind: "explicit_only"
12401
+ },
12000
12402
  template: {
12001
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
12403
+ id: asDesignSystemTemplateId(
12404
+ `template:${input.id.replace("site-style:", "")}`
12405
+ ),
12002
12406
  name: input.name,
12003
12407
  version: 1,
12004
12408
  tokenRecipes: input.tokenRecipes,
@@ -12009,6 +12413,7 @@ function defineCuratedSiteStyle(input) {
12009
12413
  supportedTransitions: generatedDesignOptionCatalog.transitions
12010
12414
  },
12011
12415
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
12416
+ ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
12012
12417
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
12013
12418
  defaultHeaderSelection: input.defaultHeaderSelection ? {
12014
12419
  layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
@@ -12016,13 +12421,17 @@ function defineCuratedSiteStyle(input) {
12016
12421
  } : inferredHeaderCuration.defaultHeaderSelection,
12017
12422
  recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
12018
12423
  recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
12019
- discouragedHeaderSelections: input.discouragedHeaderSelections?.map((selection) => ({
12020
- layoutId: asHeaderLayoutId(selection.layoutId),
12021
- styleId: asHeaderStyleId(selection.styleId)
12022
- })),
12424
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map(
12425
+ (selection) => ({
12426
+ layoutId: asHeaderLayoutId(selection.layoutId),
12427
+ styleId: asHeaderStyleId(selection.styleId)
12428
+ })
12429
+ ),
12023
12430
  recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
12024
12431
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
12025
- recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
12432
+ recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(
12433
+ asFooterLookId
12434
+ ),
12026
12435
  buttonPersonalityChoices: input.buttonPersonalityChoices,
12027
12436
  paletteVariantChoices: input.paletteVariantChoices,
12028
12437
  typographyPresetChoices,
@@ -12041,7 +12450,7 @@ function headerLayoutChoice(id, note) {
12041
12450
  function headerStyleChoice(id, note) {
12042
12451
  return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
12043
12452
  }
12044
- function headerLayoutRecordKey(id) {
12453
+ function unbrandHeaderLayoutId(id) {
12045
12454
  return id;
12046
12455
  }
12047
12456
  function uniqueHeaderLayoutChoices(choices) {
@@ -12063,8 +12472,72 @@ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
12063
12472
  };
12064
12473
  return [first, ...choices.slice(1)];
12065
12474
  }
12066
- function inferHeaderCurationFromLegacyLooks(lookIds) {
12067
- const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter((selection) => Boolean(selection));
12475
+ function uniqueCompatibleHeaderStyleChoices(choices, fallbackLayoutId) {
12476
+ const compatible = new Set(getCompatibleHeaderStyleIds(fallbackLayoutId));
12477
+ const seen = /* @__PURE__ */ new Set();
12478
+ const unique = choices.filter((choice) => {
12479
+ if (!compatible.has(choice.id)) return false;
12480
+ if (seen.has(choice.id)) return false;
12481
+ seen.add(choice.id);
12482
+ return true;
12483
+ });
12484
+ return nonEmptyHeaderStyleChoices(unique, fallbackLayoutId);
12485
+ }
12486
+ function inferredHeaderStyleValuesForRecipes(layoutId, recipes) {
12487
+ switch (layoutId) {
12488
+ case "classic":
12489
+ if (isExpressiveRecipe(recipes)) {
12490
+ return [
12491
+ "brand-bar",
12492
+ "brand-underline",
12493
+ "flat-tabs",
12494
+ "brand-pill",
12495
+ "fine-line"
12496
+ ];
12497
+ }
12498
+ if (recipes.spacing === "compact") {
12499
+ return ["flat-tabs", "fine-line", "minimal", "brand-bar"];
12500
+ }
12501
+ if (isSerifTypographyRecipe(recipes)) {
12502
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12503
+ }
12504
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12505
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12506
+ }
12507
+ return ["fine-line", "minimal", "soft-bar", "brand-bar"];
12508
+ case "centered":
12509
+ if (isSerifTypographyRecipe(recipes)) {
12510
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12511
+ }
12512
+ if (isExpressiveRecipe(recipes)) {
12513
+ return ["brand-pill", "flat-tabs", "brand-bar", "fine-line"];
12514
+ }
12515
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12516
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12517
+ }
12518
+ return ["minimal", "fine-line", "soft-bar"];
12519
+ case "floating":
12520
+ if (isExpressiveRecipe(recipes)) {
12521
+ return ["glass", "split-glass", "brand-pill", "soft-shell"];
12522
+ }
12523
+ if (isSerifTypographyRecipe(recipes)) {
12524
+ return ["split-pill", "minimal-surface", "soft-shell"];
12525
+ }
12526
+ return ["soft-shell", "minimal-surface", "glass"];
12527
+ default:
12528
+ return [];
12529
+ }
12530
+ }
12531
+ function isExpressiveRecipe(recipes) {
12532
+ return recipes.contrast === "maximum" || recipes.shadow === "layered" || recipes.motion === "expressive";
12533
+ }
12534
+ function isSerifTypographyRecipe(recipes) {
12535
+ return recipes.typography === "serif-editorial" || recipes.typography === "classic-serif";
12536
+ }
12537
+ function inferHeaderCurationFromLegacyLooks(lookIds, recipes) {
12538
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
12539
+ (selection) => Boolean(selection)
12540
+ );
12068
12541
  const defaultHeaderSelection = selections[0] ?? {
12069
12542
  layoutId: asHeaderLayoutId("classic"),
12070
12543
  styleId: asHeaderStyleId("minimal")
@@ -12074,9 +12547,13 @@ function inferHeaderCurationFromLegacyLooks(lookIds) {
12074
12547
  );
12075
12548
  const stylesByLayout = {};
12076
12549
  for (const layoutChoice of layoutChoices) {
12077
- const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12078
- stylesByLayout[headerLayoutRecordKey(layoutChoice.id)] = nonEmptyHeaderStyleChoices(
12079
- styleChoices,
12550
+ const legacyStyleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12551
+ const inferredStyleChoices = inferredHeaderStyleValuesForRecipes(
12552
+ layoutChoice.id,
12553
+ recipes
12554
+ ).map((styleId) => headerStyleChoice(styleId));
12555
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = uniqueCompatibleHeaderStyleChoices(
12556
+ [...legacyStyleChoices, ...inferredStyleChoices],
12080
12557
  layoutChoice.id
12081
12558
  );
12082
12559
  }
@@ -12133,7 +12610,11 @@ var curatedSiteStyles = [
12133
12610
  motion: "subtle"
12134
12611
  },
12135
12612
  compositionBudget: quietBudget,
12136
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
12613
+ recommendedHeaderLookIds: [
12614
+ "centered-calm",
12615
+ "minimal-transparent",
12616
+ "clean-base"
12617
+ ],
12137
12618
  buttonPersonalityChoices: [
12138
12619
  buttonChoice("soft-pill"),
12139
12620
  buttonChoice("pebble"),
@@ -12162,7 +12643,11 @@ var curatedSiteStyles = [
12162
12643
  motion: "subtle"
12163
12644
  },
12164
12645
  compositionBudget: balancedBudget,
12165
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
12646
+ recommendedHeaderLookIds: [
12647
+ "practical-utility",
12648
+ "brand-solid",
12649
+ "clean-base"
12650
+ ],
12166
12651
  buttonPersonalityChoices: [
12167
12652
  buttonChoice("confident-chip"),
12168
12653
  buttonChoice("soft-pill"),
@@ -12189,7 +12674,11 @@ var curatedSiteStyles = [
12189
12674
  motion: "subtle"
12190
12675
  },
12191
12676
  compositionBudget: balancedBudget,
12192
- recommendedHeaderLookIds: ["editorial-line", "minimal-transparent", "centered-calm"],
12677
+ recommendedHeaderLookIds: [
12678
+ "serif-line",
12679
+ "minimal-transparent",
12680
+ "centered-calm"
12681
+ ],
12193
12682
  buttonPersonalityChoices: [
12194
12683
  buttonChoice("editorial-link"),
12195
12684
  buttonChoice("soft-pill"),
@@ -12217,7 +12706,11 @@ var curatedSiteStyles = [
12217
12706
  motion: "expressive"
12218
12707
  },
12219
12708
  compositionBudget: balancedBudget,
12220
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
12709
+ recommendedHeaderLookIds: [
12710
+ "brand-solid",
12711
+ "practical-utility",
12712
+ "clean-base"
12713
+ ],
12221
12714
  buttonPersonalityChoices: [
12222
12715
  buttonChoice("pebble"),
12223
12716
  buttonChoice("brushed-wash"),
@@ -12234,7 +12727,10 @@ var curatedSiteStyles = [
12234
12727
  name: "Quiet Luxury",
12235
12728
  description: "Minimal, confident, and refined for premium experiences and private services.",
12236
12729
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
12237
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
12730
+ siteCreatorSelection: {
12731
+ kind: "site_creator_keyword_heuristic",
12732
+ priority: 20
12733
+ },
12238
12734
  selectionKeywordRules: [
12239
12735
  { kind: "word", value: "luxury" },
12240
12736
  { kind: "word", value: "premium" },
@@ -12252,7 +12748,11 @@ var curatedSiteStyles = [
12252
12748
  motion: "none"
12253
12749
  },
12254
12750
  compositionBudget: quietBudget,
12255
- recommendedHeaderLookIds: ["minimal-transparent", "editorial-line", "clean-base"],
12751
+ recommendedHeaderLookIds: [
12752
+ "minimal-transparent",
12753
+ "serif-line",
12754
+ "clean-base"
12755
+ ],
12256
12756
  buttonPersonalityChoices: [
12257
12757
  buttonChoice("editorial-link"),
12258
12758
  buttonChoice("confident-chip"),
@@ -12288,7 +12788,11 @@ var curatedSiteStyles = [
12288
12788
  motion: "none"
12289
12789
  },
12290
12790
  compositionBudget: quietBudget,
12291
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
12791
+ recommendedHeaderLookIds: [
12792
+ "practical-utility",
12793
+ "brand-solid",
12794
+ "clean-base"
12795
+ ],
12292
12796
  buttonPersonalityChoices: [
12293
12797
  buttonChoice("confident-chip"),
12294
12798
  buttonChoice("pebble"),
@@ -12315,7 +12819,11 @@ var curatedSiteStyles = [
12315
12819
  motion: "subtle"
12316
12820
  },
12317
12821
  compositionBudget: balancedBudget,
12318
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
12822
+ recommendedHeaderLookIds: [
12823
+ "centered-calm",
12824
+ "minimal-transparent",
12825
+ "clean-base"
12826
+ ],
12319
12827
  buttonPersonalityChoices: [
12320
12828
  buttonChoice("soft-pill"),
12321
12829
  buttonChoice("pebble"),
@@ -12332,7 +12840,10 @@ var curatedSiteStyles = [
12332
12840
  name: "Quiet Practice",
12333
12841
  description: "Grounded, calm, and practical for small appointment-first practices.",
12334
12842
  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.",
12335
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
12843
+ siteCreatorSelection: {
12844
+ kind: "site_creator_keyword_heuristic",
12845
+ priority: 30
12846
+ },
12336
12847
  selectionKeywordRules: [
12337
12848
  { kind: "substring", value: "massage" },
12338
12849
  { kind: "word", value: "bodywork" },
@@ -12353,7 +12864,11 @@ var curatedSiteStyles = [
12353
12864
  motion: "subtle"
12354
12865
  },
12355
12866
  compositionBudget: quietBudget,
12356
- recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
12867
+ recommendedHeaderLookIds: [
12868
+ "practical-utility",
12869
+ "clean-base",
12870
+ "centered-calm"
12871
+ ],
12357
12872
  buttonPersonalityChoices: [
12358
12873
  buttonChoice("pebble"),
12359
12874
  buttonChoice("soft-pill"),
@@ -12370,7 +12885,10 @@ var curatedSiteStyles = [
12370
12885
  name: "Personal Retreat Journal",
12371
12886
  description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
12372
12887
  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.",
12373
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
12888
+ siteCreatorSelection: {
12889
+ kind: "site_creator_keyword_heuristic",
12890
+ priority: 40
12891
+ },
12374
12892
  selectionKeywordRules: [
12375
12893
  { kind: "substring", value: "retreat" },
12376
12894
  { kind: "phrase", value: "solo practitioner" },
@@ -12390,7 +12908,11 @@ var curatedSiteStyles = [
12390
12908
  motion: "subtle"
12391
12909
  },
12392
12910
  compositionBudget: balancedBudget,
12393
- recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
12911
+ recommendedHeaderLookIds: [
12912
+ "serif-line",
12913
+ "centered-calm",
12914
+ "minimal-transparent"
12915
+ ],
12394
12916
  buttonPersonalityChoices: [
12395
12917
  buttonChoice("editorial-link"),
12396
12918
  buttonChoice("soft-pill"),
@@ -12407,7 +12929,10 @@ var curatedSiteStyles = [
12407
12929
  name: "Tactile Workshop",
12408
12930
  description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
12409
12931
  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.",
12410
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
12932
+ siteCreatorSelection: {
12933
+ kind: "site_creator_keyword_heuristic",
12934
+ priority: 50
12935
+ },
12411
12936
  selectionKeywordRules: [
12412
12937
  { kind: "substring", value: "ceramic" },
12413
12938
  { kind: "word", value: "pottery" },
@@ -12427,8 +12952,15 @@ var curatedSiteStyles = [
12427
12952
  motion: "subtle"
12428
12953
  },
12429
12954
  compositionBudget: balancedBudget,
12430
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
12431
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
12955
+ recommendedHeaderLookIds: [
12956
+ "brand-solid",
12957
+ "practical-utility",
12958
+ "clean-base"
12959
+ ],
12960
+ recommendedFooterLookIds: [
12961
+ "site-footer-brand-two-band",
12962
+ "footer-muted-grounding"
12963
+ ],
12432
12964
  buttonPersonalityChoices: [
12433
12965
  buttonChoice("pebble"),
12434
12966
  buttonChoice("confident-chip"),
@@ -12443,11 +12975,14 @@ var curatedSiteStyles = [
12443
12975
  ]
12444
12976
  }),
12445
12977
  defineCuratedSiteStyle({
12446
- id: "site-style:soft-earth",
12978
+ id: SOFT_EARTH_SITE_STYLE_ID,
12447
12979
  name: "Soft Earth",
12448
12980
  description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
12449
- generationBrief: "Use cream space, terracotta CTAs, olive proof bands, natural imagery, generous but composed spacing, and editorial serif headings. Prefer a real intro section, image-led offering cards, warm community proof, and a simple two-column FAQ when content allows.",
12450
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 45 },
12981
+ 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.",
12982
+ siteCreatorSelection: {
12983
+ kind: "site_creator_keyword_heuristic",
12984
+ priority: 45
12985
+ },
12451
12986
  selectionKeywordRules: [
12452
12987
  { kind: "word", value: "meditation" },
12453
12988
  { kind: "word", value: "wellbeing" },
@@ -12513,18 +13048,29 @@ var curatedSiteStyles = [
12513
13048
  paragraphSize: "default",
12514
13049
  headingSize: "editorial"
12515
13050
  }
12516
- }
13051
+ },
13052
+ accordions: softEarthAccordionSystem
13053
+ },
13054
+ defaultBlockVariants: {
13055
+ "block.faq": "question-columns"
12517
13056
  },
12518
13057
  recommendedAppearancePresetIds: [
12519
13058
  "hero-brand-scrim",
12520
- "intro-soft-earth-statement",
12521
- "feature-cards-soft-earth-offerings",
12522
- "testimonials-soft-earth-proof-band",
12523
- "faq-soft-earth-two-column",
13059
+ "intro-organic-statement",
13060
+ "feature-cards-raised-rule",
13061
+ "events-lined-panel",
13062
+ "testimonials-brand-background-quotes",
12524
13063
  "contact-form-panel"
12525
13064
  ],
12526
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "editorial-line"],
12527
- recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
13065
+ recommendedHeaderLookIds: [
13066
+ "centered-calm",
13067
+ "minimal-transparent",
13068
+ "serif-line"
13069
+ ],
13070
+ recommendedFooterLookIds: [
13071
+ "footer-muted-grounding",
13072
+ "site-footer-brand-two-band"
13073
+ ],
12528
13074
  buttonPersonalityChoices: [
12529
13075
  buttonChoice("earth-pill"),
12530
13076
  buttonChoice("soft-pill"),
@@ -12543,7 +13089,10 @@ var curatedSiteStyles = [
12543
13089
  name: "Bold Launch",
12544
13090
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
12545
13091
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
12546
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
13092
+ siteCreatorSelection: {
13093
+ kind: "site_creator_keyword_heuristic",
13094
+ priority: 10
13095
+ },
12547
13096
  selectionKeywordRules: [
12548
13097
  { kind: "substring", value: "launch" },
12549
13098
  { kind: "substring", value: "campaign" },
@@ -12562,7 +13111,11 @@ var curatedSiteStyles = [
12562
13111
  motion: "expressive"
12563
13112
  },
12564
13113
  compositionBudget: expressiveBudget,
12565
- recommendedHeaderLookIds: ["transparent-overlay", "floating-glass", "brand-solid"],
13114
+ recommendedHeaderLookIds: [
13115
+ "transparent-overlay",
13116
+ "floating-glass",
13117
+ "brand-solid"
13118
+ ],
12566
13119
  buttonPersonalityChoices: [
12567
13120
  buttonChoice("ink-stamp"),
12568
13121
  buttonChoice("confident-chip"),
@@ -12610,11 +13163,18 @@ var curatedSiteStyles = [
12610
13163
  "hero-brand-scrim-fixed-frame",
12611
13164
  "body-text-editorial-intro",
12612
13165
  "schedule-details-brand-depth",
12613
- "testimonials-accent-quote-proof",
13166
+ "testimonials-accent-quote-cards",
12614
13167
  "contact-form-brand-depth-card"
12615
13168
  ],
12616
- recommendedHeaderLookIds: ["brand-solid", "transparent-overlay", "practical-utility"],
12617
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
13169
+ recommendedHeaderLookIds: [
13170
+ "brand-solid",
13171
+ "transparent-overlay",
13172
+ "practical-utility"
13173
+ ],
13174
+ recommendedFooterLookIds: [
13175
+ "site-footer-brand-two-band",
13176
+ "footer-muted-grounding"
13177
+ ],
12618
13178
  buttonPersonalityChoices: [
12619
13179
  buttonChoice("showtime-pill"),
12620
13180
  buttonChoice("confident-chip"),
@@ -12698,6 +13258,7 @@ var themeV2RuntimeStyleFieldNames = [
12698
13258
  ];
12699
13259
  var themeV2BlockSpecificRawStyleFieldNames = [
12700
13260
  "_contentCardStyles",
13261
+ "_heroLayoutStyles",
12701
13262
  "_textCardStyles"
12702
13263
  ];
12703
13264
  var themeV2NormalEditorRawStyleFieldNames = [
@@ -12707,6 +13268,10 @@ var themeV2NormalEditorRawStyleFieldNames = [
12707
13268
  var themeV2NormalEditorRawStyleFieldNameSet = new Set(
12708
13269
  themeV2NormalEditorRawStyleFieldNames
12709
13270
  );
13271
+ var themeV2CompilerOwnedFieldNames = [
13272
+ ...themeV2RuntimeStyleFieldNames,
13273
+ ...themeV2BlockSpecificRawStyleFieldNames
13274
+ ];
12710
13275
 
12711
13276
  // ../theme-core/src/site-styles/designState.ts
12712
13277
  var themeV2DesignStateSchemaVersion = 1;
@@ -12721,6 +13286,16 @@ var heroLegibilityStrategySchema = z23.enum([
12721
13286
  "scrim-gradient",
12722
13287
  "solid-panel"
12723
13288
  ]);
13289
+ var heroCompositionIntentSchema = z23.enum([
13290
+ "center",
13291
+ "bottom-left"
13292
+ ]);
13293
+ var heroTypographyScaleIntentSchema = z23.enum([
13294
+ "quiet",
13295
+ "editorial",
13296
+ "display",
13297
+ "poster"
13298
+ ]);
12724
13299
  var sectionHeightIntentSchema = z23.enum([
12725
13300
  "default",
12726
13301
  "banner",
@@ -12756,6 +13331,7 @@ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
12756
13331
  ]);
12757
13332
  var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
12758
13333
  var tileTreatmentSchema = z23.enum(tileTreatmentValues);
13334
+ var eventListTreatmentSchema = z23.enum(eventListTreatmentValues);
12759
13335
  var eyebrowTreatmentSchema = z23.enum(eyebrowTreatmentValues);
12760
13336
  function uniqueNonEmpty(values) {
12761
13337
  const uniqueValues = [...new Set(values)];
@@ -12797,10 +13373,13 @@ var blockDesignPlanSchema = z23.object({
12797
13373
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
12798
13374
  sectionHeight: sectionHeightIntentSchema.optional(),
12799
13375
  heroLegibility: heroLegibilityStrategySchema.optional(),
13376
+ heroComposition: heroCompositionIntentSchema.optional(),
13377
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
12800
13378
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
12801
13379
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
12802
13380
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
12803
13381
  tileTreatment: tileTreatmentSchema.optional(),
13382
+ eventListTreatment: eventListTreatmentSchema.optional(),
12804
13383
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
12805
13384
  }).strict();
12806
13385
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
@@ -14200,6 +14779,7 @@ function styledSection(config) {
14200
14779
  renderBackgroundImage = true,
14201
14780
  backgroundImageLoading,
14202
14781
  backgroundImageFetchPriority,
14782
+ allowOverflow = false,
14203
14783
  fullWidthPath
14204
14784
  } = config;
14205
14785
  const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
@@ -14234,7 +14814,7 @@ function styledSection(config) {
14234
14814
  // No fallback needed - transform handles all cases via defaultSpacing
14235
14815
  }
14236
14816
  },
14237
- allowOverflow: {
14817
+ allowOverflow: allowOverflow ? true : {
14238
14818
  $bind: {
14239
14819
  from: `${bindFrom}.background`,
14240
14820
  transforms: [{ id: "background.resolveAllowOverflow" }],
@@ -14918,6 +15498,14 @@ var tileTreatmentSet = new Set(tileTreatmentValues);
14918
15498
  function isTileTreatment(value) {
14919
15499
  return typeof value === "string" && tileTreatmentSet.has(value);
14920
15500
  }
15501
+ var eventListTreatmentClassMap = {
15502
+ plain: "",
15503
+ "lined-panel": "rb-event-list-treatment-lined-panel"
15504
+ };
15505
+ var eventListTreatmentSet = new Set(eventListTreatmentValues);
15506
+ function isEventListTreatment(value) {
15507
+ return typeof value === "string" && eventListTreatmentSet.has(value);
15508
+ }
14921
15509
  var sectionClassNameTransform = {
14922
15510
  id: "sectionStyles.resolveClassName",
14923
15511
  kind: "string",
@@ -14985,6 +15573,17 @@ var sectionClassNameTransform = {
14985
15573
  `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
14986
15574
  );
14987
15575
  }
15576
+ const eventListTreatment = input?.eventListTreatment;
15577
+ if (isEventListTreatment(eventListTreatment)) {
15578
+ const eventListTreatmentClass = eventListTreatmentClassMap[eventListTreatment];
15579
+ if (eventListTreatmentClass) {
15580
+ classes.push(eventListTreatmentClass);
15581
+ }
15582
+ } else if (typeof eventListTreatment === "string" && process.env.NODE_ENV !== "production") {
15583
+ console.warn(
15584
+ `[sectionStyles] Invalid eventListTreatment value in _sectionStyles: "${eventListTreatment}". Expected one of: ${eventListTreatmentValues.join(", ")}.`
15585
+ );
15586
+ }
14988
15587
  if (hasFixedFrameBackgroundMotion(input)) {
14989
15588
  classes.push(fixedFrameScopeClass);
14990
15589
  }
@@ -15420,6 +16019,35 @@ function sectionState(opts) {
15420
16019
  );
15421
16020
  }
15422
16021
 
16022
+ // ../blocks/src/system/node/fragments/headingDecoration.ts
16023
+ var defaultBindFrom = "_sectionStyles.headingDecoration";
16024
+ function headingDecoration({
16025
+ bindFrom = defaultBindFrom,
16026
+ family,
16027
+ placement,
16028
+ className
16029
+ }) {
16030
+ return el(
16031
+ "div",
16032
+ {
16033
+ "aria-hidden": "true",
16034
+ className: {
16035
+ $bind: {
16036
+ from: bindFrom,
16037
+ transforms: [
16038
+ {
16039
+ id: "ui.headingDecorationClassName",
16040
+ options: { baseClass: className, family }
16041
+ }
16042
+ ]
16043
+ }
16044
+ }
16045
+ },
16046
+ null,
16047
+ when(`${bindFrom}.placement`, { equals: placement })
16048
+ );
16049
+ }
16050
+
15423
16051
  // ../blocks/src/system/fragments/types.ts
15424
16052
  import { z as z27 } from "zod";
15425
16053
  var FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
@@ -16198,6 +16826,10 @@ var testimonialsHeadingFragment = defineFragment({
16198
16826
  when("content.heading"),
16199
16827
  bind("content.heading")
16200
16828
  ),
16829
+ headingDecoration({
16830
+ family: "short-center-rule",
16831
+ placement: "under-centered-heading"
16832
+ }),
16201
16833
  text(
16202
16834
  {
16203
16835
  as: "p",
@@ -16869,6 +17501,41 @@ var faqHeadingFragment = defineFragment({
16869
17501
  });
16870
17502
 
16871
17503
  // ../blocks/src/system/fragments/library/faqAccordion.ts
17504
+ function createFaqAccordionLayout(options = {}) {
17505
+ return accordionList({
17506
+ collection: "content.items",
17507
+ itemName: "faqItem",
17508
+ indexName: "faqIndex",
17509
+ accordionProps: {
17510
+ className: options.rootClassName ?? "accordion-root",
17511
+ type: "single",
17512
+ collapsible: true
17513
+ },
17514
+ itemProps: {
17515
+ className: {
17516
+ $bind: {
17517
+ from: "content._cardStyles",
17518
+ transforms: [
17519
+ {
17520
+ id: "boxStyles.all",
17521
+ options: {
17522
+ axis: "all",
17523
+ includeSpacing: false,
17524
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
17525
+ }
17526
+ }
17527
+ ]
17528
+ },
17529
+ fallback: "rb-faq-item"
17530
+ },
17531
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17532
+ // Legacy theme accordion style
17533
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17534
+ },
17535
+ triggerFrom: "faqItem.question",
17536
+ contentFrom: "faqItem.answer"
17537
+ });
17538
+ }
16872
17539
  var faqAccordionFragment = defineFragment({
16873
17540
  id: "faqAccordion",
16874
17541
  title: "FAQ Accordion",
@@ -16902,40 +17569,7 @@ var faqAccordionFragment = defineFragment({
16902
17569
  }
16903
17570
  }
16904
17571
  ],
16905
- layout: accordionList({
16906
- collection: "content.items",
16907
- itemName: "faqItem",
16908
- indexName: "faqIndex",
16909
- accordionProps: {
16910
- className: "accordion-root",
16911
- // CSS-first: all styling handled by theme CSS
16912
- type: "single",
16913
- collapsible: true
16914
- },
16915
- itemProps: {
16916
- className: {
16917
- $bind: {
16918
- from: "content._cardStyles",
16919
- transforms: [
16920
- {
16921
- id: "boxStyles.all",
16922
- options: {
16923
- axis: "all",
16924
- includeSpacing: false,
16925
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden rb-border"
16926
- }
16927
- }
16928
- ]
16929
- },
16930
- fallback: "rb-faq-item"
16931
- },
16932
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
16933
- // Legacy theme accordion style
16934
- iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
16935
- },
16936
- triggerFrom: "faqItem.question",
16937
- contentFrom: "faqItem.answer"
16938
- })
17572
+ layout: createFaqAccordionLayout()
16939
17573
  });
16940
17574
 
16941
17575
  // ../blocks/src/system/fragments/library/card.ts
@@ -17988,6 +18622,7 @@ var microLayout = styledSection({
17988
18622
  function splitLayoutWith(children) {
17989
18623
  return styledSection({
17990
18624
  children: styledContainer({
18625
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
17991
18626
  children: {
17992
18627
  type: "grid",
17993
18628
  props: {
@@ -18012,6 +18647,7 @@ function splitLayoutWith(children) {
18012
18647
  // The split variants render the image as a real grid column, so suppress
18013
18648
  // the default absolute background image layer while keeping color/overlay.
18014
18649
  renderBackgroundImage: false,
18650
+ allowOverflow: true,
18015
18651
  baseClass: ""
18016
18652
  });
18017
18653
  }
@@ -18165,6 +18801,21 @@ function introHeading(className) {
18165
18801
  bind("content.title")
18166
18802
  );
18167
18803
  }
18804
+ function introHeadingGroup(className) {
18805
+ return stack(
18806
+ {
18807
+ gap: "sm",
18808
+ className: "rb-intro-heading-group"
18809
+ },
18810
+ [
18811
+ introHeading(className),
18812
+ headingDecoration({
18813
+ family: "organic-squiggle",
18814
+ placement: "after-heading"
18815
+ })
18816
+ ]
18817
+ );
18818
+ }
18168
18819
  function introBody(className = "rb-prose rb-max-w-none") {
18169
18820
  return richText({ className }, bind("content.body"));
18170
18821
  }
@@ -18183,6 +18834,10 @@ function introCopyStack(options = {}) {
18183
18834
  },
18184
18835
  [
18185
18836
  introHeading(options.headingClassName ?? "rb-intro-title"),
18837
+ headingDecoration({
18838
+ family: "organic-squiggle",
18839
+ placement: "after-heading"
18840
+ }),
18186
18841
  introBody(options.bodyClassName),
18187
18842
  introCtas(options.ctaJustify)
18188
18843
  ]
@@ -18222,7 +18877,7 @@ var statementCopyLayout = styledSection({
18222
18877
  className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
18223
18878
  },
18224
18879
  [
18225
- introHeading("rb-intro-title rb-max-w-xl"),
18880
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18226
18881
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18227
18882
  introBody(),
18228
18883
  introCtas("start")
@@ -18243,7 +18898,7 @@ var statementMediaLayout = styledSection({
18243
18898
  className: "rb-intro rb-intro-statement-media rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-3 rb-lg-items-center"
18244
18899
  },
18245
18900
  [
18246
- introHeading("rb-intro-title rb-max-w-xl"),
18901
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18247
18902
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18248
18903
  introBody(),
18249
18904
  introCtas("start")
@@ -19245,6 +19900,9 @@ function isNodeDefinitionArray(layout) {
19245
19900
  }
19246
19901
  var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
19247
19902
  var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
19903
+ var questionColumnsAccordionLayout = createFaqAccordionLayout({
19904
+ rootClassName: "accordion-root rb-faq-question-columns rb-grid rb-grid-cols-1 rb-gap-4 rb-lg-grid-cols-2"
19905
+ });
19248
19906
  var defaultLayout = styledSection({
19249
19907
  children: styledContainer({
19250
19908
  baseClassName: "rb-relative rb-isolate",
@@ -19258,11 +19916,24 @@ var twoColumnLayout = styledSection({
19258
19916
  children: el(
19259
19917
  "div",
19260
19918
  {
19261
- className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19919
+ className: "rb-faq-split-heading rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19262
19920
  },
19263
19921
  [
19264
- el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
19265
- el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
19922
+ el("div", { className: "rb-faq-split-heading-copy" }, [headingLayout]),
19923
+ el("div", { className: "rb-faq-split-heading-accordion" }, [accordionLayout])
19924
+ ]
19925
+ )
19926
+ }),
19927
+ baseClass: ""
19928
+ });
19929
+ var questionColumnsLayout = styledSection({
19930
+ children: styledContainer({
19931
+ baseClassName: "rb-relative rb-isolate",
19932
+ children: stack(
19933
+ { gap: "xl", className: "rb-w-full" },
19934
+ [
19935
+ headingLayout,
19936
+ questionColumnsAccordionLayout
19266
19937
  ]
19267
19938
  )
19268
19939
  }),
@@ -19287,7 +19958,8 @@ var faqManifest = createBlockManifest({
19287
19958
  layout: defaultLayout,
19288
19959
  variants: {
19289
19960
  default: defaultLayout,
19290
- "two-column": twoColumnLayout
19961
+ "two-column": twoColumnLayout,
19962
+ "question-columns": questionColumnsLayout
19291
19963
  },
19292
19964
  defaultVariant: "default",
19293
19965
  variantOptions: {
@@ -19298,6 +19970,10 @@ var faqManifest = createBlockManifest({
19298
19970
  "two-column": {
19299
19971
  label: "Two column",
19300
19972
  description: "A left heading column with FAQ items on the right."
19973
+ },
19974
+ "question-columns": {
19975
+ label: "Question columns",
19976
+ description: "A full-width heading above FAQ items split into two columns."
19301
19977
  }
19302
19978
  },
19303
19979
  description: "Accordion of frequently asked questions and answers.",
@@ -19419,9 +20095,21 @@ var eyebrowTreatmentClassMap = {
19419
20095
  "accent-pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent rb-eyebrow-treatment-pill-bounce"
19420
20096
  };
19421
20097
  var eyebrowTreatmentSet = new Set(eyebrowTreatmentValues);
20098
+ var headingDecorationFamilySet = new Set(visibleHeadingDecorationFamilyValues);
20099
+ var headingDecorationPlacementSet = new Set(visibleHeadingDecorationPlacementValues);
20100
+ var headingDecorationColorTokenSet = new Set(headingDecorationColorTokenValues);
19422
20101
  function isEyebrowTreatment(value) {
19423
20102
  return typeof value === "string" && eyebrowTreatmentSet.has(value);
19424
20103
  }
20104
+ function isHeadingDecorationFamily(value) {
20105
+ return typeof value === "string" && headingDecorationFamilySet.has(value);
20106
+ }
20107
+ function isHeadingDecorationPlacement(value) {
20108
+ return typeof value === "string" && headingDecorationPlacementSet.has(value);
20109
+ }
20110
+ function isHeadingDecorationColorToken(value) {
20111
+ return typeof value === "string" && headingDecorationColorTokenSet.has(value);
20112
+ }
19425
20113
  var imageGalleryCornerClassMap = {
19426
20114
  none: "",
19427
20115
  sm: "rb-rounded-sm",
@@ -19525,6 +20213,10 @@ var sectionStateToneTransform = {
19525
20213
  summary: "Map semantic section-state kind to feedback tone",
19526
20214
  run: (value) => sectionStateToneFromUnknown(value)
19527
20215
  };
20216
+ var heroTitleLengthThresholds = {
20217
+ medium: { maxCharacters: 42, maxWords: 6 },
20218
+ long: { maxCharacters: 78, maxWords: 11 }
20219
+ };
19528
20220
  function isPlainObject(value) {
19529
20221
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
19530
20222
  }
@@ -19532,6 +20224,14 @@ function readString(obj, key) {
19532
20224
  const v = obj[key];
19533
20225
  return typeof v === "string" ? v : void 0;
19534
20226
  }
20227
+ function resolveGeneratedHeroLayoutStyles(content) {
20228
+ const raw = content._heroLayoutStyles;
20229
+ return isPlainObject(raw) ? raw : null;
20230
+ }
20231
+ function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
20232
+ const generated = resolveGeneratedHeroLayoutStyles(content);
20233
+ return generated && typeof generated[generatedKey] === "string" ? generated[generatedKey] : readString(content, fallbackKey);
20234
+ }
19535
20235
  function resolveHeroVariant(content) {
19536
20236
  const variant = readString(content, "variant");
19537
20237
  if (variant && variant.trim()) return variant.trim();
@@ -19540,14 +20240,14 @@ function resolveHeroVariant(content) {
19540
20240
  return null;
19541
20241
  }
19542
20242
  function resolveHeroContentAlignment(content) {
19543
- const raw = readString(content, "contentAlignment");
20243
+ const raw = readHeroLayoutString(content, "contentAlignment");
19544
20244
  if (raw === "left" || raw === "center" || raw === "right") return raw;
19545
20245
  const variant = resolveHeroVariant(content);
19546
20246
  if (variant === "split" || variant === "splitReverse") return "left";
19547
20247
  return "center";
19548
20248
  }
19549
20249
  function resolveHeroVerticalAlignment(content) {
19550
- const raw = readString(content, "verticalAlignment");
20250
+ const raw = readHeroLayoutString(content, "verticalAlignment");
19551
20251
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
19552
20252
  const sectionStyles = asPartialObject(content._sectionStyles);
19553
20253
  const minHeight = sectionStyles?.minHeight;
@@ -19557,11 +20257,29 @@ function resolveHeroVerticalAlignment(content) {
19557
20257
  return "top";
19558
20258
  }
19559
20259
  function resolveHeroContentMaxWidth(content) {
19560
- const raw = readString(content, "contentMaxWidth");
20260
+ const raw = readHeroLayoutString(content, "contentMaxWidth");
19561
20261
  if (raw === "default" || raw === "narrow" || raw === "medium" || raw === "wide")
19562
20262
  return raw;
19563
20263
  return "default";
19564
20264
  }
20265
+ function resolveHeroTypographyScale(content) {
20266
+ const raw = readHeroLayoutString(
20267
+ content,
20268
+ "typographyScale",
20269
+ "heroTypographyScale"
20270
+ );
20271
+ if (raw === "quiet" || raw === "editorial" || raw === "display" || raw === "poster") {
20272
+ return raw;
20273
+ }
20274
+ return null;
20275
+ }
20276
+ function resolveHeroTitleLength(content) {
20277
+ const headline = readString(content, "headline")?.trim() ?? "";
20278
+ const wordCount = headline.length === 0 ? 0 : headline.split(/\s+/).length;
20279
+ if (headline.length > heroTitleLengthThresholds.long.maxCharacters || wordCount > heroTitleLengthThresholds.long.maxWords) return "long";
20280
+ if (headline.length > heroTitleLengthThresholds.medium.maxCharacters || wordCount > heroTitleLengthThresholds.medium.maxWords) return "medium";
20281
+ return "short";
20282
+ }
19565
20283
  var heroContentWrapperClassSchema = z33.object({
19566
20284
  base: z33.string().optional()
19567
20285
  });
@@ -19574,6 +20292,8 @@ var heroContentWrapperClassTransform = {
19574
20292
  const content = isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {};
19575
20293
  const alignment = resolveHeroContentAlignment(content);
19576
20294
  const maxWidth = resolveHeroContentMaxWidth(content);
20295
+ const typographyScale = resolveHeroTypographyScale(content);
20296
+ const titleLength = resolveHeroTitleLength(content);
19577
20297
  const textAlignClass = alignment === "center" ? "rb-text-center" : alignment === "right" ? "rb-text-right" : "rb-text-left";
19578
20298
  const maxWidthClass = maxWidth === "narrow" ? "rb-max-w-2xl" : maxWidth === "medium" ? "rb-max-w-3xl" : maxWidth === "wide" ? "rb-max-w-5xl" : "";
19579
20299
  const positionClass = alignment === "center" ? "rb-mx-auto" : alignment === "right" ? "rb-ml-auto" : "";
@@ -19581,7 +20301,9 @@ var heroContentWrapperClassTransform = {
19581
20301
  options?.base,
19582
20302
  textAlignClass,
19583
20303
  maxWidthClass,
19584
- positionClass
20304
+ positionClass,
20305
+ typographyScale ? `rb-hero-typography-${typographyScale}` : "",
20306
+ `rb-hero-title-${titleLength}`
19585
20307
  ]);
19586
20308
  }
19587
20309
  };
@@ -19881,11 +20603,67 @@ var uiTransforms = [
19881
20603
  const treatment = isEyebrowTreatment(value) ? value : "plain";
19882
20604
  return joinClasses3([baseClass, eyebrowTreatmentClassMap[treatment]]);
19883
20605
  }
20606
+ },
20607
+ {
20608
+ id: "ui.headingDecorationClassName",
20609
+ kind: "string",
20610
+ summary: "Apply constrained Theme V2 heading decoration classes",
20611
+ run: (value, options) => {
20612
+ const baseClass = typeof options?.baseClass === "string" && options.baseClass.trim() ? options.baseClass : "rb-heading-decoration";
20613
+ const decoration = asPartialObject(value);
20614
+ const family = isHeadingDecorationFamily(decoration?.family) ? decoration.family : null;
20615
+ const allowedFamily = isHeadingDecorationFamily(options?.family) ? options.family : null;
20616
+ const placement = isHeadingDecorationPlacement(decoration?.placement) ? decoration.placement : null;
20617
+ const colorToken = isHeadingDecorationColorToken(decoration?.colorToken) ? decoration.colorToken : "primary";
20618
+ if (!family || !placement) return "rb-hidden";
20619
+ if (allowedFamily && family !== allowedFamily) return "rb-hidden";
20620
+ return joinClasses3([
20621
+ baseClass,
20622
+ `rb-heading-decoration-${family}`,
20623
+ `rb-heading-decoration-placement-${placement}`,
20624
+ `rb-heading-decoration-color-${colorToken}`
20625
+ ]);
20626
+ }
19884
20627
  }
19885
20628
  ];
19886
20629
 
19887
20630
  // ../blocks/src/system/transforms/registry/layout.ts
19888
20631
  import { z as z34 } from "zod";
20632
+
20633
+ // ../theme-core/src/siteChromePlacement.ts
20634
+ var HEADER_POSITIONINGS = ["static", "sticky", "fixed"];
20635
+ function parseHeaderPositioning(value) {
20636
+ return isHeaderPositioning(value) ? value : "static";
20637
+ }
20638
+ function isHeaderPositioning(value) {
20639
+ return typeof value === "string" && HEADER_POSITIONINGS.includes(value);
20640
+ }
20641
+ function planSiteChromePlacement(positioning) {
20642
+ switch (positioning) {
20643
+ case "static":
20644
+ return {
20645
+ kind: "static",
20646
+ headerRootClassName: null,
20647
+ standaloneShellClassName: null
20648
+ };
20649
+ case "sticky":
20650
+ return {
20651
+ kind: "sticky",
20652
+ headerRootClassName: "rb-sticky rb-top-0",
20653
+ standaloneShellClassName: "sticky top-0 z-40 w-full"
20654
+ };
20655
+ case "fixed":
20656
+ return {
20657
+ kind: "fixed",
20658
+ headerRootClassName: "rb-fixed rb-top-0 rb-left-0 rb-right-0",
20659
+ standaloneShellClassName: "fixed left-0 right-0 top-0 z-40 w-full"
20660
+ };
20661
+ default:
20662
+ return assertNever(positioning);
20663
+ }
20664
+ }
20665
+
20666
+ // ../blocks/src/system/transforms/registry/layout.ts
19889
20667
  var joinClasses4 = (parts) => parts.filter(
19890
20668
  (part) => typeof part === "string" && part.trim().length > 0
19891
20669
  ).join(" ").replace(/\s+/g, " ").trim();
@@ -20001,32 +20779,35 @@ var headerRootClassTransform = {
20001
20779
  ...options
20002
20780
  };
20003
20781
  const content = asPartialObject(value) ?? {};
20004
- const positioning = typeof content.positioning === "string" ? content.positioning : "static";
20782
+ const positioning = parseHeaderPositioning(content.positioning);
20783
+ const placement = planSiteChromePlacement(positioning);
20005
20784
  const shrinkOnScroll = Boolean(content.shrinkOnScroll);
20006
20785
  const header = asPartialObject(value);
20007
20786
  const visuals = resolveHeaderVisualStyles(header, context.theme);
20008
20787
  const navContainerType = header?.navContainer?.type ?? "none";
20009
20788
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
20010
20789
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
20011
- const classes = [
20012
- config.base,
20013
- backgroundClass
20014
- ];
20790
+ const classes = [config.base, backgroundClass];
20015
20791
  if (!hasContainedNav) {
20016
20792
  if (config.blur) classes.push(config.blur);
20017
20793
  if (config.blurSupport) classes.push(config.blurSupport);
20018
20794
  }
20019
- if (positioning === "sticky") {
20795
+ if (placement.kind === "sticky") {
20020
20796
  classes.push(
20021
20797
  visuals.isTransparent ? config.stickyTransparent : config.sticky
20022
20798
  );
20023
- } else if (positioning === "fixed") {
20799
+ } else if (placement.kind === "fixed") {
20024
20800
  classes.push(config.fixed);
20025
20801
  }
20026
- if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
20802
+ if (shrinkOnScroll && placement.kind !== "static") {
20027
20803
  classes.push(config.shrink);
20028
20804
  }
20029
- const VALID_VARIANTS = ["classic", "centered", "transparent", "floating", "editorial"];
20805
+ const VALID_VARIANTS = [
20806
+ "classic",
20807
+ "centered",
20808
+ "transparent",
20809
+ "floating"
20810
+ ];
20030
20811
  const variant = header?.variant;
20031
20812
  if (variant && VALID_VARIANTS.includes(variant)) {
20032
20813
  classes.push(`header-variant-${variant}`);
@@ -20550,6 +21331,10 @@ function desktopOnlyDisplay(display) {
20550
21331
  return `rb-hidden ${LARGE_DISPLAY_CLASSES[display]}`;
20551
21332
  }
20552
21333
 
21334
+ // ../theme-core/src/siteChromeOverlayClearance.ts
21335
+ var SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
21336
+ var SITE_CHROME_VISIBLE_HEADER_SELECTOR = `[${SITE_CHROME_VISIBLE_HEADER_ATTR}="true"]`;
21337
+
20553
21338
  // ../blocks/src/system/blocks/site-header.ts
20554
21339
  var logoRow = link(
20555
21340
  {
@@ -20644,15 +21429,21 @@ var mobileCta = ctaButton({
20644
21429
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
20645
21430
  {
20646
21431
  type: "div",
20647
- props: { className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
21432
+ props: {
21433
+ className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
21434
+ }
20648
21435
  },
20649
21436
  {
20650
21437
  type: "div",
20651
- props: { className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
21438
+ props: {
21439
+ className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
21440
+ }
20652
21441
  },
20653
21442
  {
20654
21443
  type: "div",
20655
- props: { className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
21444
+ props: {
21445
+ className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
21446
+ }
20656
21447
  }
20657
21448
  ]);
20658
21449
  var mobileToggleButton = {
@@ -20816,6 +21607,7 @@ var transparentLayout = inline(
20816
21607
  );
20817
21608
  var floatingLayout = inline(
20818
21609
  {
21610
+ [SITE_CHROME_VISIBLE_HEADER_ATTR]: "true",
20819
21611
  className: bindProp("$root.theme.header.maxWidth", {
20820
21612
  transforms: pipe(
20821
21613
  tx("layout.maxWidthClass", {
@@ -20835,28 +21627,6 @@ var floatingLayout = inline(
20835
21627
  ],
20836
21628
  when("$root.theme.header.variant", { equals: "floating" })
20837
21629
  );
20838
- var editorialLayout = stack(
20839
- {
20840
- gap: "md",
20841
- align: "center",
20842
- className: bindProp("$root.theme.header.maxWidth", {
20843
- transforms: pipe(
20844
- tx("layout.maxWidthClass", {
20845
- base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
20846
- })
20847
- ),
20848
- fallback: `rb-container rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
20849
- })
20850
- },
20851
- [
20852
- centeredLogoRow,
20853
- createNavRow(
20854
- `${desktopOnlyDisplay("flex")} rb-flex-wrap rb-justify-center rb-gap-x-8 rb-gap-y-3`,
20855
- "center"
20856
- )
20857
- ],
20858
- when("$root.theme.header.variant", { equals: "editorial" })
20859
- );
20860
21630
  var headerLayout = headerSection(
20861
21631
  {
20862
21632
  background: bindProp("$root.theme.header", {
@@ -20870,10 +21640,7 @@ var headerLayout = headerSection(
20870
21640
  }),
20871
21641
  style: bindProp("$root.theme.header", {
20872
21642
  transforms: pipe(tx("layout.headerRootStyle")),
20873
- fallback: mergeStyles(
20874
- textColorStyle("text"),
20875
- borderColorStyle("border")
20876
- )
21643
+ fallback: mergeStyles(textColorStyle("text"), borderColorStyle("border"))
20877
21644
  })
20878
21645
  },
20879
21646
  [
@@ -20882,7 +21649,6 @@ var headerLayout = headerSection(
20882
21649
  centeredLayout,
20883
21650
  transparentLayout,
20884
21651
  floatingLayout,
20885
- editorialLayout,
20886
21652
  mobileOverlay
20887
21653
  ],
20888
21654
  props({
@@ -21787,6 +22553,10 @@ var sectionHeading = stack(
21787
22553
  when("content.title"),
21788
22554
  bind("content.title")
21789
22555
  ),
22556
+ headingDecoration({
22557
+ family: "short-center-rule",
22558
+ placement: "under-centered-heading"
22559
+ }),
21790
22560
  richText(
21791
22561
  {
21792
22562
  className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
@@ -24210,7 +24980,7 @@ var COLUMN_CLASSES = {
24210
24980
  };
24211
24981
  function getContainerClass(layout, columns) {
24212
24982
  if (layout === "compact") {
24213
- return "event-listing-compact-container rb-flex rb-flex-col rb-gap-2";
24983
+ return "event-listing-compact-container rb-flex rb-flex-col";
24214
24984
  }
24215
24985
  if (layout === "stack") {
24216
24986
  return "rb-flex rb-flex-col rb-gap-6";
@@ -27038,6 +27808,7 @@ import { z as z53 } from "zod";
27038
27808
  var storedProductCartItemSchema = z53.object({
27039
27809
  kind: z53.literal("product"),
27040
27810
  productId: z53.string().min(1),
27811
+ productCategoryId: z53.string().min(1).optional().nullable(),
27041
27812
  variantId: z53.string().min(1).optional().nullable(),
27042
27813
  title: z53.string().min(1),
27043
27814
  variantTitle: z53.string().optional().nullable(),
@@ -29542,6 +30313,10 @@ var scheduleTileTreatments = [
29542
30313
  "quiet",
29543
30314
  "brand-depth"
29544
30315
  ];
30316
+ var eventListTreatments = [
30317
+ "plain",
30318
+ "lined-panel"
30319
+ ];
29545
30320
  function scheduleDetailsCapable() {
29546
30321
  return declareBlockDesignCapability({
29547
30322
  sectionSurfaces: "supported",
@@ -29550,6 +30325,14 @@ function scheduleDetailsCapable() {
29550
30325
  tileTreatments: scheduleTileTreatments
29551
30326
  });
29552
30327
  }
30328
+ function eventListCapable() {
30329
+ return declareBlockDesignCapability({
30330
+ sectionSurfaces: "supported",
30331
+ contentFrames: ["plain"],
30332
+ itemSurfaces: "unsupported",
30333
+ eventListTreatments
30334
+ });
30335
+ }
29553
30336
  function defaultBoundaryBias(visualWeight) {
29554
30337
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
29555
30338
  }
@@ -29769,7 +30552,8 @@ var systemBlockDefinitionsRaw = [
29769
30552
  flow: bodyFlow,
29770
30553
  layoutProfiles: [
29771
30554
  layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
29772
- layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
30555
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" }),
30556
+ layoutProfile({ variantKey: "question-columns", family: "grid", weight: "standard" })
29773
30557
  ]
29774
30558
  })),
29775
30559
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
@@ -29863,11 +30647,11 @@ var systemBlockDefinitionsRaw = [
29863
30647
  flow: offeringsFlow,
29864
30648
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "centered", weight: "featured" })]
29865
30649
  })),
29866
- withDesignCapability("block.event-listing", eventListingBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30650
+ withDesignCapability("block.event-listing", eventListingBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
29867
30651
  flow: offeringsFlow,
29868
30652
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
29869
30653
  })),
29870
- withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30654
+ withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
29871
30655
  flow: offeringsFlow,
29872
30656
  layoutProfiles: [
29873
30657
  layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
@@ -30939,6 +31723,15 @@ ${root} {
30939
31723
  `;
30940
31724
  }
30941
31725
 
31726
+ // ../theme-core/src/runtime/themeCssVarNames.ts
31727
+ var THEME_RADIUS_CSS_VARS = {
31728
+ block: "--rb-block-radius",
31729
+ button: "--rb-button-radius",
31730
+ input: "--rb-input-radius",
31731
+ legacyCard: "--radius-card",
31732
+ legacyControl: "--radius-control"
31733
+ };
31734
+
30942
31735
  // ../theme-core/src/blocks/vars/customer-portal.ts
30943
31736
  function generateCustomerPortalVars({
30944
31737
  themeId
@@ -30952,6 +31745,11 @@ ${root} {
30952
31745
  --cp-muted: rgb(var(--tb-mutedText));
30953
31746
  --cp-border: rgb(var(--tb-border));
30954
31747
  --cp-shadow: var(--shadow-elev);
31748
+ --cp-primary: rgb(var(--tb-primary));
31749
+ --cp-primary-hover: rgb(var(--tb-primary-700, var(--tb-primary)));
31750
+ --cp-error: rgb(var(--tb-destructive));
31751
+ --cp-card-radius: var(${THEME_RADIUS_CSS_VARS.block}, var(${THEME_RADIUS_CSS_VARS.legacyCard}, 0.75rem));
31752
+ --cp-control-radius: var(${THEME_RADIUS_CSS_VARS.input}, var(${THEME_RADIUS_CSS_VARS.legacyControl}, 0.5rem));
30955
31753
 
30956
31754
  /* Shared tab bar (underline style) */
30957
31755
  --rb-tab-border-width: 1px;
@@ -31002,7 +31800,7 @@ ${root} {
31002
31800
  --rb-modal-bg: var(--cp-card-bg);
31003
31801
  --rb-modal-border: var(--cp-card-border);
31004
31802
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
31005
- --rb-modal-radius: var(--radius-card);
31803
+ --rb-modal-radius: var(--cp-card-radius);
31006
31804
  --rb-modal-max-width: 560px;
31007
31805
 
31008
31806
  /* Header */
@@ -32383,6 +33181,9 @@ import { jsx as jsx5 } from "react/jsx-runtime";
32383
33181
  import * as React from "react";
32384
33182
  import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
32385
33183
 
33184
+ // ../theme-core/src/fonts/uploadFormat.ts
33185
+ var MAX_FONT_UPLOAD_BYTES = 5 * 1024 * 1024;
33186
+
32386
33187
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
32387
33188
  import { z as z60 } from "zod";
32388
33189
  var themeBridgeConfigSchema = z60.object({
@@ -32829,6 +33630,7 @@ var COURSE_ENROLLMENT_REFUND_FAILED_CODES = [
32829
33630
  ];
32830
33631
 
32831
33632
  // ../api/src/bookingVerticals.ts
33633
+ import { z as z63 } from "zod";
32832
33634
  var VERTICAL_IDS = [
32833
33635
  "yoga_wellness",
32834
33636
  "fitness_pt",
@@ -32907,6 +33709,132 @@ var VERTICAL_ID_SET = new Set(VERTICAL_IDS);
32907
33709
  var VERTICAL_PRESET_ID_SET = new Set(
32908
33710
  VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id)
32909
33711
  );
33712
+ function parseVerticalId(value) {
33713
+ return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
33714
+ }
33715
+ function parseVerticalPresetId(value) {
33716
+ return typeof value === "string" && VERTICAL_PRESET_ID_SET.has(value) ? value : null;
33717
+ }
33718
+ function getVerticalPresetDefinition(presetId) {
33719
+ const definition = VERTICAL_BOOKING_PRESETS.find((presetDefinition) => presetDefinition.id === presetId);
33720
+ if (!definition) {
33721
+ throw new Error(`Unhandled vertical preset id: ${presetId}`);
33722
+ }
33723
+ return definition;
33724
+ }
33725
+ function toNonEmptyVerticalPresetIds(presetIds) {
33726
+ const firstPresetId = presetIds[0];
33727
+ return firstPresetId ? [firstPresetId, ...presetIds.slice(1)] : null;
33728
+ }
33729
+ function createConfiguredSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33730
+ return {
33731
+ verticalId,
33732
+ selectedPresetIds
33733
+ };
33734
+ }
33735
+ function createSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33736
+ const nonEmptyPresetIds = toNonEmptyVerticalPresetIds(selectedPresetIds);
33737
+ return nonEmptyPresetIds ? createConfiguredSiteVerticalBookingConfig(verticalId, nonEmptyPresetIds) : null;
33738
+ }
33739
+ function resolveSiteVerticalBookingConfig(rawConfig) {
33740
+ if (!rawConfig) {
33741
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33742
+ }
33743
+ const verticalId = parseVerticalId(rawConfig.verticalId);
33744
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33745
+ const selectedPresetIds = rawPresetIds.map(parseVerticalPresetId).filter((presetId) => Boolean(presetId));
33746
+ const config = {
33747
+ verticalId,
33748
+ selectedPresetIds
33749
+ };
33750
+ if (!verticalId && selectedPresetIds.length === 0) {
33751
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33752
+ }
33753
+ const issues = getSiteVerticalConfigIssues(rawConfig, config);
33754
+ if (issues.length > 0) {
33755
+ return { kind: "invalid", config, issues };
33756
+ }
33757
+ const configuredConfig = verticalId ? createSiteVerticalBookingConfig(verticalId, selectedPresetIds) : null;
33758
+ if (!configuredConfig) {
33759
+ return { kind: "invalid", config, issues: ["empty_selected_presets"] };
33760
+ }
33761
+ return {
33762
+ kind: "configured",
33763
+ config: configuredConfig,
33764
+ selectedPresets: configuredConfig.selectedPresetIds.map(getVerticalPresetDefinition)
33765
+ };
33766
+ }
33767
+ function getSiteVerticalConfigIssues(rawConfig, config) {
33768
+ const issues = /* @__PURE__ */ new Set();
33769
+ if (rawConfig.verticalId != null && !config.verticalId) {
33770
+ issues.add("unknown_vertical");
33771
+ }
33772
+ if (!config.verticalId && config.selectedPresetIds.length > 0) {
33773
+ issues.add("missing_vertical");
33774
+ }
33775
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33776
+ if (rawPresetIds.some((presetId) => parseVerticalPresetId(presetId) === null)) {
33777
+ issues.add("unknown_preset");
33778
+ }
33779
+ if (config.verticalId && config.selectedPresetIds.length === 0) {
33780
+ issues.add("empty_selected_presets");
33781
+ }
33782
+ const seenBehaviours = /* @__PURE__ */ new Set();
33783
+ for (const presetId of config.selectedPresetIds) {
33784
+ const presetDefinition = getVerticalPresetDefinition(presetId);
33785
+ if (config.verticalId && presetDefinition.verticalId !== config.verticalId) {
33786
+ issues.add("preset_vertical_mismatch");
33787
+ }
33788
+ if (presetDefinition.availability === "future") {
33789
+ issues.add("future_preset_selected");
33790
+ }
33791
+ if (seenBehaviours.has(presetDefinition.canonicalBehaviour)) {
33792
+ issues.add("duplicate_canonical_behaviour");
33793
+ }
33794
+ seenBehaviours.add(presetDefinition.canonicalBehaviour);
33795
+ }
33796
+ return [...issues];
33797
+ }
33798
+ var VerticalIdSchema = z63.string().trim().transform((value, ctx) => {
33799
+ const parsed = parseVerticalId(value);
33800
+ if (!parsed) {
33801
+ ctx.addIssue({
33802
+ code: z63.ZodIssueCode.custom,
33803
+ message: "Unknown booking vertical"
33804
+ });
33805
+ return z63.NEVER;
33806
+ }
33807
+ return parsed;
33808
+ });
33809
+ var VerticalPresetIdSchema = z63.string().trim().transform((value, ctx) => {
33810
+ const parsed = parseVerticalPresetId(value);
33811
+ if (!parsed) {
33812
+ ctx.addIssue({
33813
+ code: z63.ZodIssueCode.custom,
33814
+ message: "Unknown booking preset"
33815
+ });
33816
+ return z63.NEVER;
33817
+ }
33818
+ return parsed;
33819
+ });
33820
+ var BookingVerticalConfigSchema = z63.object({
33821
+ verticalId: VerticalIdSchema.nullable(),
33822
+ selectedPresetIds: z63.array(VerticalPresetIdSchema).max(20)
33823
+ }).transform((value, ctx) => {
33824
+ const resolved = resolveSiteVerticalBookingConfig(value);
33825
+ if (resolved.kind === "invalid") {
33826
+ ctx.addIssue({
33827
+ code: z63.ZodIssueCode.custom,
33828
+ message: `Invalid booking vertical config: ${resolved.issues.join(", ")}`
33829
+ });
33830
+ return z63.NEVER;
33831
+ }
33832
+ return resolved.config;
33833
+ });
33834
+ var DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
33835
+ verticalId: null,
33836
+ selectedPresetIds: []
33837
+ };
32910
33838
  function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
32911
33839
  return {
32912
33840
  id,
@@ -32926,51 +33854,51 @@ function isRecord3(value) {
32926
33854
  }
32927
33855
 
32928
33856
  // ../api/src/appointmentSetup.ts
32929
- import { z as z63 } from "zod";
33857
+ import { z as z64 } from "zod";
32930
33858
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
32931
- var appointmentSetupRefSchema = z63.discriminatedUnion("kind", [
32932
- z63.object({ kind: z63.literal("existing"), id: z63.string().min(1) }),
32933
- z63.object({ kind: z63.literal("new"), draftId: z63.string().min(1) })
33859
+ var appointmentSetupRefSchema = z64.discriminatedUnion("kind", [
33860
+ z64.object({ kind: z64.literal("existing"), id: z64.string().min(1) }),
33861
+ z64.object({ kind: z64.literal("new"), draftId: z64.string().min(1) })
32934
33862
  ]);
32935
- var appointmentSetupVenueChoiceSchema = z63.discriminatedUnion("kind", [
32936
- z63.object({ kind: z63.literal("none") }),
32937
- z63.object({ kind: z63.literal("existing"), venueId: z63.string().min(1) }),
32938
- z63.object({
32939
- kind: z63.literal("create"),
32940
- draftId: z63.string().min(1),
32941
- title: z63.string().trim().min(1),
32942
- description: z63.string().nullable(),
32943
- timezone: z63.string().trim().min(1).nullable(),
32944
- addressJson: z63.record(z63.string(), z63.unknown()),
32945
- locationJson: z63.object({ lat: z63.number(), lng: z63.number() }).nullable()
33863
+ var appointmentSetupVenueChoiceSchema = z64.discriminatedUnion("kind", [
33864
+ z64.object({ kind: z64.literal("none") }),
33865
+ z64.object({ kind: z64.literal("existing"), venueId: z64.string().min(1) }),
33866
+ z64.object({
33867
+ kind: z64.literal("create"),
33868
+ draftId: z64.string().min(1),
33869
+ title: z64.string().trim().min(1),
33870
+ description: z64.string().nullable(),
33871
+ timezone: z64.string().trim().min(1).nullable(),
33872
+ addressJson: z64.record(z64.string(), z64.unknown()),
33873
+ locationJson: z64.object({ lat: z64.number(), lng: z64.number() }).nullable()
32946
33874
  })
32947
33875
  ]);
32948
- var appointmentSetupPaymentDraftSchema = z63.object({
32949
- priceType: z63.union([z63.literal("free"), z63.literal("paid")])
32950
- });
32951
- var appointmentSetupServiceAssignmentDraftSchema = z63.discriminatedUnion("kind", [
32952
- z63.object({ kind: z63.literal("all_practitioners") }),
32953
- z63.object({
32954
- kind: z63.literal("selected_practitioners"),
32955
- resourceRefs: z63.array(appointmentSetupRefSchema)
33876
+ var appointmentSetupPaymentDraftSchema = z64.object({
33877
+ priceType: z64.union([z64.literal("free"), z64.literal("paid")])
33878
+ });
33879
+ var appointmentSetupServiceAssignmentDraftSchema = z64.discriminatedUnion("kind", [
33880
+ z64.object({ kind: z64.literal("all_practitioners") }),
33881
+ z64.object({
33882
+ kind: z64.literal("selected_practitioners"),
33883
+ resourceRefs: z64.array(appointmentSetupRefSchema)
32956
33884
  })
32957
33885
  ]);
32958
- var appointmentSetupServiceDraftSchema = z63.object({
33886
+ var appointmentSetupServiceDraftSchema = z64.object({
32959
33887
  ref: appointmentSetupRefSchema,
32960
- title: z63.string().trim().min(1),
32961
- description: z63.string().nullable(),
32962
- durationMinutes: z63.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
32963
- prepMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
32964
- cleanupMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
32965
- priceAmount: z63.number().int().nonnegative().nullable(),
32966
- isActive: z63.boolean(),
32967
- locationType: z63.union([
32968
- z63.literal("virtual"),
32969
- z63.literal("in_person"),
32970
- z63.literal("hybrid")
33888
+ title: z64.string().trim().min(1),
33889
+ description: z64.string().nullable(),
33890
+ durationMinutes: z64.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
33891
+ prepMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33892
+ cleanupMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33893
+ priceAmount: z64.number().int().nonnegative().nullable(),
33894
+ isActive: z64.boolean(),
33895
+ locationType: z64.union([
33896
+ z64.literal("virtual"),
33897
+ z64.literal("in_person"),
33898
+ z64.literal("hybrid")
32971
33899
  ]),
32972
33900
  venue: appointmentSetupVenueChoiceSchema,
32973
- timezone: z63.string().trim().min(1).nullable(),
33901
+ timezone: z64.string().trim().min(1).nullable(),
32974
33902
  payment: appointmentSetupPaymentDraftSchema,
32975
33903
  assignment: appointmentSetupServiceAssignmentDraftSchema
32976
33904
  }).superRefine((service, ctx) => {
@@ -32989,49 +33917,49 @@ var appointmentSetupServiceDraftSchema = z63.object({
32989
33917
  });
32990
33918
  }
32991
33919
  });
32992
- var appointmentSetupPractitionerDraftSchema = z63.object({
33920
+ var appointmentSetupPractitionerDraftSchema = z64.object({
32993
33921
  ref: appointmentSetupRefSchema,
32994
- displayName: z63.string().trim().min(1),
32995
- bio: z63.string().nullable(),
32996
- timezone: z63.string().trim().min(1),
32997
- colorHex: z63.string().nullable()
32998
- });
32999
- var appointmentSetupWeeklyWindowDraftSchema = z63.object({
33000
- weekday: z63.number().int().min(0).max(6),
33001
- startTime: z63.string(),
33002
- endTime: z63.string()
33003
- });
33004
- var appointmentSetupStartTimePolicyDraftSchema = z63.discriminatedUnion("kind", [
33005
- z63.object({ kind: z63.literal("automatic_spacing") }),
33006
- z63.object({
33007
- kind: z63.literal("regular_interval"),
33008
- intervalMinutes: z63.union([
33009
- z63.literal(10),
33010
- z63.literal(15),
33011
- z63.literal(20),
33012
- z63.literal(30),
33013
- z63.literal(45),
33014
- z63.literal(60)
33922
+ displayName: z64.string().trim().min(1),
33923
+ bio: z64.string().nullable(),
33924
+ timezone: z64.string().trim().min(1),
33925
+ colorHex: z64.string().nullable()
33926
+ });
33927
+ var appointmentSetupWeeklyWindowDraftSchema = z64.object({
33928
+ weekday: z64.number().int().min(0).max(6),
33929
+ startTime: z64.string(),
33930
+ endTime: z64.string()
33931
+ });
33932
+ var appointmentSetupStartTimePolicyDraftSchema = z64.discriminatedUnion("kind", [
33933
+ z64.object({ kind: z64.literal("automatic_spacing") }),
33934
+ z64.object({
33935
+ kind: z64.literal("regular_interval"),
33936
+ intervalMinutes: z64.union([
33937
+ z64.literal(10),
33938
+ z64.literal(15),
33939
+ z64.literal(20),
33940
+ z64.literal(30),
33941
+ z64.literal(45),
33942
+ z64.literal(60)
33015
33943
  ])
33016
33944
  })
33017
33945
  ]);
33018
- var appointmentSetupAvailabilityDraftSchema = z63.object({
33019
- kind: z63.literal("weekly_windows"),
33946
+ var appointmentSetupAvailabilityDraftSchema = z64.object({
33947
+ kind: z64.literal("weekly_windows"),
33020
33948
  resourceRef: appointmentSetupRefSchema,
33021
33949
  serviceRef: appointmentSetupRefSchema.nullable(),
33022
- windows: z63.array(appointmentSetupWeeklyWindowDraftSchema),
33950
+ windows: z64.array(appointmentSetupWeeklyWindowDraftSchema),
33023
33951
  startTimePolicy: appointmentSetupStartTimePolicyDraftSchema.optional()
33024
33952
  });
33025
33953
  var APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX = 28 * 24 * 60;
33026
33954
  var APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX = 10 * 365 * 24 * 60;
33027
- var appointmentSetupBookingNoticeSchema = z63.object({
33028
- minLeadMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
33029
- maxBookingNoticeMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
33030
- });
33031
- var applyAppointmentSetupRequestSchema = z63.object({
33032
- services: z63.array(appointmentSetupServiceDraftSchema),
33033
- practitioners: z63.array(appointmentSetupPractitionerDraftSchema),
33034
- availability: z63.array(appointmentSetupAvailabilityDraftSchema),
33955
+ var appointmentSetupBookingNoticeSchema = z64.object({
33956
+ minLeadMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
33957
+ maxBookingNoticeMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
33958
+ });
33959
+ var applyAppointmentSetupRequestSchema = z64.object({
33960
+ services: z64.array(appointmentSetupServiceDraftSchema),
33961
+ practitioners: z64.array(appointmentSetupPractitionerDraftSchema),
33962
+ availability: z64.array(appointmentSetupAvailabilityDraftSchema),
33035
33963
  bookingNotice: appointmentSetupBookingNoticeSchema
33036
33964
  });
33037
33965
 
@@ -33064,24 +33992,24 @@ var STAFF_CANCELLATION_CONTEXT_CATEGORIES = [
33064
33992
  ];
33065
33993
 
33066
33994
  // ../api/src/siteBanner.ts
33067
- import { z as z64 } from "zod";
33995
+ import { z as z65 } from "zod";
33068
33996
  var SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
33069
33997
  var SITE_BANNER_TONE_VALUES = ["announcement", "promotion", "notice", "warning"];
33070
33998
  var SITE_BANNER_MAX_TEXT_LENGTH = 320;
33071
33999
  var SITE_BANNER_MAX_PARAGRAPHS = 2;
33072
- var siteBannerScopeSchema = z64.enum(SITE_BANNER_SCOPE_VALUES);
33073
- var siteBannerToneSchema = z64.enum(SITE_BANNER_TONE_VALUES);
33074
- var siteBannerBodySchema = z64.unknown().transform(unwrapRichTextValue);
33075
- var siteBannerCtaSchema = z64.object({
33076
- label: z64.string().trim().min(1),
34000
+ var siteBannerScopeSchema = z65.enum(SITE_BANNER_SCOPE_VALUES);
34001
+ var siteBannerToneSchema = z65.enum(SITE_BANNER_TONE_VALUES);
34002
+ var siteBannerBodySchema = z65.unknown().transform(unwrapRichTextValue);
34003
+ var siteBannerCtaSchema = z65.object({
34004
+ label: z65.string().trim().min(1),
33077
34005
  link: linkPayloadSchema
33078
34006
  });
33079
- var siteBannerSettingsSchema = z64.discriminatedUnion("enabled", [
33080
- z64.object({
33081
- enabled: z64.literal(false)
34007
+ var siteBannerSettingsSchema = z65.discriminatedUnion("enabled", [
34008
+ z65.object({
34009
+ enabled: z65.literal(false)
33082
34010
  }),
33083
- z64.object({
33084
- enabled: z64.literal(true),
34011
+ z65.object({
34012
+ enabled: z65.literal(true),
33085
34013
  scope: siteBannerScopeSchema,
33086
34014
  tone: siteBannerToneSchema,
33087
34015
  body: siteBannerBodySchema,
@@ -33095,7 +34023,7 @@ var siteBannerSettingsInputSchema = siteBannerSettingsSchema.superRefine((value,
33095
34023
  const analysis = analyzeSiteBannerBody(value.body);
33096
34024
  for (const issue of analysis.issues) {
33097
34025
  ctx.addIssue({
33098
- code: z64.ZodIssueCode.custom,
34026
+ code: z65.ZodIssueCode.custom,
33099
34027
  path: ["body"],
33100
34028
  message: siteBannerBodyIssueMessage(issue)
33101
34029
  });
@@ -33363,76 +34291,109 @@ function isNavigationMenuValidationItem(value) {
33363
34291
  return typeof value.label === "string";
33364
34292
  }
33365
34293
 
34294
+ // ../api/src/navigation/dashboardSiteNav.ts
34295
+ var hiddenDemoSiteNavSurfaceIds = [
34296
+ "site.newsletter"
34297
+ ];
34298
+ var hiddenDemoSiteNavIds = new Set(
34299
+ hiddenDemoSiteNavSurfaceIds
34300
+ );
34301
+ var websiteSurfaceIds = [
34302
+ "site.content",
34303
+ "site.footerBlocks",
34304
+ "site.navigation",
34305
+ "site.media",
34306
+ "site.style",
34307
+ "site.performance"
34308
+ ];
34309
+ var websiteSurfaceIdSet = new Set(
34310
+ websiteSurfaceIds
34311
+ );
34312
+
34313
+ // ../api/src/navigation/dashboardSettingsNav.ts
34314
+ var hiddenDemoSettingsNavSurfaceIds = [
34315
+ "settings.features",
34316
+ "settings.domains",
34317
+ "settings.bookings",
34318
+ "settings.emails",
34319
+ "settings.team",
34320
+ "settings.billing",
34321
+ "settings.developer",
34322
+ "settings.apiKeys",
34323
+ "settings.backup"
34324
+ ];
34325
+ var hiddenDemoSettingsNavIds = new Set(hiddenDemoSettingsNavSurfaceIds);
34326
+
33366
34327
  // ../api/src/aiPlayground.ts
33367
- import { z as z65 } from "zod";
33368
- var Rfc6902PatchOp = z65.discriminatedUnion("op", [
34328
+ import { z as z66 } from "zod";
34329
+ var Rfc6902PatchOp = z66.discriminatedUnion("op", [
33369
34330
  // Standard RFC-6902 operations
33370
- z65.object({
33371
- op: z65.literal("add"),
33372
- path: z65.string(),
33373
- value: z65.unknown()
34331
+ z66.object({
34332
+ op: z66.literal("add"),
34333
+ path: z66.string(),
34334
+ value: z66.unknown()
33374
34335
  }),
33375
- z65.object({
33376
- op: z65.literal("remove"),
33377
- path: z65.string()
34336
+ z66.object({
34337
+ op: z66.literal("remove"),
34338
+ path: z66.string()
33378
34339
  }),
33379
- z65.object({
33380
- op: z65.literal("replace"),
33381
- path: z65.string(),
33382
- value: z65.unknown()
34340
+ z66.object({
34341
+ op: z66.literal("replace"),
34342
+ path: z66.string(),
34343
+ value: z66.unknown()
33383
34344
  }),
33384
- z65.object({
33385
- op: z65.literal("move"),
33386
- from: z65.string(),
33387
- path: z65.string()
34345
+ z66.object({
34346
+ op: z66.literal("move"),
34347
+ from: z66.string(),
34348
+ path: z66.string()
33388
34349
  }),
33389
- z65.object({
33390
- op: z65.literal("copy"),
33391
- from: z65.string(),
33392
- path: z65.string()
34350
+ z66.object({
34351
+ op: z66.literal("copy"),
34352
+ from: z66.string(),
34353
+ path: z66.string()
33393
34354
  }),
33394
34355
  // Block-level operations (Phase 2)
33395
- z65.object({
33396
- op: z65.literal("add_block"),
33397
- blockKind: z65.string(),
33398
- afterBlockId: z65.string().nullable(),
33399
- content: z65.record(z65.string(), z65.unknown()),
33400
- rationale: z65.string()
34356
+ z66.object({
34357
+ op: z66.literal("add_block"),
34358
+ blockKind: z66.string(),
34359
+ afterBlockId: z66.string().nullable(),
34360
+ content: z66.record(z66.string(), z66.unknown()),
34361
+ rationale: z66.string()
33401
34362
  }),
33402
- z65.object({
33403
- op: z65.literal("delete_block"),
33404
- blockId: z65.string(),
33405
- rationale: z65.string()
34363
+ z66.object({
34364
+ op: z66.literal("delete_block"),
34365
+ blockId: z66.string(),
34366
+ rationale: z66.string()
33406
34367
  }),
33407
- z65.object({
33408
- op: z65.literal("reorder_block"),
33409
- blockId: z65.string(),
33410
- afterBlockId: z65.string().nullable(),
33411
- rationale: z65.string()
34368
+ z66.object({
34369
+ op: z66.literal("reorder_block"),
34370
+ blockId: z66.string(),
34371
+ afterBlockId: z66.string().nullable(),
34372
+ rationale: z66.string()
33412
34373
  })
33413
34374
  ]);
33414
- var PlaygroundProposeRequest = z65.object({
33415
- request: z65.string().min(1).max(2e3)
34375
+ var PlaygroundProposeRequest = z66.object({
34376
+ request: z66.string().min(1).max(2e3)
33416
34377
  });
33417
- var MultiPagePatchEnvelope = z65.object({
33418
- pageId: z65.string(),
33419
- blockId: z65.string().optional(),
34378
+ var MultiPagePatchEnvelope = z66.object({
34379
+ pageId: z66.string(),
34380
+ blockId: z66.string().optional(),
33420
34381
  // Not present for page-level ops
33421
- blockKind: z65.string().optional(),
33422
- blockPurpose: z65.string().optional().nullable(),
33423
- ops: z65.array(Rfc6902PatchOp),
33424
- rationale: z65.string(),
33425
- currentContent: z65.record(z65.string(), z65.unknown()).optional()
34382
+ blockKind: z66.string().optional(),
34383
+ blockPurpose: z66.string().optional().nullable(),
34384
+ ops: z66.array(Rfc6902PatchOp),
34385
+ rationale: z66.string(),
34386
+ currentContent: z66.record(z66.string(), z66.unknown()).optional()
33426
34387
  });
33427
- var MultiPageUpdateResponse = z65.object({
33428
- patches: z65.array(MultiPagePatchEnvelope),
33429
- assistantMessage: z65.string(),
33430
- pagesModified: z65.number(),
33431
- toolCallsUsed: z65.number()
34388
+ var MultiPageUpdateResponse = z66.object({
34389
+ patches: z66.array(MultiPagePatchEnvelope),
34390
+ assistantMessage: z66.string(),
34391
+ pagesModified: z66.number(),
34392
+ toolCallsUsed: z66.number()
33432
34393
  });
33433
34394
 
33434
34395
  // src/config/content-validation.ts
33435
- import { z as z66 } from "zod";
34396
+ import { z as z67 } from "zod";
33436
34397
 
33437
34398
  // src/types/block-kinds.ts
33438
34399
  var SYSTEM_BLOCK_KINDS = [
@@ -33574,32 +34535,32 @@ function describeInvalidBindingTransform(transform) {
33574
34535
  }
33575
34536
 
33576
34537
  // src/config/content-validation.ts
33577
- var jsonDataSchema = z66.record(z66.string(), z66.any());
33578
- var contentTypeKeySchema = z66.string().min(1).regex(
34538
+ var jsonDataSchema = z67.record(z67.string(), z67.any());
34539
+ var contentTypeKeySchema = z67.string().min(1).regex(
33579
34540
  /^[a-z][a-z0-9-]*$/,
33580
34541
  "Key must be lowercase, start with a letter, and contain only letters, numbers, and hyphens"
33581
34542
  );
33582
- var templateConfigSchemaForward = z66.object({
33583
- blocks: z66.array(
33584
- z66.object({
33585
- identifier: z66.string().min(1),
33586
- kind: z66.string(),
33587
- scope: z66.enum(["entry", "template"]),
33588
- bindings: z66.record(z66.string(), z66.any()).optional(),
33589
- content: z66.record(z66.string(), z66.any()).optional()
34543
+ var templateConfigSchemaForward = z67.object({
34544
+ blocks: z67.array(
34545
+ z67.object({
34546
+ identifier: z67.string().min(1),
34547
+ kind: z67.string(),
34548
+ scope: z67.enum(["entry", "template"]),
34549
+ bindings: z67.record(z67.string(), z67.any()).optional(),
34550
+ content: z67.record(z67.string(), z67.any()).optional()
33590
34551
  })
33591
34552
  )
33592
34553
  }).optional();
33593
- var contentTypeConfigSchema = z66.object({
34554
+ var contentTypeConfigSchema = z67.object({
33594
34555
  key: contentTypeKeySchema,
33595
- name: z66.string().min(1),
33596
- description: z66.string().optional(),
33597
- hasPages: z66.boolean(),
33598
- routePattern: z66.string().optional(),
34556
+ name: z67.string().min(1),
34557
+ description: z67.string().optional(),
34558
+ hasPages: z67.boolean(),
34559
+ routePattern: z67.string().optional(),
33599
34560
  // Fields are validated as unknown[] here - deep field validation happens in @riverbankcms/blocks
33600
- fields: z66.array(z66.any()).min(1, "At least one field is required"),
33601
- titleField: z66.string().optional(),
33602
- isSingleton: z66.boolean().optional().default(false),
34561
+ fields: z67.array(z67.any()).min(1, "At least one field is required"),
34562
+ titleField: z67.string().optional(),
34563
+ isSingleton: z67.boolean().optional().default(false),
33603
34564
  template: templateConfigSchemaForward
33604
34565
  }).refine(
33605
34566
  (data) => {
@@ -33621,7 +34582,7 @@ var contentTypeConfigSchema = z66.object({
33621
34582
  }
33622
34583
  if (!data.routePattern) {
33623
34584
  ctx.addIssue({
33624
- code: z66.ZodIssueCode.custom,
34585
+ code: z67.ZodIssueCode.custom,
33625
34586
  path: ["routePattern"],
33626
34587
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33627
34588
  });
@@ -33630,7 +34591,7 @@ var contentTypeConfigSchema = z66.object({
33630
34591
  const parseResult = safeParseRouteTemplate(data.routePattern);
33631
34592
  if (!parseResult.success) {
33632
34593
  ctx.addIssue({
33633
- code: z66.ZodIssueCode.custom,
34594
+ code: z67.ZodIssueCode.custom,
33634
34595
  path: ["routePattern"],
33635
34596
  message: describeRouteTemplateParseError(parseResult.error)
33636
34597
  });
@@ -33638,44 +34599,44 @@ var contentTypeConfigSchema = z66.object({
33638
34599
  }
33639
34600
  if (!data.isSingleton && parseResult.routeTemplate.kind !== "slug-template") {
33640
34601
  ctx.addIssue({
33641
- code: z66.ZodIssueCode.custom,
34602
+ code: z67.ZodIssueCode.custom,
33642
34603
  path: ["routePattern"],
33643
34604
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33644
34605
  });
33645
34606
  }
33646
34607
  });
33647
- var fieldBindingSchema = z66.object({
33648
- source: z66.literal("field"),
33649
- path: z66.string().min(1, "Field path is required")
34608
+ var fieldBindingSchema = z67.object({
34609
+ source: z67.literal("field"),
34610
+ path: z67.string().min(1, "Field path is required")
33650
34611
  });
33651
- var metaBindingSchema = z66.object({
33652
- source: z66.literal("meta"),
33653
- path: z66.enum(TEMPLATE_BINDING_META_PATHS, {
34612
+ var metaBindingSchema = z67.object({
34613
+ source: z67.literal("meta"),
34614
+ path: z67.enum(TEMPLATE_BINDING_META_PATHS, {
33654
34615
  error: (issue) => describeInvalidTemplateBindingMetaPath(String(issue.input))
33655
34616
  })
33656
34617
  });
33657
- var literalBindingSchema = z66.object({
33658
- source: z66.literal("literal"),
33659
- value: z66.unknown()
34618
+ var literalBindingSchema = z67.object({
34619
+ source: z67.literal("literal"),
34620
+ value: z67.unknown()
33660
34621
  });
33661
- var transformBindingSchema = z66.object({
33662
- source: z66.literal("transform"),
33663
- path: z66.string().min(1, "Transform path is required"),
33664
- transform: z66.enum(BINDING_TRANSFORM_VALUES, {
34622
+ var transformBindingSchema = z67.object({
34623
+ source: z67.literal("transform"),
34624
+ path: z67.string().min(1, "Transform path is required"),
34625
+ transform: z67.enum(BINDING_TRANSFORM_VALUES, {
33665
34626
  error: (issue) => describeInvalidBindingTransform(String(issue.input))
33666
34627
  })
33667
34628
  });
33668
- var baseBindingSchema = z66.discriminatedUnion("source", [
34629
+ var baseBindingSchema = z67.discriminatedUnion("source", [
33669
34630
  fieldBindingSchema,
33670
34631
  metaBindingSchema,
33671
34632
  literalBindingSchema,
33672
34633
  transformBindingSchema
33673
34634
  ]);
33674
- var fallbackBindingSchema = z66.object({
33675
- source: z66.literal("fallback"),
33676
- sources: z66.array(z66.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
34635
+ var fallbackBindingSchema = z67.object({
34636
+ source: z67.literal("fallback"),
34637
+ sources: z67.array(z67.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
33677
34638
  });
33678
- var bindingSourceSchema = z66.union([
34639
+ var bindingSourceSchema = z67.union([
33679
34640
  baseBindingSchema,
33680
34641
  fallbackBindingSchema
33681
34642
  ]);
@@ -33689,12 +34650,12 @@ function isValidBlockKind(kind) {
33689
34650
  return false;
33690
34651
  }
33691
34652
  var BLOCK_KIND_ERROR_MESSAGE = 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.myBlock")';
33692
- var blockKindSchema = z66.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
33693
- var templateBlockConfigSchema = z66.object({
33694
- identifier: z66.string().min(1, "Block identifier is required"),
34653
+ var blockKindSchema = z67.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
34654
+ var templateBlockConfigSchema = z67.object({
34655
+ identifier: z67.string().min(1, "Block identifier is required"),
33695
34656
  kind: blockKindSchema,
33696
- scope: z66.enum(["entry", "template"]),
33697
- bindings: z66.record(z66.string(), bindingSourceSchema).optional(),
34657
+ scope: z67.enum(["entry", "template"]),
34658
+ bindings: z67.record(z67.string(), bindingSourceSchema).optional(),
33698
34659
  content: jsonDataSchema.optional()
33699
34660
  }).refine(
33700
34661
  (data) => {
@@ -33713,8 +34674,8 @@ var templateBlockConfigSchema = z66.object({
33713
34674
  },
33714
34675
  { message: "Template-scoped blocks should define static content, not bindings" }
33715
34676
  );
33716
- var templateConfigSchema = z66.object({
33717
- blocks: z66.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
34677
+ var templateConfigSchema = z67.object({
34678
+ blocks: z67.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
33718
34679
  }).refine(
33719
34680
  (data) => {
33720
34681
  const identifiers = data.blocks.map((b) => b.identifier);
@@ -33723,77 +34684,77 @@ var templateConfigSchema = z66.object({
33723
34684
  },
33724
34685
  { message: "Template block identifiers must be unique" }
33725
34686
  );
33726
- var blockConfigSchema = z66.object({
34687
+ var blockConfigSchema = z67.object({
33727
34688
  kind: blockKindSchema,
33728
34689
  content: jsonDataSchema,
33729
- orderIndex: z66.number().optional()
33730
- });
33731
- var pageConfigSchema = z66.object({
33732
- identifier: z66.string().min(1, "Identifier is required"),
33733
- title: z66.string().min(1, "Title is required"),
33734
- path: z66.string().regex(/^\//, "Path must start with /"),
33735
- purpose: z66.string().default("content"),
33736
- blocks: z66.array(blockConfigSchema).optional(),
33737
- status: z66.enum(["draft", "published"]).default("draft"),
33738
- metaTitle: z66.string().optional(),
33739
- metaDescription: z66.string().optional()
33740
- });
33741
- var entryConfigSchema = z66.object({
33742
- identifier: z66.string().min(1, "Identifier is required"),
33743
- contentType: z66.string().min(1, "Content type is required"),
34690
+ orderIndex: z67.number().optional()
34691
+ });
34692
+ var pageConfigSchema = z67.object({
34693
+ identifier: z67.string().min(1, "Identifier is required"),
34694
+ title: z67.string().min(1, "Title is required"),
34695
+ path: z67.string().regex(/^\//, "Path must start with /"),
34696
+ purpose: z67.string().default("content"),
34697
+ blocks: z67.array(blockConfigSchema).optional(),
34698
+ status: z67.enum(["draft", "published"]).default("draft"),
34699
+ metaTitle: z67.string().optional(),
34700
+ metaDescription: z67.string().optional()
34701
+ });
34702
+ var entryConfigSchema = z67.object({
34703
+ identifier: z67.string().min(1, "Identifier is required"),
34704
+ contentType: z67.string().min(1, "Content type is required"),
33744
34705
  data: jsonDataSchema,
33745
- status: z66.enum(["draft", "published"]).default("draft"),
33746
- slug: z66.string().optional(),
33747
- summary: z66.string().optional(),
34706
+ status: z67.enum(["draft", "published"]).default("draft"),
34707
+ slug: z67.string().optional(),
34708
+ summary: z67.string().optional(),
33748
34709
  // Hard remove legacy config-only titles: titles must live in entry `data`.
33749
- title: z66.any().optional().refine((value) => value === void 0, {
34710
+ title: z67.any().optional().refine((value) => value === void 0, {
33750
34711
  message: "Entry titles are now derived from entry data. Remove `title` and move it into `data` (e.g. `data.title`, or your configured `titleField`). Run `riverbankcms migrate entries` for guided migration."
33751
34712
  }),
33752
- metaTitle: z66.string().optional(),
33753
- metaDescription: z66.string().optional()
34713
+ metaTitle: z67.string().optional(),
34714
+ metaDescription: z67.string().optional()
33754
34715
  });
33755
- var dropdownLinkSchema = z66.object({
33756
- kind: z66.literal("dropdown")
34716
+ var dropdownLinkSchema = z67.object({
34717
+ kind: z67.literal("dropdown")
33757
34718
  });
33758
- var navigationLinkSchema = z66.discriminatedUnion("kind", [
34719
+ var navigationLinkSchema = z67.discriminatedUnion("kind", [
33759
34720
  ...navigationLinkInputSchemaOptions,
33760
34721
  dropdownLinkSchema
33761
34722
  ]);
33762
- var baseNavigationItemSchema = z66.object({
33763
- label: z66.string().min(1, "Label is required"),
34723
+ var baseNavigationItemSchema = z67.object({
34724
+ label: z67.string().min(1, "Label is required"),
33764
34725
  link: navigationLinkSchema,
33765
- isCta: z66.boolean().optional()
34726
+ isCta: z67.boolean().optional()
33766
34727
  });
33767
34728
  var navigationItemConfigSchema = baseNavigationItemSchema.extend({
33768
- children: z66.lazy(() => z66.array(navigationItemConfigSchema)).optional()
33769
- });
33770
- var navigationMenuConfigSchema = z66.object({
33771
- identifier: z66.string().min(1, "Identifier is required"),
33772
- name: z66.string().min(1, "Name is required"),
33773
- isPrimary: z66.boolean().optional(),
33774
- isFooter: z66.boolean().optional(),
33775
- items: z66.array(navigationItemConfigSchema)
34729
+ children: z67.lazy(() => z67.array(navigationItemConfigSchema)).optional()
34730
+ });
34731
+ var navigationMenuConfigSchema = z67.object({
34732
+ identifier: z67.string().min(1, "Identifier is required"),
34733
+ name: z67.string().min(1, "Name is required"),
34734
+ isPrimary: z67.boolean().optional(),
34735
+ isFooter: z67.boolean().optional(),
34736
+ items: z67.array(navigationItemConfigSchema)
33776
34737
  }).superRefine((menu, ctx) => {
33777
34738
  const portalStats = collectPortalLinkStats(
33778
34739
  menu.items
33779
34740
  );
33780
34741
  if (portalStats.count > 1) {
33781
34742
  ctx.addIssue({
33782
- code: z66.ZodIssueCode.custom,
34743
+ code: z67.ZodIssueCode.custom,
33783
34744
  message: "Only one portal link is allowed per navigation menu",
33784
34745
  path: ["items"]
33785
34746
  });
33786
34747
  }
33787
34748
  if (portalStats.nestedLabels.length > 0) {
33788
34749
  ctx.addIssue({
33789
- code: z66.ZodIssueCode.custom,
34750
+ code: z67.ZodIssueCode.custom,
33790
34751
  message: `Portal links must be root-level items: ${portalStats.nestedLabels.join(", ")}`,
33791
34752
  path: ["items"]
33792
34753
  });
33793
34754
  }
33794
34755
  if (portalStats.withChildrenLabels.length > 0) {
33795
34756
  ctx.addIssue({
33796
- code: z66.ZodIssueCode.custom,
34757
+ code: z67.ZodIssueCode.custom,
33797
34758
  message: `Portal links cannot contain child items: ${portalStats.withChildrenLabels.join(", ")}`,
33798
34759
  path: ["items"]
33799
34760
  });
@@ -33803,44 +34764,44 @@ var navigationMenuConfigSchema = z66.object({
33803
34764
  );
33804
34765
  if (cartStats.nestedLabels.length > 0) {
33805
34766
  ctx.addIssue({
33806
- code: z66.ZodIssueCode.custom,
34767
+ code: z67.ZodIssueCode.custom,
33807
34768
  message: `Cart links must be root-level items: ${cartStats.nestedLabels.join(", ")}`,
33808
34769
  path: ["items"]
33809
34770
  });
33810
34771
  }
33811
34772
  if (cartStats.withChildrenLabels.length > 0) {
33812
34773
  ctx.addIssue({
33813
- code: z66.ZodIssueCode.custom,
34774
+ code: z67.ZodIssueCode.custom,
33814
34775
  message: `Cart links cannot contain child items: ${cartStats.withChildrenLabels.join(", ")}`,
33815
34776
  path: ["items"]
33816
34777
  });
33817
34778
  }
33818
34779
  if (cartStats.ctaLabels.length > 0) {
33819
34780
  ctx.addIssue({
33820
- code: z66.ZodIssueCode.custom,
34781
+ code: z67.ZodIssueCode.custom,
33821
34782
  message: `Cart links cannot be marked as CTA: ${cartStats.ctaLabels.join(", ")}`,
33822
34783
  path: ["items"]
33823
34784
  });
33824
34785
  }
33825
34786
  if (cartStats.missingVisibleTextLabels.length > 0) {
33826
34787
  ctx.addIssue({
33827
- code: z66.ZodIssueCode.custom,
34788
+ code: z67.ZodIssueCode.custom,
33828
34789
  message: `Cart links with icon-with-label must provide a visible label: ${cartStats.missingVisibleTextLabels.join(", ")}`,
33829
34790
  path: ["items"]
33830
34791
  });
33831
34792
  }
33832
34793
  });
33833
- var siteSettingsConfigSchema = z66.object({
33834
- homepagePath: z66.string().optional(),
33835
- siteTitle: z66.string().optional(),
33836
- siteDescription: z66.string().optional(),
33837
- defaultTemplates: z66.record(z66.string(), z66.string()).optional()
34794
+ var siteSettingsConfigSchema = z67.object({
34795
+ homepagePath: z67.string().optional(),
34796
+ siteTitle: z67.string().optional(),
34797
+ siteDescription: z67.string().optional(),
34798
+ defaultTemplates: z67.record(z67.string(), z67.string()).optional()
33838
34799
  });
33839
- var contentConfigBaseSchema = z66.object({
33840
- contentTypes: z66.array(contentTypeConfigSchema).optional(),
33841
- entries: z66.array(entryConfigSchema).optional(),
33842
- pages: z66.array(pageConfigSchema).optional(),
33843
- navigationMenus: z66.array(navigationMenuConfigSchema).optional(),
34800
+ var contentConfigBaseSchema = z67.object({
34801
+ contentTypes: z67.array(contentTypeConfigSchema).optional(),
34802
+ entries: z67.array(entryConfigSchema).optional(),
34803
+ pages: z67.array(pageConfigSchema).optional(),
34804
+ navigationMenus: z67.array(navigationMenuConfigSchema).optional(),
33844
34805
  settings: siteSettingsConfigSchema.optional()
33845
34806
  });
33846
34807
  var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
@@ -33849,7 +34810,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33849
34810
  const duplicateKeys = keys.filter((key, i) => keys.indexOf(key) !== i);
33850
34811
  if (duplicateKeys.length > 0) {
33851
34812
  ctx.addIssue({
33852
- code: z66.ZodIssueCode.custom,
34813
+ code: z67.ZodIssueCode.custom,
33853
34814
  message: `Content type keys must be unique. Duplicates: ${duplicateKeys.join(", ")}`,
33854
34815
  path: ["contentTypes"]
33855
34816
  });
@@ -33860,7 +34821,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33860
34821
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
33861
34822
  if (duplicateIds.length > 0) {
33862
34823
  ctx.addIssue({
33863
- code: z66.ZodIssueCode.custom,
34824
+ code: z67.ZodIssueCode.custom,
33864
34825
  message: `Page identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
33865
34826
  path: ["pages"]
33866
34827
  });
@@ -33869,7 +34830,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33869
34830
  const duplicatePaths = paths.filter((path, i) => paths.indexOf(path) !== i);
33870
34831
  if (duplicatePaths.length > 0) {
33871
34832
  ctx.addIssue({
33872
- code: z66.ZodIssueCode.custom,
34833
+ code: z67.ZodIssueCode.custom,
33873
34834
  message: `Page paths must be unique. Duplicates: ${duplicatePaths.join(", ")}`,
33874
34835
  path: ["pages"]
33875
34836
  });
@@ -33880,7 +34841,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33880
34841
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
33881
34842
  if (duplicateIds.length > 0) {
33882
34843
  ctx.addIssue({
33883
- code: z66.ZodIssueCode.custom,
34844
+ code: z67.ZodIssueCode.custom,
33884
34845
  message: `Entry identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
33885
34846
  path: ["entries"]
33886
34847
  });
@@ -33891,7 +34852,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33891
34852
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
33892
34853
  if (duplicateIds.length > 0) {
33893
34854
  ctx.addIssue({
33894
- code: z66.ZodIssueCode.custom,
34855
+ code: z67.ZodIssueCode.custom,
33895
34856
  message: `Navigation menu identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
33896
34857
  path: ["navigationMenus"]
33897
34858
  });
@@ -33905,7 +34866,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33905
34866
  const entriesForType = data.entries.filter((e) => e.contentType === singletonKey);
33906
34867
  if (entriesForType.length > 1) {
33907
34868
  ctx.addIssue({
33908
- code: z66.ZodIssueCode.custom,
34869
+ code: z67.ZodIssueCode.custom,
33909
34870
  message: `Singleton content type "${singletonKey}" cannot have more than one entry. Found ${entriesForType.length} entries.`,
33910
34871
  path: ["entries"]
33911
34872
  });
@@ -34018,18 +34979,18 @@ function validateLayout(layout) {
34018
34979
  }
34019
34980
 
34020
34981
  // src/config/dashboard-validation.ts
34021
- import { z as z67 } from "zod";
34022
- var navIdListSchema2 = z67.preprocess((value) => {
34982
+ import { z as z68 } from "zod";
34983
+ var navIdListSchema2 = z68.preprocess((value) => {
34023
34984
  if (!Array.isArray(value)) return void 0;
34024
34985
  const filtered = value.filter((v) => typeof v === "string" && v.trim().length > 0);
34025
34986
  return filtered.length > 0 ? filtered : void 0;
34026
- }, z67.array(z67.string()).max(200, "Maximum 200 nav IDs").optional());
34027
- var dashboardNavVisibilityBaseSchema2 = z67.object({
34028
- mode: z67.enum(["augment", "restrict"]).optional(),
34987
+ }, z68.array(z68.string()).max(200, "Maximum 200 nav IDs").optional());
34988
+ var dashboardNavVisibilityBaseSchema2 = z68.object({
34989
+ mode: z68.enum(["augment", "restrict"]).optional(),
34029
34990
  allowIds: navIdListSchema2,
34030
34991
  denyIds: navIdListSchema2
34031
34992
  }).strip();
34032
- var dashboardNavVisibilityRolesSchema2 = z67.object({
34993
+ var dashboardNavVisibilityRolesSchema2 = z68.object({
34033
34994
  administrator: dashboardNavVisibilityBaseSchema2.optional(),
34034
34995
  editor: dashboardNavVisibilityBaseSchema2.optional(),
34035
34996
  team_member: dashboardNavVisibilityBaseSchema2.optional()
@@ -34037,20 +34998,20 @@ var dashboardNavVisibilityRolesSchema2 = z67.object({
34037
34998
  var dashboardNavVisibilitySchema2 = dashboardNavVisibilityBaseSchema2.extend({
34038
34999
  roles: dashboardNavVisibilityRolesSchema2
34039
35000
  }).strip();
34040
- var dashboardNavigationConfigSchema2 = z67.object({
35001
+ var dashboardNavigationConfigSchema2 = z68.object({
34041
35002
  siteNav: dashboardNavVisibilitySchema2.optional(),
34042
35003
  settingsNav: dashboardNavVisibilitySchema2.optional()
34043
35004
  }).strip();
34044
- var dashboardConfigSchema2 = z67.object({
34045
- previewEditingEnabled: z67.boolean().optional(),
35005
+ var dashboardConfigSchema2 = z68.object({
35006
+ previewEditingEnabled: z68.boolean().optional(),
34046
35007
  navigation: dashboardNavigationConfigSchema2.optional()
34047
35008
  }).strip();
34048
35009
 
34049
35010
  // src/zod/titleSourceSchema.ts
34050
- import { z as z68 } from "zod";
34051
- var titleSourceValueSchema = z68.union([
34052
- z68.string().min(1),
34053
- z68.array(z68.string().min(1)).min(1)
35011
+ import { z as z69 } from "zod";
35012
+ var titleSourceValueSchema = z69.union([
35013
+ z69.string().min(1),
35014
+ z69.array(z69.string().min(1)).min(1)
34054
35015
  ]);
34055
35016
 
34056
35017
  // src/data/prefetchBlockData.ts
@@ -34069,11 +35030,11 @@ var SUPPORTED_LOADER_ENDPOINTS2 = [
34069
35030
  ];
34070
35031
 
34071
35032
  // src/config/validation.ts
34072
- var sdkThemePaletteSchema2 = z69.record(z69.string(), z69.string());
34073
- var sdkThemeConfigSchema2 = z69.object({
35033
+ var sdkThemePaletteSchema2 = z70.record(z70.string(), z70.string());
35034
+ var sdkThemeConfigSchema2 = z70.object({
34074
35035
  palette: sdkThemePaletteSchema2
34075
35036
  });
34076
- var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
35037
+ var sdkSiteUrlSchema = z70.string().url("Must be a valid URL").refine((url) => {
34077
35038
  try {
34078
35039
  const parsed = new URL(url);
34079
35040
  const isLocal = parsed.hostname === "localhost" || parsed.hostname.endsWith(".localhost") || parsed.hostname.endsWith(".local") || parsed.hostname.endsWith(".test");
@@ -34082,97 +35043,97 @@ var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
34082
35043
  return false;
34083
35044
  }
34084
35045
  }, { message: "Production URLs must use HTTPS" }).transform((url) => url.replace(/\/$/, ""));
34085
- var sectionBackgroundSchema = z69.object({
34086
- id: z69.string(),
34087
- label: z69.string(),
34088
- token: z69.string()
35046
+ var sectionBackgroundSchema = z70.object({
35047
+ id: z70.string(),
35048
+ label: z70.string(),
35049
+ token: z70.string()
34089
35050
  // Reference to theme palette token
34090
35051
  });
34091
- var sectionSpacingSchema = z69.enum(["compact", "default", "spacious"]);
34092
- var containerMaxWidthSchema = z69.enum(["narrow", "default", "wide", "full"]);
34093
- var containerAlignmentSchema = z69.enum(["left", "center", "right"]);
34094
- var sectionOptionsSchema = z69.object({
34095
- backgroundColor: z69.boolean().optional(),
34096
- backgroundImage: z69.boolean().optional(),
34097
- backgroundGradient: z69.boolean().optional(),
34098
- spacing: z69.union([
34099
- z69.array(sectionSpacingSchema),
34100
- z69.boolean()
35052
+ var sectionSpacingSchema = z70.enum(["compact", "default", "spacious"]);
35053
+ var containerMaxWidthSchema = z70.enum(["narrow", "default", "wide", "full"]);
35054
+ var containerAlignmentSchema = z70.enum(["left", "center", "right"]);
35055
+ var sectionOptionsSchema = z70.object({
35056
+ backgroundColor: z70.boolean().optional(),
35057
+ backgroundImage: z70.boolean().optional(),
35058
+ backgroundGradient: z70.boolean().optional(),
35059
+ spacing: z70.union([
35060
+ z70.array(sectionSpacingSchema),
35061
+ z70.boolean()
34101
35062
  ]).optional(),
34102
- textColor: z69.boolean().optional()
35063
+ textColor: z70.boolean().optional()
34103
35064
  }).optional();
34104
- var containerOptionsSchema = z69.object({
34105
- maxWidth: z69.union([
34106
- z69.array(containerMaxWidthSchema),
34107
- z69.boolean()
35065
+ var containerOptionsSchema = z70.object({
35066
+ maxWidth: z70.union([
35067
+ z70.array(containerMaxWidthSchema),
35068
+ z70.boolean()
34108
35069
  ]).optional(),
34109
- alignment: z69.union([
34110
- z69.array(containerAlignmentSchema),
34111
- z69.boolean()
35070
+ alignment: z70.union([
35071
+ z70.array(containerAlignmentSchema),
35072
+ z70.boolean()
34112
35073
  ]).optional()
34113
35074
  }).optional();
34114
- var siteStyleConfigSchema = z69.object({
34115
- sectionBackgrounds: z69.array(sectionBackgroundSchema).optional(),
35075
+ var siteStyleConfigSchema = z70.object({
35076
+ sectionBackgrounds: z70.array(sectionBackgroundSchema).optional(),
34116
35077
  sectionOptions: sectionOptionsSchema,
34117
35078
  containerOptions: containerOptionsSchema
34118
35079
  }).optional();
34119
- var sdkLoaderEndpointSchema2 = z69.enum(SUPPORTED_LOADER_ENDPOINTS2);
35080
+ var sdkLoaderEndpointSchema2 = z70.enum(SUPPORTED_LOADER_ENDPOINTS2);
34120
35081
  var allowedTransformIds = new Set(builtinTransformDefinitions.map((transform) => transform.id));
34121
- var loaderTransformStepSchema = z69.object({
34122
- id: z69.string().refine((id) => allowedTransformIds.has(id), {
35082
+ var loaderTransformStepSchema = z70.object({
35083
+ id: z70.string().refine((id) => allowedTransformIds.has(id), {
34123
35084
  message: "Unknown transform id"
34124
35085
  }),
34125
- options: z69.record(z69.string(), z69.unknown()).optional()
35086
+ options: z70.record(z70.string(), z70.unknown()).optional()
34126
35087
  });
34127
- var loaderParamBindingSchema2 = z69.object({
34128
- $bind: z69.object({
34129
- from: z69.string().min(1, "Binding path is required"),
35088
+ var loaderParamBindingSchema2 = z70.object({
35089
+ $bind: z70.object({
35090
+ from: z70.string().min(1, "Binding path is required"),
34130
35091
  // Loader params are ultimately string-normalized for query strings, so fallbacks should
34131
35092
  // stay scalar. Use transforms (e.g. `value.jsonArray`) when you need to serialize
34132
35093
  // more complex values into a string.
34133
- fallback: z69.union([z69.string(), z69.number(), z69.boolean(), z69.null()]).optional(),
34134
- transforms: z69.array(loaderTransformStepSchema).default([]),
34135
- pick: z69.enum(["value", "collection", "context"]).default("value"),
34136
- coerce: z69.enum(["number", "boolean", "string"]).optional()
35094
+ fallback: z70.union([z70.string(), z70.number(), z70.boolean(), z70.null()]).optional(),
35095
+ transforms: z70.array(loaderTransformStepSchema).default([]),
35096
+ pick: z70.enum(["value", "collection", "context"]).default("value"),
35097
+ coerce: z70.enum(["number", "boolean", "string"]).optional()
34137
35098
  })
34138
35099
  });
34139
- var loaderParamValueSchema2 = z69.union([
34140
- z69.string(),
34141
- z69.number(),
34142
- z69.boolean(),
35100
+ var loaderParamValueSchema2 = z70.union([
35101
+ z70.string(),
35102
+ z70.number(),
35103
+ z70.boolean(),
34143
35104
  loaderParamBindingSchema2
34144
35105
  ]);
34145
- var loaderWhenValueSchema = z69.union([
34146
- z69.boolean(),
35106
+ var loaderWhenValueSchema = z70.union([
35107
+ z70.boolean(),
34147
35108
  loaderParamBindingSchema2
34148
35109
  ]);
34149
- var sdkConfigLoaderSchema2 = z69.object({
35110
+ var sdkConfigLoaderSchema2 = z70.object({
34150
35111
  endpoint: sdkLoaderEndpointSchema2,
34151
- params: z69.record(z69.string(), loaderParamValueSchema2),
34152
- mode: z69.enum(["server", "client"]).default("server"),
35112
+ params: z70.record(z70.string(), loaderParamValueSchema2),
35113
+ mode: z70.enum(["server", "client"]).default("server"),
34153
35114
  when: loaderWhenValueSchema.optional()
34154
35115
  });
34155
- var sdkDataLoadersSchema2 = z69.record(z69.string(), sdkConfigLoaderSchema2).refine(
35116
+ var sdkDataLoadersSchema2 = z70.record(z70.string(), sdkConfigLoaderSchema2).refine(
34156
35117
  (loaders) => Object.keys(loaders).length <= 5,
34157
35118
  { message: "Maximum 5 data loaders per block" }
34158
35119
  ).optional();
34159
- var fieldSelectOptionSchema = z69.object({
34160
- value: z69.string().min(1, "Option value is required"),
34161
- label: z69.string().min(1, "Option label is required")
35120
+ var fieldSelectOptionSchema = z70.object({
35121
+ value: z70.string().min(1, "Option value is required"),
35122
+ label: z70.string().min(1, "Option label is required")
34162
35123
  });
34163
- var blockFieldConfigSchema = z69.object({
34164
- options: z69.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
35124
+ var blockFieldConfigSchema = z70.object({
35125
+ options: z70.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
34165
35126
  });
34166
- var blockFieldOptionsSchema = z69.record(
34167
- z69.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
35127
+ var blockFieldOptionsSchema = z70.record(
35128
+ z70.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
34168
35129
  message: "Block ID must be 'block.*' or 'custom.*' format"
34169
35130
  }),
34170
- z69.record(
34171
- z69.string().min(1, "Field ID is required"),
35131
+ z70.record(
35132
+ z70.string().min(1, "Field ID is required"),
34172
35133
  blockFieldConfigSchema
34173
35134
  )
34174
35135
  ).optional();
34175
- var blockFieldExtensionSchema = z69.object({
35136
+ var blockFieldExtensionSchema = z70.object({
34176
35137
  fields: fieldSchema.array().min(1, "At least one field is required")
34177
35138
  }).refine(
34178
35139
  (data) => {
@@ -34186,10 +35147,10 @@ var blockFieldExtensionSchema = z69.object({
34186
35147
  message: "Required fields must have a defaultValue to support existing blocks"
34187
35148
  }
34188
35149
  );
34189
- var blockFieldExtensionsMapSchema = z69.record(
35150
+ var blockFieldExtensionsMapSchema = z70.record(
34190
35151
  // System blocks are kebab-case: block.body-text, block.event-calendar, ...
34191
35152
  // Enforce: lowercase alphanumerics with single hyphens (no trailing hyphen, no consecutive hyphens).
34192
- z69.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
35153
+ z70.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
34193
35154
  message: "Block ID must be 'block.*' format (system blocks only)"
34194
35155
  }),
34195
35156
  blockFieldExtensionSchema
@@ -34205,7 +35166,7 @@ var blockFieldExtensionsMapSchema = z69.record(
34205
35166
  (field) => field.id === collision.fieldId
34206
35167
  );
34207
35168
  ctx.addIssue({
34208
- code: z69.ZodIssueCode.custom,
35169
+ code: z70.ZodIssueCode.custom,
34209
35170
  message: collision.message,
34210
35171
  path: [
34211
35172
  APPOINTMENT_BOOKING_BLOCK_ID,
@@ -34220,24 +35181,24 @@ var blockFieldExtensionsSchema = blockFieldExtensionsMapSchema.optional();
34220
35181
  function collectAppointmentBookingExtensionReservedFieldCollisions(extension) {
34221
35182
  return collectBookingReservedFieldCollisions(extension, { type: "booking" });
34222
35183
  }
34223
- var syncConfigSchema = z69.object({
34224
- existingEntries: z69.enum(["skip", "update"]).optional()
35184
+ var syncConfigSchema = z70.object({
35185
+ existingEntries: z70.enum(["skip", "update"]).optional()
34225
35186
  }).optional();
34226
- var deployConfigSchema = z69.object({
34227
- verifyCommand: z69.string().optional(),
34228
- prebuildOutput: z69.string().optional()
35187
+ var deployConfigSchema = z70.object({
35188
+ verifyCommand: z70.string().optional(),
35189
+ prebuildOutput: z70.string().optional()
34229
35190
  }).optional();
34230
- var sdkCustomBlockSchema = z69.object({
35191
+ var sdkCustomBlockSchema = z70.object({
34231
35192
  // Block ID must start with 'custom.'
34232
- id: z69.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
35193
+ id: z70.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
34233
35194
  message: "Block ID must start with 'custom.' followed by lowercase letters, numbers, or hyphens"
34234
35195
  }),
34235
- title: z69.string().min(1, "Title is required"),
35196
+ title: z70.string().min(1, "Title is required"),
34236
35197
  titleSource: titleSourceValueSchema.optional(),
34237
- description: z69.string().optional(),
35198
+ description: z70.string().optional(),
34238
35199
  category: blockCategoryEnum,
34239
- icon: z69.string().optional(),
34240
- tags: z69.array(z69.string()).optional(),
35200
+ icon: z70.string().optional(),
35201
+ tags: z70.array(z70.string()).optional(),
34241
35202
  // Reuse the exact field schema from @riverbankcms/blocks - all field types supported
34242
35203
  fields: fieldSchema.array().min(1, "Custom blocks must have at least one field"),
34243
35204
  // Data loaders for CMS endpoints
@@ -34245,14 +35206,14 @@ var sdkCustomBlockSchema = z69.object({
34245
35206
  // Optional declarative layout - when present, block can render without React override
34246
35207
  layout: NodeSchema.optional(),
34247
35208
  // Optional variants system (preferred when a block has multiple structural layouts)
34248
- variants: z69.record(z69.string().min(1), NodeSchema).optional(),
34249
- defaultVariant: z69.string().min(1).optional(),
34250
- variantOptions: z69.record(
34251
- z69.string().min(1),
34252
- z69.object({
34253
- label: z69.string().min(1).optional(),
34254
- description: z69.string().min(1).optional(),
34255
- icon: z69.string().min(1).optional()
35209
+ variants: z70.record(z70.string().min(1), NodeSchema).optional(),
35210
+ defaultVariant: z70.string().min(1).optional(),
35211
+ variantOptions: z70.record(
35212
+ z70.string().min(1),
35213
+ z70.object({
35214
+ label: z70.string().min(1).optional(),
35215
+ description: z70.string().min(1).optional(),
35216
+ icon: z70.string().min(1).optional()
34256
35217
  })
34257
35218
  ).optional()
34258
35219
  }).superRefine((data, ctx) => {
@@ -34263,7 +35224,7 @@ var sdkCustomBlockSchema = z69.object({
34263
35224
  const exists = fields3.some((field) => field.id === source);
34264
35225
  if (!exists) {
34265
35226
  ctx.addIssue({
34266
- code: z69.ZodIssueCode.custom,
35227
+ code: z70.ZodIssueCode.custom,
34267
35228
  message: `titleSource must reference a valid field ID (got "${source}")`,
34268
35229
  path: Array.isArray(data.titleSource) ? ["titleSource", index] : ["titleSource"]
34269
35230
  });
@@ -34272,7 +35233,7 @@ var sdkCustomBlockSchema = z69.object({
34272
35233
  }
34273
35234
  if (data.layout && data.variants) {
34274
35235
  ctx.addIssue({
34275
- code: z69.ZodIssueCode.custom,
35236
+ code: z70.ZodIssueCode.custom,
34276
35237
  message: "Custom block must define either `layout` or `variants`, not both",
34277
35238
  path: ["variants"]
34278
35239
  });
@@ -34282,7 +35243,7 @@ var sdkCustomBlockSchema = z69.object({
34282
35243
  if (!result.valid) {
34283
35244
  for (const error of result.errors) {
34284
35245
  ctx.addIssue({
34285
- code: z69.ZodIssueCode.custom,
35246
+ code: z70.ZodIssueCode.custom,
34286
35247
  message: error.message,
34287
35248
  path: ["layout"]
34288
35249
  });
@@ -34293,14 +35254,14 @@ var sdkCustomBlockSchema = z69.object({
34293
35254
  const keys = Object.keys(data.variants);
34294
35255
  if (keys.length === 0) {
34295
35256
  ctx.addIssue({
34296
- code: z69.ZodIssueCode.custom,
35257
+ code: z70.ZodIssueCode.custom,
34297
35258
  message: "`variants` must contain at least one variant key",
34298
35259
  path: ["variants"]
34299
35260
  });
34300
35261
  }
34301
35262
  if (data.defaultVariant && !Object.prototype.hasOwnProperty.call(data.variants, data.defaultVariant)) {
34302
35263
  ctx.addIssue({
34303
- code: z69.ZodIssueCode.custom,
35264
+ code: z70.ZodIssueCode.custom,
34304
35265
  message: "`defaultVariant` must be a key present in `variants`",
34305
35266
  path: ["defaultVariant"]
34306
35267
  });
@@ -34310,7 +35271,7 @@ var sdkCustomBlockSchema = z69.object({
34310
35271
  if (!result.valid) {
34311
35272
  for (const error of result.errors) {
34312
35273
  ctx.addIssue({
34313
- code: z69.ZodIssueCode.custom,
35274
+ code: z70.ZodIssueCode.custom,
34314
35275
  message: `${key}: ${error.message}`,
34315
35276
  path: ["variants", key]
34316
35277
  });
@@ -34321,7 +35282,7 @@ var sdkCustomBlockSchema = z69.object({
34321
35282
  for (const key of Object.keys(data.variantOptions)) {
34322
35283
  if (!Object.prototype.hasOwnProperty.call(data.variants, key)) {
34323
35284
  ctx.addIssue({
34324
- code: z69.ZodIssueCode.custom,
35285
+ code: z70.ZodIssueCode.custom,
34325
35286
  message: "`variantOptions` key must exist in `variants`",
34326
35287
  path: ["variantOptions", key]
34327
35288
  });
@@ -34330,58 +35291,58 @@ var sdkCustomBlockSchema = z69.object({
34330
35291
  }
34331
35292
  }
34332
35293
  });
34333
- var themeSourceSchema = z69.enum(["local", "cms"]).optional();
34334
- var activeThemeSchema = z69.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
35294
+ var themeSourceSchema = z70.enum(["local", "cms"]).optional();
35295
+ var activeThemeSchema = z70.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
34335
35296
  message: "Theme name must be lowercase alphanumeric with hyphens/underscores"
34336
35297
  }).max(64, "Theme name too long").optional();
34337
35298
  function isValidConfigBlockKind(kind) {
34338
35299
  if (getBlockDefinition(kind)) return true;
34339
35300
  return /^custom\.[a-z][a-z0-9-]*$/.test(kind);
34340
35301
  }
34341
- var layoutBlockKindSchema = z69.string().refine(isValidConfigBlockKind, {
35302
+ var layoutBlockKindSchema = z70.string().refine(isValidConfigBlockKind, {
34342
35303
  message: 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.my-block")'
34343
35304
  });
34344
- var layoutFooterBlockSchema = z69.object({
34345
- id: z69.string().min(1).optional(),
35305
+ var layoutFooterBlockSchema = z70.object({
35306
+ id: z70.string().min(1).optional(),
34346
35307
  kind: layoutBlockKindSchema,
34347
35308
  // Allow omitted content for blocks that rely on defaults.
34348
- content: z69.record(z69.string(), z69.unknown()).optional()
35309
+ content: z70.record(z70.string(), z70.unknown()).optional()
34349
35310
  }).strict();
34350
- var layoutConfigSchema = z69.object({
34351
- footerBlocks: z69.array(layoutFooterBlockSchema).optional()
35311
+ var layoutConfigSchema = z70.object({
35312
+ footerBlocks: z70.array(layoutFooterBlockSchema).optional()
34352
35313
  }).strict();
34353
- var sdkWorkflowIdSchema2 = z69.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
35314
+ var sdkWorkflowIdSchema2 = z70.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
34354
35315
  message: "Workflow ID must start with a lowercase letter and use lowercase letters, numbers, dots, underscores, or hyphens"
34355
35316
  });
34356
- var sdkWorkflowEndpointSchema2 = z69.string().min(1).max(SDK_WORKFLOW_ENDPOINT_MAX_LENGTH).regex(SDK_WORKFLOW_ENDPOINT_PATTERN, { message: 'Workflow endpoint must be a site-relative path starting with "/"' });
34357
- var sdkWorkflowTriggerSchema2 = z69.discriminatedUnion("type", [
34358
- z69.object({ type: z69.literal("manual") }).strict()
35317
+ var sdkWorkflowEndpointSchema2 = z70.string().min(1).max(SDK_WORKFLOW_ENDPOINT_MAX_LENGTH).regex(SDK_WORKFLOW_ENDPOINT_PATTERN, { message: 'Workflow endpoint must be a site-relative path starting with "/"' });
35318
+ var sdkWorkflowTriggerSchema2 = z70.discriminatedUnion("type", [
35319
+ z70.object({ type: z70.literal("manual") }).strict()
34359
35320
  ]);
34360
- var sdkWorkflowConfirmationSchema2 = z69.object({
34361
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
34362
- body: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
35321
+ var sdkWorkflowConfirmationSchema2 = z70.object({
35322
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
35323
+ body: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
34363
35324
  }).strict();
34364
- var sdkWorkflowConfigSchema2 = z69.object({
35325
+ var sdkWorkflowConfigSchema2 = z70.object({
34365
35326
  id: sdkWorkflowIdSchema2,
34366
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
34367
- description: z69.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
34368
- contentType: z69.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
35327
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
35328
+ description: z70.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
35329
+ contentType: z70.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
34369
35330
  endpoint: sdkWorkflowEndpointSchema2,
34370
- triggers: z69.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
35331
+ triggers: z70.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
34371
35332
  confirmation: sdkWorkflowConfirmationSchema2.optional()
34372
35333
  }).strict();
34373
- var sdkWorkflowsSchema2 = z69.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
35334
+ var sdkWorkflowsSchema2 = z70.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
34374
35335
  const ids = workflows.map((workflow) => workflow.id);
34375
35336
  return ids.length === new Set(ids).size;
34376
35337
  }, { message: "Workflow IDs must be unique" }).optional();
34377
- var riverbankSiteConfigSchema = z69.object({
34378
- siteId: z69.string().uuid(),
35338
+ var riverbankSiteConfigSchema = z70.object({
35339
+ siteId: z70.string().uuid(),
34379
35340
  previewUrl: sdkSiteUrlSchema.optional(),
34380
35341
  liveUrl: sdkSiteUrlSchema.optional(),
34381
35342
  theme: sdkThemeConfigSchema2.optional(),
34382
35343
  styles: siteStyleConfigSchema,
34383
35344
  layout: layoutConfigSchema.optional(),
34384
- customBlocks: z69.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
35345
+ customBlocks: z70.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
34385
35346
  // Ensure unique block IDs
34386
35347
  (blocks) => {
34387
35348
  const ids = blocks.map((b) => b.id);
@@ -34394,7 +35355,7 @@ var riverbankSiteConfigSchema = z69.object({
34394
35355
  workflows: sdkWorkflowsSchema2,
34395
35356
  content: contentConfigSchema.optional(),
34396
35357
  // CLI-related configuration (Phase 4)
34397
- contentDir: z69.string().optional(),
35358
+ contentDir: z70.string().optional(),
34398
35359
  sync: syncConfigSchema,
34399
35360
  deploy: deployConfigSchema,
34400
35361
  // Theme sync configuration (Phase 5)