@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
@@ -1,5 +1,5 @@
1
1
  // src/config/validation.ts
2
- import { z as z69 } from "zod";
2
+ import { z as z70 } from "zod";
3
3
 
4
4
  // ../api/src/apiEndpointTypes.ts
5
5
  function blockedDemoMutationPolicy(classification, publicMessage) {
@@ -3903,6 +3903,14 @@ var ENDPOINT_DEFINITIONS = {
3903
3903
  responseKind: "json",
3904
3904
  errors: []
3905
3905
  },
3906
+ applyDiscountCode: {
3907
+ path: "/public/sites/{siteId}/bookings/discounts/apply",
3908
+ method: "POST",
3909
+ tags: ["site-{siteId}", "booking-discounts"],
3910
+ auth: "public",
3911
+ responseKind: "json",
3912
+ errors: ["validation:invalid_input", "rate_limit:exceeded"]
3913
+ },
3906
3914
  // Batch endpoint for block loader requests (reduces SSR fan-out)
3907
3915
  batchBlockLoaders: {
3908
3916
  path: "/public/sites/{siteId}/block-loaders/batch",
@@ -6242,6 +6250,27 @@ var ENDPOINT_DEFINITIONS = {
6242
6250
  }
6243
6251
  };
6244
6252
 
6253
+ // ../core/src/location.ts
6254
+ function normalizeLocationAddressText(value) {
6255
+ if (typeof value !== "string") {
6256
+ return null;
6257
+ }
6258
+ const trimmed = value.trim();
6259
+ return trimmed ? trimmed : null;
6260
+ }
6261
+ function hasLocationCoordinates(value) {
6262
+ return typeof value?.lat === "number" && typeof value?.lng === "number";
6263
+ }
6264
+ function toLocationCoordinates(value) {
6265
+ if (!hasLocationCoordinates(value)) {
6266
+ return null;
6267
+ }
6268
+ return {
6269
+ lat: value.lat,
6270
+ lng: value.lng
6271
+ };
6272
+ }
6273
+
6245
6274
  // ../api/src/accessAdmin.ts
6246
6275
  import { z } from "zod";
6247
6276
  var managedDomainAddOnPricingSnapshotSchema = z.object({
@@ -6384,27 +6413,6 @@ function formatKeyAsLabel(key) {
6384
6413
  // ../blocks/src/system/manifest/schema.ts
6385
6414
  import { z as z4 } from "zod";
6386
6415
 
6387
- // ../core/src/location.ts
6388
- function normalizeLocationAddressText(value) {
6389
- if (typeof value !== "string") {
6390
- return null;
6391
- }
6392
- const trimmed = value.trim();
6393
- return trimmed ? trimmed : null;
6394
- }
6395
- function hasLocationCoordinates(value) {
6396
- return typeof value?.lat === "number" && typeof value?.lng === "number";
6397
- }
6398
- function toLocationCoordinates(value) {
6399
- if (!hasLocationCoordinates(value)) {
6400
- return null;
6401
- }
6402
- return {
6403
- lat: value.lat,
6404
- lng: value.lng
6405
- };
6406
- }
6407
-
6408
6416
  // ../media-core/src/transformRect.ts
6409
6417
  function isValidTransformRectStructure(rect) {
6410
6418
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -7529,6 +7537,9 @@ function makeBoundaryId(previousBlockId, nextBlockId) {
7529
7537
  const next = encodeURIComponent(nextBlockId);
7530
7538
  return asDesignBoundaryId(`boundary:${previous}:${next}`);
7531
7539
  }
7540
+ function assertNever(value, message = "Unhandled Theme V2 variant") {
7541
+ throw new Error(`${message}: ${String(value)}`);
7542
+ }
7532
7543
  function brandNonEmptyString(value, label) {
7533
7544
  if (value.length === 0) {
7534
7545
  throw new Error(`${label} must be a non-empty string.`);
@@ -7556,6 +7567,10 @@ var tileTreatmentValues = [
7556
7567
  "quiet",
7557
7568
  "brand-depth"
7558
7569
  ];
7570
+ var eventListTreatmentValues = [
7571
+ "plain",
7572
+ "lined-panel"
7573
+ ];
7559
7574
  var eyebrowTreatmentValues = [
7560
7575
  "plain",
7561
7576
  "pill",
@@ -7613,6 +7628,7 @@ function defineBlockDesignCapability(capability) {
7613
7628
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7614
7629
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7615
7630
  tileTreatments: capability.tileTreatments ?? ["default"],
7631
+ eventListTreatments: capability.eventListTreatments ?? ["plain"],
7616
7632
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
7617
7633
  ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
7618
7634
  ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
@@ -7637,9 +7653,98 @@ var blockAppearancePresets = [
7637
7653
  transitionAfter: "soft-fade-short",
7638
7654
  emphasis: "high",
7639
7655
  sectionHeight: "hero",
7656
+ heroComposition: "center",
7657
+ heroTypographyScale: "display",
7640
7658
  imageSurfaceTreatment: { kind: "neutral-wash" }
7641
7659
  }
7642
7660
  }),
7661
+ defineBlockAppearancePreset({
7662
+ kind: "block-design",
7663
+ id: "hero-bottom-left-panel",
7664
+ target: "hero",
7665
+ label: "Bottom-left panel hero",
7666
+ blockKinds: ["block.hero"],
7667
+ constraints: {
7668
+ layoutFamilies: ["centered", "compact"]
7669
+ },
7670
+ optionGroups: [
7671
+ {
7672
+ id: "image-surface-treatment",
7673
+ label: "Treatment",
7674
+ selectedOptionId: "neutral-scrim",
7675
+ options: [
7676
+ {
7677
+ id: "neutral-scrim",
7678
+ label: "Neutral scrim",
7679
+ designPatch: {
7680
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7681
+ }
7682
+ },
7683
+ {
7684
+ id: "brand-scrim-primary",
7685
+ label: "Brand scrim",
7686
+ designPatch: {
7687
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "balanced" }
7688
+ }
7689
+ }
7690
+ ]
7691
+ }
7692
+ ],
7693
+ layoutPatches: [
7694
+ {
7695
+ constraints: {
7696
+ layoutVariantKeys: ["micro"]
7697
+ },
7698
+ designPatch: {
7699
+ sectionHeight: "banner",
7700
+ heroTypographyScale: "editorial"
7701
+ }
7702
+ }
7703
+ ],
7704
+ design: {
7705
+ sectionSurface: "hero-image",
7706
+ contentFrame: panelFrame("raised"),
7707
+ itemSurface: "none",
7708
+ transitionAfter: "soft-fade-short",
7709
+ emphasis: "high",
7710
+ sectionHeight: "immersive",
7711
+ heroComposition: "bottom-left",
7712
+ heroTypographyScale: "display",
7713
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7714
+ }
7715
+ }),
7716
+ defineBlockAppearancePreset({
7717
+ kind: "block-design",
7718
+ id: "hero-poster-image",
7719
+ target: "hero",
7720
+ label: "Poster image hero",
7721
+ blockKinds: ["block.hero"],
7722
+ constraints: {
7723
+ layoutFamilies: ["centered", "compact"]
7724
+ },
7725
+ layoutPatches: [
7726
+ {
7727
+ constraints: {
7728
+ layoutVariantKeys: ["micro"]
7729
+ },
7730
+ designPatch: {
7731
+ sectionHeight: "banner",
7732
+ heroTypographyScale: "display"
7733
+ }
7734
+ }
7735
+ ],
7736
+ design: {
7737
+ sectionSurface: "hero-image",
7738
+ contentFrame: plainFrame,
7739
+ itemSurface: "none",
7740
+ transitionAfter: "soft-fade-short",
7741
+ emphasis: "high",
7742
+ sectionHeight: "immersive",
7743
+ heroComposition: "center",
7744
+ heroTypographyScale: "poster",
7745
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "strong" }
7746
+ }
7747
+ }),
7643
7748
  defineBlockAppearancePreset({
7644
7749
  kind: "block-design",
7645
7750
  id: "hero-brand-scrim",
@@ -7689,6 +7794,8 @@ var blockAppearancePresets = [
7689
7794
  transitionAfter: "soft-fade-short",
7690
7795
  emphasis: "high",
7691
7796
  sectionHeight: "immersive",
7797
+ heroComposition: "center",
7798
+ heroTypographyScale: "display",
7692
7799
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7693
7800
  }
7694
7801
  }),
@@ -7741,6 +7848,8 @@ var blockAppearancePresets = [
7741
7848
  transitionAfter: "soft-fade-short",
7742
7849
  emphasis: "high",
7743
7850
  sectionHeight: "immersive",
7851
+ heroComposition: "center",
7852
+ heroTypographyScale: "display",
7744
7853
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7745
7854
  imageSurfaceMotion: "fixed-frame",
7746
7855
  eyebrowTreatment: "accent-pill-bounce"
@@ -7761,6 +7870,8 @@ var blockAppearancePresets = [
7761
7870
  itemSurface: "none",
7762
7871
  transitionAfter: "soft-fade-short",
7763
7872
  emphasis: "high",
7873
+ heroComposition: "center",
7874
+ heroTypographyScale: "editorial",
7764
7875
  eyebrowTreatment: "accent-pill-bounce"
7765
7876
  }
7766
7877
  }),
@@ -7775,7 +7886,82 @@ var blockAppearancePresets = [
7775
7886
  contentFrame: panelFrame("inset"),
7776
7887
  itemSurface: "none",
7777
7888
  transitionAfter: "none",
7778
- emphasis: "high"
7889
+ emphasis: "high",
7890
+ heroComposition: "center",
7891
+ heroTypographyScale: "editorial"
7892
+ }
7893
+ }),
7894
+ defineBlockAppearancePreset({
7895
+ kind: "block-design",
7896
+ id: "hero-split-editorial",
7897
+ target: "hero",
7898
+ label: "Editorial split hero",
7899
+ blockKinds: ["block.hero"],
7900
+ constraints: {
7901
+ layoutFamilies: ["split"]
7902
+ },
7903
+ design: {
7904
+ sectionSurface: "base",
7905
+ contentFrame: plainFrame,
7906
+ itemSurface: "none",
7907
+ transitionAfter: "soft-fade-short",
7908
+ emphasis: "high",
7909
+ heroTypographyScale: "editorial"
7910
+ }
7911
+ }),
7912
+ defineBlockAppearancePreset({
7913
+ kind: "block-design",
7914
+ id: "hero-split-brand",
7915
+ target: "hero",
7916
+ label: "Brand split hero",
7917
+ blockKinds: ["block.hero"],
7918
+ constraints: {
7919
+ layoutFamilies: ["split"]
7920
+ },
7921
+ design: {
7922
+ sectionSurface: "brand-depth-band",
7923
+ contentFrame: plainFrame,
7924
+ itemSurface: "none",
7925
+ transitionAfter: "soft-fade-short",
7926
+ emphasis: "high",
7927
+ heroTypographyScale: "display",
7928
+ eyebrowTreatment: "accent-pill-bounce"
7929
+ }
7930
+ }),
7931
+ defineBlockAppearancePreset({
7932
+ kind: "block-design",
7933
+ id: "hero-split-soft-panel",
7934
+ target: "hero",
7935
+ label: "Soft panel split hero",
7936
+ blockKinds: ["block.hero"],
7937
+ constraints: {
7938
+ layoutFamilies: ["split"]
7939
+ },
7940
+ design: {
7941
+ sectionSurface: "muted-band",
7942
+ contentFrame: panelFrame("raised"),
7943
+ itemSurface: "none",
7944
+ transitionAfter: "soft-fade-short",
7945
+ emphasis: "high",
7946
+ heroTypographyScale: "editorial"
7947
+ }
7948
+ }),
7949
+ defineBlockAppearancePreset({
7950
+ kind: "block-design",
7951
+ id: "hero-split-accent",
7952
+ target: "hero",
7953
+ label: "Accent split hero",
7954
+ blockKinds: ["block.hero"],
7955
+ constraints: {
7956
+ layoutFamilies: ["split"]
7957
+ },
7958
+ design: {
7959
+ sectionSurface: "accent-band",
7960
+ contentFrame: panelFrame("raised"),
7961
+ itemSurface: "none",
7962
+ transitionAfter: "soft-fade-short",
7963
+ emphasis: "high",
7964
+ heroTypographyScale: "display"
7779
7965
  }
7780
7966
  }),
7781
7967
  defineBlockAppearancePreset({
@@ -7808,9 +7994,9 @@ var blockAppearancePresets = [
7808
7994
  }),
7809
7995
  defineBlockAppearancePreset({
7810
7996
  kind: "block-design",
7811
- id: "intro-soft-earth-statement",
7997
+ id: "intro-organic-statement",
7812
7998
  target: "intro",
7813
- label: "Soft Earth intro statement",
7999
+ label: "Organic intro statement",
7814
8000
  blockKinds: ["block.intro"],
7815
8001
  design: {
7816
8002
  sectionSurface: "base",
@@ -7841,9 +8027,9 @@ var blockAppearancePresets = [
7841
8027
  }),
7842
8028
  defineBlockAppearancePreset({
7843
8029
  kind: "block-design",
7844
- id: "feature-cards-soft-earth-offerings",
8030
+ id: "feature-cards-raised-rule",
7845
8031
  target: "feature-cards",
7846
- label: "Soft Earth offering cards",
8032
+ label: "Raised cards with rule",
7847
8033
  blockKinds: ["block.feature-cards"],
7848
8034
  design: {
7849
8035
  sectionSurface: "base",
@@ -7872,6 +8058,21 @@ var blockAppearancePresets = [
7872
8058
  emphasis: "medium"
7873
8059
  }
7874
8060
  }),
8061
+ defineBlockAppearancePreset({
8062
+ kind: "block-design",
8063
+ id: "events-lined-panel",
8064
+ target: "events",
8065
+ label: "Lined event panel",
8066
+ blockKinds: ["block.event-calendar", "block.event-listing"],
8067
+ design: {
8068
+ sectionSurface: "base",
8069
+ contentFrame: plainFrame,
8070
+ itemSurface: "none",
8071
+ transitionAfter: "none",
8072
+ emphasis: "medium",
8073
+ eventListTreatment: "lined-panel"
8074
+ }
8075
+ }),
7875
8076
  defineBlockAppearancePreset({
7876
8077
  kind: "block-design",
7877
8078
  id: "schedule-details-accent-section",
@@ -7931,9 +8132,9 @@ var blockAppearancePresets = [
7931
8132
  }),
7932
8133
  defineBlockAppearancePreset({
7933
8134
  kind: "block-design",
7934
- id: "testimonials-carded-proof",
8135
+ id: "testimonials-simple-cards",
7935
8136
  target: "testimonials",
7936
- label: "Carded social proof",
8137
+ label: "Simple testimonial cards",
7937
8138
  blockKinds: ["block.testimonials"],
7938
8139
  design: {
7939
8140
  sectionSurface: "base",
@@ -7945,9 +8146,9 @@ var blockAppearancePresets = [
7945
8146
  }),
7946
8147
  defineBlockAppearancePreset({
7947
8148
  kind: "block-design",
7948
- id: "testimonials-contained-proof",
8149
+ id: "testimonials-raised-panel",
7949
8150
  target: "testimonials",
7950
- label: "Contained social proof",
8151
+ label: "Raised testimonial panel",
7951
8152
  blockKinds: ["block.testimonials"],
7952
8153
  design: {
7953
8154
  sectionSurface: "muted-band",
@@ -7959,9 +8160,9 @@ var blockAppearancePresets = [
7959
8160
  }),
7960
8161
  defineBlockAppearancePreset({
7961
8162
  kind: "block-design",
7962
- id: "testimonials-dark-proof",
8163
+ id: "testimonials-accent-panel",
7963
8164
  target: "testimonials",
7964
- label: "Dark proof panel",
8165
+ label: "Accent testimonial panel",
7965
8166
  blockKinds: ["block.testimonials"],
7966
8167
  design: {
7967
8168
  sectionSurface: "accent-band",
@@ -7973,9 +8174,9 @@ var blockAppearancePresets = [
7973
8174
  }),
7974
8175
  defineBlockAppearancePreset({
7975
8176
  kind: "block-design",
7976
- id: "testimonials-accent-quote-proof",
8177
+ id: "testimonials-accent-quote-cards",
7977
8178
  target: "testimonials",
7978
- label: "Accent quote proof",
8179
+ label: "Accent quote cards",
7979
8180
  blockKinds: ["block.testimonials"],
7980
8181
  design: {
7981
8182
  sectionSurface: "accent-band",
@@ -7988,9 +8189,9 @@ var blockAppearancePresets = [
7988
8189
  }),
7989
8190
  defineBlockAppearancePreset({
7990
8191
  kind: "block-design",
7991
- id: "testimonials-soft-earth-proof-band",
8192
+ id: "testimonials-brand-background-quotes",
7992
8193
  target: "testimonials",
7993
- label: "Soft Earth proof band",
8194
+ label: "Brand background quotes",
7994
8195
  blockKinds: ["block.testimonials"],
7995
8196
  design: {
7996
8197
  sectionSurface: "brand-depth-band",
@@ -8034,25 +8235,6 @@ var blockAppearancePresets = [
8034
8235
  emphasis: "low"
8035
8236
  }
8036
8237
  }),
8037
- defineBlockAppearancePreset({
8038
- kind: "block-design",
8039
- id: "faq-soft-earth-two-column",
8040
- target: "faq",
8041
- label: "Soft Earth two-column FAQ",
8042
- blockKinds: ["block.faq"],
8043
- design: {
8044
- sectionSurface: "base",
8045
- contentFrame: plainFrame,
8046
- itemSurface: "flat",
8047
- transitionAfter: "none",
8048
- emphasis: "medium",
8049
- accordionIconTreatment: {
8050
- iconSet: "plus",
8051
- colorToken: "primary",
8052
- motion: "swap"
8053
- }
8054
- }
8055
- }),
8056
8238
  defineBlockAppearancePreset({
8057
8239
  kind: "block-design",
8058
8240
  id: "contact-form-panel",
@@ -9431,7 +9613,8 @@ var accordionSystemSchema = z12.object({
9431
9613
  icon: z12.object({
9432
9614
  style: accordionIconSchema,
9433
9615
  position: z12.enum(["left", "right"]),
9434
- size: z12.enum(["sm", "md", "lg"])
9616
+ size: z12.enum(["sm", "md", "lg"]),
9617
+ colorToken: themeColorTokenSchema.optional()
9435
9618
  }),
9436
9619
  // Trigger (question) styling
9437
9620
  trigger: z12.object({
@@ -9565,6 +9748,7 @@ var navLinkPaddingXSchema = z16.enum(["none", "tight", "compact", "default", "re
9565
9748
  var navLinkBorderRadiusSchema = z16.enum(["none", "sm", "md", "full"]);
9566
9749
  var navLinkTextSizeSchema = z16.enum(["xs", "sm", "base", "lg"]);
9567
9750
  var navLinkLetterSpacingSchema = z16.enum(["normal", "wide", "wider", "widest"]);
9751
+ var navLinkContrastTreatmentSchema = z16.enum(["none", "soft-glow"]);
9568
9752
  var navLinkStyleSchema = z16.object({
9569
9753
  /** Display name for the style */
9570
9754
  name: z16.string().min(1).max(30).optional(),
@@ -9576,6 +9760,8 @@ var navLinkStyleSchema = z16.object({
9576
9760
  textSize: navLinkTextSizeSchema.optional(),
9577
9761
  /** Optional letter spacing override */
9578
9762
  letterSpacing: navLinkLetterSpacingSchema.optional(),
9763
+ /** Optional text-only contrast treatment for transparent/overlay navigation */
9764
+ contrastTreatment: navLinkContrastTreatmentSchema.optional(),
9579
9765
  /** Hover/active color token (for color-change effects) */
9580
9766
  hoverColorToken: themeColorTokenSchema.nullable().optional(),
9581
9767
  /** Padding preset */
@@ -9929,8 +10115,19 @@ var headingTypographyStyleSchema = typographyStyleSchema.extend({
9929
10115
  colorToken: themeColorTokenSchema.nullable().optional()
9930
10116
  });
9931
10117
  var proseLinkUnderlineStyleSchema = z21.enum(["solid", "dotted", "dashed"]);
9932
- var proseLinkUnderlineThicknessSchema = z21.enum(["auto", "fromFont", "thin", "medium", "thick"]);
9933
- var proseLinkUnderlineOffsetSchema = z21.enum(["auto", "tight", "normal", "loose"]);
10118
+ var proseLinkUnderlineThicknessSchema = z21.enum([
10119
+ "auto",
10120
+ "fromFont",
10121
+ "thin",
10122
+ "medium",
10123
+ "thick"
10124
+ ]);
10125
+ var proseLinkUnderlineOffsetSchema = z21.enum([
10126
+ "auto",
10127
+ "tight",
10128
+ "normal",
10129
+ "loose"
10130
+ ]);
9934
10131
  var proseLinkStyleSchema = z21.object({
9935
10132
  colorToken: themeColorTokenSchema.optional(),
9936
10133
  hoverColorToken: themeColorTokenSchema.optional(),
@@ -9941,7 +10138,14 @@ var proseLinkStyleSchema = z21.object({
9941
10138
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9942
10139
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9943
10140
  });
9944
- var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
10141
+ var semanticSpacingSchema = z21.enum([
10142
+ "none",
10143
+ "compact",
10144
+ "cozy",
10145
+ "medium",
10146
+ "comfortable",
10147
+ "spacious"
10148
+ ]);
9945
10149
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9946
10150
  var boxBackgroundOverlaySchema = z21.object({
9947
10151
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -9987,6 +10191,7 @@ var sectionStylesOverrideSchema = z21.object({
9987
10191
  spacing: semanticSpacingSchema.nullable().optional(),
9988
10192
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
9989
10193
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
10194
+ eventListTreatment: z21.enum(eventListTreatmentValues).nullable().optional(),
9990
10195
  eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
9991
10196
  headingDecoration: headingDecorationSchema.nullable().optional(),
9992
10197
  // Author-level override consumed by later block/editor rendering phases.
@@ -10085,9 +10290,17 @@ var inputStyle = z21.object({
10085
10290
  focus: z21.enum(["glow", "ring", "underline"]),
10086
10291
  label: z21.enum(["inside", "above"])
10087
10292
  });
10088
- var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
10293
+ var headerVariant = z21.enum(["classic", "centered", "transparent", "floating"]);
10089
10294
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
10090
- var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
10295
+ var headerNavStyle = z21.enum([
10296
+ "minimal",
10297
+ "underline",
10298
+ "underline-grow",
10299
+ "capsule",
10300
+ "scale",
10301
+ "frosted",
10302
+ "solid"
10303
+ ]);
10091
10304
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
10092
10305
  var headerMaxWidth = z21.enum(["container", "full"]);
10093
10306
  var headerContainerSchema = z21.object({
@@ -10135,8 +10348,22 @@ var dropdownStyleSchema = z21.object({
10135
10348
  textSize: z21.enum(["xs", "sm", "base", "lg"]).optional()
10136
10349
  // optional = no override (browser default)
10137
10350
  }).optional();
10138
- var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
10139
- var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
10351
+ var headerCtaGapSchema = z21.enum([
10352
+ "none",
10353
+ "tight",
10354
+ "compact",
10355
+ "default",
10356
+ "relaxed",
10357
+ "spacious"
10358
+ ]);
10359
+ var headerCtaTreatmentSchema = z21.enum([
10360
+ "default",
10361
+ "primary",
10362
+ "secondary",
10363
+ "inverted",
10364
+ "outline",
10365
+ "ghost"
10366
+ ]);
10140
10367
  var navContainerSchema = z21.object({
10141
10368
  type: z21.enum(["none", "pill", "glass"]).default("none"),
10142
10369
  tint: z21.string().nullable().optional(),
@@ -10191,7 +10418,14 @@ var footerMaxWidth = z21.enum(["container", "full"]);
10191
10418
  var footerMode = z21.enum(["default", "blocks", "default+blocks", "none"]);
10192
10419
  var footerNavLayoutMode = z21.enum(["stack", "inline", "inline-wrap"]);
10193
10420
  var footerNavLayoutAlign = z21.enum(["start", "center", "end", "space-between"]);
10194
- var footerSpacing = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
10421
+ var footerSpacing = z21.enum([
10422
+ "none",
10423
+ "tight",
10424
+ "compact",
10425
+ "default",
10426
+ "relaxed",
10427
+ "spacious"
10428
+ ]);
10195
10429
  var footerLogoPlacement = z21.enum(["left", "right", "above", "below"]);
10196
10430
  var footerLogoSize = z21.enum(["sm", "md", "lg", "xl"]);
10197
10431
  var footerLogoMaxHeight = z21.enum(["sm", "md", "lg", "xl"]);
@@ -10256,7 +10490,12 @@ var footerSchema = z21.object({
10256
10490
  logo: footerLogoSchema.optional(),
10257
10491
  bottomBar: footerBottomBarSchema.optional()
10258
10492
  });
10259
- var containerPaddingPresetSchema = z21.enum(["tight", "compact", "default", "relaxed"]);
10493
+ var containerPaddingPresetSchema = z21.enum([
10494
+ "tight",
10495
+ "compact",
10496
+ "default",
10497
+ "relaxed"
10498
+ ]);
10260
10499
  var layoutSchema = z21.object({
10261
10500
  containerPadding: z21.object({
10262
10501
  mobile: containerPaddingPresetSchema.optional(),
@@ -10264,8 +10503,24 @@ var layoutSchema = z21.object({
10264
10503
  desktop: containerPaddingPresetSchema.optional()
10265
10504
  }).optional()
10266
10505
  }).optional();
10267
- var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
10268
- var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
10506
+ var heroTypographySizeSchema = z21.enum([
10507
+ "sm",
10508
+ "base",
10509
+ "lg",
10510
+ "xl",
10511
+ "2xl",
10512
+ "3xl",
10513
+ "4xl",
10514
+ "5xl",
10515
+ "6xl",
10516
+ "editorial"
10517
+ ]);
10518
+ var heroTypographyLineHeightSchema = z21.enum([
10519
+ "tight",
10520
+ "snug",
10521
+ "normal",
10522
+ "relaxed"
10523
+ ]);
10269
10524
  var heroResponsiveTypographySchema = z21.object({
10270
10525
  headlineSize: heroTypographySizeSchema.optional(),
10271
10526
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
@@ -10770,6 +11025,34 @@ var paletteVariantsById = new Map(
10770
11025
  paletteVariants.map((v) => [v.id, v])
10771
11026
  );
10772
11027
 
11028
+ // ../theme-core/src/accordions/siteStyleDefaults.ts
11029
+ var softEarthAccordionSystem = {
11030
+ background: {
11031
+ type: "solid",
11032
+ colorToken: "background"
11033
+ },
11034
+ spacing: "comfortable",
11035
+ corners: "square",
11036
+ border: null,
11037
+ shadow: null,
11038
+ icon: {
11039
+ style: "plus-minus",
11040
+ position: "right",
11041
+ size: "md",
11042
+ colorToken: "primary"
11043
+ },
11044
+ trigger: {
11045
+ textColorToken: "text",
11046
+ fontWeight: "medium"
11047
+ },
11048
+ hover: {
11049
+ textColorToken: "primary"
11050
+ },
11051
+ content: {
11052
+ textColorToken: "neutral-700"
11053
+ }
11054
+ };
11055
+
10773
11056
  // ../theme-core/src/site-styles/headerLooks.ts
10774
11057
  function asHeaderLookId(value) {
10775
11058
  return value;
@@ -10819,23 +11102,13 @@ var headerLayoutCatalog = [
10819
11102
  maxRecommendedNavItems: 5,
10820
11103
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
10821
11104
  },
10822
- {
10823
- id: asHeaderLayoutId("editorial"),
10824
- label: "Editorial",
10825
- description: "A composed, magazine-like stacked header treatment.",
10826
- structure: "editorial-stack",
10827
- variant: "editorial",
10828
- defaultPositioning: "static",
10829
- shrinkOnScroll: false,
10830
- maxRecommendedNavItems: 6
10831
- },
10832
11105
  {
10833
11106
  id: asHeaderLayoutId("floating"),
10834
11107
  label: "Floating",
10835
11108
  description: "Detached header chrome that sits over the opening section.",
10836
11109
  structure: "floating-shell",
10837
11110
  variant: "floating",
10838
- defaultPositioning: "fixed",
11111
+ defaultPositioning: "sticky",
10839
11112
  shrinkOnScroll: true,
10840
11113
  maxRecommendedNavItems: 5,
10841
11114
  allowedLogoShapes: ["none", "text-only", "horizontal"]
@@ -10849,17 +11122,23 @@ var headerStyleCatalog = [
10849
11122
  id: asHeaderStyleId("minimal"),
10850
11123
  label: "Minimal",
10851
11124
  description: "Quiet surface with simple color-change navigation.",
10852
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
11125
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10853
11126
  navInteraction: "color-change",
10854
- surface: "neutral"
11127
+ surface: "neutral",
11128
+ defaultDepth: "none",
11129
+ navTypography: "plain",
11130
+ moods: ["calm", "professional", "editorial"]
10855
11131
  },
10856
11132
  {
10857
11133
  id: asHeaderStyleId("fine-line"),
10858
11134
  label: "Fine Line",
10859
11135
  description: "Light surface with a crisp lower rule and underline hover.",
10860
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
11136
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10861
11137
  navInteraction: "underline-grow",
10862
- surface: "bordered"
11138
+ surface: "bordered",
11139
+ defaultDepth: "line",
11140
+ navTypography: "plain",
11141
+ moods: ["calm", "professional", "editorial"]
10863
11142
  },
10864
11143
  {
10865
11144
  id: asHeaderStyleId("soft-bar"),
@@ -10867,7 +11146,10 @@ var headerStyleCatalog = [
10867
11146
  description: "Soft tinted surface with gentle pill hover states.",
10868
11147
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10869
11148
  navInteraction: "pill-background",
10870
- surface: "soft"
11149
+ surface: "soft",
11150
+ defaultDepth: "line",
11151
+ navTypography: "plain",
11152
+ moods: ["calm", "professional"]
10871
11153
  },
10872
11154
  {
10873
11155
  id: asHeaderStyleId("pill-nav"),
@@ -10875,23 +11157,32 @@ var headerStyleCatalog = [
10875
11157
  description: "A calm pill navigation rail over a neutral header.",
10876
11158
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10877
11159
  navInteraction: "pill-background",
10878
- surface: "soft"
11160
+ surface: "soft",
11161
+ defaultDepth: "none",
11162
+ navTypography: "plain",
11163
+ moods: ["calm"]
10879
11164
  },
10880
11165
  {
10881
11166
  id: asHeaderStyleId("brand-bar"),
10882
11167
  label: "Brand Bar",
10883
11168
  description: "Solid brand surface with high-contrast navigation.",
10884
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
11169
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10885
11170
  navInteraction: "color-change",
10886
- surface: "brand-solid"
11171
+ surface: "brand-solid",
11172
+ defaultDepth: "none",
11173
+ navTypography: "brand-caps",
11174
+ moods: ["professional", "expressive", "utility"]
10887
11175
  },
10888
11176
  {
10889
11177
  id: asHeaderStyleId("brand-underline"),
10890
11178
  label: "Brand Underline",
10891
11179
  description: "Brand surface with underline-grow navigation.",
10892
- supportedLayoutIds: supportedLayouts(["classic", "editorial"]),
11180
+ supportedLayoutIds: supportedLayouts(["classic"]),
10893
11181
  navInteraction: "underline-grow",
10894
- surface: "brand-solid"
11182
+ surface: "brand-solid",
11183
+ defaultDepth: "none",
11184
+ navTypography: "brand-caps",
11185
+ moods: ["expressive"]
10895
11186
  },
10896
11187
  {
10897
11188
  id: asHeaderStyleId("brand-pill"),
@@ -10899,41 +11190,54 @@ var headerStyleCatalog = [
10899
11190
  description: "Solid brand surface with rounded active and hover states.",
10900
11191
  supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
10901
11192
  navInteraction: "pill-background",
10902
- surface: "brand-solid"
11193
+ surface: "brand-solid",
11194
+ defaultDepth: "none",
11195
+ navTypography: "brand-caps",
11196
+ moods: ["expressive"]
10903
11197
  },
10904
11198
  {
10905
- id: asHeaderStyleId("editorial-line"),
10906
- label: "Editorial Line",
11199
+ id: asHeaderStyleId("serif-line"),
11200
+ label: "Serif Line",
10907
11201
  description: "Typographic logo treatment with understated underline navigation.",
10908
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
11202
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10909
11203
  navInteraction: "underline-grow",
10910
- surface: "bordered"
11204
+ surface: "bordered",
11205
+ defaultDepth: "line",
11206
+ navTypography: "heading",
11207
+ moods: ["editorial", "calm"]
10911
11208
  },
10912
11209
  {
10913
11210
  id: asHeaderStyleId("flat-tabs"),
10914
11211
  label: "Flat Tabs",
10915
11212
  description: "Flat block hover and active states with a Swiss utility feel.",
10916
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
11213
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10917
11214
  navInteraction: "flat-block",
10918
- surface: "bordered"
11215
+ surface: "bordered",
11216
+ defaultDepth: "shadow",
11217
+ navTypography: "quiet-caps",
11218
+ moods: ["professional", "utility", "expressive"]
10919
11219
  },
10920
11220
  {
10921
11221
  id: asHeaderStyleId("glass"),
10922
11222
  label: "Glass",
10923
- description: "Floating translucent chrome with frosted navigation backing.",
11223
+ description: "Translucent chrome with frosted navigation backing.",
10924
11224
  supportedLayoutIds: supportedLayouts(["floating"]),
10925
11225
  navInteraction: "glass-backed",
10926
11226
  surface: "floating",
10927
- requiresFloatingLayout: true
11227
+ defaultDepth: "shadow",
11228
+ navTypography: "plain",
11229
+ moods: ["expressive", "calm"]
10928
11230
  },
10929
11231
  {
10930
11232
  id: asHeaderStyleId("minimal-surface"),
10931
- label: "Minimal Surface",
10932
- description: "Floating chrome with a restrained translucent surface.",
11233
+ label: "Clear Split",
11234
+ description: "Floating logo with transparent navigation and no shared shell.",
10933
11235
  supportedLayoutIds: supportedLayouts(["floating"]),
10934
11236
  navInteraction: "color-change",
10935
11237
  surface: "floating",
10936
- requiresFloatingLayout: true
11238
+ defaultDepth: "none",
11239
+ navTypography: "plain",
11240
+ moods: ["editorial", "calm"]
10937
11241
  },
10938
11242
  {
10939
11243
  id: asHeaderStyleId("soft-shell"),
@@ -10942,7 +11246,31 @@ var headerStyleCatalog = [
10942
11246
  supportedLayoutIds: supportedLayouts(["floating"]),
10943
11247
  navInteraction: "pill-background",
10944
11248
  surface: "floating",
10945
- requiresFloatingLayout: true
11249
+ defaultDepth: "shadow",
11250
+ navTypography: "plain",
11251
+ moods: ["calm", "professional"]
11252
+ },
11253
+ {
11254
+ id: asHeaderStyleId("split-glass"),
11255
+ label: "Split Glass",
11256
+ description: "Logo floats independently while the navigation sits in a glass rail.",
11257
+ supportedLayoutIds: supportedLayouts(["floating"]),
11258
+ navInteraction: "glass-backed",
11259
+ surface: "floating",
11260
+ defaultDepth: "shadow",
11261
+ navTypography: "quiet-caps",
11262
+ moods: ["expressive"]
11263
+ },
11264
+ {
11265
+ id: asHeaderStyleId("split-pill"),
11266
+ label: "Split Pill",
11267
+ description: "Logo floats independently with a soft pill-backed navigation rail.",
11268
+ supportedLayoutIds: supportedLayouts(["floating"]),
11269
+ navInteraction: "pill-background",
11270
+ surface: "floating",
11271
+ defaultDepth: "shadow",
11272
+ navTypography: "heading",
11273
+ moods: ["calm", "editorial"]
10946
11274
  }
10947
11275
  ];
10948
11276
  var headerLayoutsById = new Map(
@@ -10962,7 +11290,7 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
10962
11290
  "brand-bar",
10963
11291
  "brand-underline",
10964
11292
  "brand-pill",
10965
- "editorial-line",
11293
+ "serif-line",
10966
11294
  "flat-tabs"
10967
11295
  ])
10968
11296
  ],
@@ -10975,19 +11303,7 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
10975
11303
  "pill-nav",
10976
11304
  "brand-bar",
10977
11305
  "brand-pill",
10978
- "editorial-line",
10979
- "flat-tabs"
10980
- ])
10981
- ],
10982
- [
10983
- asHeaderLayoutId("editorial"),
10984
- headerStyleRepairChain([
10985
- "minimal",
10986
- "fine-line",
10987
- "soft-bar",
10988
- "brand-bar",
10989
- "brand-underline",
10990
- "editorial-line",
11306
+ "serif-line",
10991
11307
  "flat-tabs"
10992
11308
  ])
10993
11309
  ],
@@ -10996,6 +11312,8 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
10996
11312
  headerStyleRepairChain([
10997
11313
  "glass",
10998
11314
  "minimal-surface",
11315
+ "split-glass",
11316
+ "split-pill",
10999
11317
  "soft-shell",
11000
11318
  "brand-pill"
11001
11319
  ])
@@ -11004,20 +11322,69 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11004
11322
  function headerStyleRepairChain(values) {
11005
11323
  return values.map(asHeaderStyleId);
11006
11324
  }
11007
- var headerStyleRepairOrder = /* @__PURE__ */ new Map([
11008
- [asHeaderStyleId("brand-bar"), headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])],
11009
- [asHeaderStyleId("brand-underline"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
11010
- [asHeaderStyleId("brand-pill"), headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])],
11011
- [asHeaderStyleId("pill-nav"), headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])],
11012
- [asHeaderStyleId("flat-tabs"), headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])],
11013
- [asHeaderStyleId("editorial-line"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
11014
- [asHeaderStyleId("glass"), headerStyleRepairChain(["glass", "minimal-surface", "minimal"])],
11015
- [asHeaderStyleId("soft-shell"), headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])],
11016
- [asHeaderStyleId("minimal-surface"), headerStyleRepairChain(["minimal-surface", "minimal"])],
11017
- [asHeaderStyleId("fine-line"), headerStyleRepairChain(["fine-line", "minimal"])],
11018
- [asHeaderStyleId("soft-bar"), headerStyleRepairChain(["soft-bar", "minimal"])],
11019
- [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
11020
- ]);
11325
+ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
11326
+ [
11327
+ [
11328
+ asHeaderStyleId("brand-bar"),
11329
+ headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])
11330
+ ],
11331
+ [
11332
+ asHeaderStyleId("brand-underline"),
11333
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
11334
+ ],
11335
+ [
11336
+ asHeaderStyleId("brand-pill"),
11337
+ headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])
11338
+ ],
11339
+ [
11340
+ asHeaderStyleId("pill-nav"),
11341
+ headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])
11342
+ ],
11343
+ [
11344
+ asHeaderStyleId("flat-tabs"),
11345
+ headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])
11346
+ ],
11347
+ [
11348
+ asHeaderStyleId("serif-line"),
11349
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
11350
+ ],
11351
+ [
11352
+ asHeaderStyleId("glass"),
11353
+ headerStyleRepairChain([
11354
+ "glass",
11355
+ "soft-shell",
11356
+ "fine-line",
11357
+ "minimal-surface",
11358
+ "minimal"
11359
+ ])
11360
+ ],
11361
+ [
11362
+ asHeaderStyleId("soft-shell"),
11363
+ headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])
11364
+ ],
11365
+ [
11366
+ asHeaderStyleId("minimal-surface"),
11367
+ headerStyleRepairChain(["minimal-surface", "minimal"])
11368
+ ],
11369
+ [
11370
+ asHeaderStyleId("split-glass"),
11371
+ headerStyleRepairChain(["split-glass", "glass", "minimal-surface"])
11372
+ ],
11373
+ [
11374
+ asHeaderStyleId("split-pill"),
11375
+ headerStyleRepairChain(["split-pill", "soft-shell", "brand-pill"])
11376
+ ],
11377
+ [
11378
+ asHeaderStyleId("fine-line"),
11379
+ headerStyleRepairChain(["fine-line", "minimal"])
11380
+ ],
11381
+ [
11382
+ asHeaderStyleId("soft-bar"),
11383
+ headerStyleRepairChain(["soft-bar", "minimal"])
11384
+ ],
11385
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
11386
+ ]
11387
+ );
11021
11388
  var legacyHeaderLookAliases = [
11022
11389
  {
11023
11390
  lookId: asHeaderLookId("clean-base"),
@@ -11034,10 +11401,10 @@ var legacyHeaderLookAliases = [
11034
11401
  }
11035
11402
  },
11036
11403
  {
11037
- lookId: asHeaderLookId("editorial-line"),
11404
+ lookId: asHeaderLookId("serif-line"),
11038
11405
  selection: {
11039
- layoutId: asHeaderLayoutId("editorial"),
11040
- styleId: asHeaderStyleId("editorial-line")
11406
+ layoutId: asHeaderLayoutId("centered"),
11407
+ styleId: asHeaderStyleId("serif-line")
11041
11408
  }
11042
11409
  },
11043
11410
  {
@@ -11076,9 +11443,7 @@ var legacyHeaderLookAliases = [
11076
11443
  }
11077
11444
  }
11078
11445
  ];
11079
- var legacyHeaderLookAliasesById = new Map(
11080
- legacyHeaderLookAliases.map((alias) => [alias.lookId, alias])
11081
- );
11446
+ var legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
11082
11447
  function getHeaderStyle(id) {
11083
11448
  return headerStylesById.get(id) ?? null;
11084
11449
  }
@@ -11096,10 +11461,29 @@ function resolveLegacyHeaderLookAlias(lookId) {
11096
11461
  return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
11097
11462
  }
11098
11463
  function getCompatibleHeaderStyleIds(layoutId) {
11099
- return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
11100
- const style = getHeaderStyleOrThrow(styleId);
11101
- return isHeaderStyleCompatibleWithLayout(style, layoutId);
11102
- });
11464
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter(
11465
+ (styleId) => {
11466
+ const style = getHeaderStyleOrThrow(styleId);
11467
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
11468
+ }
11469
+ );
11470
+ }
11471
+ function themedHeaderShadow(theme) {
11472
+ switch (theme.shadow.elevation) {
11473
+ case "none":
11474
+ return void 0;
11475
+ case "low":
11476
+ return { elevation: "sm" };
11477
+ case "medium":
11478
+ return { elevation: "md" };
11479
+ case "high":
11480
+ return { elevation: "lg" };
11481
+ default:
11482
+ return assertNever(
11483
+ theme.shadow.elevation,
11484
+ "Unhandled theme shadow elevation"
11485
+ );
11486
+ }
11103
11487
  }
11104
11488
  function solidBrandHeader(theme) {
11105
11489
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
@@ -11130,8 +11514,14 @@ function solidBrandHeader(theme) {
11130
11514
  borderRadius: "none",
11131
11515
  effects: {
11132
11516
  hover: [
11133
- { effectId: "text-color-change", options: { hoverColorToken: "secondary" } },
11134
- { effectId: "nav-underline", options: { style: "grow", colorToken: "secondary" } }
11517
+ {
11518
+ effectId: "text-color-change",
11519
+ options: { hoverColorToken: "secondary" }
11520
+ },
11521
+ {
11522
+ effectId: "nav-underline",
11523
+ options: { style: "grow", colorToken: "secondary" }
11524
+ }
11135
11525
  ]
11136
11526
  }
11137
11527
  },
@@ -11187,10 +11577,10 @@ function cleanBaseHeader(theme) {
11187
11577
  ctaGap: "default"
11188
11578
  };
11189
11579
  }
11190
- function editorialLineHeader(theme) {
11580
+ function serifLineHeader(theme) {
11191
11581
  return {
11192
11582
  ...baseHeader(theme),
11193
- variant: "editorial",
11583
+ variant: "centered",
11194
11584
  positioning: "sticky",
11195
11585
  shrinkOnScroll: false,
11196
11586
  background: {
@@ -11244,9 +11634,7 @@ function practicalUtilityHeader(theme) {
11244
11634
  navColor: "text",
11245
11635
  navStyle: "solid",
11246
11636
  navWeight: "semibold",
11247
- shadow: {
11248
- elevation: "sm"
11249
- },
11637
+ shadow: themedHeaderShadow(theme),
11250
11638
  border: {
11251
11639
  style: "solid",
11252
11640
  width: "thin",
@@ -11315,6 +11703,7 @@ function floatingGlassHeader(theme) {
11315
11703
  return {
11316
11704
  ...transparentOverlayHeader(theme),
11317
11705
  variant: "floating",
11706
+ positioning: "sticky",
11318
11707
  navStyle: "frosted",
11319
11708
  navContainer: {
11320
11709
  type: "glass",
@@ -11359,27 +11748,27 @@ var headerLookCatalog = [
11359
11748
  compile: solidBrandHeader
11360
11749
  },
11361
11750
  {
11362
- id: asHeaderLookId("editorial-line"),
11363
- label: "Editorial line",
11364
- visualTreatment: "light-editorial",
11751
+ id: asHeaderLookId("serif-line"),
11752
+ label: "Serif line",
11753
+ visualTreatment: "light-serif",
11365
11754
  layoutBehavior: "sticky",
11366
11755
  configuration: {
11367
- structure: "editorial-stack",
11368
- treatment: "light-editorial",
11756
+ structure: "centered-stack",
11757
+ treatment: "light-serif",
11369
11758
  behavior: "sticky"
11370
11759
  },
11371
11760
  openingRequirement: "none",
11372
11761
  maxRecommendedNavItems: 6,
11373
- compile: editorialLineHeader
11762
+ compile: serifLineHeader
11374
11763
  },
11375
11764
  {
11376
11765
  id: asHeaderLookId("centered-calm"),
11377
11766
  label: "Centered calm",
11378
- visualTreatment: "light-editorial",
11767
+ visualTreatment: "light-serif",
11379
11768
  layoutBehavior: "normal-flow",
11380
11769
  configuration: {
11381
11770
  structure: "centered-stack",
11382
- treatment: "light-editorial",
11771
+ treatment: "light-serif",
11383
11772
  behavior: "normal-flow"
11384
11773
  },
11385
11774
  openingRequirement: "none",
@@ -11830,7 +12219,7 @@ var typographyPresets = [
11830
12219
  heroTypography: {
11831
12220
  headlineSize: "6xl",
11832
12221
  headlineLineHeight: "tight",
11833
- subheadlineSize: "editorial",
12222
+ subheadlineSize: "2xl",
11834
12223
  subheadlineLineHeight: "normal",
11835
12224
  microHeadlineSize: "6xl",
11836
12225
  microHeadlineLineHeight: "tight",
@@ -11848,6 +12237,8 @@ var typographyPresetsById = new Map(
11848
12237
  );
11849
12238
 
11850
12239
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
12240
+ var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
12241
+ var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
11851
12242
  var curatedSiteStyleIdValues = [
11852
12243
  "site-style:calm-studio",
11853
12244
  "site-style:clear-professional",
@@ -11859,7 +12250,7 @@ var curatedSiteStyleIdValues = [
11859
12250
  "site-style:personal-retreat-journal",
11860
12251
  "site-style:tactile-workshop",
11861
12252
  "site-style:modern-wellness",
11862
- "site-style:soft-earth",
12253
+ SOFT_EARTH_SITE_STYLE_ID_VALUE,
11863
12254
  "site-style:bold-launch",
11864
12255
  "site-style:south-west-twerk-school"
11865
12256
  ];
@@ -11925,22 +12316,31 @@ var expressiveUnderlineInputs = {
11925
12316
  }
11926
12317
  };
11927
12318
  function uniqueContentFrameKinds() {
11928
- const kinds = [...new Set(
11929
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
11930
- )];
12319
+ const kinds = [
12320
+ ...new Set(
12321
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
12322
+ )
12323
+ ];
11931
12324
  const firstKind = kinds[0];
11932
12325
  if (!firstKind) {
11933
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
12326
+ throw new Error(
12327
+ "Expected generated design option catalog to expose at least one content frame kind."
12328
+ );
11934
12329
  }
11935
12330
  return [firstKind, ...kinds.slice(1)];
11936
12331
  }
11937
12332
  var generatedContentFrameKinds = uniqueContentFrameKinds();
11938
12333
  function defineCuratedSiteStyle(input) {
11939
12334
  const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
11940
- const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
12335
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(
12336
+ legacyHeaderLookIds,
12337
+ input.tokenRecipes
12338
+ );
11941
12339
  const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
11942
12340
  const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
11943
- if (!typographyPresetChoices.some((choice) => choice.id === defaultTypographyPresetId)) {
12341
+ if (!typographyPresetChoices.some(
12342
+ (choice) => choice.id === defaultTypographyPresetId
12343
+ )) {
11944
12344
  throw new Error(
11945
12345
  `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
11946
12346
  );
@@ -11951,9 +12351,13 @@ function defineCuratedSiteStyle(input) {
11951
12351
  description: input.description,
11952
12352
  generationBrief: input.generationBrief,
11953
12353
  selectionKeywordRules: input.selectionKeywordRules ?? [],
11954
- siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
12354
+ siteCreatorSelection: input.siteCreatorSelection ?? {
12355
+ kind: "explicit_only"
12356
+ },
11955
12357
  template: {
11956
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
12358
+ id: asDesignSystemTemplateId(
12359
+ `template:${input.id.replace("site-style:", "")}`
12360
+ ),
11957
12361
  name: input.name,
11958
12362
  version: 1,
11959
12363
  tokenRecipes: input.tokenRecipes,
@@ -11964,6 +12368,7 @@ function defineCuratedSiteStyle(input) {
11964
12368
  supportedTransitions: generatedDesignOptionCatalog.transitions
11965
12369
  },
11966
12370
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
12371
+ ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
11967
12372
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
11968
12373
  defaultHeaderSelection: input.defaultHeaderSelection ? {
11969
12374
  layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
@@ -11971,13 +12376,17 @@ function defineCuratedSiteStyle(input) {
11971
12376
  } : inferredHeaderCuration.defaultHeaderSelection,
11972
12377
  recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
11973
12378
  recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
11974
- discouragedHeaderSelections: input.discouragedHeaderSelections?.map((selection) => ({
11975
- layoutId: asHeaderLayoutId(selection.layoutId),
11976
- styleId: asHeaderStyleId(selection.styleId)
11977
- })),
12379
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map(
12380
+ (selection) => ({
12381
+ layoutId: asHeaderLayoutId(selection.layoutId),
12382
+ styleId: asHeaderStyleId(selection.styleId)
12383
+ })
12384
+ ),
11978
12385
  recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
11979
12386
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
11980
- recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
12387
+ recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(
12388
+ asFooterLookId
12389
+ ),
11981
12390
  buttonPersonalityChoices: input.buttonPersonalityChoices,
11982
12391
  paletteVariantChoices: input.paletteVariantChoices,
11983
12392
  typographyPresetChoices,
@@ -11996,7 +12405,7 @@ function headerLayoutChoice(id, note) {
11996
12405
  function headerStyleChoice(id, note) {
11997
12406
  return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
11998
12407
  }
11999
- function headerLayoutRecordKey(id) {
12408
+ function unbrandHeaderLayoutId(id) {
12000
12409
  return id;
12001
12410
  }
12002
12411
  function uniqueHeaderLayoutChoices(choices) {
@@ -12018,8 +12427,72 @@ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
12018
12427
  };
12019
12428
  return [first, ...choices.slice(1)];
12020
12429
  }
12021
- function inferHeaderCurationFromLegacyLooks(lookIds) {
12022
- const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter((selection) => Boolean(selection));
12430
+ function uniqueCompatibleHeaderStyleChoices(choices, fallbackLayoutId) {
12431
+ const compatible = new Set(getCompatibleHeaderStyleIds(fallbackLayoutId));
12432
+ const seen = /* @__PURE__ */ new Set();
12433
+ const unique = choices.filter((choice) => {
12434
+ if (!compatible.has(choice.id)) return false;
12435
+ if (seen.has(choice.id)) return false;
12436
+ seen.add(choice.id);
12437
+ return true;
12438
+ });
12439
+ return nonEmptyHeaderStyleChoices(unique, fallbackLayoutId);
12440
+ }
12441
+ function inferredHeaderStyleValuesForRecipes(layoutId, recipes) {
12442
+ switch (layoutId) {
12443
+ case "classic":
12444
+ if (isExpressiveRecipe(recipes)) {
12445
+ return [
12446
+ "brand-bar",
12447
+ "brand-underline",
12448
+ "flat-tabs",
12449
+ "brand-pill",
12450
+ "fine-line"
12451
+ ];
12452
+ }
12453
+ if (recipes.spacing === "compact") {
12454
+ return ["flat-tabs", "fine-line", "minimal", "brand-bar"];
12455
+ }
12456
+ if (isSerifTypographyRecipe(recipes)) {
12457
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12458
+ }
12459
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12460
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12461
+ }
12462
+ return ["fine-line", "minimal", "soft-bar", "brand-bar"];
12463
+ case "centered":
12464
+ if (isSerifTypographyRecipe(recipes)) {
12465
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12466
+ }
12467
+ if (isExpressiveRecipe(recipes)) {
12468
+ return ["brand-pill", "flat-tabs", "brand-bar", "fine-line"];
12469
+ }
12470
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12471
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12472
+ }
12473
+ return ["minimal", "fine-line", "soft-bar"];
12474
+ case "floating":
12475
+ if (isExpressiveRecipe(recipes)) {
12476
+ return ["glass", "split-glass", "brand-pill", "soft-shell"];
12477
+ }
12478
+ if (isSerifTypographyRecipe(recipes)) {
12479
+ return ["split-pill", "minimal-surface", "soft-shell"];
12480
+ }
12481
+ return ["soft-shell", "minimal-surface", "glass"];
12482
+ default:
12483
+ return [];
12484
+ }
12485
+ }
12486
+ function isExpressiveRecipe(recipes) {
12487
+ return recipes.contrast === "maximum" || recipes.shadow === "layered" || recipes.motion === "expressive";
12488
+ }
12489
+ function isSerifTypographyRecipe(recipes) {
12490
+ return recipes.typography === "serif-editorial" || recipes.typography === "classic-serif";
12491
+ }
12492
+ function inferHeaderCurationFromLegacyLooks(lookIds, recipes) {
12493
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
12494
+ (selection) => Boolean(selection)
12495
+ );
12023
12496
  const defaultHeaderSelection = selections[0] ?? {
12024
12497
  layoutId: asHeaderLayoutId("classic"),
12025
12498
  styleId: asHeaderStyleId("minimal")
@@ -12029,9 +12502,13 @@ function inferHeaderCurationFromLegacyLooks(lookIds) {
12029
12502
  );
12030
12503
  const stylesByLayout = {};
12031
12504
  for (const layoutChoice of layoutChoices) {
12032
- const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12033
- stylesByLayout[headerLayoutRecordKey(layoutChoice.id)] = nonEmptyHeaderStyleChoices(
12034
- styleChoices,
12505
+ const legacyStyleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12506
+ const inferredStyleChoices = inferredHeaderStyleValuesForRecipes(
12507
+ layoutChoice.id,
12508
+ recipes
12509
+ ).map((styleId) => headerStyleChoice(styleId));
12510
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = uniqueCompatibleHeaderStyleChoices(
12511
+ [...legacyStyleChoices, ...inferredStyleChoices],
12035
12512
  layoutChoice.id
12036
12513
  );
12037
12514
  }
@@ -12088,7 +12565,11 @@ var curatedSiteStyles = [
12088
12565
  motion: "subtle"
12089
12566
  },
12090
12567
  compositionBudget: quietBudget,
12091
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
12568
+ recommendedHeaderLookIds: [
12569
+ "centered-calm",
12570
+ "minimal-transparent",
12571
+ "clean-base"
12572
+ ],
12092
12573
  buttonPersonalityChoices: [
12093
12574
  buttonChoice("soft-pill"),
12094
12575
  buttonChoice("pebble"),
@@ -12117,7 +12598,11 @@ var curatedSiteStyles = [
12117
12598
  motion: "subtle"
12118
12599
  },
12119
12600
  compositionBudget: balancedBudget,
12120
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
12601
+ recommendedHeaderLookIds: [
12602
+ "practical-utility",
12603
+ "brand-solid",
12604
+ "clean-base"
12605
+ ],
12121
12606
  buttonPersonalityChoices: [
12122
12607
  buttonChoice("confident-chip"),
12123
12608
  buttonChoice("soft-pill"),
@@ -12144,7 +12629,11 @@ var curatedSiteStyles = [
12144
12629
  motion: "subtle"
12145
12630
  },
12146
12631
  compositionBudget: balancedBudget,
12147
- recommendedHeaderLookIds: ["editorial-line", "minimal-transparent", "centered-calm"],
12632
+ recommendedHeaderLookIds: [
12633
+ "serif-line",
12634
+ "minimal-transparent",
12635
+ "centered-calm"
12636
+ ],
12148
12637
  buttonPersonalityChoices: [
12149
12638
  buttonChoice("editorial-link"),
12150
12639
  buttonChoice("soft-pill"),
@@ -12172,7 +12661,11 @@ var curatedSiteStyles = [
12172
12661
  motion: "expressive"
12173
12662
  },
12174
12663
  compositionBudget: balancedBudget,
12175
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
12664
+ recommendedHeaderLookIds: [
12665
+ "brand-solid",
12666
+ "practical-utility",
12667
+ "clean-base"
12668
+ ],
12176
12669
  buttonPersonalityChoices: [
12177
12670
  buttonChoice("pebble"),
12178
12671
  buttonChoice("brushed-wash"),
@@ -12189,7 +12682,10 @@ var curatedSiteStyles = [
12189
12682
  name: "Quiet Luxury",
12190
12683
  description: "Minimal, confident, and refined for premium experiences and private services.",
12191
12684
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
12192
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
12685
+ siteCreatorSelection: {
12686
+ kind: "site_creator_keyword_heuristic",
12687
+ priority: 20
12688
+ },
12193
12689
  selectionKeywordRules: [
12194
12690
  { kind: "word", value: "luxury" },
12195
12691
  { kind: "word", value: "premium" },
@@ -12207,7 +12703,11 @@ var curatedSiteStyles = [
12207
12703
  motion: "none"
12208
12704
  },
12209
12705
  compositionBudget: quietBudget,
12210
- recommendedHeaderLookIds: ["minimal-transparent", "editorial-line", "clean-base"],
12706
+ recommendedHeaderLookIds: [
12707
+ "minimal-transparent",
12708
+ "serif-line",
12709
+ "clean-base"
12710
+ ],
12211
12711
  buttonPersonalityChoices: [
12212
12712
  buttonChoice("editorial-link"),
12213
12713
  buttonChoice("confident-chip"),
@@ -12243,7 +12743,11 @@ var curatedSiteStyles = [
12243
12743
  motion: "none"
12244
12744
  },
12245
12745
  compositionBudget: quietBudget,
12246
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
12746
+ recommendedHeaderLookIds: [
12747
+ "practical-utility",
12748
+ "brand-solid",
12749
+ "clean-base"
12750
+ ],
12247
12751
  buttonPersonalityChoices: [
12248
12752
  buttonChoice("confident-chip"),
12249
12753
  buttonChoice("pebble"),
@@ -12270,7 +12774,11 @@ var curatedSiteStyles = [
12270
12774
  motion: "subtle"
12271
12775
  },
12272
12776
  compositionBudget: balancedBudget,
12273
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
12777
+ recommendedHeaderLookIds: [
12778
+ "centered-calm",
12779
+ "minimal-transparent",
12780
+ "clean-base"
12781
+ ],
12274
12782
  buttonPersonalityChoices: [
12275
12783
  buttonChoice("soft-pill"),
12276
12784
  buttonChoice("pebble"),
@@ -12287,7 +12795,10 @@ var curatedSiteStyles = [
12287
12795
  name: "Quiet Practice",
12288
12796
  description: "Grounded, calm, and practical for small appointment-first practices.",
12289
12797
  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.",
12290
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
12798
+ siteCreatorSelection: {
12799
+ kind: "site_creator_keyword_heuristic",
12800
+ priority: 30
12801
+ },
12291
12802
  selectionKeywordRules: [
12292
12803
  { kind: "substring", value: "massage" },
12293
12804
  { kind: "word", value: "bodywork" },
@@ -12308,7 +12819,11 @@ var curatedSiteStyles = [
12308
12819
  motion: "subtle"
12309
12820
  },
12310
12821
  compositionBudget: quietBudget,
12311
- recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
12822
+ recommendedHeaderLookIds: [
12823
+ "practical-utility",
12824
+ "clean-base",
12825
+ "centered-calm"
12826
+ ],
12312
12827
  buttonPersonalityChoices: [
12313
12828
  buttonChoice("pebble"),
12314
12829
  buttonChoice("soft-pill"),
@@ -12325,7 +12840,10 @@ var curatedSiteStyles = [
12325
12840
  name: "Personal Retreat Journal",
12326
12841
  description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
12327
12842
  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.",
12328
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
12843
+ siteCreatorSelection: {
12844
+ kind: "site_creator_keyword_heuristic",
12845
+ priority: 40
12846
+ },
12329
12847
  selectionKeywordRules: [
12330
12848
  { kind: "substring", value: "retreat" },
12331
12849
  { kind: "phrase", value: "solo practitioner" },
@@ -12345,7 +12863,11 @@ var curatedSiteStyles = [
12345
12863
  motion: "subtle"
12346
12864
  },
12347
12865
  compositionBudget: balancedBudget,
12348
- recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
12866
+ recommendedHeaderLookIds: [
12867
+ "serif-line",
12868
+ "centered-calm",
12869
+ "minimal-transparent"
12870
+ ],
12349
12871
  buttonPersonalityChoices: [
12350
12872
  buttonChoice("editorial-link"),
12351
12873
  buttonChoice("soft-pill"),
@@ -12362,7 +12884,10 @@ var curatedSiteStyles = [
12362
12884
  name: "Tactile Workshop",
12363
12885
  description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
12364
12886
  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.",
12365
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
12887
+ siteCreatorSelection: {
12888
+ kind: "site_creator_keyword_heuristic",
12889
+ priority: 50
12890
+ },
12366
12891
  selectionKeywordRules: [
12367
12892
  { kind: "substring", value: "ceramic" },
12368
12893
  { kind: "word", value: "pottery" },
@@ -12382,8 +12907,15 @@ var curatedSiteStyles = [
12382
12907
  motion: "subtle"
12383
12908
  },
12384
12909
  compositionBudget: balancedBudget,
12385
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
12386
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
12910
+ recommendedHeaderLookIds: [
12911
+ "brand-solid",
12912
+ "practical-utility",
12913
+ "clean-base"
12914
+ ],
12915
+ recommendedFooterLookIds: [
12916
+ "site-footer-brand-two-band",
12917
+ "footer-muted-grounding"
12918
+ ],
12387
12919
  buttonPersonalityChoices: [
12388
12920
  buttonChoice("pebble"),
12389
12921
  buttonChoice("confident-chip"),
@@ -12398,11 +12930,14 @@ var curatedSiteStyles = [
12398
12930
  ]
12399
12931
  }),
12400
12932
  defineCuratedSiteStyle({
12401
- id: "site-style:soft-earth",
12933
+ id: SOFT_EARTH_SITE_STYLE_ID,
12402
12934
  name: "Soft Earth",
12403
12935
  description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
12404
- 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.",
12405
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 45 },
12936
+ 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.",
12937
+ siteCreatorSelection: {
12938
+ kind: "site_creator_keyword_heuristic",
12939
+ priority: 45
12940
+ },
12406
12941
  selectionKeywordRules: [
12407
12942
  { kind: "word", value: "meditation" },
12408
12943
  { kind: "word", value: "wellbeing" },
@@ -12468,18 +13003,29 @@ var curatedSiteStyles = [
12468
13003
  paragraphSize: "default",
12469
13004
  headingSize: "editorial"
12470
13005
  }
12471
- }
13006
+ },
13007
+ accordions: softEarthAccordionSystem
13008
+ },
13009
+ defaultBlockVariants: {
13010
+ "block.faq": "question-columns"
12472
13011
  },
12473
13012
  recommendedAppearancePresetIds: [
12474
13013
  "hero-brand-scrim",
12475
- "intro-soft-earth-statement",
12476
- "feature-cards-soft-earth-offerings",
12477
- "testimonials-soft-earth-proof-band",
12478
- "faq-soft-earth-two-column",
13014
+ "intro-organic-statement",
13015
+ "feature-cards-raised-rule",
13016
+ "events-lined-panel",
13017
+ "testimonials-brand-background-quotes",
12479
13018
  "contact-form-panel"
12480
13019
  ],
12481
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "editorial-line"],
12482
- recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
13020
+ recommendedHeaderLookIds: [
13021
+ "centered-calm",
13022
+ "minimal-transparent",
13023
+ "serif-line"
13024
+ ],
13025
+ recommendedFooterLookIds: [
13026
+ "footer-muted-grounding",
13027
+ "site-footer-brand-two-band"
13028
+ ],
12483
13029
  buttonPersonalityChoices: [
12484
13030
  buttonChoice("earth-pill"),
12485
13031
  buttonChoice("soft-pill"),
@@ -12498,7 +13044,10 @@ var curatedSiteStyles = [
12498
13044
  name: "Bold Launch",
12499
13045
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
12500
13046
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
12501
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
13047
+ siteCreatorSelection: {
13048
+ kind: "site_creator_keyword_heuristic",
13049
+ priority: 10
13050
+ },
12502
13051
  selectionKeywordRules: [
12503
13052
  { kind: "substring", value: "launch" },
12504
13053
  { kind: "substring", value: "campaign" },
@@ -12517,7 +13066,11 @@ var curatedSiteStyles = [
12517
13066
  motion: "expressive"
12518
13067
  },
12519
13068
  compositionBudget: expressiveBudget,
12520
- recommendedHeaderLookIds: ["transparent-overlay", "floating-glass", "brand-solid"],
13069
+ recommendedHeaderLookIds: [
13070
+ "transparent-overlay",
13071
+ "floating-glass",
13072
+ "brand-solid"
13073
+ ],
12521
13074
  buttonPersonalityChoices: [
12522
13075
  buttonChoice("ink-stamp"),
12523
13076
  buttonChoice("confident-chip"),
@@ -12565,11 +13118,18 @@ var curatedSiteStyles = [
12565
13118
  "hero-brand-scrim-fixed-frame",
12566
13119
  "body-text-editorial-intro",
12567
13120
  "schedule-details-brand-depth",
12568
- "testimonials-accent-quote-proof",
13121
+ "testimonials-accent-quote-cards",
12569
13122
  "contact-form-brand-depth-card"
12570
13123
  ],
12571
- recommendedHeaderLookIds: ["brand-solid", "transparent-overlay", "practical-utility"],
12572
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
13124
+ recommendedHeaderLookIds: [
13125
+ "brand-solid",
13126
+ "transparent-overlay",
13127
+ "practical-utility"
13128
+ ],
13129
+ recommendedFooterLookIds: [
13130
+ "site-footer-brand-two-band",
13131
+ "footer-muted-grounding"
13132
+ ],
12573
13133
  buttonPersonalityChoices: [
12574
13134
  buttonChoice("showtime-pill"),
12575
13135
  buttonChoice("confident-chip"),
@@ -12653,6 +13213,7 @@ var themeV2RuntimeStyleFieldNames = [
12653
13213
  ];
12654
13214
  var themeV2BlockSpecificRawStyleFieldNames = [
12655
13215
  "_contentCardStyles",
13216
+ "_heroLayoutStyles",
12656
13217
  "_textCardStyles"
12657
13218
  ];
12658
13219
  var themeV2NormalEditorRawStyleFieldNames = [
@@ -12662,6 +13223,10 @@ var themeV2NormalEditorRawStyleFieldNames = [
12662
13223
  var themeV2NormalEditorRawStyleFieldNameSet = new Set(
12663
13224
  themeV2NormalEditorRawStyleFieldNames
12664
13225
  );
13226
+ var themeV2CompilerOwnedFieldNames = [
13227
+ ...themeV2RuntimeStyleFieldNames,
13228
+ ...themeV2BlockSpecificRawStyleFieldNames
13229
+ ];
12665
13230
 
12666
13231
  // ../theme-core/src/site-styles/designState.ts
12667
13232
  var themeV2DesignStateSchemaVersion = 1;
@@ -12676,6 +13241,16 @@ var heroLegibilityStrategySchema = z23.enum([
12676
13241
  "scrim-gradient",
12677
13242
  "solid-panel"
12678
13243
  ]);
13244
+ var heroCompositionIntentSchema = z23.enum([
13245
+ "center",
13246
+ "bottom-left"
13247
+ ]);
13248
+ var heroTypographyScaleIntentSchema = z23.enum([
13249
+ "quiet",
13250
+ "editorial",
13251
+ "display",
13252
+ "poster"
13253
+ ]);
12679
13254
  var sectionHeightIntentSchema = z23.enum([
12680
13255
  "default",
12681
13256
  "banner",
@@ -12711,6 +13286,7 @@ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
12711
13286
  ]);
12712
13287
  var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
12713
13288
  var tileTreatmentSchema = z23.enum(tileTreatmentValues);
13289
+ var eventListTreatmentSchema = z23.enum(eventListTreatmentValues);
12714
13290
  var eyebrowTreatmentSchema = z23.enum(eyebrowTreatmentValues);
12715
13291
  function uniqueNonEmpty(values) {
12716
13292
  const uniqueValues = [...new Set(values)];
@@ -12752,10 +13328,13 @@ var blockDesignPlanSchema = z23.object({
12752
13328
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
12753
13329
  sectionHeight: sectionHeightIntentSchema.optional(),
12754
13330
  heroLegibility: heroLegibilityStrategySchema.optional(),
13331
+ heroComposition: heroCompositionIntentSchema.optional(),
13332
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
12755
13333
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
12756
13334
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
12757
13335
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
12758
13336
  tileTreatment: tileTreatmentSchema.optional(),
13337
+ eventListTreatment: eventListTreatmentSchema.optional(),
12759
13338
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
12760
13339
  }).strict();
12761
13340
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
@@ -14155,6 +14734,7 @@ function styledSection(config) {
14155
14734
  renderBackgroundImage = true,
14156
14735
  backgroundImageLoading,
14157
14736
  backgroundImageFetchPriority,
14737
+ allowOverflow = false,
14158
14738
  fullWidthPath
14159
14739
  } = config;
14160
14740
  const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
@@ -14189,7 +14769,7 @@ function styledSection(config) {
14189
14769
  // No fallback needed - transform handles all cases via defaultSpacing
14190
14770
  }
14191
14771
  },
14192
- allowOverflow: {
14772
+ allowOverflow: allowOverflow ? true : {
14193
14773
  $bind: {
14194
14774
  from: `${bindFrom}.background`,
14195
14775
  transforms: [{ id: "background.resolveAllowOverflow" }],
@@ -14873,6 +15453,14 @@ var tileTreatmentSet = new Set(tileTreatmentValues);
14873
15453
  function isTileTreatment(value) {
14874
15454
  return typeof value === "string" && tileTreatmentSet.has(value);
14875
15455
  }
15456
+ var eventListTreatmentClassMap = {
15457
+ plain: "",
15458
+ "lined-panel": "rb-event-list-treatment-lined-panel"
15459
+ };
15460
+ var eventListTreatmentSet = new Set(eventListTreatmentValues);
15461
+ function isEventListTreatment(value) {
15462
+ return typeof value === "string" && eventListTreatmentSet.has(value);
15463
+ }
14876
15464
  var sectionClassNameTransform = {
14877
15465
  id: "sectionStyles.resolveClassName",
14878
15466
  kind: "string",
@@ -14940,6 +15528,17 @@ var sectionClassNameTransform = {
14940
15528
  `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
14941
15529
  );
14942
15530
  }
15531
+ const eventListTreatment = input?.eventListTreatment;
15532
+ if (isEventListTreatment(eventListTreatment)) {
15533
+ const eventListTreatmentClass = eventListTreatmentClassMap[eventListTreatment];
15534
+ if (eventListTreatmentClass) {
15535
+ classes.push(eventListTreatmentClass);
15536
+ }
15537
+ } else if (typeof eventListTreatment === "string" && process.env.NODE_ENV !== "production") {
15538
+ console.warn(
15539
+ `[sectionStyles] Invalid eventListTreatment value in _sectionStyles: "${eventListTreatment}". Expected one of: ${eventListTreatmentValues.join(", ")}.`
15540
+ );
15541
+ }
14943
15542
  if (hasFixedFrameBackgroundMotion(input)) {
14944
15543
  classes.push(fixedFrameScopeClass);
14945
15544
  }
@@ -15375,6 +15974,35 @@ function sectionState(opts) {
15375
15974
  );
15376
15975
  }
15377
15976
 
15977
+ // ../blocks/src/system/node/fragments/headingDecoration.ts
15978
+ var defaultBindFrom = "_sectionStyles.headingDecoration";
15979
+ function headingDecoration({
15980
+ bindFrom = defaultBindFrom,
15981
+ family,
15982
+ placement,
15983
+ className
15984
+ }) {
15985
+ return el(
15986
+ "div",
15987
+ {
15988
+ "aria-hidden": "true",
15989
+ className: {
15990
+ $bind: {
15991
+ from: bindFrom,
15992
+ transforms: [
15993
+ {
15994
+ id: "ui.headingDecorationClassName",
15995
+ options: { baseClass: className, family }
15996
+ }
15997
+ ]
15998
+ }
15999
+ }
16000
+ },
16001
+ null,
16002
+ when(`${bindFrom}.placement`, { equals: placement })
16003
+ );
16004
+ }
16005
+
15378
16006
  // ../blocks/src/system/fragments/types.ts
15379
16007
  import { z as z27 } from "zod";
15380
16008
  var FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
@@ -16153,6 +16781,10 @@ var testimonialsHeadingFragment = defineFragment({
16153
16781
  when("content.heading"),
16154
16782
  bind("content.heading")
16155
16783
  ),
16784
+ headingDecoration({
16785
+ family: "short-center-rule",
16786
+ placement: "under-centered-heading"
16787
+ }),
16156
16788
  text(
16157
16789
  {
16158
16790
  as: "p",
@@ -16824,6 +17456,41 @@ var faqHeadingFragment = defineFragment({
16824
17456
  });
16825
17457
 
16826
17458
  // ../blocks/src/system/fragments/library/faqAccordion.ts
17459
+ function createFaqAccordionLayout(options = {}) {
17460
+ return accordionList({
17461
+ collection: "content.items",
17462
+ itemName: "faqItem",
17463
+ indexName: "faqIndex",
17464
+ accordionProps: {
17465
+ className: options.rootClassName ?? "accordion-root",
17466
+ type: "single",
17467
+ collapsible: true
17468
+ },
17469
+ itemProps: {
17470
+ className: {
17471
+ $bind: {
17472
+ from: "content._cardStyles",
17473
+ transforms: [
17474
+ {
17475
+ id: "boxStyles.all",
17476
+ options: {
17477
+ axis: "all",
17478
+ includeSpacing: false,
17479
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
17480
+ }
17481
+ }
17482
+ ]
17483
+ },
17484
+ fallback: "rb-faq-item"
17485
+ },
17486
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17487
+ // Legacy theme accordion style
17488
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17489
+ },
17490
+ triggerFrom: "faqItem.question",
17491
+ contentFrom: "faqItem.answer"
17492
+ });
17493
+ }
16827
17494
  var faqAccordionFragment = defineFragment({
16828
17495
  id: "faqAccordion",
16829
17496
  title: "FAQ Accordion",
@@ -16857,40 +17524,7 @@ var faqAccordionFragment = defineFragment({
16857
17524
  }
16858
17525
  }
16859
17526
  ],
16860
- layout: accordionList({
16861
- collection: "content.items",
16862
- itemName: "faqItem",
16863
- indexName: "faqIndex",
16864
- accordionProps: {
16865
- className: "accordion-root",
16866
- // CSS-first: all styling handled by theme CSS
16867
- type: "single",
16868
- collapsible: true
16869
- },
16870
- itemProps: {
16871
- className: {
16872
- $bind: {
16873
- from: "content._cardStyles",
16874
- transforms: [
16875
- {
16876
- id: "boxStyles.all",
16877
- options: {
16878
- axis: "all",
16879
- includeSpacing: false,
16880
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden rb-border"
16881
- }
16882
- }
16883
- ]
16884
- },
16885
- fallback: "rb-faq-item"
16886
- },
16887
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
16888
- // Legacy theme accordion style
16889
- iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
16890
- },
16891
- triggerFrom: "faqItem.question",
16892
- contentFrom: "faqItem.answer"
16893
- })
17527
+ layout: createFaqAccordionLayout()
16894
17528
  });
16895
17529
 
16896
17530
  // ../blocks/src/system/fragments/library/card.ts
@@ -17943,6 +18577,7 @@ var microLayout = styledSection({
17943
18577
  function splitLayoutWith(children) {
17944
18578
  return styledSection({
17945
18579
  children: styledContainer({
18580
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
17946
18581
  children: {
17947
18582
  type: "grid",
17948
18583
  props: {
@@ -17967,6 +18602,7 @@ function splitLayoutWith(children) {
17967
18602
  // The split variants render the image as a real grid column, so suppress
17968
18603
  // the default absolute background image layer while keeping color/overlay.
17969
18604
  renderBackgroundImage: false,
18605
+ allowOverflow: true,
17970
18606
  baseClass: ""
17971
18607
  });
17972
18608
  }
@@ -18120,6 +18756,21 @@ function introHeading(className) {
18120
18756
  bind("content.title")
18121
18757
  );
18122
18758
  }
18759
+ function introHeadingGroup(className) {
18760
+ return stack(
18761
+ {
18762
+ gap: "sm",
18763
+ className: "rb-intro-heading-group"
18764
+ },
18765
+ [
18766
+ introHeading(className),
18767
+ headingDecoration({
18768
+ family: "organic-squiggle",
18769
+ placement: "after-heading"
18770
+ })
18771
+ ]
18772
+ );
18773
+ }
18123
18774
  function introBody(className = "rb-prose rb-max-w-none") {
18124
18775
  return richText({ className }, bind("content.body"));
18125
18776
  }
@@ -18138,6 +18789,10 @@ function introCopyStack(options = {}) {
18138
18789
  },
18139
18790
  [
18140
18791
  introHeading(options.headingClassName ?? "rb-intro-title"),
18792
+ headingDecoration({
18793
+ family: "organic-squiggle",
18794
+ placement: "after-heading"
18795
+ }),
18141
18796
  introBody(options.bodyClassName),
18142
18797
  introCtas(options.ctaJustify)
18143
18798
  ]
@@ -18177,7 +18832,7 @@ var statementCopyLayout = styledSection({
18177
18832
  className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
18178
18833
  },
18179
18834
  [
18180
- introHeading("rb-intro-title rb-max-w-xl"),
18835
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18181
18836
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18182
18837
  introBody(),
18183
18838
  introCtas("start")
@@ -18198,7 +18853,7 @@ var statementMediaLayout = styledSection({
18198
18853
  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"
18199
18854
  },
18200
18855
  [
18201
- introHeading("rb-intro-title rb-max-w-xl"),
18856
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18202
18857
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18203
18858
  introBody(),
18204
18859
  introCtas("start")
@@ -19200,6 +19855,9 @@ function isNodeDefinitionArray(layout) {
19200
19855
  }
19201
19856
  var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
19202
19857
  var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
19858
+ var questionColumnsAccordionLayout = createFaqAccordionLayout({
19859
+ rootClassName: "accordion-root rb-faq-question-columns rb-grid rb-grid-cols-1 rb-gap-4 rb-lg-grid-cols-2"
19860
+ });
19203
19861
  var defaultLayout = styledSection({
19204
19862
  children: styledContainer({
19205
19863
  baseClassName: "rb-relative rb-isolate",
@@ -19213,11 +19871,24 @@ var twoColumnLayout = styledSection({
19213
19871
  children: el(
19214
19872
  "div",
19215
19873
  {
19216
- className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19874
+ className: "rb-faq-split-heading rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19217
19875
  },
19218
19876
  [
19219
- el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
19220
- el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
19877
+ el("div", { className: "rb-faq-split-heading-copy" }, [headingLayout]),
19878
+ el("div", { className: "rb-faq-split-heading-accordion" }, [accordionLayout])
19879
+ ]
19880
+ )
19881
+ }),
19882
+ baseClass: ""
19883
+ });
19884
+ var questionColumnsLayout = styledSection({
19885
+ children: styledContainer({
19886
+ baseClassName: "rb-relative rb-isolate",
19887
+ children: stack(
19888
+ { gap: "xl", className: "rb-w-full" },
19889
+ [
19890
+ headingLayout,
19891
+ questionColumnsAccordionLayout
19221
19892
  ]
19222
19893
  )
19223
19894
  }),
@@ -19242,7 +19913,8 @@ var faqManifest = createBlockManifest({
19242
19913
  layout: defaultLayout,
19243
19914
  variants: {
19244
19915
  default: defaultLayout,
19245
- "two-column": twoColumnLayout
19916
+ "two-column": twoColumnLayout,
19917
+ "question-columns": questionColumnsLayout
19246
19918
  },
19247
19919
  defaultVariant: "default",
19248
19920
  variantOptions: {
@@ -19253,6 +19925,10 @@ var faqManifest = createBlockManifest({
19253
19925
  "two-column": {
19254
19926
  label: "Two column",
19255
19927
  description: "A left heading column with FAQ items on the right."
19928
+ },
19929
+ "question-columns": {
19930
+ label: "Question columns",
19931
+ description: "A full-width heading above FAQ items split into two columns."
19256
19932
  }
19257
19933
  },
19258
19934
  description: "Accordion of frequently asked questions and answers.",
@@ -19374,9 +20050,21 @@ var eyebrowTreatmentClassMap = {
19374
20050
  "accent-pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent rb-eyebrow-treatment-pill-bounce"
19375
20051
  };
19376
20052
  var eyebrowTreatmentSet = new Set(eyebrowTreatmentValues);
20053
+ var headingDecorationFamilySet = new Set(visibleHeadingDecorationFamilyValues);
20054
+ var headingDecorationPlacementSet = new Set(visibleHeadingDecorationPlacementValues);
20055
+ var headingDecorationColorTokenSet = new Set(headingDecorationColorTokenValues);
19377
20056
  function isEyebrowTreatment(value) {
19378
20057
  return typeof value === "string" && eyebrowTreatmentSet.has(value);
19379
20058
  }
20059
+ function isHeadingDecorationFamily(value) {
20060
+ return typeof value === "string" && headingDecorationFamilySet.has(value);
20061
+ }
20062
+ function isHeadingDecorationPlacement(value) {
20063
+ return typeof value === "string" && headingDecorationPlacementSet.has(value);
20064
+ }
20065
+ function isHeadingDecorationColorToken(value) {
20066
+ return typeof value === "string" && headingDecorationColorTokenSet.has(value);
20067
+ }
19380
20068
  var imageGalleryCornerClassMap = {
19381
20069
  none: "",
19382
20070
  sm: "rb-rounded-sm",
@@ -19480,6 +20168,10 @@ var sectionStateToneTransform = {
19480
20168
  summary: "Map semantic section-state kind to feedback tone",
19481
20169
  run: (value) => sectionStateToneFromUnknown(value)
19482
20170
  };
20171
+ var heroTitleLengthThresholds = {
20172
+ medium: { maxCharacters: 42, maxWords: 6 },
20173
+ long: { maxCharacters: 78, maxWords: 11 }
20174
+ };
19483
20175
  function isPlainObject(value) {
19484
20176
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
19485
20177
  }
@@ -19487,6 +20179,14 @@ function readString(obj, key) {
19487
20179
  const v = obj[key];
19488
20180
  return typeof v === "string" ? v : void 0;
19489
20181
  }
20182
+ function resolveGeneratedHeroLayoutStyles(content) {
20183
+ const raw = content._heroLayoutStyles;
20184
+ return isPlainObject(raw) ? raw : null;
20185
+ }
20186
+ function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
20187
+ const generated = resolveGeneratedHeroLayoutStyles(content);
20188
+ return generated && typeof generated[generatedKey] === "string" ? generated[generatedKey] : readString(content, fallbackKey);
20189
+ }
19490
20190
  function resolveHeroVariant(content) {
19491
20191
  const variant = readString(content, "variant");
19492
20192
  if (variant && variant.trim()) return variant.trim();
@@ -19495,14 +20195,14 @@ function resolveHeroVariant(content) {
19495
20195
  return null;
19496
20196
  }
19497
20197
  function resolveHeroContentAlignment(content) {
19498
- const raw = readString(content, "contentAlignment");
20198
+ const raw = readHeroLayoutString(content, "contentAlignment");
19499
20199
  if (raw === "left" || raw === "center" || raw === "right") return raw;
19500
20200
  const variant = resolveHeroVariant(content);
19501
20201
  if (variant === "split" || variant === "splitReverse") return "left";
19502
20202
  return "center";
19503
20203
  }
19504
20204
  function resolveHeroVerticalAlignment(content) {
19505
- const raw = readString(content, "verticalAlignment");
20205
+ const raw = readHeroLayoutString(content, "verticalAlignment");
19506
20206
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
19507
20207
  const sectionStyles = asPartialObject(content._sectionStyles);
19508
20208
  const minHeight = sectionStyles?.minHeight;
@@ -19512,11 +20212,29 @@ function resolveHeroVerticalAlignment(content) {
19512
20212
  return "top";
19513
20213
  }
19514
20214
  function resolveHeroContentMaxWidth(content) {
19515
- const raw = readString(content, "contentMaxWidth");
20215
+ const raw = readHeroLayoutString(content, "contentMaxWidth");
19516
20216
  if (raw === "default" || raw === "narrow" || raw === "medium" || raw === "wide")
19517
20217
  return raw;
19518
20218
  return "default";
19519
20219
  }
20220
+ function resolveHeroTypographyScale(content) {
20221
+ const raw = readHeroLayoutString(
20222
+ content,
20223
+ "typographyScale",
20224
+ "heroTypographyScale"
20225
+ );
20226
+ if (raw === "quiet" || raw === "editorial" || raw === "display" || raw === "poster") {
20227
+ return raw;
20228
+ }
20229
+ return null;
20230
+ }
20231
+ function resolveHeroTitleLength(content) {
20232
+ const headline = readString(content, "headline")?.trim() ?? "";
20233
+ const wordCount = headline.length === 0 ? 0 : headline.split(/\s+/).length;
20234
+ if (headline.length > heroTitleLengthThresholds.long.maxCharacters || wordCount > heroTitleLengthThresholds.long.maxWords) return "long";
20235
+ if (headline.length > heroTitleLengthThresholds.medium.maxCharacters || wordCount > heroTitleLengthThresholds.medium.maxWords) return "medium";
20236
+ return "short";
20237
+ }
19520
20238
  var heroContentWrapperClassSchema = z33.object({
19521
20239
  base: z33.string().optional()
19522
20240
  });
@@ -19529,6 +20247,8 @@ var heroContentWrapperClassTransform = {
19529
20247
  const content = isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {};
19530
20248
  const alignment = resolveHeroContentAlignment(content);
19531
20249
  const maxWidth = resolveHeroContentMaxWidth(content);
20250
+ const typographyScale = resolveHeroTypographyScale(content);
20251
+ const titleLength = resolveHeroTitleLength(content);
19532
20252
  const textAlignClass = alignment === "center" ? "rb-text-center" : alignment === "right" ? "rb-text-right" : "rb-text-left";
19533
20253
  const maxWidthClass = maxWidth === "narrow" ? "rb-max-w-2xl" : maxWidth === "medium" ? "rb-max-w-3xl" : maxWidth === "wide" ? "rb-max-w-5xl" : "";
19534
20254
  const positionClass = alignment === "center" ? "rb-mx-auto" : alignment === "right" ? "rb-ml-auto" : "";
@@ -19536,7 +20256,9 @@ var heroContentWrapperClassTransform = {
19536
20256
  options?.base,
19537
20257
  textAlignClass,
19538
20258
  maxWidthClass,
19539
- positionClass
20259
+ positionClass,
20260
+ typographyScale ? `rb-hero-typography-${typographyScale}` : "",
20261
+ `rb-hero-title-${titleLength}`
19540
20262
  ]);
19541
20263
  }
19542
20264
  };
@@ -19836,11 +20558,67 @@ var uiTransforms = [
19836
20558
  const treatment = isEyebrowTreatment(value) ? value : "plain";
19837
20559
  return joinClasses3([baseClass, eyebrowTreatmentClassMap[treatment]]);
19838
20560
  }
20561
+ },
20562
+ {
20563
+ id: "ui.headingDecorationClassName",
20564
+ kind: "string",
20565
+ summary: "Apply constrained Theme V2 heading decoration classes",
20566
+ run: (value, options) => {
20567
+ const baseClass = typeof options?.baseClass === "string" && options.baseClass.trim() ? options.baseClass : "rb-heading-decoration";
20568
+ const decoration = asPartialObject(value);
20569
+ const family = isHeadingDecorationFamily(decoration?.family) ? decoration.family : null;
20570
+ const allowedFamily = isHeadingDecorationFamily(options?.family) ? options.family : null;
20571
+ const placement = isHeadingDecorationPlacement(decoration?.placement) ? decoration.placement : null;
20572
+ const colorToken = isHeadingDecorationColorToken(decoration?.colorToken) ? decoration.colorToken : "primary";
20573
+ if (!family || !placement) return "rb-hidden";
20574
+ if (allowedFamily && family !== allowedFamily) return "rb-hidden";
20575
+ return joinClasses3([
20576
+ baseClass,
20577
+ `rb-heading-decoration-${family}`,
20578
+ `rb-heading-decoration-placement-${placement}`,
20579
+ `rb-heading-decoration-color-${colorToken}`
20580
+ ]);
20581
+ }
19839
20582
  }
19840
20583
  ];
19841
20584
 
19842
20585
  // ../blocks/src/system/transforms/registry/layout.ts
19843
20586
  import { z as z34 } from "zod";
20587
+
20588
+ // ../theme-core/src/siteChromePlacement.ts
20589
+ var HEADER_POSITIONINGS = ["static", "sticky", "fixed"];
20590
+ function parseHeaderPositioning(value) {
20591
+ return isHeaderPositioning(value) ? value : "static";
20592
+ }
20593
+ function isHeaderPositioning(value) {
20594
+ return typeof value === "string" && HEADER_POSITIONINGS.includes(value);
20595
+ }
20596
+ function planSiteChromePlacement(positioning) {
20597
+ switch (positioning) {
20598
+ case "static":
20599
+ return {
20600
+ kind: "static",
20601
+ headerRootClassName: null,
20602
+ standaloneShellClassName: null
20603
+ };
20604
+ case "sticky":
20605
+ return {
20606
+ kind: "sticky",
20607
+ headerRootClassName: "rb-sticky rb-top-0",
20608
+ standaloneShellClassName: "sticky top-0 z-40 w-full"
20609
+ };
20610
+ case "fixed":
20611
+ return {
20612
+ kind: "fixed",
20613
+ headerRootClassName: "rb-fixed rb-top-0 rb-left-0 rb-right-0",
20614
+ standaloneShellClassName: "fixed left-0 right-0 top-0 z-40 w-full"
20615
+ };
20616
+ default:
20617
+ return assertNever(positioning);
20618
+ }
20619
+ }
20620
+
20621
+ // ../blocks/src/system/transforms/registry/layout.ts
19844
20622
  var joinClasses4 = (parts) => parts.filter(
19845
20623
  (part) => typeof part === "string" && part.trim().length > 0
19846
20624
  ).join(" ").replace(/\s+/g, " ").trim();
@@ -19956,32 +20734,35 @@ var headerRootClassTransform = {
19956
20734
  ...options
19957
20735
  };
19958
20736
  const content = asPartialObject(value) ?? {};
19959
- const positioning = typeof content.positioning === "string" ? content.positioning : "static";
20737
+ const positioning = parseHeaderPositioning(content.positioning);
20738
+ const placement = planSiteChromePlacement(positioning);
19960
20739
  const shrinkOnScroll = Boolean(content.shrinkOnScroll);
19961
20740
  const header = asPartialObject(value);
19962
20741
  const visuals = resolveHeaderVisualStyles(header, context.theme);
19963
20742
  const navContainerType = header?.navContainer?.type ?? "none";
19964
20743
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
19965
20744
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
19966
- const classes = [
19967
- config.base,
19968
- backgroundClass
19969
- ];
20745
+ const classes = [config.base, backgroundClass];
19970
20746
  if (!hasContainedNav) {
19971
20747
  if (config.blur) classes.push(config.blur);
19972
20748
  if (config.blurSupport) classes.push(config.blurSupport);
19973
20749
  }
19974
- if (positioning === "sticky") {
20750
+ if (placement.kind === "sticky") {
19975
20751
  classes.push(
19976
20752
  visuals.isTransparent ? config.stickyTransparent : config.sticky
19977
20753
  );
19978
- } else if (positioning === "fixed") {
20754
+ } else if (placement.kind === "fixed") {
19979
20755
  classes.push(config.fixed);
19980
20756
  }
19981
- if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
20757
+ if (shrinkOnScroll && placement.kind !== "static") {
19982
20758
  classes.push(config.shrink);
19983
20759
  }
19984
- const VALID_VARIANTS = ["classic", "centered", "transparent", "floating", "editorial"];
20760
+ const VALID_VARIANTS = [
20761
+ "classic",
20762
+ "centered",
20763
+ "transparent",
20764
+ "floating"
20765
+ ];
19985
20766
  const variant = header?.variant;
19986
20767
  if (variant && VALID_VARIANTS.includes(variant)) {
19987
20768
  classes.push(`header-variant-${variant}`);
@@ -20505,6 +21286,10 @@ function desktopOnlyDisplay(display) {
20505
21286
  return `rb-hidden ${LARGE_DISPLAY_CLASSES[display]}`;
20506
21287
  }
20507
21288
 
21289
+ // ../theme-core/src/siteChromeOverlayClearance.ts
21290
+ var SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
21291
+ var SITE_CHROME_VISIBLE_HEADER_SELECTOR = `[${SITE_CHROME_VISIBLE_HEADER_ATTR}="true"]`;
21292
+
20508
21293
  // ../blocks/src/system/blocks/site-header.ts
20509
21294
  var logoRow = link(
20510
21295
  {
@@ -20599,15 +21384,21 @@ var mobileCta = ctaButton({
20599
21384
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
20600
21385
  {
20601
21386
  type: "div",
20602
- props: { className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
21387
+ props: {
21388
+ className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
21389
+ }
20603
21390
  },
20604
21391
  {
20605
21392
  type: "div",
20606
- props: { className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
21393
+ props: {
21394
+ className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
21395
+ }
20607
21396
  },
20608
21397
  {
20609
21398
  type: "div",
20610
- props: { className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
21399
+ props: {
21400
+ className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
21401
+ }
20611
21402
  }
20612
21403
  ]);
20613
21404
  var mobileToggleButton = {
@@ -20771,6 +21562,7 @@ var transparentLayout = inline(
20771
21562
  );
20772
21563
  var floatingLayout = inline(
20773
21564
  {
21565
+ [SITE_CHROME_VISIBLE_HEADER_ATTR]: "true",
20774
21566
  className: bindProp("$root.theme.header.maxWidth", {
20775
21567
  transforms: pipe(
20776
21568
  tx("layout.maxWidthClass", {
@@ -20790,28 +21582,6 @@ var floatingLayout = inline(
20790
21582
  ],
20791
21583
  when("$root.theme.header.variant", { equals: "floating" })
20792
21584
  );
20793
- var editorialLayout = stack(
20794
- {
20795
- gap: "md",
20796
- align: "center",
20797
- className: bindProp("$root.theme.header.maxWidth", {
20798
- transforms: pipe(
20799
- tx("layout.maxWidthClass", {
20800
- base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
20801
- })
20802
- ),
20803
- fallback: `rb-container rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
20804
- })
20805
- },
20806
- [
20807
- centeredLogoRow,
20808
- createNavRow(
20809
- `${desktopOnlyDisplay("flex")} rb-flex-wrap rb-justify-center rb-gap-x-8 rb-gap-y-3`,
20810
- "center"
20811
- )
20812
- ],
20813
- when("$root.theme.header.variant", { equals: "editorial" })
20814
- );
20815
21585
  var headerLayout = headerSection(
20816
21586
  {
20817
21587
  background: bindProp("$root.theme.header", {
@@ -20825,10 +21595,7 @@ var headerLayout = headerSection(
20825
21595
  }),
20826
21596
  style: bindProp("$root.theme.header", {
20827
21597
  transforms: pipe(tx("layout.headerRootStyle")),
20828
- fallback: mergeStyles(
20829
- textColorStyle("text"),
20830
- borderColorStyle("border")
20831
- )
21598
+ fallback: mergeStyles(textColorStyle("text"), borderColorStyle("border"))
20832
21599
  })
20833
21600
  },
20834
21601
  [
@@ -20837,7 +21604,6 @@ var headerLayout = headerSection(
20837
21604
  centeredLayout,
20838
21605
  transparentLayout,
20839
21606
  floatingLayout,
20840
- editorialLayout,
20841
21607
  mobileOverlay
20842
21608
  ],
20843
21609
  props({
@@ -21742,6 +22508,10 @@ var sectionHeading = stack(
21742
22508
  when("content.title"),
21743
22509
  bind("content.title")
21744
22510
  ),
22511
+ headingDecoration({
22512
+ family: "short-center-rule",
22513
+ placement: "under-centered-heading"
22514
+ }),
21745
22515
  richText(
21746
22516
  {
21747
22517
  className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
@@ -24165,7 +24935,7 @@ var COLUMN_CLASSES = {
24165
24935
  };
24166
24936
  function getContainerClass(layout, columns) {
24167
24937
  if (layout === "compact") {
24168
- return "event-listing-compact-container rb-flex rb-flex-col rb-gap-2";
24938
+ return "event-listing-compact-container rb-flex rb-flex-col";
24169
24939
  }
24170
24940
  if (layout === "stack") {
24171
24941
  return "rb-flex rb-flex-col rb-gap-6";
@@ -26993,6 +27763,7 @@ import { z as z53 } from "zod";
26993
27763
  var storedProductCartItemSchema = z53.object({
26994
27764
  kind: z53.literal("product"),
26995
27765
  productId: z53.string().min(1),
27766
+ productCategoryId: z53.string().min(1).optional().nullable(),
26996
27767
  variantId: z53.string().min(1).optional().nullable(),
26997
27768
  title: z53.string().min(1),
26998
27769
  variantTitle: z53.string().optional().nullable(),
@@ -29497,6 +30268,10 @@ var scheduleTileTreatments = [
29497
30268
  "quiet",
29498
30269
  "brand-depth"
29499
30270
  ];
30271
+ var eventListTreatments = [
30272
+ "plain",
30273
+ "lined-panel"
30274
+ ];
29500
30275
  function scheduleDetailsCapable() {
29501
30276
  return declareBlockDesignCapability({
29502
30277
  sectionSurfaces: "supported",
@@ -29505,6 +30280,14 @@ function scheduleDetailsCapable() {
29505
30280
  tileTreatments: scheduleTileTreatments
29506
30281
  });
29507
30282
  }
30283
+ function eventListCapable() {
30284
+ return declareBlockDesignCapability({
30285
+ sectionSurfaces: "supported",
30286
+ contentFrames: ["plain"],
30287
+ itemSurfaces: "unsupported",
30288
+ eventListTreatments
30289
+ });
30290
+ }
29508
30291
  function defaultBoundaryBias(visualWeight) {
29509
30292
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
29510
30293
  }
@@ -29724,7 +30507,8 @@ var systemBlockDefinitionsRaw = [
29724
30507
  flow: bodyFlow,
29725
30508
  layoutProfiles: [
29726
30509
  layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
29727
- layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
30510
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" }),
30511
+ layoutProfile({ variantKey: "question-columns", family: "grid", weight: "standard" })
29728
30512
  ]
29729
30513
  })),
29730
30514
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
@@ -29818,11 +30602,11 @@ var systemBlockDefinitionsRaw = [
29818
30602
  flow: offeringsFlow,
29819
30603
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "centered", weight: "featured" })]
29820
30604
  })),
29821
- withDesignCapability("block.event-listing", eventListingBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30605
+ withDesignCapability("block.event-listing", eventListingBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
29822
30606
  flow: offeringsFlow,
29823
30607
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
29824
30608
  })),
29825
- withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30609
+ withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
29826
30610
  flow: offeringsFlow,
29827
30611
  layoutProfiles: [
29828
30612
  layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
@@ -30894,6 +31678,15 @@ ${root} {
30894
31678
  `;
30895
31679
  }
30896
31680
 
31681
+ // ../theme-core/src/runtime/themeCssVarNames.ts
31682
+ var THEME_RADIUS_CSS_VARS = {
31683
+ block: "--rb-block-radius",
31684
+ button: "--rb-button-radius",
31685
+ input: "--rb-input-radius",
31686
+ legacyCard: "--radius-card",
31687
+ legacyControl: "--radius-control"
31688
+ };
31689
+
30897
31690
  // ../theme-core/src/blocks/vars/customer-portal.ts
30898
31691
  function generateCustomerPortalVars({
30899
31692
  themeId
@@ -30907,6 +31700,11 @@ ${root} {
30907
31700
  --cp-muted: rgb(var(--tb-mutedText));
30908
31701
  --cp-border: rgb(var(--tb-border));
30909
31702
  --cp-shadow: var(--shadow-elev);
31703
+ --cp-primary: rgb(var(--tb-primary));
31704
+ --cp-primary-hover: rgb(var(--tb-primary-700, var(--tb-primary)));
31705
+ --cp-error: rgb(var(--tb-destructive));
31706
+ --cp-card-radius: var(${THEME_RADIUS_CSS_VARS.block}, var(${THEME_RADIUS_CSS_VARS.legacyCard}, 0.75rem));
31707
+ --cp-control-radius: var(${THEME_RADIUS_CSS_VARS.input}, var(${THEME_RADIUS_CSS_VARS.legacyControl}, 0.5rem));
30910
31708
 
30911
31709
  /* Shared tab bar (underline style) */
30912
31710
  --rb-tab-border-width: 1px;
@@ -30957,7 +31755,7 @@ ${root} {
30957
31755
  --rb-modal-bg: var(--cp-card-bg);
30958
31756
  --rb-modal-border: var(--cp-card-border);
30959
31757
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
30960
- --rb-modal-radius: var(--radius-card);
31758
+ --rb-modal-radius: var(--cp-card-radius);
30961
31759
  --rb-modal-max-width: 560px;
30962
31760
 
30963
31761
  /* Header */
@@ -32338,6 +33136,9 @@ import { jsx as jsx5 } from "react/jsx-runtime";
32338
33136
  import * as React from "react";
32339
33137
  import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
32340
33138
 
33139
+ // ../theme-core/src/fonts/uploadFormat.ts
33140
+ var MAX_FONT_UPLOAD_BYTES = 5 * 1024 * 1024;
33141
+
32341
33142
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
32342
33143
  import { z as z60 } from "zod";
32343
33144
  var themeBridgeConfigSchema = z60.object({
@@ -32784,6 +33585,7 @@ var COURSE_ENROLLMENT_REFUND_FAILED_CODES = [
32784
33585
  ];
32785
33586
 
32786
33587
  // ../api/src/bookingVerticals.ts
33588
+ import { z as z63 } from "zod";
32787
33589
  var VERTICAL_IDS = [
32788
33590
  "yoga_wellness",
32789
33591
  "fitness_pt",
@@ -32862,6 +33664,132 @@ var VERTICAL_ID_SET = new Set(VERTICAL_IDS);
32862
33664
  var VERTICAL_PRESET_ID_SET = new Set(
32863
33665
  VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id)
32864
33666
  );
33667
+ function parseVerticalId(value) {
33668
+ return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
33669
+ }
33670
+ function parseVerticalPresetId(value) {
33671
+ return typeof value === "string" && VERTICAL_PRESET_ID_SET.has(value) ? value : null;
33672
+ }
33673
+ function getVerticalPresetDefinition(presetId) {
33674
+ const definition = VERTICAL_BOOKING_PRESETS.find((presetDefinition) => presetDefinition.id === presetId);
33675
+ if (!definition) {
33676
+ throw new Error(`Unhandled vertical preset id: ${presetId}`);
33677
+ }
33678
+ return definition;
33679
+ }
33680
+ function toNonEmptyVerticalPresetIds(presetIds) {
33681
+ const firstPresetId = presetIds[0];
33682
+ return firstPresetId ? [firstPresetId, ...presetIds.slice(1)] : null;
33683
+ }
33684
+ function createConfiguredSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33685
+ return {
33686
+ verticalId,
33687
+ selectedPresetIds
33688
+ };
33689
+ }
33690
+ function createSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33691
+ const nonEmptyPresetIds = toNonEmptyVerticalPresetIds(selectedPresetIds);
33692
+ return nonEmptyPresetIds ? createConfiguredSiteVerticalBookingConfig(verticalId, nonEmptyPresetIds) : null;
33693
+ }
33694
+ function resolveSiteVerticalBookingConfig(rawConfig) {
33695
+ if (!rawConfig) {
33696
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33697
+ }
33698
+ const verticalId = parseVerticalId(rawConfig.verticalId);
33699
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33700
+ const selectedPresetIds = rawPresetIds.map(parseVerticalPresetId).filter((presetId) => Boolean(presetId));
33701
+ const config = {
33702
+ verticalId,
33703
+ selectedPresetIds
33704
+ };
33705
+ if (!verticalId && selectedPresetIds.length === 0) {
33706
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33707
+ }
33708
+ const issues = getSiteVerticalConfigIssues(rawConfig, config);
33709
+ if (issues.length > 0) {
33710
+ return { kind: "invalid", config, issues };
33711
+ }
33712
+ const configuredConfig = verticalId ? createSiteVerticalBookingConfig(verticalId, selectedPresetIds) : null;
33713
+ if (!configuredConfig) {
33714
+ return { kind: "invalid", config, issues: ["empty_selected_presets"] };
33715
+ }
33716
+ return {
33717
+ kind: "configured",
33718
+ config: configuredConfig,
33719
+ selectedPresets: configuredConfig.selectedPresetIds.map(getVerticalPresetDefinition)
33720
+ };
33721
+ }
33722
+ function getSiteVerticalConfigIssues(rawConfig, config) {
33723
+ const issues = /* @__PURE__ */ new Set();
33724
+ if (rawConfig.verticalId != null && !config.verticalId) {
33725
+ issues.add("unknown_vertical");
33726
+ }
33727
+ if (!config.verticalId && config.selectedPresetIds.length > 0) {
33728
+ issues.add("missing_vertical");
33729
+ }
33730
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33731
+ if (rawPresetIds.some((presetId) => parseVerticalPresetId(presetId) === null)) {
33732
+ issues.add("unknown_preset");
33733
+ }
33734
+ if (config.verticalId && config.selectedPresetIds.length === 0) {
33735
+ issues.add("empty_selected_presets");
33736
+ }
33737
+ const seenBehaviours = /* @__PURE__ */ new Set();
33738
+ for (const presetId of config.selectedPresetIds) {
33739
+ const presetDefinition = getVerticalPresetDefinition(presetId);
33740
+ if (config.verticalId && presetDefinition.verticalId !== config.verticalId) {
33741
+ issues.add("preset_vertical_mismatch");
33742
+ }
33743
+ if (presetDefinition.availability === "future") {
33744
+ issues.add("future_preset_selected");
33745
+ }
33746
+ if (seenBehaviours.has(presetDefinition.canonicalBehaviour)) {
33747
+ issues.add("duplicate_canonical_behaviour");
33748
+ }
33749
+ seenBehaviours.add(presetDefinition.canonicalBehaviour);
33750
+ }
33751
+ return [...issues];
33752
+ }
33753
+ var VerticalIdSchema = z63.string().trim().transform((value, ctx) => {
33754
+ const parsed = parseVerticalId(value);
33755
+ if (!parsed) {
33756
+ ctx.addIssue({
33757
+ code: z63.ZodIssueCode.custom,
33758
+ message: "Unknown booking vertical"
33759
+ });
33760
+ return z63.NEVER;
33761
+ }
33762
+ return parsed;
33763
+ });
33764
+ var VerticalPresetIdSchema = z63.string().trim().transform((value, ctx) => {
33765
+ const parsed = parseVerticalPresetId(value);
33766
+ if (!parsed) {
33767
+ ctx.addIssue({
33768
+ code: z63.ZodIssueCode.custom,
33769
+ message: "Unknown booking preset"
33770
+ });
33771
+ return z63.NEVER;
33772
+ }
33773
+ return parsed;
33774
+ });
33775
+ var BookingVerticalConfigSchema = z63.object({
33776
+ verticalId: VerticalIdSchema.nullable(),
33777
+ selectedPresetIds: z63.array(VerticalPresetIdSchema).max(20)
33778
+ }).transform((value, ctx) => {
33779
+ const resolved = resolveSiteVerticalBookingConfig(value);
33780
+ if (resolved.kind === "invalid") {
33781
+ ctx.addIssue({
33782
+ code: z63.ZodIssueCode.custom,
33783
+ message: `Invalid booking vertical config: ${resolved.issues.join(", ")}`
33784
+ });
33785
+ return z63.NEVER;
33786
+ }
33787
+ return resolved.config;
33788
+ });
33789
+ var DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
33790
+ verticalId: null,
33791
+ selectedPresetIds: []
33792
+ };
32865
33793
  function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
32866
33794
  return {
32867
33795
  id,
@@ -32881,51 +33809,51 @@ function isRecord3(value) {
32881
33809
  }
32882
33810
 
32883
33811
  // ../api/src/appointmentSetup.ts
32884
- import { z as z63 } from "zod";
33812
+ import { z as z64 } from "zod";
32885
33813
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
32886
- var appointmentSetupRefSchema = z63.discriminatedUnion("kind", [
32887
- z63.object({ kind: z63.literal("existing"), id: z63.string().min(1) }),
32888
- z63.object({ kind: z63.literal("new"), draftId: z63.string().min(1) })
33814
+ var appointmentSetupRefSchema = z64.discriminatedUnion("kind", [
33815
+ z64.object({ kind: z64.literal("existing"), id: z64.string().min(1) }),
33816
+ z64.object({ kind: z64.literal("new"), draftId: z64.string().min(1) })
32889
33817
  ]);
32890
- var appointmentSetupVenueChoiceSchema = z63.discriminatedUnion("kind", [
32891
- z63.object({ kind: z63.literal("none") }),
32892
- z63.object({ kind: z63.literal("existing"), venueId: z63.string().min(1) }),
32893
- z63.object({
32894
- kind: z63.literal("create"),
32895
- draftId: z63.string().min(1),
32896
- title: z63.string().trim().min(1),
32897
- description: z63.string().nullable(),
32898
- timezone: z63.string().trim().min(1).nullable(),
32899
- addressJson: z63.record(z63.string(), z63.unknown()),
32900
- locationJson: z63.object({ lat: z63.number(), lng: z63.number() }).nullable()
33818
+ var appointmentSetupVenueChoiceSchema = z64.discriminatedUnion("kind", [
33819
+ z64.object({ kind: z64.literal("none") }),
33820
+ z64.object({ kind: z64.literal("existing"), venueId: z64.string().min(1) }),
33821
+ z64.object({
33822
+ kind: z64.literal("create"),
33823
+ draftId: z64.string().min(1),
33824
+ title: z64.string().trim().min(1),
33825
+ description: z64.string().nullable(),
33826
+ timezone: z64.string().trim().min(1).nullable(),
33827
+ addressJson: z64.record(z64.string(), z64.unknown()),
33828
+ locationJson: z64.object({ lat: z64.number(), lng: z64.number() }).nullable()
32901
33829
  })
32902
33830
  ]);
32903
- var appointmentSetupPaymentDraftSchema = z63.object({
32904
- priceType: z63.union([z63.literal("free"), z63.literal("paid")])
32905
- });
32906
- var appointmentSetupServiceAssignmentDraftSchema = z63.discriminatedUnion("kind", [
32907
- z63.object({ kind: z63.literal("all_practitioners") }),
32908
- z63.object({
32909
- kind: z63.literal("selected_practitioners"),
32910
- resourceRefs: z63.array(appointmentSetupRefSchema)
33831
+ var appointmentSetupPaymentDraftSchema = z64.object({
33832
+ priceType: z64.union([z64.literal("free"), z64.literal("paid")])
33833
+ });
33834
+ var appointmentSetupServiceAssignmentDraftSchema = z64.discriminatedUnion("kind", [
33835
+ z64.object({ kind: z64.literal("all_practitioners") }),
33836
+ z64.object({
33837
+ kind: z64.literal("selected_practitioners"),
33838
+ resourceRefs: z64.array(appointmentSetupRefSchema)
32911
33839
  })
32912
33840
  ]);
32913
- var appointmentSetupServiceDraftSchema = z63.object({
33841
+ var appointmentSetupServiceDraftSchema = z64.object({
32914
33842
  ref: appointmentSetupRefSchema,
32915
- title: z63.string().trim().min(1),
32916
- description: z63.string().nullable(),
32917
- durationMinutes: z63.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
32918
- prepMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
32919
- cleanupMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
32920
- priceAmount: z63.number().int().nonnegative().nullable(),
32921
- isActive: z63.boolean(),
32922
- locationType: z63.union([
32923
- z63.literal("virtual"),
32924
- z63.literal("in_person"),
32925
- z63.literal("hybrid")
33843
+ title: z64.string().trim().min(1),
33844
+ description: z64.string().nullable(),
33845
+ durationMinutes: z64.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
33846
+ prepMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33847
+ cleanupMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33848
+ priceAmount: z64.number().int().nonnegative().nullable(),
33849
+ isActive: z64.boolean(),
33850
+ locationType: z64.union([
33851
+ z64.literal("virtual"),
33852
+ z64.literal("in_person"),
33853
+ z64.literal("hybrid")
32926
33854
  ]),
32927
33855
  venue: appointmentSetupVenueChoiceSchema,
32928
- timezone: z63.string().trim().min(1).nullable(),
33856
+ timezone: z64.string().trim().min(1).nullable(),
32929
33857
  payment: appointmentSetupPaymentDraftSchema,
32930
33858
  assignment: appointmentSetupServiceAssignmentDraftSchema
32931
33859
  }).superRefine((service, ctx) => {
@@ -32944,49 +33872,49 @@ var appointmentSetupServiceDraftSchema = z63.object({
32944
33872
  });
32945
33873
  }
32946
33874
  });
32947
- var appointmentSetupPractitionerDraftSchema = z63.object({
33875
+ var appointmentSetupPractitionerDraftSchema = z64.object({
32948
33876
  ref: appointmentSetupRefSchema,
32949
- displayName: z63.string().trim().min(1),
32950
- bio: z63.string().nullable(),
32951
- timezone: z63.string().trim().min(1),
32952
- colorHex: z63.string().nullable()
32953
- });
32954
- var appointmentSetupWeeklyWindowDraftSchema = z63.object({
32955
- weekday: z63.number().int().min(0).max(6),
32956
- startTime: z63.string(),
32957
- endTime: z63.string()
32958
- });
32959
- var appointmentSetupStartTimePolicyDraftSchema = z63.discriminatedUnion("kind", [
32960
- z63.object({ kind: z63.literal("automatic_spacing") }),
32961
- z63.object({
32962
- kind: z63.literal("regular_interval"),
32963
- intervalMinutes: z63.union([
32964
- z63.literal(10),
32965
- z63.literal(15),
32966
- z63.literal(20),
32967
- z63.literal(30),
32968
- z63.literal(45),
32969
- z63.literal(60)
33877
+ displayName: z64.string().trim().min(1),
33878
+ bio: z64.string().nullable(),
33879
+ timezone: z64.string().trim().min(1),
33880
+ colorHex: z64.string().nullable()
33881
+ });
33882
+ var appointmentSetupWeeklyWindowDraftSchema = z64.object({
33883
+ weekday: z64.number().int().min(0).max(6),
33884
+ startTime: z64.string(),
33885
+ endTime: z64.string()
33886
+ });
33887
+ var appointmentSetupStartTimePolicyDraftSchema = z64.discriminatedUnion("kind", [
33888
+ z64.object({ kind: z64.literal("automatic_spacing") }),
33889
+ z64.object({
33890
+ kind: z64.literal("regular_interval"),
33891
+ intervalMinutes: z64.union([
33892
+ z64.literal(10),
33893
+ z64.literal(15),
33894
+ z64.literal(20),
33895
+ z64.literal(30),
33896
+ z64.literal(45),
33897
+ z64.literal(60)
32970
33898
  ])
32971
33899
  })
32972
33900
  ]);
32973
- var appointmentSetupAvailabilityDraftSchema = z63.object({
32974
- kind: z63.literal("weekly_windows"),
33901
+ var appointmentSetupAvailabilityDraftSchema = z64.object({
33902
+ kind: z64.literal("weekly_windows"),
32975
33903
  resourceRef: appointmentSetupRefSchema,
32976
33904
  serviceRef: appointmentSetupRefSchema.nullable(),
32977
- windows: z63.array(appointmentSetupWeeklyWindowDraftSchema),
33905
+ windows: z64.array(appointmentSetupWeeklyWindowDraftSchema),
32978
33906
  startTimePolicy: appointmentSetupStartTimePolicyDraftSchema.optional()
32979
33907
  });
32980
33908
  var APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX = 28 * 24 * 60;
32981
33909
  var APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX = 10 * 365 * 24 * 60;
32982
- var appointmentSetupBookingNoticeSchema = z63.object({
32983
- minLeadMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
32984
- maxBookingNoticeMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
32985
- });
32986
- var applyAppointmentSetupRequestSchema = z63.object({
32987
- services: z63.array(appointmentSetupServiceDraftSchema),
32988
- practitioners: z63.array(appointmentSetupPractitionerDraftSchema),
32989
- availability: z63.array(appointmentSetupAvailabilityDraftSchema),
33910
+ var appointmentSetupBookingNoticeSchema = z64.object({
33911
+ minLeadMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
33912
+ maxBookingNoticeMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
33913
+ });
33914
+ var applyAppointmentSetupRequestSchema = z64.object({
33915
+ services: z64.array(appointmentSetupServiceDraftSchema),
33916
+ practitioners: z64.array(appointmentSetupPractitionerDraftSchema),
33917
+ availability: z64.array(appointmentSetupAvailabilityDraftSchema),
32990
33918
  bookingNotice: appointmentSetupBookingNoticeSchema
32991
33919
  });
32992
33920
 
@@ -33019,24 +33947,24 @@ var STAFF_CANCELLATION_CONTEXT_CATEGORIES = [
33019
33947
  ];
33020
33948
 
33021
33949
  // ../api/src/siteBanner.ts
33022
- import { z as z64 } from "zod";
33950
+ import { z as z65 } from "zod";
33023
33951
  var SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
33024
33952
  var SITE_BANNER_TONE_VALUES = ["announcement", "promotion", "notice", "warning"];
33025
33953
  var SITE_BANNER_MAX_TEXT_LENGTH = 320;
33026
33954
  var SITE_BANNER_MAX_PARAGRAPHS = 2;
33027
- var siteBannerScopeSchema = z64.enum(SITE_BANNER_SCOPE_VALUES);
33028
- var siteBannerToneSchema = z64.enum(SITE_BANNER_TONE_VALUES);
33029
- var siteBannerBodySchema = z64.unknown().transform(unwrapRichTextValue);
33030
- var siteBannerCtaSchema = z64.object({
33031
- label: z64.string().trim().min(1),
33955
+ var siteBannerScopeSchema = z65.enum(SITE_BANNER_SCOPE_VALUES);
33956
+ var siteBannerToneSchema = z65.enum(SITE_BANNER_TONE_VALUES);
33957
+ var siteBannerBodySchema = z65.unknown().transform(unwrapRichTextValue);
33958
+ var siteBannerCtaSchema = z65.object({
33959
+ label: z65.string().trim().min(1),
33032
33960
  link: linkPayloadSchema
33033
33961
  });
33034
- var siteBannerSettingsSchema = z64.discriminatedUnion("enabled", [
33035
- z64.object({
33036
- enabled: z64.literal(false)
33962
+ var siteBannerSettingsSchema = z65.discriminatedUnion("enabled", [
33963
+ z65.object({
33964
+ enabled: z65.literal(false)
33037
33965
  }),
33038
- z64.object({
33039
- enabled: z64.literal(true),
33966
+ z65.object({
33967
+ enabled: z65.literal(true),
33040
33968
  scope: siteBannerScopeSchema,
33041
33969
  tone: siteBannerToneSchema,
33042
33970
  body: siteBannerBodySchema,
@@ -33050,7 +33978,7 @@ var siteBannerSettingsInputSchema = siteBannerSettingsSchema.superRefine((value,
33050
33978
  const analysis = analyzeSiteBannerBody(value.body);
33051
33979
  for (const issue of analysis.issues) {
33052
33980
  ctx.addIssue({
33053
- code: z64.ZodIssueCode.custom,
33981
+ code: z65.ZodIssueCode.custom,
33054
33982
  path: ["body"],
33055
33983
  message: siteBannerBodyIssueMessage(issue)
33056
33984
  });
@@ -33318,76 +34246,109 @@ function isNavigationMenuValidationItem(value) {
33318
34246
  return typeof value.label === "string";
33319
34247
  }
33320
34248
 
34249
+ // ../api/src/navigation/dashboardSiteNav.ts
34250
+ var hiddenDemoSiteNavSurfaceIds = [
34251
+ "site.newsletter"
34252
+ ];
34253
+ var hiddenDemoSiteNavIds = new Set(
34254
+ hiddenDemoSiteNavSurfaceIds
34255
+ );
34256
+ var websiteSurfaceIds = [
34257
+ "site.content",
34258
+ "site.footerBlocks",
34259
+ "site.navigation",
34260
+ "site.media",
34261
+ "site.style",
34262
+ "site.performance"
34263
+ ];
34264
+ var websiteSurfaceIdSet = new Set(
34265
+ websiteSurfaceIds
34266
+ );
34267
+
34268
+ // ../api/src/navigation/dashboardSettingsNav.ts
34269
+ var hiddenDemoSettingsNavSurfaceIds = [
34270
+ "settings.features",
34271
+ "settings.domains",
34272
+ "settings.bookings",
34273
+ "settings.emails",
34274
+ "settings.team",
34275
+ "settings.billing",
34276
+ "settings.developer",
34277
+ "settings.apiKeys",
34278
+ "settings.backup"
34279
+ ];
34280
+ var hiddenDemoSettingsNavIds = new Set(hiddenDemoSettingsNavSurfaceIds);
34281
+
33321
34282
  // ../api/src/aiPlayground.ts
33322
- import { z as z65 } from "zod";
33323
- var Rfc6902PatchOp = z65.discriminatedUnion("op", [
34283
+ import { z as z66 } from "zod";
34284
+ var Rfc6902PatchOp = z66.discriminatedUnion("op", [
33324
34285
  // Standard RFC-6902 operations
33325
- z65.object({
33326
- op: z65.literal("add"),
33327
- path: z65.string(),
33328
- value: z65.unknown()
34286
+ z66.object({
34287
+ op: z66.literal("add"),
34288
+ path: z66.string(),
34289
+ value: z66.unknown()
33329
34290
  }),
33330
- z65.object({
33331
- op: z65.literal("remove"),
33332
- path: z65.string()
34291
+ z66.object({
34292
+ op: z66.literal("remove"),
34293
+ path: z66.string()
33333
34294
  }),
33334
- z65.object({
33335
- op: z65.literal("replace"),
33336
- path: z65.string(),
33337
- value: z65.unknown()
34295
+ z66.object({
34296
+ op: z66.literal("replace"),
34297
+ path: z66.string(),
34298
+ value: z66.unknown()
33338
34299
  }),
33339
- z65.object({
33340
- op: z65.literal("move"),
33341
- from: z65.string(),
33342
- path: z65.string()
34300
+ z66.object({
34301
+ op: z66.literal("move"),
34302
+ from: z66.string(),
34303
+ path: z66.string()
33343
34304
  }),
33344
- z65.object({
33345
- op: z65.literal("copy"),
33346
- from: z65.string(),
33347
- path: z65.string()
34305
+ z66.object({
34306
+ op: z66.literal("copy"),
34307
+ from: z66.string(),
34308
+ path: z66.string()
33348
34309
  }),
33349
34310
  // Block-level operations (Phase 2)
33350
- z65.object({
33351
- op: z65.literal("add_block"),
33352
- blockKind: z65.string(),
33353
- afterBlockId: z65.string().nullable(),
33354
- content: z65.record(z65.string(), z65.unknown()),
33355
- rationale: z65.string()
34311
+ z66.object({
34312
+ op: z66.literal("add_block"),
34313
+ blockKind: z66.string(),
34314
+ afterBlockId: z66.string().nullable(),
34315
+ content: z66.record(z66.string(), z66.unknown()),
34316
+ rationale: z66.string()
33356
34317
  }),
33357
- z65.object({
33358
- op: z65.literal("delete_block"),
33359
- blockId: z65.string(),
33360
- rationale: z65.string()
34318
+ z66.object({
34319
+ op: z66.literal("delete_block"),
34320
+ blockId: z66.string(),
34321
+ rationale: z66.string()
33361
34322
  }),
33362
- z65.object({
33363
- op: z65.literal("reorder_block"),
33364
- blockId: z65.string(),
33365
- afterBlockId: z65.string().nullable(),
33366
- rationale: z65.string()
34323
+ z66.object({
34324
+ op: z66.literal("reorder_block"),
34325
+ blockId: z66.string(),
34326
+ afterBlockId: z66.string().nullable(),
34327
+ rationale: z66.string()
33367
34328
  })
33368
34329
  ]);
33369
- var PlaygroundProposeRequest = z65.object({
33370
- request: z65.string().min(1).max(2e3)
34330
+ var PlaygroundProposeRequest = z66.object({
34331
+ request: z66.string().min(1).max(2e3)
33371
34332
  });
33372
- var MultiPagePatchEnvelope = z65.object({
33373
- pageId: z65.string(),
33374
- blockId: z65.string().optional(),
34333
+ var MultiPagePatchEnvelope = z66.object({
34334
+ pageId: z66.string(),
34335
+ blockId: z66.string().optional(),
33375
34336
  // Not present for page-level ops
33376
- blockKind: z65.string().optional(),
33377
- blockPurpose: z65.string().optional().nullable(),
33378
- ops: z65.array(Rfc6902PatchOp),
33379
- rationale: z65.string(),
33380
- currentContent: z65.record(z65.string(), z65.unknown()).optional()
34337
+ blockKind: z66.string().optional(),
34338
+ blockPurpose: z66.string().optional().nullable(),
34339
+ ops: z66.array(Rfc6902PatchOp),
34340
+ rationale: z66.string(),
34341
+ currentContent: z66.record(z66.string(), z66.unknown()).optional()
33381
34342
  });
33382
- var MultiPageUpdateResponse = z65.object({
33383
- patches: z65.array(MultiPagePatchEnvelope),
33384
- assistantMessage: z65.string(),
33385
- pagesModified: z65.number(),
33386
- toolCallsUsed: z65.number()
34343
+ var MultiPageUpdateResponse = z66.object({
34344
+ patches: z66.array(MultiPagePatchEnvelope),
34345
+ assistantMessage: z66.string(),
34346
+ pagesModified: z66.number(),
34347
+ toolCallsUsed: z66.number()
33387
34348
  });
33388
34349
 
33389
34350
  // src/config/content-validation.ts
33390
- import { z as z66 } from "zod";
34351
+ import { z as z67 } from "zod";
33391
34352
 
33392
34353
  // src/types/block-kinds.ts
33393
34354
  var SYSTEM_BLOCK_KINDS = [
@@ -33541,32 +34502,32 @@ function describeInvalidBindingTransform(transform) {
33541
34502
  }
33542
34503
 
33543
34504
  // src/config/content-validation.ts
33544
- var jsonDataSchema = z66.record(z66.string(), z66.any());
33545
- var contentTypeKeySchema = z66.string().min(1).regex(
34505
+ var jsonDataSchema = z67.record(z67.string(), z67.any());
34506
+ var contentTypeKeySchema = z67.string().min(1).regex(
33546
34507
  /^[a-z][a-z0-9-]*$/,
33547
34508
  "Key must be lowercase, start with a letter, and contain only letters, numbers, and hyphens"
33548
34509
  );
33549
- var templateConfigSchemaForward = z66.object({
33550
- blocks: z66.array(
33551
- z66.object({
33552
- identifier: z66.string().min(1),
33553
- kind: z66.string(),
33554
- scope: z66.enum(["entry", "template"]),
33555
- bindings: z66.record(z66.string(), z66.any()).optional(),
33556
- content: z66.record(z66.string(), z66.any()).optional()
34510
+ var templateConfigSchemaForward = z67.object({
34511
+ blocks: z67.array(
34512
+ z67.object({
34513
+ identifier: z67.string().min(1),
34514
+ kind: z67.string(),
34515
+ scope: z67.enum(["entry", "template"]),
34516
+ bindings: z67.record(z67.string(), z67.any()).optional(),
34517
+ content: z67.record(z67.string(), z67.any()).optional()
33557
34518
  })
33558
34519
  )
33559
34520
  }).optional();
33560
- var contentTypeConfigSchema = z66.object({
34521
+ var contentTypeConfigSchema = z67.object({
33561
34522
  key: contentTypeKeySchema,
33562
- name: z66.string().min(1),
33563
- description: z66.string().optional(),
33564
- hasPages: z66.boolean(),
33565
- routePattern: z66.string().optional(),
34523
+ name: z67.string().min(1),
34524
+ description: z67.string().optional(),
34525
+ hasPages: z67.boolean(),
34526
+ routePattern: z67.string().optional(),
33566
34527
  // Fields are validated as unknown[] here - deep field validation happens in @riverbankcms/blocks
33567
- fields: z66.array(z66.any()).min(1, "At least one field is required"),
33568
- titleField: z66.string().optional(),
33569
- isSingleton: z66.boolean().optional().default(false),
34528
+ fields: z67.array(z67.any()).min(1, "At least one field is required"),
34529
+ titleField: z67.string().optional(),
34530
+ isSingleton: z67.boolean().optional().default(false),
33570
34531
  template: templateConfigSchemaForward
33571
34532
  }).refine(
33572
34533
  (data) => {
@@ -33588,7 +34549,7 @@ var contentTypeConfigSchema = z66.object({
33588
34549
  }
33589
34550
  if (!data.routePattern) {
33590
34551
  ctx.addIssue({
33591
- code: z66.ZodIssueCode.custom,
34552
+ code: z67.ZodIssueCode.custom,
33592
34553
  path: ["routePattern"],
33593
34554
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33594
34555
  });
@@ -33597,7 +34558,7 @@ var contentTypeConfigSchema = z66.object({
33597
34558
  const parseResult = safeParseRouteTemplate(data.routePattern);
33598
34559
  if (!parseResult.success) {
33599
34560
  ctx.addIssue({
33600
- code: z66.ZodIssueCode.custom,
34561
+ code: z67.ZodIssueCode.custom,
33601
34562
  path: ["routePattern"],
33602
34563
  message: describeRouteTemplateParseError(parseResult.error)
33603
34564
  });
@@ -33605,44 +34566,44 @@ var contentTypeConfigSchema = z66.object({
33605
34566
  }
33606
34567
  if (!data.isSingleton && parseResult.routeTemplate.kind !== "slug-template") {
33607
34568
  ctx.addIssue({
33608
- code: z66.ZodIssueCode.custom,
34569
+ code: z67.ZodIssueCode.custom,
33609
34570
  path: ["routePattern"],
33610
34571
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33611
34572
  });
33612
34573
  }
33613
34574
  });
33614
- var fieldBindingSchema = z66.object({
33615
- source: z66.literal("field"),
33616
- path: z66.string().min(1, "Field path is required")
34575
+ var fieldBindingSchema = z67.object({
34576
+ source: z67.literal("field"),
34577
+ path: z67.string().min(1, "Field path is required")
33617
34578
  });
33618
- var metaBindingSchema = z66.object({
33619
- source: z66.literal("meta"),
33620
- path: z66.enum(TEMPLATE_BINDING_META_PATHS, {
34579
+ var metaBindingSchema = z67.object({
34580
+ source: z67.literal("meta"),
34581
+ path: z67.enum(TEMPLATE_BINDING_META_PATHS, {
33621
34582
  error: (issue) => describeInvalidTemplateBindingMetaPath(String(issue.input))
33622
34583
  })
33623
34584
  });
33624
- var literalBindingSchema = z66.object({
33625
- source: z66.literal("literal"),
33626
- value: z66.unknown()
34585
+ var literalBindingSchema = z67.object({
34586
+ source: z67.literal("literal"),
34587
+ value: z67.unknown()
33627
34588
  });
33628
- var transformBindingSchema = z66.object({
33629
- source: z66.literal("transform"),
33630
- path: z66.string().min(1, "Transform path is required"),
33631
- transform: z66.enum(BINDING_TRANSFORM_VALUES, {
34589
+ var transformBindingSchema = z67.object({
34590
+ source: z67.literal("transform"),
34591
+ path: z67.string().min(1, "Transform path is required"),
34592
+ transform: z67.enum(BINDING_TRANSFORM_VALUES, {
33632
34593
  error: (issue) => describeInvalidBindingTransform(String(issue.input))
33633
34594
  })
33634
34595
  });
33635
- var baseBindingSchema = z66.discriminatedUnion("source", [
34596
+ var baseBindingSchema = z67.discriminatedUnion("source", [
33636
34597
  fieldBindingSchema,
33637
34598
  metaBindingSchema,
33638
34599
  literalBindingSchema,
33639
34600
  transformBindingSchema
33640
34601
  ]);
33641
- var fallbackBindingSchema = z66.object({
33642
- source: z66.literal("fallback"),
33643
- sources: z66.array(z66.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
34602
+ var fallbackBindingSchema = z67.object({
34603
+ source: z67.literal("fallback"),
34604
+ sources: z67.array(z67.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
33644
34605
  });
33645
- var bindingSourceSchema = z66.union([
34606
+ var bindingSourceSchema = z67.union([
33646
34607
  baseBindingSchema,
33647
34608
  fallbackBindingSchema
33648
34609
  ]);
@@ -33656,12 +34617,12 @@ function isValidBlockKind(kind) {
33656
34617
  return false;
33657
34618
  }
33658
34619
  var BLOCK_KIND_ERROR_MESSAGE = 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.myBlock")';
33659
- var blockKindSchema = z66.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
33660
- var templateBlockConfigSchema = z66.object({
33661
- identifier: z66.string().min(1, "Block identifier is required"),
34620
+ var blockKindSchema = z67.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
34621
+ var templateBlockConfigSchema = z67.object({
34622
+ identifier: z67.string().min(1, "Block identifier is required"),
33662
34623
  kind: blockKindSchema,
33663
- scope: z66.enum(["entry", "template"]),
33664
- bindings: z66.record(z66.string(), bindingSourceSchema).optional(),
34624
+ scope: z67.enum(["entry", "template"]),
34625
+ bindings: z67.record(z67.string(), bindingSourceSchema).optional(),
33665
34626
  content: jsonDataSchema.optional()
33666
34627
  }).refine(
33667
34628
  (data) => {
@@ -33680,8 +34641,8 @@ var templateBlockConfigSchema = z66.object({
33680
34641
  },
33681
34642
  { message: "Template-scoped blocks should define static content, not bindings" }
33682
34643
  );
33683
- var templateConfigSchema = z66.object({
33684
- blocks: z66.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
34644
+ var templateConfigSchema = z67.object({
34645
+ blocks: z67.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
33685
34646
  }).refine(
33686
34647
  (data) => {
33687
34648
  const identifiers = data.blocks.map((b) => b.identifier);
@@ -33690,77 +34651,77 @@ var templateConfigSchema = z66.object({
33690
34651
  },
33691
34652
  { message: "Template block identifiers must be unique" }
33692
34653
  );
33693
- var blockConfigSchema = z66.object({
34654
+ var blockConfigSchema = z67.object({
33694
34655
  kind: blockKindSchema,
33695
34656
  content: jsonDataSchema,
33696
- orderIndex: z66.number().optional()
33697
- });
33698
- var pageConfigSchema = z66.object({
33699
- identifier: z66.string().min(1, "Identifier is required"),
33700
- title: z66.string().min(1, "Title is required"),
33701
- path: z66.string().regex(/^\//, "Path must start with /"),
33702
- purpose: z66.string().default("content"),
33703
- blocks: z66.array(blockConfigSchema).optional(),
33704
- status: z66.enum(["draft", "published"]).default("draft"),
33705
- metaTitle: z66.string().optional(),
33706
- metaDescription: z66.string().optional()
33707
- });
33708
- var entryConfigSchema = z66.object({
33709
- identifier: z66.string().min(1, "Identifier is required"),
33710
- contentType: z66.string().min(1, "Content type is required"),
34657
+ orderIndex: z67.number().optional()
34658
+ });
34659
+ var pageConfigSchema = z67.object({
34660
+ identifier: z67.string().min(1, "Identifier is required"),
34661
+ title: z67.string().min(1, "Title is required"),
34662
+ path: z67.string().regex(/^\//, "Path must start with /"),
34663
+ purpose: z67.string().default("content"),
34664
+ blocks: z67.array(blockConfigSchema).optional(),
34665
+ status: z67.enum(["draft", "published"]).default("draft"),
34666
+ metaTitle: z67.string().optional(),
34667
+ metaDescription: z67.string().optional()
34668
+ });
34669
+ var entryConfigSchema = z67.object({
34670
+ identifier: z67.string().min(1, "Identifier is required"),
34671
+ contentType: z67.string().min(1, "Content type is required"),
33711
34672
  data: jsonDataSchema,
33712
- status: z66.enum(["draft", "published"]).default("draft"),
33713
- slug: z66.string().optional(),
33714
- summary: z66.string().optional(),
34673
+ status: z67.enum(["draft", "published"]).default("draft"),
34674
+ slug: z67.string().optional(),
34675
+ summary: z67.string().optional(),
33715
34676
  // Hard remove legacy config-only titles: titles must live in entry `data`.
33716
- title: z66.any().optional().refine((value) => value === void 0, {
34677
+ title: z67.any().optional().refine((value) => value === void 0, {
33717
34678
  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."
33718
34679
  }),
33719
- metaTitle: z66.string().optional(),
33720
- metaDescription: z66.string().optional()
34680
+ metaTitle: z67.string().optional(),
34681
+ metaDescription: z67.string().optional()
33721
34682
  });
33722
- var dropdownLinkSchema = z66.object({
33723
- kind: z66.literal("dropdown")
34683
+ var dropdownLinkSchema = z67.object({
34684
+ kind: z67.literal("dropdown")
33724
34685
  });
33725
- var navigationLinkSchema = z66.discriminatedUnion("kind", [
34686
+ var navigationLinkSchema = z67.discriminatedUnion("kind", [
33726
34687
  ...navigationLinkInputSchemaOptions,
33727
34688
  dropdownLinkSchema
33728
34689
  ]);
33729
- var baseNavigationItemSchema = z66.object({
33730
- label: z66.string().min(1, "Label is required"),
34690
+ var baseNavigationItemSchema = z67.object({
34691
+ label: z67.string().min(1, "Label is required"),
33731
34692
  link: navigationLinkSchema,
33732
- isCta: z66.boolean().optional()
34693
+ isCta: z67.boolean().optional()
33733
34694
  });
33734
34695
  var navigationItemConfigSchema = baseNavigationItemSchema.extend({
33735
- children: z66.lazy(() => z66.array(navigationItemConfigSchema)).optional()
33736
- });
33737
- var navigationMenuConfigSchema = z66.object({
33738
- identifier: z66.string().min(1, "Identifier is required"),
33739
- name: z66.string().min(1, "Name is required"),
33740
- isPrimary: z66.boolean().optional(),
33741
- isFooter: z66.boolean().optional(),
33742
- items: z66.array(navigationItemConfigSchema)
34696
+ children: z67.lazy(() => z67.array(navigationItemConfigSchema)).optional()
34697
+ });
34698
+ var navigationMenuConfigSchema = z67.object({
34699
+ identifier: z67.string().min(1, "Identifier is required"),
34700
+ name: z67.string().min(1, "Name is required"),
34701
+ isPrimary: z67.boolean().optional(),
34702
+ isFooter: z67.boolean().optional(),
34703
+ items: z67.array(navigationItemConfigSchema)
33743
34704
  }).superRefine((menu, ctx) => {
33744
34705
  const portalStats = collectPortalLinkStats(
33745
34706
  menu.items
33746
34707
  );
33747
34708
  if (portalStats.count > 1) {
33748
34709
  ctx.addIssue({
33749
- code: z66.ZodIssueCode.custom,
34710
+ code: z67.ZodIssueCode.custom,
33750
34711
  message: "Only one portal link is allowed per navigation menu",
33751
34712
  path: ["items"]
33752
34713
  });
33753
34714
  }
33754
34715
  if (portalStats.nestedLabels.length > 0) {
33755
34716
  ctx.addIssue({
33756
- code: z66.ZodIssueCode.custom,
34717
+ code: z67.ZodIssueCode.custom,
33757
34718
  message: `Portal links must be root-level items: ${portalStats.nestedLabels.join(", ")}`,
33758
34719
  path: ["items"]
33759
34720
  });
33760
34721
  }
33761
34722
  if (portalStats.withChildrenLabels.length > 0) {
33762
34723
  ctx.addIssue({
33763
- code: z66.ZodIssueCode.custom,
34724
+ code: z67.ZodIssueCode.custom,
33764
34725
  message: `Portal links cannot contain child items: ${portalStats.withChildrenLabels.join(", ")}`,
33765
34726
  path: ["items"]
33766
34727
  });
@@ -33770,44 +34731,44 @@ var navigationMenuConfigSchema = z66.object({
33770
34731
  );
33771
34732
  if (cartStats.nestedLabels.length > 0) {
33772
34733
  ctx.addIssue({
33773
- code: z66.ZodIssueCode.custom,
34734
+ code: z67.ZodIssueCode.custom,
33774
34735
  message: `Cart links must be root-level items: ${cartStats.nestedLabels.join(", ")}`,
33775
34736
  path: ["items"]
33776
34737
  });
33777
34738
  }
33778
34739
  if (cartStats.withChildrenLabels.length > 0) {
33779
34740
  ctx.addIssue({
33780
- code: z66.ZodIssueCode.custom,
34741
+ code: z67.ZodIssueCode.custom,
33781
34742
  message: `Cart links cannot contain child items: ${cartStats.withChildrenLabels.join(", ")}`,
33782
34743
  path: ["items"]
33783
34744
  });
33784
34745
  }
33785
34746
  if (cartStats.ctaLabels.length > 0) {
33786
34747
  ctx.addIssue({
33787
- code: z66.ZodIssueCode.custom,
34748
+ code: z67.ZodIssueCode.custom,
33788
34749
  message: `Cart links cannot be marked as CTA: ${cartStats.ctaLabels.join(", ")}`,
33789
34750
  path: ["items"]
33790
34751
  });
33791
34752
  }
33792
34753
  if (cartStats.missingVisibleTextLabels.length > 0) {
33793
34754
  ctx.addIssue({
33794
- code: z66.ZodIssueCode.custom,
34755
+ code: z67.ZodIssueCode.custom,
33795
34756
  message: `Cart links with icon-with-label must provide a visible label: ${cartStats.missingVisibleTextLabels.join(", ")}`,
33796
34757
  path: ["items"]
33797
34758
  });
33798
34759
  }
33799
34760
  });
33800
- var siteSettingsConfigSchema = z66.object({
33801
- homepagePath: z66.string().optional(),
33802
- siteTitle: z66.string().optional(),
33803
- siteDescription: z66.string().optional(),
33804
- defaultTemplates: z66.record(z66.string(), z66.string()).optional()
34761
+ var siteSettingsConfigSchema = z67.object({
34762
+ homepagePath: z67.string().optional(),
34763
+ siteTitle: z67.string().optional(),
34764
+ siteDescription: z67.string().optional(),
34765
+ defaultTemplates: z67.record(z67.string(), z67.string()).optional()
33805
34766
  });
33806
- var contentConfigBaseSchema = z66.object({
33807
- contentTypes: z66.array(contentTypeConfigSchema).optional(),
33808
- entries: z66.array(entryConfigSchema).optional(),
33809
- pages: z66.array(pageConfigSchema).optional(),
33810
- navigationMenus: z66.array(navigationMenuConfigSchema).optional(),
34767
+ var contentConfigBaseSchema = z67.object({
34768
+ contentTypes: z67.array(contentTypeConfigSchema).optional(),
34769
+ entries: z67.array(entryConfigSchema).optional(),
34770
+ pages: z67.array(pageConfigSchema).optional(),
34771
+ navigationMenus: z67.array(navigationMenuConfigSchema).optional(),
33811
34772
  settings: siteSettingsConfigSchema.optional()
33812
34773
  });
33813
34774
  var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
@@ -33816,7 +34777,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33816
34777
  const duplicateKeys = keys.filter((key, i) => keys.indexOf(key) !== i);
33817
34778
  if (duplicateKeys.length > 0) {
33818
34779
  ctx.addIssue({
33819
- code: z66.ZodIssueCode.custom,
34780
+ code: z67.ZodIssueCode.custom,
33820
34781
  message: `Content type keys must be unique. Duplicates: ${duplicateKeys.join(", ")}`,
33821
34782
  path: ["contentTypes"]
33822
34783
  });
@@ -33827,7 +34788,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33827
34788
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
33828
34789
  if (duplicateIds.length > 0) {
33829
34790
  ctx.addIssue({
33830
- code: z66.ZodIssueCode.custom,
34791
+ code: z67.ZodIssueCode.custom,
33831
34792
  message: `Page identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
33832
34793
  path: ["pages"]
33833
34794
  });
@@ -33836,7 +34797,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33836
34797
  const duplicatePaths = paths.filter((path, i) => paths.indexOf(path) !== i);
33837
34798
  if (duplicatePaths.length > 0) {
33838
34799
  ctx.addIssue({
33839
- code: z66.ZodIssueCode.custom,
34800
+ code: z67.ZodIssueCode.custom,
33840
34801
  message: `Page paths must be unique. Duplicates: ${duplicatePaths.join(", ")}`,
33841
34802
  path: ["pages"]
33842
34803
  });
@@ -33847,7 +34808,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33847
34808
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
33848
34809
  if (duplicateIds.length > 0) {
33849
34810
  ctx.addIssue({
33850
- code: z66.ZodIssueCode.custom,
34811
+ code: z67.ZodIssueCode.custom,
33851
34812
  message: `Entry identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
33852
34813
  path: ["entries"]
33853
34814
  });
@@ -33858,7 +34819,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33858
34819
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
33859
34820
  if (duplicateIds.length > 0) {
33860
34821
  ctx.addIssue({
33861
- code: z66.ZodIssueCode.custom,
34822
+ code: z67.ZodIssueCode.custom,
33862
34823
  message: `Navigation menu identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
33863
34824
  path: ["navigationMenus"]
33864
34825
  });
@@ -33872,7 +34833,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
33872
34833
  const entriesForType = data.entries.filter((e) => e.contentType === singletonKey);
33873
34834
  if (entriesForType.length > 1) {
33874
34835
  ctx.addIssue({
33875
- code: z66.ZodIssueCode.custom,
34836
+ code: z67.ZodIssueCode.custom,
33876
34837
  message: `Singleton content type "${singletonKey}" cannot have more than one entry. Found ${entriesForType.length} entries.`,
33877
34838
  path: ["entries"]
33878
34839
  });
@@ -33985,18 +34946,18 @@ function validateLayout(layout) {
33985
34946
  }
33986
34947
 
33987
34948
  // src/config/dashboard-validation.ts
33988
- import { z as z67 } from "zod";
33989
- var navIdListSchema2 = z67.preprocess((value) => {
34949
+ import { z as z68 } from "zod";
34950
+ var navIdListSchema2 = z68.preprocess((value) => {
33990
34951
  if (!Array.isArray(value)) return void 0;
33991
34952
  const filtered = value.filter((v) => typeof v === "string" && v.trim().length > 0);
33992
34953
  return filtered.length > 0 ? filtered : void 0;
33993
- }, z67.array(z67.string()).max(200, "Maximum 200 nav IDs").optional());
33994
- var dashboardNavVisibilityBaseSchema2 = z67.object({
33995
- mode: z67.enum(["augment", "restrict"]).optional(),
34954
+ }, z68.array(z68.string()).max(200, "Maximum 200 nav IDs").optional());
34955
+ var dashboardNavVisibilityBaseSchema2 = z68.object({
34956
+ mode: z68.enum(["augment", "restrict"]).optional(),
33996
34957
  allowIds: navIdListSchema2,
33997
34958
  denyIds: navIdListSchema2
33998
34959
  }).strip();
33999
- var dashboardNavVisibilityRolesSchema2 = z67.object({
34960
+ var dashboardNavVisibilityRolesSchema2 = z68.object({
34000
34961
  administrator: dashboardNavVisibilityBaseSchema2.optional(),
34001
34962
  editor: dashboardNavVisibilityBaseSchema2.optional(),
34002
34963
  team_member: dashboardNavVisibilityBaseSchema2.optional()
@@ -34004,20 +34965,20 @@ var dashboardNavVisibilityRolesSchema2 = z67.object({
34004
34965
  var dashboardNavVisibilitySchema2 = dashboardNavVisibilityBaseSchema2.extend({
34005
34966
  roles: dashboardNavVisibilityRolesSchema2
34006
34967
  }).strip();
34007
- var dashboardNavigationConfigSchema2 = z67.object({
34968
+ var dashboardNavigationConfigSchema2 = z68.object({
34008
34969
  siteNav: dashboardNavVisibilitySchema2.optional(),
34009
34970
  settingsNav: dashboardNavVisibilitySchema2.optional()
34010
34971
  }).strip();
34011
- var dashboardConfigSchema2 = z67.object({
34012
- previewEditingEnabled: z67.boolean().optional(),
34972
+ var dashboardConfigSchema2 = z68.object({
34973
+ previewEditingEnabled: z68.boolean().optional(),
34013
34974
  navigation: dashboardNavigationConfigSchema2.optional()
34014
34975
  }).strip();
34015
34976
 
34016
34977
  // src/zod/titleSourceSchema.ts
34017
- import { z as z68 } from "zod";
34018
- var titleSourceValueSchema = z68.union([
34019
- z68.string().min(1),
34020
- z68.array(z68.string().min(1)).min(1)
34978
+ import { z as z69 } from "zod";
34979
+ var titleSourceValueSchema = z69.union([
34980
+ z69.string().min(1),
34981
+ z69.array(z69.string().min(1)).min(1)
34021
34982
  ]);
34022
34983
 
34023
34984
  // src/data/prefetchBlockData.ts
@@ -34036,11 +34997,11 @@ var SUPPORTED_LOADER_ENDPOINTS2 = [
34036
34997
  ];
34037
34998
 
34038
34999
  // src/config/validation.ts
34039
- var sdkThemePaletteSchema2 = z69.record(z69.string(), z69.string());
34040
- var sdkThemeConfigSchema2 = z69.object({
35000
+ var sdkThemePaletteSchema2 = z70.record(z70.string(), z70.string());
35001
+ var sdkThemeConfigSchema2 = z70.object({
34041
35002
  palette: sdkThemePaletteSchema2
34042
35003
  });
34043
- var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
35004
+ var sdkSiteUrlSchema = z70.string().url("Must be a valid URL").refine((url) => {
34044
35005
  try {
34045
35006
  const parsed = new URL(url);
34046
35007
  const isLocal = parsed.hostname === "localhost" || parsed.hostname.endsWith(".localhost") || parsed.hostname.endsWith(".local") || parsed.hostname.endsWith(".test");
@@ -34049,97 +35010,97 @@ var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
34049
35010
  return false;
34050
35011
  }
34051
35012
  }, { message: "Production URLs must use HTTPS" }).transform((url) => url.replace(/\/$/, ""));
34052
- var sectionBackgroundSchema = z69.object({
34053
- id: z69.string(),
34054
- label: z69.string(),
34055
- token: z69.string()
35013
+ var sectionBackgroundSchema = z70.object({
35014
+ id: z70.string(),
35015
+ label: z70.string(),
35016
+ token: z70.string()
34056
35017
  // Reference to theme palette token
34057
35018
  });
34058
- var sectionSpacingSchema = z69.enum(["compact", "default", "spacious"]);
34059
- var containerMaxWidthSchema = z69.enum(["narrow", "default", "wide", "full"]);
34060
- var containerAlignmentSchema = z69.enum(["left", "center", "right"]);
34061
- var sectionOptionsSchema = z69.object({
34062
- backgroundColor: z69.boolean().optional(),
34063
- backgroundImage: z69.boolean().optional(),
34064
- backgroundGradient: z69.boolean().optional(),
34065
- spacing: z69.union([
34066
- z69.array(sectionSpacingSchema),
34067
- z69.boolean()
35019
+ var sectionSpacingSchema = z70.enum(["compact", "default", "spacious"]);
35020
+ var containerMaxWidthSchema = z70.enum(["narrow", "default", "wide", "full"]);
35021
+ var containerAlignmentSchema = z70.enum(["left", "center", "right"]);
35022
+ var sectionOptionsSchema = z70.object({
35023
+ backgroundColor: z70.boolean().optional(),
35024
+ backgroundImage: z70.boolean().optional(),
35025
+ backgroundGradient: z70.boolean().optional(),
35026
+ spacing: z70.union([
35027
+ z70.array(sectionSpacingSchema),
35028
+ z70.boolean()
34068
35029
  ]).optional(),
34069
- textColor: z69.boolean().optional()
35030
+ textColor: z70.boolean().optional()
34070
35031
  }).optional();
34071
- var containerOptionsSchema = z69.object({
34072
- maxWidth: z69.union([
34073
- z69.array(containerMaxWidthSchema),
34074
- z69.boolean()
35032
+ var containerOptionsSchema = z70.object({
35033
+ maxWidth: z70.union([
35034
+ z70.array(containerMaxWidthSchema),
35035
+ z70.boolean()
34075
35036
  ]).optional(),
34076
- alignment: z69.union([
34077
- z69.array(containerAlignmentSchema),
34078
- z69.boolean()
35037
+ alignment: z70.union([
35038
+ z70.array(containerAlignmentSchema),
35039
+ z70.boolean()
34079
35040
  ]).optional()
34080
35041
  }).optional();
34081
- var siteStyleConfigSchema = z69.object({
34082
- sectionBackgrounds: z69.array(sectionBackgroundSchema).optional(),
35042
+ var siteStyleConfigSchema = z70.object({
35043
+ sectionBackgrounds: z70.array(sectionBackgroundSchema).optional(),
34083
35044
  sectionOptions: sectionOptionsSchema,
34084
35045
  containerOptions: containerOptionsSchema
34085
35046
  }).optional();
34086
- var sdkLoaderEndpointSchema2 = z69.enum(SUPPORTED_LOADER_ENDPOINTS2);
35047
+ var sdkLoaderEndpointSchema2 = z70.enum(SUPPORTED_LOADER_ENDPOINTS2);
34087
35048
  var allowedTransformIds = new Set(builtinTransformDefinitions.map((transform) => transform.id));
34088
- var loaderTransformStepSchema = z69.object({
34089
- id: z69.string().refine((id) => allowedTransformIds.has(id), {
35049
+ var loaderTransformStepSchema = z70.object({
35050
+ id: z70.string().refine((id) => allowedTransformIds.has(id), {
34090
35051
  message: "Unknown transform id"
34091
35052
  }),
34092
- options: z69.record(z69.string(), z69.unknown()).optional()
35053
+ options: z70.record(z70.string(), z70.unknown()).optional()
34093
35054
  });
34094
- var loaderParamBindingSchema2 = z69.object({
34095
- $bind: z69.object({
34096
- from: z69.string().min(1, "Binding path is required"),
35055
+ var loaderParamBindingSchema2 = z70.object({
35056
+ $bind: z70.object({
35057
+ from: z70.string().min(1, "Binding path is required"),
34097
35058
  // Loader params are ultimately string-normalized for query strings, so fallbacks should
34098
35059
  // stay scalar. Use transforms (e.g. `value.jsonArray`) when you need to serialize
34099
35060
  // more complex values into a string.
34100
- fallback: z69.union([z69.string(), z69.number(), z69.boolean(), z69.null()]).optional(),
34101
- transforms: z69.array(loaderTransformStepSchema).default([]),
34102
- pick: z69.enum(["value", "collection", "context"]).default("value"),
34103
- coerce: z69.enum(["number", "boolean", "string"]).optional()
35061
+ fallback: z70.union([z70.string(), z70.number(), z70.boolean(), z70.null()]).optional(),
35062
+ transforms: z70.array(loaderTransformStepSchema).default([]),
35063
+ pick: z70.enum(["value", "collection", "context"]).default("value"),
35064
+ coerce: z70.enum(["number", "boolean", "string"]).optional()
34104
35065
  })
34105
35066
  });
34106
- var loaderParamValueSchema2 = z69.union([
34107
- z69.string(),
34108
- z69.number(),
34109
- z69.boolean(),
35067
+ var loaderParamValueSchema2 = z70.union([
35068
+ z70.string(),
35069
+ z70.number(),
35070
+ z70.boolean(),
34110
35071
  loaderParamBindingSchema2
34111
35072
  ]);
34112
- var loaderWhenValueSchema = z69.union([
34113
- z69.boolean(),
35073
+ var loaderWhenValueSchema = z70.union([
35074
+ z70.boolean(),
34114
35075
  loaderParamBindingSchema2
34115
35076
  ]);
34116
- var sdkConfigLoaderSchema2 = z69.object({
35077
+ var sdkConfigLoaderSchema2 = z70.object({
34117
35078
  endpoint: sdkLoaderEndpointSchema2,
34118
- params: z69.record(z69.string(), loaderParamValueSchema2),
34119
- mode: z69.enum(["server", "client"]).default("server"),
35079
+ params: z70.record(z70.string(), loaderParamValueSchema2),
35080
+ mode: z70.enum(["server", "client"]).default("server"),
34120
35081
  when: loaderWhenValueSchema.optional()
34121
35082
  });
34122
- var sdkDataLoadersSchema2 = z69.record(z69.string(), sdkConfigLoaderSchema2).refine(
35083
+ var sdkDataLoadersSchema2 = z70.record(z70.string(), sdkConfigLoaderSchema2).refine(
34123
35084
  (loaders) => Object.keys(loaders).length <= 5,
34124
35085
  { message: "Maximum 5 data loaders per block" }
34125
35086
  ).optional();
34126
- var fieldSelectOptionSchema = z69.object({
34127
- value: z69.string().min(1, "Option value is required"),
34128
- label: z69.string().min(1, "Option label is required")
35087
+ var fieldSelectOptionSchema = z70.object({
35088
+ value: z70.string().min(1, "Option value is required"),
35089
+ label: z70.string().min(1, "Option label is required")
34129
35090
  });
34130
- var blockFieldConfigSchema = z69.object({
34131
- options: z69.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
35091
+ var blockFieldConfigSchema = z70.object({
35092
+ options: z70.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
34132
35093
  });
34133
- var blockFieldOptionsSchema = z69.record(
34134
- z69.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
35094
+ var blockFieldOptionsSchema = z70.record(
35095
+ z70.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
34135
35096
  message: "Block ID must be 'block.*' or 'custom.*' format"
34136
35097
  }),
34137
- z69.record(
34138
- z69.string().min(1, "Field ID is required"),
35098
+ z70.record(
35099
+ z70.string().min(1, "Field ID is required"),
34139
35100
  blockFieldConfigSchema
34140
35101
  )
34141
35102
  ).optional();
34142
- var blockFieldExtensionSchema = z69.object({
35103
+ var blockFieldExtensionSchema = z70.object({
34143
35104
  fields: fieldSchema.array().min(1, "At least one field is required")
34144
35105
  }).refine(
34145
35106
  (data) => {
@@ -34153,10 +35114,10 @@ var blockFieldExtensionSchema = z69.object({
34153
35114
  message: "Required fields must have a defaultValue to support existing blocks"
34154
35115
  }
34155
35116
  );
34156
- var blockFieldExtensionsMapSchema = z69.record(
35117
+ var blockFieldExtensionsMapSchema = z70.record(
34157
35118
  // System blocks are kebab-case: block.body-text, block.event-calendar, ...
34158
35119
  // Enforce: lowercase alphanumerics with single hyphens (no trailing hyphen, no consecutive hyphens).
34159
- z69.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
35120
+ z70.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
34160
35121
  message: "Block ID must be 'block.*' format (system blocks only)"
34161
35122
  }),
34162
35123
  blockFieldExtensionSchema
@@ -34172,7 +35133,7 @@ var blockFieldExtensionsMapSchema = z69.record(
34172
35133
  (field) => field.id === collision.fieldId
34173
35134
  );
34174
35135
  ctx.addIssue({
34175
- code: z69.ZodIssueCode.custom,
35136
+ code: z70.ZodIssueCode.custom,
34176
35137
  message: collision.message,
34177
35138
  path: [
34178
35139
  APPOINTMENT_BOOKING_BLOCK_ID,
@@ -34238,24 +35199,24 @@ function validateFieldIdConflicts(blockFieldExtensions) {
34238
35199
  }
34239
35200
  return conflicts;
34240
35201
  }
34241
- var syncConfigSchema = z69.object({
34242
- existingEntries: z69.enum(["skip", "update"]).optional()
35202
+ var syncConfigSchema = z70.object({
35203
+ existingEntries: z70.enum(["skip", "update"]).optional()
34243
35204
  }).optional();
34244
- var deployConfigSchema = z69.object({
34245
- verifyCommand: z69.string().optional(),
34246
- prebuildOutput: z69.string().optional()
35205
+ var deployConfigSchema = z70.object({
35206
+ verifyCommand: z70.string().optional(),
35207
+ prebuildOutput: z70.string().optional()
34247
35208
  }).optional();
34248
- var sdkCustomBlockSchema = z69.object({
35209
+ var sdkCustomBlockSchema = z70.object({
34249
35210
  // Block ID must start with 'custom.'
34250
- id: z69.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
35211
+ id: z70.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
34251
35212
  message: "Block ID must start with 'custom.' followed by lowercase letters, numbers, or hyphens"
34252
35213
  }),
34253
- title: z69.string().min(1, "Title is required"),
35214
+ title: z70.string().min(1, "Title is required"),
34254
35215
  titleSource: titleSourceValueSchema.optional(),
34255
- description: z69.string().optional(),
35216
+ description: z70.string().optional(),
34256
35217
  category: blockCategoryEnum,
34257
- icon: z69.string().optional(),
34258
- tags: z69.array(z69.string()).optional(),
35218
+ icon: z70.string().optional(),
35219
+ tags: z70.array(z70.string()).optional(),
34259
35220
  // Reuse the exact field schema from @riverbankcms/blocks - all field types supported
34260
35221
  fields: fieldSchema.array().min(1, "Custom blocks must have at least one field"),
34261
35222
  // Data loaders for CMS endpoints
@@ -34263,14 +35224,14 @@ var sdkCustomBlockSchema = z69.object({
34263
35224
  // Optional declarative layout - when present, block can render without React override
34264
35225
  layout: NodeSchema.optional(),
34265
35226
  // Optional variants system (preferred when a block has multiple structural layouts)
34266
- variants: z69.record(z69.string().min(1), NodeSchema).optional(),
34267
- defaultVariant: z69.string().min(1).optional(),
34268
- variantOptions: z69.record(
34269
- z69.string().min(1),
34270
- z69.object({
34271
- label: z69.string().min(1).optional(),
34272
- description: z69.string().min(1).optional(),
34273
- icon: z69.string().min(1).optional()
35227
+ variants: z70.record(z70.string().min(1), NodeSchema).optional(),
35228
+ defaultVariant: z70.string().min(1).optional(),
35229
+ variantOptions: z70.record(
35230
+ z70.string().min(1),
35231
+ z70.object({
35232
+ label: z70.string().min(1).optional(),
35233
+ description: z70.string().min(1).optional(),
35234
+ icon: z70.string().min(1).optional()
34274
35235
  })
34275
35236
  ).optional()
34276
35237
  }).superRefine((data, ctx) => {
@@ -34281,7 +35242,7 @@ var sdkCustomBlockSchema = z69.object({
34281
35242
  const exists = fields3.some((field) => field.id === source);
34282
35243
  if (!exists) {
34283
35244
  ctx.addIssue({
34284
- code: z69.ZodIssueCode.custom,
35245
+ code: z70.ZodIssueCode.custom,
34285
35246
  message: `titleSource must reference a valid field ID (got "${source}")`,
34286
35247
  path: Array.isArray(data.titleSource) ? ["titleSource", index] : ["titleSource"]
34287
35248
  });
@@ -34290,7 +35251,7 @@ var sdkCustomBlockSchema = z69.object({
34290
35251
  }
34291
35252
  if (data.layout && data.variants) {
34292
35253
  ctx.addIssue({
34293
- code: z69.ZodIssueCode.custom,
35254
+ code: z70.ZodIssueCode.custom,
34294
35255
  message: "Custom block must define either `layout` or `variants`, not both",
34295
35256
  path: ["variants"]
34296
35257
  });
@@ -34300,7 +35261,7 @@ var sdkCustomBlockSchema = z69.object({
34300
35261
  if (!result.valid) {
34301
35262
  for (const error of result.errors) {
34302
35263
  ctx.addIssue({
34303
- code: z69.ZodIssueCode.custom,
35264
+ code: z70.ZodIssueCode.custom,
34304
35265
  message: error.message,
34305
35266
  path: ["layout"]
34306
35267
  });
@@ -34311,14 +35272,14 @@ var sdkCustomBlockSchema = z69.object({
34311
35272
  const keys = Object.keys(data.variants);
34312
35273
  if (keys.length === 0) {
34313
35274
  ctx.addIssue({
34314
- code: z69.ZodIssueCode.custom,
35275
+ code: z70.ZodIssueCode.custom,
34315
35276
  message: "`variants` must contain at least one variant key",
34316
35277
  path: ["variants"]
34317
35278
  });
34318
35279
  }
34319
35280
  if (data.defaultVariant && !Object.prototype.hasOwnProperty.call(data.variants, data.defaultVariant)) {
34320
35281
  ctx.addIssue({
34321
- code: z69.ZodIssueCode.custom,
35282
+ code: z70.ZodIssueCode.custom,
34322
35283
  message: "`defaultVariant` must be a key present in `variants`",
34323
35284
  path: ["defaultVariant"]
34324
35285
  });
@@ -34328,7 +35289,7 @@ var sdkCustomBlockSchema = z69.object({
34328
35289
  if (!result.valid) {
34329
35290
  for (const error of result.errors) {
34330
35291
  ctx.addIssue({
34331
- code: z69.ZodIssueCode.custom,
35292
+ code: z70.ZodIssueCode.custom,
34332
35293
  message: `${key}: ${error.message}`,
34333
35294
  path: ["variants", key]
34334
35295
  });
@@ -34339,7 +35300,7 @@ var sdkCustomBlockSchema = z69.object({
34339
35300
  for (const key of Object.keys(data.variantOptions)) {
34340
35301
  if (!Object.prototype.hasOwnProperty.call(data.variants, key)) {
34341
35302
  ctx.addIssue({
34342
- code: z69.ZodIssueCode.custom,
35303
+ code: z70.ZodIssueCode.custom,
34343
35304
  message: "`variantOptions` key must exist in `variants`",
34344
35305
  path: ["variantOptions", key]
34345
35306
  });
@@ -34348,58 +35309,58 @@ var sdkCustomBlockSchema = z69.object({
34348
35309
  }
34349
35310
  }
34350
35311
  });
34351
- var themeSourceSchema = z69.enum(["local", "cms"]).optional();
34352
- var activeThemeSchema = z69.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
35312
+ var themeSourceSchema = z70.enum(["local", "cms"]).optional();
35313
+ var activeThemeSchema = z70.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
34353
35314
  message: "Theme name must be lowercase alphanumeric with hyphens/underscores"
34354
35315
  }).max(64, "Theme name too long").optional();
34355
35316
  function isValidConfigBlockKind(kind) {
34356
35317
  if (getBlockDefinition(kind)) return true;
34357
35318
  return /^custom\.[a-z][a-z0-9-]*$/.test(kind);
34358
35319
  }
34359
- var layoutBlockKindSchema = z69.string().refine(isValidConfigBlockKind, {
35320
+ var layoutBlockKindSchema = z70.string().refine(isValidConfigBlockKind, {
34360
35321
  message: 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.my-block")'
34361
35322
  });
34362
- var layoutFooterBlockSchema = z69.object({
34363
- id: z69.string().min(1).optional(),
35323
+ var layoutFooterBlockSchema = z70.object({
35324
+ id: z70.string().min(1).optional(),
34364
35325
  kind: layoutBlockKindSchema,
34365
35326
  // Allow omitted content for blocks that rely on defaults.
34366
- content: z69.record(z69.string(), z69.unknown()).optional()
35327
+ content: z70.record(z70.string(), z70.unknown()).optional()
34367
35328
  }).strict();
34368
- var layoutConfigSchema = z69.object({
34369
- footerBlocks: z69.array(layoutFooterBlockSchema).optional()
35329
+ var layoutConfigSchema = z70.object({
35330
+ footerBlocks: z70.array(layoutFooterBlockSchema).optional()
34370
35331
  }).strict();
34371
- var sdkWorkflowIdSchema2 = z69.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
35332
+ var sdkWorkflowIdSchema2 = z70.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
34372
35333
  message: "Workflow ID must start with a lowercase letter and use lowercase letters, numbers, dots, underscores, or hyphens"
34373
35334
  });
34374
- 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 "/"' });
34375
- var sdkWorkflowTriggerSchema2 = z69.discriminatedUnion("type", [
34376
- z69.object({ type: z69.literal("manual") }).strict()
35335
+ 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 "/"' });
35336
+ var sdkWorkflowTriggerSchema2 = z70.discriminatedUnion("type", [
35337
+ z70.object({ type: z70.literal("manual") }).strict()
34377
35338
  ]);
34378
- var sdkWorkflowConfirmationSchema2 = z69.object({
34379
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
34380
- body: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
35339
+ var sdkWorkflowConfirmationSchema2 = z70.object({
35340
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
35341
+ body: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
34381
35342
  }).strict();
34382
- var sdkWorkflowConfigSchema2 = z69.object({
35343
+ var sdkWorkflowConfigSchema2 = z70.object({
34383
35344
  id: sdkWorkflowIdSchema2,
34384
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
34385
- description: z69.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
34386
- contentType: z69.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
35345
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
35346
+ description: z70.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
35347
+ contentType: z70.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
34387
35348
  endpoint: sdkWorkflowEndpointSchema2,
34388
- triggers: z69.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
35349
+ triggers: z70.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
34389
35350
  confirmation: sdkWorkflowConfirmationSchema2.optional()
34390
35351
  }).strict();
34391
- var sdkWorkflowsSchema2 = z69.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
35352
+ var sdkWorkflowsSchema2 = z70.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
34392
35353
  const ids = workflows.map((workflow) => workflow.id);
34393
35354
  return ids.length === new Set(ids).size;
34394
35355
  }, { message: "Workflow IDs must be unique" }).optional();
34395
- var riverbankSiteConfigSchema = z69.object({
34396
- siteId: z69.string().uuid(),
35356
+ var riverbankSiteConfigSchema = z70.object({
35357
+ siteId: z70.string().uuid(),
34397
35358
  previewUrl: sdkSiteUrlSchema.optional(),
34398
35359
  liveUrl: sdkSiteUrlSchema.optional(),
34399
35360
  theme: sdkThemeConfigSchema2.optional(),
34400
35361
  styles: siteStyleConfigSchema,
34401
35362
  layout: layoutConfigSchema.optional(),
34402
- customBlocks: z69.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
35363
+ customBlocks: z70.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
34403
35364
  // Ensure unique block IDs
34404
35365
  (blocks) => {
34405
35366
  const ids = blocks.map((b) => b.id);
@@ -34412,7 +35373,7 @@ var riverbankSiteConfigSchema = z69.object({
34412
35373
  workflows: sdkWorkflowsSchema2,
34413
35374
  content: contentConfigSchema.optional(),
34414
35375
  // CLI-related configuration (Phase 4)
34415
- contentDir: z69.string().optional(),
35376
+ contentDir: z70.string().optional(),
34416
35377
  sync: syncConfigSchema,
34417
35378
  deploy: deployConfigSchema,
34418
35379
  // Theme sync configuration (Phase 5)