@riverbankcms/sdk 0.77.1 → 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 (230) hide show
  1. package/README.md +69 -0
  2. package/dist/{PreviewEditorSidebar-DVUG7GK4.mjs → PreviewEditorSidebar-RIKFQ72L.mjs} +4916 -4847
  3. package/dist/{PreviewEditorUI-P7RN4CDS.mjs → PreviewEditorUI-XO7TUWKK.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-LAGYMPNF.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +154 -154
  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/index.d.ts +1 -0
  26. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  27. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  28. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  29. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  30. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +2 -2
  32. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +294 -289
  33. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  34. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  35. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +21 -21
  36. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  37. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  38. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  39. package/dist/_dts/blocks/src/system/data/index.d.ts +5 -3
  40. package/dist/_dts/blocks/src/system/data/previewResolvedDataState.d.ts +45 -0
  41. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +2 -1
  42. package/dist/_dts/blocks/src/system/fragments/library/faqAccordion.d.ts +5 -0
  43. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +29 -29
  44. package/dist/_dts/blocks/src/system/node/fragments/headingDecoration.d.ts +10 -0
  45. package/dist/_dts/blocks/src/system/node/fragments/index.d.ts +1 -0
  46. package/dist/_dts/blocks/src/system/node/fragments/styledSection.d.ts +9 -0
  47. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +3 -2
  48. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +8 -0
  49. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  50. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +43 -8
  51. package/dist/_dts/blocks/src/system/runtime/header/shared.d.ts +8 -7
  52. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventCompactRow.d.ts +1 -4
  53. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +7 -0
  54. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.client.d.ts +2 -8
  55. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.server.d.ts +2 -9
  56. package/dist/_dts/blocks/src/system/runtime/nodes/shop-cart-discount-ui.d.ts +5 -0
  57. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout-form.d.ts +76 -0
  58. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout.state.d.ts +1 -4
  59. package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce-store.d.ts +2 -0
  60. package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce.shared.d.ts +1 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/shop-discount-apply.state.d.ts +52 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/shop.state.d.ts +2 -4
  63. package/dist/_dts/blocks/src/system/runtime/nodes/useDiscountApply.d.ts +21 -0
  64. package/dist/_dts/blocks/src/system/runtime/shared/components/DiscountCodeDisclosure.d.ts +54 -0
  65. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -0
  66. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  67. package/dist/_dts/blocks/src/system/transforms/registry/ui.d.ts +1 -1
  68. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +1 -1
  69. package/dist/_dts/content-editor/src/contentTypeEditorContentState.d.ts +26 -0
  70. package/dist/_dts/content-editor/src/definitions/factory.d.ts +75 -0
  71. package/dist/_dts/content-editor/src/entryWorkflows.d.ts +2 -0
  72. package/dist/_dts/content-editor/src/footerBlocksEditorState.d.ts +76 -0
  73. package/dist/_dts/content-editor/src/index.d.ts +5 -0
  74. package/dist/_dts/content-editor/src/pageWorkflowContent.d.ts +29 -0
  75. package/dist/_dts/content-model/src/content-types/schema.d.ts +3 -3
  76. package/dist/_dts/content-model/src/index.d.ts +1 -0
  77. package/dist/_dts/content-model/src/routeTemplate.d.ts +4 -0
  78. package/dist/_dts/content-model/src/templates/editorState.d.ts +25 -0
  79. package/dist/_dts/core/src/csv-cells.d.ts +10 -0
  80. package/dist/_dts/core/src/csv-date-filter.d.ts +27 -0
  81. package/dist/_dts/core/src/csv-escape.d.ts +1 -0
  82. package/dist/_dts/core/src/csv-filename.d.ts +18 -0
  83. package/dist/_dts/core/src/csv-render.d.ts +4 -0
  84. package/dist/_dts/core/src/csv-types.d.ts +116 -0
  85. package/dist/_dts/core/src/currency-format.d.ts +4 -0
  86. package/dist/_dts/core/src/demo-capability-policy.d.ts +29 -0
  87. package/dist/_dts/core/src/demo-claim-access.d.ts +14 -0
  88. package/dist/_dts/core/src/demo-lifecycle-status.d.ts +11 -0
  89. package/dist/_dts/core/src/demo-runtime.d.ts +47 -0
  90. package/dist/_dts/core/src/duration.d.ts +14 -0
  91. package/dist/_dts/core/src/email-format.d.ts +10 -0
  92. package/dist/_dts/core/src/field-errors.d.ts +1 -0
  93. package/dist/_dts/core/src/form-submission-preview.d.ts +24 -0
  94. package/dist/_dts/core/src/index.d.ts +20 -0
  95. package/dist/_dts/core/src/number-input.d.ts +22 -0
  96. package/dist/_dts/core/src/public-url-validation.d.ts +12 -0
  97. package/dist/_dts/core/src/slug.d.ts +39 -0
  98. package/dist/_dts/core/src/string.d.ts +19 -0
  99. package/dist/_dts/core/src/uuid.d.ts +6 -0
  100. package/dist/_dts/db/src/schemas/forms.d.ts +50 -50
  101. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +34 -0
  102. package/dist/_dts/media-core/src/bulkDeletePlanning.d.ts +24 -0
  103. package/dist/_dts/media-core/src/canonicalCropReview.d.ts +66 -0
  104. package/dist/_dts/media-core/src/classifyAllPlanning.d.ts +48 -0
  105. package/dist/_dts/media-core/src/filename.d.ts +1 -0
  106. package/dist/_dts/media-core/src/index.d.ts +10 -0
  107. package/dist/_dts/media-core/src/mediaAssetUsageStatus.d.ts +47 -0
  108. package/dist/_dts/media-core/src/mediaSettingsState.d.ts +3 -0
  109. package/dist/_dts/media-core/src/portableMediaReferences.d.ts +38 -0
  110. package/dist/_dts/media-core/src/uploadVerificationContract.d.ts +28 -0
  111. package/dist/_dts/media-core/src/videoAssetRepair.d.ts +38 -0
  112. package/dist/_dts/media-editor/src/mediaEditorDebug.d.ts +1 -0
  113. package/dist/_dts/path-utils/src/index.d.ts +8 -0
  114. package/dist/_dts/path-utils/src/redirectPaths.d.ts +26 -0
  115. package/dist/_dts/path-utils/src/safeAppPath.d.ts +26 -0
  116. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +2 -1
  117. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -0
  118. package/dist/_dts/preview-next/src/client/preview/previewDocumentFrame.d.ts +31 -0
  119. package/dist/_dts/sdk/src/client/error.d.ts +3 -0
  120. package/dist/_dts/sdk/src/client/index.d.ts +2 -2
  121. package/dist/_dts/sdk/src/client/types.d.ts +37 -19
  122. package/dist/_dts/sdk/src/index.d.ts +2 -2
  123. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +16 -16
  124. package/dist/_dts/sdk/src/next/content-load-failure.d.ts +51 -0
  125. package/dist/_dts/sdk/src/next/index.d.ts +2 -1
  126. package/dist/_dts/sdk/src/next/types.d.ts +19 -0
  127. package/dist/_dts/sdk/src/portal/redirects.d.ts +1 -1
  128. package/dist/_dts/sdk/src/routing/index.d.ts +3 -2
  129. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +71 -6
  130. package/dist/_dts/sdk/src/version.d.ts +1 -1
  131. package/dist/_dts/site-commands/src/commands.d.ts +12 -12
  132. package/dist/_dts/site-commands/src/index.d.ts +1 -0
  133. package/dist/_dts/site-commands/src/pagePaths.d.ts +6 -0
  134. package/dist/_dts/theme-core/src/accordions/siteStyleDefaults.d.ts +26 -0
  135. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -0
  136. package/dist/_dts/theme-core/src/blocks/vars/index.d.ts +1 -0
  137. package/dist/_dts/theme-core/src/fonts/index.d.ts +1 -0
  138. package/dist/_dts/theme-core/src/fonts/uploadFormat.d.ts +44 -0
  139. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  140. package/dist/_dts/theme-core/src/index.d.ts +3 -1
  141. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +36 -24
  142. package/dist/_dts/theme-core/src/navigation/generateNavLinkCSS.d.ts +6 -1
  143. package/dist/_dts/theme-core/src/navigation/types.d.ts +12 -0
  144. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +3 -3
  145. package/dist/_dts/theme-core/src/runtime/themeCssVarNames.d.ts +7 -0
  146. package/dist/_dts/theme-core/src/schema.d.ts +64 -18
  147. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +214 -34
  148. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +5 -2
  149. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +214 -34
  150. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +24 -0
  151. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +31 -3
  152. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -4
  153. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +33 -1
  154. package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +4 -2
  155. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +9 -1
  156. package/dist/_dts/theme-core/src/site-styles/types.d.ts +27 -2
  157. package/dist/_dts/theme-core/src/siteChrome.d.ts +17 -34
  158. package/dist/_dts/theme-core/src/siteChromeOverlayClearance.d.ts +22 -0
  159. package/dist/_dts/theme-core/src/siteChromePlacement.d.ts +22 -0
  160. package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +32 -0
  161. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -2
  162. package/dist/{chunk-2SPENC5M.mjs → chunk-F7RTCZYN.mjs} +229 -50
  163. package/dist/{chunk-IENWFSLO.mjs → chunk-NIDXI46P.mjs} +1 -1
  164. package/dist/{chunk-KWJPDZH2.mjs → chunk-OECWLDHN.mjs} +2770 -620
  165. package/dist/{chunk-VX7B5VAC.mjs → chunk-SVMMM2NA.mjs} +8 -0
  166. package/dist/{chunk-6SMUFTXD.mjs → chunk-SXOLGNMX.mjs} +1 -1
  167. package/dist/{chunk-ZYEJLCTN.mjs → chunk-TXDES5P2.mjs} +2 -2
  168. package/dist/cli/index.mjs +1677 -440
  169. package/dist/client/{accordion-RZMQSYLR.mjs → accordion-EVDEOUPR.mjs} +2 -2
  170. package/dist/client/{bookingForm-NF4ASVNV.mjs → bookingForm-DIHBLC64.mjs} +27 -30
  171. package/dist/client/bookings.mjs +3707 -259
  172. package/dist/client/{carousel-LDX47ZIK.mjs → carousel-FEBQHIWI.mjs} +3 -4
  173. package/dist/client/{cart-RGXDS5F4.mjs → cart-7CKSXAE4.mjs} +8 -8
  174. package/dist/client/{checkout-P7WWSNNY.mjs → checkout-WKYCANLV.mjs} +8 -8
  175. package/dist/client/{chunk-JNC7CGHX.mjs → chunk-2SAVKN2M.mjs} +2 -2
  176. package/dist/client/{chunk-TQ5MSPDX.mjs → chunk-36WJCERQ.mjs} +1 -1
  177. package/dist/client/{chunk-R56FQ3RR.mjs → chunk-65F47D7Y.mjs} +280 -71
  178. package/dist/client/{chunk-L3DNHIJX.mjs → chunk-GUK2FPXQ.mjs} +23 -45
  179. package/dist/client/{chunk-PMAIXMAB.mjs → chunk-IVNCUVAV.mjs} +26 -21
  180. package/dist/client/{chunk-II7O4XN3.mjs → chunk-OFMSCGNY.mjs} +2 -2
  181. package/dist/client/chunk-PD6NBCEY.mjs +66 -0
  182. package/dist/client/{chunk-GMVTOKYG.mjs → chunk-RV6FX7UH.mjs} +510 -64
  183. package/dist/client/{chunk-E2TDNXCL.mjs → chunk-RZDWX7QW.mjs} +2 -1
  184. package/dist/client/{chunk-M3L3KYYR.mjs → chunk-UDNSI5PY.mjs} +12 -0
  185. package/dist/client/{chunk-JEZECJ3W.mjs → chunk-VPPMNXCF.mjs} +129 -3
  186. package/dist/client/{chunk-UFSWADAO.mjs → chunk-YDSEG6GZ.mjs} +5 -66
  187. package/dist/client/client.mjs +7070 -4561
  188. package/dist/client/{courseRegistration-7F65K5ZR.mjs → courseRegistration-5QF2PHKM.mjs} +14 -11
  189. package/dist/client/{eventCalendar-GLSC5KTL.mjs → eventCalendar-4ZOSETDU.mjs} +9 -9
  190. package/dist/client/{eventCombined-ZHK4WKUR.mjs → eventCombined-WQGU7JUX.mjs} +9 -9
  191. package/dist/client/{eventDetails-E3PJYBIN.mjs → eventDetails-AYWVUJ5Y.mjs} +9 -9
  192. package/dist/client/{eventListing-EMS3WC3E.mjs → eventListing-NT7C6UT5.mjs} +9 -9
  193. package/dist/client/{eventRegistration-NZOTVNPI.mjs → eventRegistration-OH24F4ZJ.mjs} +9 -9
  194. package/dist/client/{form-ETFZFATW.mjs → form-7L42SRBB.mjs} +6 -6
  195. package/dist/client/{headerSection-4LBP7ULT.mjs → headerSection-OZRZNZ52.mjs} +3 -3
  196. package/dist/client/hooks.mjs +1040 -278
  197. package/dist/client/{locationMap-5M655YSJ.mjs → locationMap-ZBXRPQ7C.mjs} +2 -2
  198. package/dist/client/{newsletterForm-QOUYW44O.mjs → newsletterForm-SNAGFF2I.mjs} +3 -3
  199. package/dist/client/{productDetail-O4DOCWQG.mjs → productDetail-I46BOFGV.mjs} +8 -8
  200. package/dist/client/{productList-A5RO5WIS.mjs → productList-BOYHTYI6.mjs} +8 -8
  201. package/dist/client/rendering/client.mjs +7090 -2645
  202. package/dist/client/rendering/islands.mjs +19 -19
  203. package/dist/client/rendering.mjs +6089 -3792
  204. package/dist/client/{shop-L4MZH4I2.mjs → shop-XTXPZTKR.mjs} +8 -8
  205. package/dist/preview-next/before-render.mjs +8 -0
  206. package/dist/preview-next/client/runtime.mjs +5 -5
  207. package/dist/preview-next/editor-chrome.css +10 -0
  208. package/dist/preview-next/middleware.mjs +8 -0
  209. package/dist/{sdk-runtime-6UT2S7KZ.mjs → sdk-runtime-ZJLKC6DR.mjs} +6 -6
  210. package/dist/server/components.mjs +2635 -1262
  211. package/dist/server/config-validation.mjs +1271 -509
  212. package/dist/server/config.mjs +1271 -509
  213. package/dist/server/data.mjs +1040 -278
  214. package/dist/server/index.mjs +488 -246
  215. package/dist/server/next.mjs +4087 -2147
  216. package/dist/server/page-converter.mjs +571 -115
  217. package/dist/server/prebuild.mjs +1 -1
  218. package/dist/server/rendering/server.mjs +2636 -1263
  219. package/dist/server/rendering.mjs +2654 -1268
  220. package/dist/server/routing.mjs +1729 -489
  221. package/dist/server/server.mjs +1532 -530
  222. package/dist/server/theme-bridge.mjs +3151 -131
  223. package/dist/server/theme.mjs +10 -1
  224. package/dist/styles/index.css +488 -48
  225. package/package.json +2 -1
  226. package/dist/SdkPreviewModeRuntime-KLPX47SE.mjs +0 -8
  227. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/DiscountCodeSection.d.ts +0 -7
  228. package/dist/_dts/preview-next/src/client/widgets/PreviewMediaField.d.ts +0 -4
  229. package/dist/client/chunk-OJPZEZU2.mjs +0 -31
  230. package/dist/client/chunk-RTZ3JKKX.mjs +0 -178
@@ -44,7 +44,7 @@ function fallbackBinding(...sources) {
44
44
  }
45
45
 
46
46
  // src/config/validation.ts
47
- import { z as z69 } from "zod";
47
+ import { z as z70 } from "zod";
48
48
 
49
49
  // ../api/src/apiEndpointTypes.ts
50
50
  function blockedDemoMutationPolicy(classification, publicMessage) {
@@ -3948,6 +3948,14 @@ var ENDPOINT_DEFINITIONS = {
3948
3948
  responseKind: "json",
3949
3949
  errors: []
3950
3950
  },
3951
+ applyDiscountCode: {
3952
+ path: "/public/sites/{siteId}/bookings/discounts/apply",
3953
+ method: "POST",
3954
+ tags: ["site-{siteId}", "booking-discounts"],
3955
+ auth: "public",
3956
+ responseKind: "json",
3957
+ errors: ["validation:invalid_input", "rate_limit:exceeded"]
3958
+ },
3951
3959
  // Batch endpoint for block loader requests (reduces SSR fan-out)
3952
3960
  batchBlockLoaders: {
3953
3961
  path: "/public/sites/{siteId}/block-loaders/batch",
@@ -6287,6 +6295,27 @@ var ENDPOINT_DEFINITIONS = {
6287
6295
  }
6288
6296
  };
6289
6297
 
6298
+ // ../core/src/location.ts
6299
+ function normalizeLocationAddressText(value) {
6300
+ if (typeof value !== "string") {
6301
+ return null;
6302
+ }
6303
+ const trimmed = value.trim();
6304
+ return trimmed ? trimmed : null;
6305
+ }
6306
+ function hasLocationCoordinates(value) {
6307
+ return typeof value?.lat === "number" && typeof value?.lng === "number";
6308
+ }
6309
+ function toLocationCoordinates(value) {
6310
+ if (!hasLocationCoordinates(value)) {
6311
+ return null;
6312
+ }
6313
+ return {
6314
+ lat: value.lat,
6315
+ lng: value.lng
6316
+ };
6317
+ }
6318
+
6290
6319
  // ../api/src/accessAdmin.ts
6291
6320
  import { z } from "zod";
6292
6321
  var managedDomainAddOnPricingSnapshotSchema = z.object({
@@ -6429,27 +6458,6 @@ function formatKeyAsLabel(key) {
6429
6458
  // ../blocks/src/system/manifest/schema.ts
6430
6459
  import { z as z4 } from "zod";
6431
6460
 
6432
- // ../core/src/location.ts
6433
- function normalizeLocationAddressText(value) {
6434
- if (typeof value !== "string") {
6435
- return null;
6436
- }
6437
- const trimmed = value.trim();
6438
- return trimmed ? trimmed : null;
6439
- }
6440
- function hasLocationCoordinates(value) {
6441
- return typeof value?.lat === "number" && typeof value?.lng === "number";
6442
- }
6443
- function toLocationCoordinates(value) {
6444
- if (!hasLocationCoordinates(value)) {
6445
- return null;
6446
- }
6447
- return {
6448
- lat: value.lat,
6449
- lng: value.lng
6450
- };
6451
- }
6452
-
6453
6461
  // ../media-core/src/transformRect.ts
6454
6462
  function isValidTransformRectStructure(rect) {
6455
6463
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -7574,6 +7582,9 @@ function makeBoundaryId(previousBlockId, nextBlockId) {
7574
7582
  const next = encodeURIComponent(nextBlockId);
7575
7583
  return asDesignBoundaryId(`boundary:${previous}:${next}`);
7576
7584
  }
7585
+ function assertNever(value, message = "Unhandled Theme V2 variant") {
7586
+ throw new Error(`${message}: ${String(value)}`);
7587
+ }
7577
7588
  function brandNonEmptyString(value, label) {
7578
7589
  if (value.length === 0) {
7579
7590
  throw new Error(`${label} must be a non-empty string.`);
@@ -7601,6 +7612,10 @@ var tileTreatmentValues = [
7601
7612
  "quiet",
7602
7613
  "brand-depth"
7603
7614
  ];
7615
+ var eventListTreatmentValues = [
7616
+ "plain",
7617
+ "lined-panel"
7618
+ ];
7604
7619
  var eyebrowTreatmentValues = [
7605
7620
  "plain",
7606
7621
  "pill",
@@ -7658,6 +7673,7 @@ function defineBlockDesignCapability(capability) {
7658
7673
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7659
7674
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7660
7675
  tileTreatments: capability.tileTreatments ?? ["default"],
7676
+ eventListTreatments: capability.eventListTreatments ?? ["plain"],
7661
7677
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
7662
7678
  ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
7663
7679
  ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
@@ -7682,9 +7698,98 @@ var blockAppearancePresets = [
7682
7698
  transitionAfter: "soft-fade-short",
7683
7699
  emphasis: "high",
7684
7700
  sectionHeight: "hero",
7701
+ heroComposition: "center",
7702
+ heroTypographyScale: "display",
7685
7703
  imageSurfaceTreatment: { kind: "neutral-wash" }
7686
7704
  }
7687
7705
  }),
7706
+ defineBlockAppearancePreset({
7707
+ kind: "block-design",
7708
+ id: "hero-bottom-left-panel",
7709
+ target: "hero",
7710
+ label: "Bottom-left panel hero",
7711
+ blockKinds: ["block.hero"],
7712
+ constraints: {
7713
+ layoutFamilies: ["centered", "compact"]
7714
+ },
7715
+ optionGroups: [
7716
+ {
7717
+ id: "image-surface-treatment",
7718
+ label: "Treatment",
7719
+ selectedOptionId: "neutral-scrim",
7720
+ options: [
7721
+ {
7722
+ id: "neutral-scrim",
7723
+ label: "Neutral scrim",
7724
+ designPatch: {
7725
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7726
+ }
7727
+ },
7728
+ {
7729
+ id: "brand-scrim-primary",
7730
+ label: "Brand scrim",
7731
+ designPatch: {
7732
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "balanced" }
7733
+ }
7734
+ }
7735
+ ]
7736
+ }
7737
+ ],
7738
+ layoutPatches: [
7739
+ {
7740
+ constraints: {
7741
+ layoutVariantKeys: ["micro"]
7742
+ },
7743
+ designPatch: {
7744
+ sectionHeight: "banner",
7745
+ heroTypographyScale: "editorial"
7746
+ }
7747
+ }
7748
+ ],
7749
+ design: {
7750
+ sectionSurface: "hero-image",
7751
+ contentFrame: panelFrame("raised"),
7752
+ itemSurface: "none",
7753
+ transitionAfter: "soft-fade-short",
7754
+ emphasis: "high",
7755
+ sectionHeight: "immersive",
7756
+ heroComposition: "bottom-left",
7757
+ heroTypographyScale: "display",
7758
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7759
+ }
7760
+ }),
7761
+ defineBlockAppearancePreset({
7762
+ kind: "block-design",
7763
+ id: "hero-poster-image",
7764
+ target: "hero",
7765
+ label: "Poster image hero",
7766
+ blockKinds: ["block.hero"],
7767
+ constraints: {
7768
+ layoutFamilies: ["centered", "compact"]
7769
+ },
7770
+ layoutPatches: [
7771
+ {
7772
+ constraints: {
7773
+ layoutVariantKeys: ["micro"]
7774
+ },
7775
+ designPatch: {
7776
+ sectionHeight: "banner",
7777
+ heroTypographyScale: "display"
7778
+ }
7779
+ }
7780
+ ],
7781
+ design: {
7782
+ sectionSurface: "hero-image",
7783
+ contentFrame: plainFrame,
7784
+ itemSurface: "none",
7785
+ transitionAfter: "soft-fade-short",
7786
+ emphasis: "high",
7787
+ sectionHeight: "immersive",
7788
+ heroComposition: "center",
7789
+ heroTypographyScale: "poster",
7790
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "strong" }
7791
+ }
7792
+ }),
7688
7793
  defineBlockAppearancePreset({
7689
7794
  kind: "block-design",
7690
7795
  id: "hero-brand-scrim",
@@ -7734,6 +7839,8 @@ var blockAppearancePresets = [
7734
7839
  transitionAfter: "soft-fade-short",
7735
7840
  emphasis: "high",
7736
7841
  sectionHeight: "immersive",
7842
+ heroComposition: "center",
7843
+ heroTypographyScale: "display",
7737
7844
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7738
7845
  }
7739
7846
  }),
@@ -7786,6 +7893,8 @@ var blockAppearancePresets = [
7786
7893
  transitionAfter: "soft-fade-short",
7787
7894
  emphasis: "high",
7788
7895
  sectionHeight: "immersive",
7896
+ heroComposition: "center",
7897
+ heroTypographyScale: "display",
7789
7898
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7790
7899
  imageSurfaceMotion: "fixed-frame",
7791
7900
  eyebrowTreatment: "accent-pill-bounce"
@@ -7806,6 +7915,8 @@ var blockAppearancePresets = [
7806
7915
  itemSurface: "none",
7807
7916
  transitionAfter: "soft-fade-short",
7808
7917
  emphasis: "high",
7918
+ heroComposition: "center",
7919
+ heroTypographyScale: "editorial",
7809
7920
  eyebrowTreatment: "accent-pill-bounce"
7810
7921
  }
7811
7922
  }),
@@ -7820,7 +7931,82 @@ var blockAppearancePresets = [
7820
7931
  contentFrame: panelFrame("inset"),
7821
7932
  itemSurface: "none",
7822
7933
  transitionAfter: "none",
7823
- emphasis: "high"
7934
+ emphasis: "high",
7935
+ heroComposition: "center",
7936
+ heroTypographyScale: "editorial"
7937
+ }
7938
+ }),
7939
+ defineBlockAppearancePreset({
7940
+ kind: "block-design",
7941
+ id: "hero-split-editorial",
7942
+ target: "hero",
7943
+ label: "Editorial split hero",
7944
+ blockKinds: ["block.hero"],
7945
+ constraints: {
7946
+ layoutFamilies: ["split"]
7947
+ },
7948
+ design: {
7949
+ sectionSurface: "base",
7950
+ contentFrame: plainFrame,
7951
+ itemSurface: "none",
7952
+ transitionAfter: "soft-fade-short",
7953
+ emphasis: "high",
7954
+ heroTypographyScale: "editorial"
7955
+ }
7956
+ }),
7957
+ defineBlockAppearancePreset({
7958
+ kind: "block-design",
7959
+ id: "hero-split-brand",
7960
+ target: "hero",
7961
+ label: "Brand split hero",
7962
+ blockKinds: ["block.hero"],
7963
+ constraints: {
7964
+ layoutFamilies: ["split"]
7965
+ },
7966
+ design: {
7967
+ sectionSurface: "brand-depth-band",
7968
+ contentFrame: plainFrame,
7969
+ itemSurface: "none",
7970
+ transitionAfter: "soft-fade-short",
7971
+ emphasis: "high",
7972
+ heroTypographyScale: "display",
7973
+ eyebrowTreatment: "accent-pill-bounce"
7974
+ }
7975
+ }),
7976
+ defineBlockAppearancePreset({
7977
+ kind: "block-design",
7978
+ id: "hero-split-soft-panel",
7979
+ target: "hero",
7980
+ label: "Soft panel split hero",
7981
+ blockKinds: ["block.hero"],
7982
+ constraints: {
7983
+ layoutFamilies: ["split"]
7984
+ },
7985
+ design: {
7986
+ sectionSurface: "muted-band",
7987
+ contentFrame: panelFrame("raised"),
7988
+ itemSurface: "none",
7989
+ transitionAfter: "soft-fade-short",
7990
+ emphasis: "high",
7991
+ heroTypographyScale: "editorial"
7992
+ }
7993
+ }),
7994
+ defineBlockAppearancePreset({
7995
+ kind: "block-design",
7996
+ id: "hero-split-accent",
7997
+ target: "hero",
7998
+ label: "Accent split hero",
7999
+ blockKinds: ["block.hero"],
8000
+ constraints: {
8001
+ layoutFamilies: ["split"]
8002
+ },
8003
+ design: {
8004
+ sectionSurface: "accent-band",
8005
+ contentFrame: panelFrame("raised"),
8006
+ itemSurface: "none",
8007
+ transitionAfter: "soft-fade-short",
8008
+ emphasis: "high",
8009
+ heroTypographyScale: "display"
7824
8010
  }
7825
8011
  }),
7826
8012
  defineBlockAppearancePreset({
@@ -7853,9 +8039,9 @@ var blockAppearancePresets = [
7853
8039
  }),
7854
8040
  defineBlockAppearancePreset({
7855
8041
  kind: "block-design",
7856
- id: "intro-soft-earth-statement",
8042
+ id: "intro-organic-statement",
7857
8043
  target: "intro",
7858
- label: "Soft Earth intro statement",
8044
+ label: "Organic intro statement",
7859
8045
  blockKinds: ["block.intro"],
7860
8046
  design: {
7861
8047
  sectionSurface: "base",
@@ -7886,9 +8072,9 @@ var blockAppearancePresets = [
7886
8072
  }),
7887
8073
  defineBlockAppearancePreset({
7888
8074
  kind: "block-design",
7889
- id: "feature-cards-soft-earth-offerings",
8075
+ id: "feature-cards-raised-rule",
7890
8076
  target: "feature-cards",
7891
- label: "Soft Earth offering cards",
8077
+ label: "Raised cards with rule",
7892
8078
  blockKinds: ["block.feature-cards"],
7893
8079
  design: {
7894
8080
  sectionSurface: "base",
@@ -7917,6 +8103,21 @@ var blockAppearancePresets = [
7917
8103
  emphasis: "medium"
7918
8104
  }
7919
8105
  }),
8106
+ defineBlockAppearancePreset({
8107
+ kind: "block-design",
8108
+ id: "events-lined-panel",
8109
+ target: "events",
8110
+ label: "Lined event panel",
8111
+ blockKinds: ["block.event-calendar", "block.event-listing"],
8112
+ design: {
8113
+ sectionSurface: "base",
8114
+ contentFrame: plainFrame,
8115
+ itemSurface: "none",
8116
+ transitionAfter: "none",
8117
+ emphasis: "medium",
8118
+ eventListTreatment: "lined-panel"
8119
+ }
8120
+ }),
7920
8121
  defineBlockAppearancePreset({
7921
8122
  kind: "block-design",
7922
8123
  id: "schedule-details-accent-section",
@@ -7976,9 +8177,9 @@ var blockAppearancePresets = [
7976
8177
  }),
7977
8178
  defineBlockAppearancePreset({
7978
8179
  kind: "block-design",
7979
- id: "testimonials-carded-proof",
8180
+ id: "testimonials-simple-cards",
7980
8181
  target: "testimonials",
7981
- label: "Carded social proof",
8182
+ label: "Simple testimonial cards",
7982
8183
  blockKinds: ["block.testimonials"],
7983
8184
  design: {
7984
8185
  sectionSurface: "base",
@@ -7990,9 +8191,9 @@ var blockAppearancePresets = [
7990
8191
  }),
7991
8192
  defineBlockAppearancePreset({
7992
8193
  kind: "block-design",
7993
- id: "testimonials-contained-proof",
8194
+ id: "testimonials-raised-panel",
7994
8195
  target: "testimonials",
7995
- label: "Contained social proof",
8196
+ label: "Raised testimonial panel",
7996
8197
  blockKinds: ["block.testimonials"],
7997
8198
  design: {
7998
8199
  sectionSurface: "muted-band",
@@ -8004,9 +8205,9 @@ var blockAppearancePresets = [
8004
8205
  }),
8005
8206
  defineBlockAppearancePreset({
8006
8207
  kind: "block-design",
8007
- id: "testimonials-dark-proof",
8208
+ id: "testimonials-accent-panel",
8008
8209
  target: "testimonials",
8009
- label: "Dark proof panel",
8210
+ label: "Accent testimonial panel",
8010
8211
  blockKinds: ["block.testimonials"],
8011
8212
  design: {
8012
8213
  sectionSurface: "accent-band",
@@ -8018,9 +8219,9 @@ var blockAppearancePresets = [
8018
8219
  }),
8019
8220
  defineBlockAppearancePreset({
8020
8221
  kind: "block-design",
8021
- id: "testimonials-accent-quote-proof",
8222
+ id: "testimonials-accent-quote-cards",
8022
8223
  target: "testimonials",
8023
- label: "Accent quote proof",
8224
+ label: "Accent quote cards",
8024
8225
  blockKinds: ["block.testimonials"],
8025
8226
  design: {
8026
8227
  sectionSurface: "accent-band",
@@ -8033,9 +8234,9 @@ var blockAppearancePresets = [
8033
8234
  }),
8034
8235
  defineBlockAppearancePreset({
8035
8236
  kind: "block-design",
8036
- id: "testimonials-soft-earth-proof-band",
8237
+ id: "testimonials-brand-background-quotes",
8037
8238
  target: "testimonials",
8038
- label: "Soft Earth proof band",
8239
+ label: "Brand background quotes",
8039
8240
  blockKinds: ["block.testimonials"],
8040
8241
  design: {
8041
8242
  sectionSurface: "brand-depth-band",
@@ -8079,25 +8280,6 @@ var blockAppearancePresets = [
8079
8280
  emphasis: "low"
8080
8281
  }
8081
8282
  }),
8082
- defineBlockAppearancePreset({
8083
- kind: "block-design",
8084
- id: "faq-soft-earth-two-column",
8085
- target: "faq",
8086
- label: "Soft Earth two-column FAQ",
8087
- blockKinds: ["block.faq"],
8088
- design: {
8089
- sectionSurface: "base",
8090
- contentFrame: plainFrame,
8091
- itemSurface: "flat",
8092
- transitionAfter: "none",
8093
- emphasis: "medium",
8094
- accordionIconTreatment: {
8095
- iconSet: "plus",
8096
- colorToken: "primary",
8097
- motion: "swap"
8098
- }
8099
- }
8100
- }),
8101
8283
  defineBlockAppearancePreset({
8102
8284
  kind: "block-design",
8103
8285
  id: "contact-form-panel",
@@ -9476,7 +9658,8 @@ var accordionSystemSchema = z12.object({
9476
9658
  icon: z12.object({
9477
9659
  style: accordionIconSchema,
9478
9660
  position: z12.enum(["left", "right"]),
9479
- size: z12.enum(["sm", "md", "lg"])
9661
+ size: z12.enum(["sm", "md", "lg"]),
9662
+ colorToken: themeColorTokenSchema.optional()
9480
9663
  }),
9481
9664
  // Trigger (question) styling
9482
9665
  trigger: z12.object({
@@ -9610,6 +9793,7 @@ var navLinkPaddingXSchema = z16.enum(["none", "tight", "compact", "default", "re
9610
9793
  var navLinkBorderRadiusSchema = z16.enum(["none", "sm", "md", "full"]);
9611
9794
  var navLinkTextSizeSchema = z16.enum(["xs", "sm", "base", "lg"]);
9612
9795
  var navLinkLetterSpacingSchema = z16.enum(["normal", "wide", "wider", "widest"]);
9796
+ var navLinkContrastTreatmentSchema = z16.enum(["none", "soft-glow"]);
9613
9797
  var navLinkStyleSchema = z16.object({
9614
9798
  /** Display name for the style */
9615
9799
  name: z16.string().min(1).max(30).optional(),
@@ -9621,6 +9805,8 @@ var navLinkStyleSchema = z16.object({
9621
9805
  textSize: navLinkTextSizeSchema.optional(),
9622
9806
  /** Optional letter spacing override */
9623
9807
  letterSpacing: navLinkLetterSpacingSchema.optional(),
9808
+ /** Optional text-only contrast treatment for transparent/overlay navigation */
9809
+ contrastTreatment: navLinkContrastTreatmentSchema.optional(),
9624
9810
  /** Hover/active color token (for color-change effects) */
9625
9811
  hoverColorToken: themeColorTokenSchema.nullable().optional(),
9626
9812
  /** Padding preset */
@@ -10050,6 +10236,7 @@ var sectionStylesOverrideSchema = z21.object({
10050
10236
  spacing: semanticSpacingSchema.nullable().optional(),
10051
10237
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
10052
10238
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
10239
+ eventListTreatment: z21.enum(eventListTreatmentValues).nullable().optional(),
10053
10240
  eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
10054
10241
  headingDecoration: headingDecorationSchema.nullable().optional(),
10055
10242
  // Author-level override consumed by later block/editor rendering phases.
@@ -10883,6 +11070,34 @@ var paletteVariantsById = new Map(
10883
11070
  paletteVariants.map((v) => [v.id, v])
10884
11071
  );
10885
11072
 
11073
+ // ../theme-core/src/accordions/siteStyleDefaults.ts
11074
+ var softEarthAccordionSystem = {
11075
+ background: {
11076
+ type: "solid",
11077
+ colorToken: "background"
11078
+ },
11079
+ spacing: "comfortable",
11080
+ corners: "square",
11081
+ border: null,
11082
+ shadow: null,
11083
+ icon: {
11084
+ style: "plus-minus",
11085
+ position: "right",
11086
+ size: "md",
11087
+ colorToken: "primary"
11088
+ },
11089
+ trigger: {
11090
+ textColorToken: "text",
11091
+ fontWeight: "medium"
11092
+ },
11093
+ hover: {
11094
+ textColorToken: "primary"
11095
+ },
11096
+ content: {
11097
+ textColorToken: "neutral-700"
11098
+ }
11099
+ };
11100
+
10886
11101
  // ../theme-core/src/site-styles/headerLooks.ts
10887
11102
  function asHeaderLookId(value) {
10888
11103
  return value;
@@ -10938,7 +11153,7 @@ var headerLayoutCatalog = [
10938
11153
  description: "Detached header chrome that sits over the opening section.",
10939
11154
  structure: "floating-shell",
10940
11155
  variant: "floating",
10941
- defaultPositioning: "fixed",
11156
+ defaultPositioning: "sticky",
10942
11157
  shrinkOnScroll: true,
10943
11158
  maxRecommendedNavItems: 5,
10944
11159
  allowedLogoShapes: ["none", "text-only", "horizontal"]
@@ -10955,7 +11170,9 @@ var headerStyleCatalog = [
10955
11170
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10956
11171
  navInteraction: "color-change",
10957
11172
  surface: "neutral",
10958
- navTypography: "plain"
11173
+ defaultDepth: "none",
11174
+ navTypography: "plain",
11175
+ moods: ["calm", "professional", "editorial"]
10959
11176
  },
10960
11177
  {
10961
11178
  id: asHeaderStyleId("fine-line"),
@@ -10964,7 +11181,9 @@ var headerStyleCatalog = [
10964
11181
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10965
11182
  navInteraction: "underline-grow",
10966
11183
  surface: "bordered",
10967
- navTypography: "plain"
11184
+ defaultDepth: "line",
11185
+ navTypography: "plain",
11186
+ moods: ["calm", "professional", "editorial"]
10968
11187
  },
10969
11188
  {
10970
11189
  id: asHeaderStyleId("soft-bar"),
@@ -10973,7 +11192,9 @@ var headerStyleCatalog = [
10973
11192
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10974
11193
  navInteraction: "pill-background",
10975
11194
  surface: "soft",
10976
- navTypography: "plain"
11195
+ defaultDepth: "line",
11196
+ navTypography: "plain",
11197
+ moods: ["calm", "professional"]
10977
11198
  },
10978
11199
  {
10979
11200
  id: asHeaderStyleId("pill-nav"),
@@ -10982,7 +11203,9 @@ var headerStyleCatalog = [
10982
11203
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10983
11204
  navInteraction: "pill-background",
10984
11205
  surface: "soft",
10985
- navTypography: "plain"
11206
+ defaultDepth: "none",
11207
+ navTypography: "plain",
11208
+ moods: ["calm"]
10986
11209
  },
10987
11210
  {
10988
11211
  id: asHeaderStyleId("brand-bar"),
@@ -10991,7 +11214,9 @@ var headerStyleCatalog = [
10991
11214
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10992
11215
  navInteraction: "color-change",
10993
11216
  surface: "brand-solid",
10994
- navTypography: "brand-caps"
11217
+ defaultDepth: "none",
11218
+ navTypography: "brand-caps",
11219
+ moods: ["professional", "expressive", "utility"]
10995
11220
  },
10996
11221
  {
10997
11222
  id: asHeaderStyleId("brand-underline"),
@@ -11000,7 +11225,9 @@ var headerStyleCatalog = [
11000
11225
  supportedLayoutIds: supportedLayouts(["classic"]),
11001
11226
  navInteraction: "underline-grow",
11002
11227
  surface: "brand-solid",
11003
- navTypography: "brand-caps"
11228
+ defaultDepth: "none",
11229
+ navTypography: "brand-caps",
11230
+ moods: ["expressive"]
11004
11231
  },
11005
11232
  {
11006
11233
  id: asHeaderStyleId("brand-pill"),
@@ -11009,7 +11236,9 @@ var headerStyleCatalog = [
11009
11236
  supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
11010
11237
  navInteraction: "pill-background",
11011
11238
  surface: "brand-solid",
11012
- navTypography: "brand-caps"
11239
+ defaultDepth: "none",
11240
+ navTypography: "brand-caps",
11241
+ moods: ["expressive"]
11013
11242
  },
11014
11243
  {
11015
11244
  id: asHeaderStyleId("serif-line"),
@@ -11018,7 +11247,9 @@ var headerStyleCatalog = [
11018
11247
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
11019
11248
  navInteraction: "underline-grow",
11020
11249
  surface: "bordered",
11021
- navTypography: "heading"
11250
+ defaultDepth: "line",
11251
+ navTypography: "heading",
11252
+ moods: ["editorial", "calm"]
11022
11253
  },
11023
11254
  {
11024
11255
  id: asHeaderStyleId("flat-tabs"),
@@ -11027,16 +11258,20 @@ var headerStyleCatalog = [
11027
11258
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
11028
11259
  navInteraction: "flat-block",
11029
11260
  surface: "bordered",
11030
- navTypography: "quiet-caps"
11261
+ defaultDepth: "shadow",
11262
+ navTypography: "quiet-caps",
11263
+ moods: ["professional", "utility", "expressive"]
11031
11264
  },
11032
11265
  {
11033
11266
  id: asHeaderStyleId("glass"),
11034
11267
  label: "Glass",
11035
11268
  description: "Translucent chrome with frosted navigation backing.",
11036
- supportedLayoutIds: supportedLayouts(["classic", "floating"]),
11269
+ supportedLayoutIds: supportedLayouts(["floating"]),
11037
11270
  navInteraction: "glass-backed",
11038
11271
  surface: "floating",
11039
- navTypography: "plain"
11272
+ defaultDepth: "shadow",
11273
+ navTypography: "plain",
11274
+ moods: ["expressive", "calm"]
11040
11275
  },
11041
11276
  {
11042
11277
  id: asHeaderStyleId("minimal-surface"),
@@ -11045,7 +11280,9 @@ var headerStyleCatalog = [
11045
11280
  supportedLayoutIds: supportedLayouts(["floating"]),
11046
11281
  navInteraction: "color-change",
11047
11282
  surface: "floating",
11048
- navTypography: "plain"
11283
+ defaultDepth: "none",
11284
+ navTypography: "plain",
11285
+ moods: ["editorial", "calm"]
11049
11286
  },
11050
11287
  {
11051
11288
  id: asHeaderStyleId("soft-shell"),
@@ -11054,7 +11291,9 @@ var headerStyleCatalog = [
11054
11291
  supportedLayoutIds: supportedLayouts(["floating"]),
11055
11292
  navInteraction: "pill-background",
11056
11293
  surface: "floating",
11057
- navTypography: "plain"
11294
+ defaultDepth: "shadow",
11295
+ navTypography: "plain",
11296
+ moods: ["calm", "professional"]
11058
11297
  },
11059
11298
  {
11060
11299
  id: asHeaderStyleId("split-glass"),
@@ -11063,7 +11302,9 @@ var headerStyleCatalog = [
11063
11302
  supportedLayoutIds: supportedLayouts(["floating"]),
11064
11303
  navInteraction: "glass-backed",
11065
11304
  surface: "floating",
11066
- navTypography: "quiet-caps"
11305
+ defaultDepth: "shadow",
11306
+ navTypography: "quiet-caps",
11307
+ moods: ["expressive"]
11067
11308
  },
11068
11309
  {
11069
11310
  id: asHeaderStyleId("split-pill"),
@@ -11072,7 +11313,9 @@ var headerStyleCatalog = [
11072
11313
  supportedLayoutIds: supportedLayouts(["floating"]),
11073
11314
  navInteraction: "pill-background",
11074
11315
  surface: "floating",
11075
- navTypography: "heading"
11316
+ defaultDepth: "shadow",
11317
+ navTypography: "heading",
11318
+ moods: ["calm", "editorial"]
11076
11319
  }
11077
11320
  ];
11078
11321
  var headerLayoutsById = new Map(
@@ -11086,7 +11329,6 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11086
11329
  asHeaderLayoutId("classic"),
11087
11330
  headerStyleRepairChain([
11088
11331
  "minimal",
11089
- "glass",
11090
11332
  "fine-line",
11091
11333
  "soft-bar",
11092
11334
  "pill-nav",
@@ -11153,7 +11395,13 @@ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
11153
11395
  ],
11154
11396
  [
11155
11397
  asHeaderStyleId("glass"),
11156
- headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
11398
+ headerStyleRepairChain([
11399
+ "glass",
11400
+ "soft-shell",
11401
+ "fine-line",
11402
+ "minimal-surface",
11403
+ "minimal"
11404
+ ])
11157
11405
  ],
11158
11406
  [
11159
11407
  asHeaderStyleId("soft-shell"),
@@ -11265,6 +11513,23 @@ function getCompatibleHeaderStyleIds(layoutId) {
11265
11513
  }
11266
11514
  );
11267
11515
  }
11516
+ function themedHeaderShadow(theme) {
11517
+ switch (theme.shadow.elevation) {
11518
+ case "none":
11519
+ return void 0;
11520
+ case "low":
11521
+ return { elevation: "sm" };
11522
+ case "medium":
11523
+ return { elevation: "md" };
11524
+ case "high":
11525
+ return { elevation: "lg" };
11526
+ default:
11527
+ return assertNever(
11528
+ theme.shadow.elevation,
11529
+ "Unhandled theme shadow elevation"
11530
+ );
11531
+ }
11532
+ }
11268
11533
  function solidBrandHeader(theme) {
11269
11534
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
11270
11535
  return {
@@ -11414,9 +11679,7 @@ function practicalUtilityHeader(theme) {
11414
11679
  navColor: "text",
11415
11680
  navStyle: "solid",
11416
11681
  navWeight: "semibold",
11417
- shadow: {
11418
- elevation: "sm"
11419
- },
11682
+ shadow: themedHeaderShadow(theme),
11420
11683
  border: {
11421
11684
  style: "solid",
11422
11685
  width: "thin",
@@ -11485,6 +11748,7 @@ function floatingGlassHeader(theme) {
11485
11748
  return {
11486
11749
  ...transparentOverlayHeader(theme),
11487
11750
  variant: "floating",
11751
+ positioning: "sticky",
11488
11752
  navStyle: "frosted",
11489
11753
  navContainer: {
11490
11754
  type: "glass",
@@ -12000,7 +12264,7 @@ var typographyPresets = [
12000
12264
  heroTypography: {
12001
12265
  headlineSize: "6xl",
12002
12266
  headlineLineHeight: "tight",
12003
- subheadlineSize: "editorial",
12267
+ subheadlineSize: "2xl",
12004
12268
  subheadlineLineHeight: "normal",
12005
12269
  microHeadlineSize: "6xl",
12006
12270
  microHeadlineLineHeight: "tight",
@@ -12018,6 +12282,8 @@ var typographyPresetsById = new Map(
12018
12282
  );
12019
12283
 
12020
12284
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
12285
+ var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
12286
+ var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
12021
12287
  var curatedSiteStyleIdValues = [
12022
12288
  "site-style:calm-studio",
12023
12289
  "site-style:clear-professional",
@@ -12029,7 +12295,7 @@ var curatedSiteStyleIdValues = [
12029
12295
  "site-style:personal-retreat-journal",
12030
12296
  "site-style:tactile-workshop",
12031
12297
  "site-style:modern-wellness",
12032
- "site-style:soft-earth",
12298
+ SOFT_EARTH_SITE_STYLE_ID_VALUE,
12033
12299
  "site-style:bold-launch",
12034
12300
  "site-style:south-west-twerk-school"
12035
12301
  ];
@@ -12111,7 +12377,10 @@ function uniqueContentFrameKinds() {
12111
12377
  var generatedContentFrameKinds = uniqueContentFrameKinds();
12112
12378
  function defineCuratedSiteStyle(input) {
12113
12379
  const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
12114
- const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
12380
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(
12381
+ legacyHeaderLookIds,
12382
+ input.tokenRecipes
12383
+ );
12115
12384
  const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
12116
12385
  const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
12117
12386
  if (!typographyPresetChoices.some(
@@ -12144,6 +12413,7 @@ function defineCuratedSiteStyle(input) {
12144
12413
  supportedTransitions: generatedDesignOptionCatalog.transitions
12145
12414
  },
12146
12415
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
12416
+ ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
12147
12417
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
12148
12418
  defaultHeaderSelection: input.defaultHeaderSelection ? {
12149
12419
  layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
@@ -12202,7 +12472,69 @@ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
12202
12472
  };
12203
12473
  return [first, ...choices.slice(1)];
12204
12474
  }
12205
- function inferHeaderCurationFromLegacyLooks(lookIds) {
12475
+ function uniqueCompatibleHeaderStyleChoices(choices, fallbackLayoutId) {
12476
+ const compatible = new Set(getCompatibleHeaderStyleIds(fallbackLayoutId));
12477
+ const seen = /* @__PURE__ */ new Set();
12478
+ const unique = choices.filter((choice) => {
12479
+ if (!compatible.has(choice.id)) return false;
12480
+ if (seen.has(choice.id)) return false;
12481
+ seen.add(choice.id);
12482
+ return true;
12483
+ });
12484
+ return nonEmptyHeaderStyleChoices(unique, fallbackLayoutId);
12485
+ }
12486
+ function inferredHeaderStyleValuesForRecipes(layoutId, recipes) {
12487
+ switch (layoutId) {
12488
+ case "classic":
12489
+ if (isExpressiveRecipe(recipes)) {
12490
+ return [
12491
+ "brand-bar",
12492
+ "brand-underline",
12493
+ "flat-tabs",
12494
+ "brand-pill",
12495
+ "fine-line"
12496
+ ];
12497
+ }
12498
+ if (recipes.spacing === "compact") {
12499
+ return ["flat-tabs", "fine-line", "minimal", "brand-bar"];
12500
+ }
12501
+ if (isSerifTypographyRecipe(recipes)) {
12502
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12503
+ }
12504
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12505
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12506
+ }
12507
+ return ["fine-line", "minimal", "soft-bar", "brand-bar"];
12508
+ case "centered":
12509
+ if (isSerifTypographyRecipe(recipes)) {
12510
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12511
+ }
12512
+ if (isExpressiveRecipe(recipes)) {
12513
+ return ["brand-pill", "flat-tabs", "brand-bar", "fine-line"];
12514
+ }
12515
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12516
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12517
+ }
12518
+ return ["minimal", "fine-line", "soft-bar"];
12519
+ case "floating":
12520
+ if (isExpressiveRecipe(recipes)) {
12521
+ return ["glass", "split-glass", "brand-pill", "soft-shell"];
12522
+ }
12523
+ if (isSerifTypographyRecipe(recipes)) {
12524
+ return ["split-pill", "minimal-surface", "soft-shell"];
12525
+ }
12526
+ return ["soft-shell", "minimal-surface", "glass"];
12527
+ default:
12528
+ return [];
12529
+ }
12530
+ }
12531
+ function isExpressiveRecipe(recipes) {
12532
+ return recipes.contrast === "maximum" || recipes.shadow === "layered" || recipes.motion === "expressive";
12533
+ }
12534
+ function isSerifTypographyRecipe(recipes) {
12535
+ return recipes.typography === "serif-editorial" || recipes.typography === "classic-serif";
12536
+ }
12537
+ function inferHeaderCurationFromLegacyLooks(lookIds, recipes) {
12206
12538
  const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
12207
12539
  (selection) => Boolean(selection)
12208
12540
  );
@@ -12215,8 +12547,15 @@ function inferHeaderCurationFromLegacyLooks(lookIds) {
12215
12547
  );
12216
12548
  const stylesByLayout = {};
12217
12549
  for (const layoutChoice of layoutChoices) {
12218
- const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12219
- stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
12550
+ const legacyStyleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12551
+ const inferredStyleChoices = inferredHeaderStyleValuesForRecipes(
12552
+ layoutChoice.id,
12553
+ recipes
12554
+ ).map((styleId) => headerStyleChoice(styleId));
12555
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = uniqueCompatibleHeaderStyleChoices(
12556
+ [...legacyStyleChoices, ...inferredStyleChoices],
12557
+ layoutChoice.id
12558
+ );
12220
12559
  }
12221
12560
  return {
12222
12561
  defaultHeaderSelection,
@@ -12636,10 +12975,10 @@ var curatedSiteStyles = [
12636
12975
  ]
12637
12976
  }),
12638
12977
  defineCuratedSiteStyle({
12639
- id: "site-style:soft-earth",
12978
+ id: SOFT_EARTH_SITE_STYLE_ID,
12640
12979
  name: "Soft Earth",
12641
12980
  description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
12642
- 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.",
12981
+ generationBrief: "Use cream space, terracotta CTAs, olive quote bands, natural imagery, generous but composed spacing, and editorial serif headings. Prefer a real intro section, image-led offering cards, warm community quotes, and an FAQ with a full-width intro above two columns of questions when content allows.",
12643
12982
  siteCreatorSelection: {
12644
12983
  kind: "site_creator_keyword_heuristic",
12645
12984
  priority: 45
@@ -12709,14 +13048,18 @@ var curatedSiteStyles = [
12709
13048
  paragraphSize: "default",
12710
13049
  headingSize: "editorial"
12711
13050
  }
12712
- }
13051
+ },
13052
+ accordions: softEarthAccordionSystem
13053
+ },
13054
+ defaultBlockVariants: {
13055
+ "block.faq": "question-columns"
12713
13056
  },
12714
13057
  recommendedAppearancePresetIds: [
12715
13058
  "hero-brand-scrim",
12716
- "intro-soft-earth-statement",
12717
- "feature-cards-soft-earth-offerings",
12718
- "testimonials-soft-earth-proof-band",
12719
- "faq-soft-earth-two-column",
13059
+ "intro-organic-statement",
13060
+ "feature-cards-raised-rule",
13061
+ "events-lined-panel",
13062
+ "testimonials-brand-background-quotes",
12720
13063
  "contact-form-panel"
12721
13064
  ],
12722
13065
  recommendedHeaderLookIds: [
@@ -12820,7 +13163,7 @@ var curatedSiteStyles = [
12820
13163
  "hero-brand-scrim-fixed-frame",
12821
13164
  "body-text-editorial-intro",
12822
13165
  "schedule-details-brand-depth",
12823
- "testimonials-accent-quote-proof",
13166
+ "testimonials-accent-quote-cards",
12824
13167
  "contact-form-brand-depth-card"
12825
13168
  ],
12826
13169
  recommendedHeaderLookIds: [
@@ -12915,6 +13258,7 @@ var themeV2RuntimeStyleFieldNames = [
12915
13258
  ];
12916
13259
  var themeV2BlockSpecificRawStyleFieldNames = [
12917
13260
  "_contentCardStyles",
13261
+ "_heroLayoutStyles",
12918
13262
  "_textCardStyles"
12919
13263
  ];
12920
13264
  var themeV2NormalEditorRawStyleFieldNames = [
@@ -12924,6 +13268,10 @@ var themeV2NormalEditorRawStyleFieldNames = [
12924
13268
  var themeV2NormalEditorRawStyleFieldNameSet = new Set(
12925
13269
  themeV2NormalEditorRawStyleFieldNames
12926
13270
  );
13271
+ var themeV2CompilerOwnedFieldNames = [
13272
+ ...themeV2RuntimeStyleFieldNames,
13273
+ ...themeV2BlockSpecificRawStyleFieldNames
13274
+ ];
12927
13275
 
12928
13276
  // ../theme-core/src/site-styles/designState.ts
12929
13277
  var themeV2DesignStateSchemaVersion = 1;
@@ -12938,6 +13286,16 @@ var heroLegibilityStrategySchema = z23.enum([
12938
13286
  "scrim-gradient",
12939
13287
  "solid-panel"
12940
13288
  ]);
13289
+ var heroCompositionIntentSchema = z23.enum([
13290
+ "center",
13291
+ "bottom-left"
13292
+ ]);
13293
+ var heroTypographyScaleIntentSchema = z23.enum([
13294
+ "quiet",
13295
+ "editorial",
13296
+ "display",
13297
+ "poster"
13298
+ ]);
12941
13299
  var sectionHeightIntentSchema = z23.enum([
12942
13300
  "default",
12943
13301
  "banner",
@@ -12973,6 +13331,7 @@ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
12973
13331
  ]);
12974
13332
  var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
12975
13333
  var tileTreatmentSchema = z23.enum(tileTreatmentValues);
13334
+ var eventListTreatmentSchema = z23.enum(eventListTreatmentValues);
12976
13335
  var eyebrowTreatmentSchema = z23.enum(eyebrowTreatmentValues);
12977
13336
  function uniqueNonEmpty(values) {
12978
13337
  const uniqueValues = [...new Set(values)];
@@ -13014,10 +13373,13 @@ var blockDesignPlanSchema = z23.object({
13014
13373
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
13015
13374
  sectionHeight: sectionHeightIntentSchema.optional(),
13016
13375
  heroLegibility: heroLegibilityStrategySchema.optional(),
13376
+ heroComposition: heroCompositionIntentSchema.optional(),
13377
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
13017
13378
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
13018
13379
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
13019
13380
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
13020
13381
  tileTreatment: tileTreatmentSchema.optional(),
13382
+ eventListTreatment: eventListTreatmentSchema.optional(),
13021
13383
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
13022
13384
  }).strict();
13023
13385
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
@@ -14417,6 +14779,7 @@ function styledSection(config) {
14417
14779
  renderBackgroundImage = true,
14418
14780
  backgroundImageLoading,
14419
14781
  backgroundImageFetchPriority,
14782
+ allowOverflow = false,
14420
14783
  fullWidthPath
14421
14784
  } = config;
14422
14785
  const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
@@ -14451,7 +14814,7 @@ function styledSection(config) {
14451
14814
  // No fallback needed - transform handles all cases via defaultSpacing
14452
14815
  }
14453
14816
  },
14454
- allowOverflow: {
14817
+ allowOverflow: allowOverflow ? true : {
14455
14818
  $bind: {
14456
14819
  from: `${bindFrom}.background`,
14457
14820
  transforms: [{ id: "background.resolveAllowOverflow" }],
@@ -15135,6 +15498,14 @@ var tileTreatmentSet = new Set(tileTreatmentValues);
15135
15498
  function isTileTreatment(value) {
15136
15499
  return typeof value === "string" && tileTreatmentSet.has(value);
15137
15500
  }
15501
+ var eventListTreatmentClassMap = {
15502
+ plain: "",
15503
+ "lined-panel": "rb-event-list-treatment-lined-panel"
15504
+ };
15505
+ var eventListTreatmentSet = new Set(eventListTreatmentValues);
15506
+ function isEventListTreatment(value) {
15507
+ return typeof value === "string" && eventListTreatmentSet.has(value);
15508
+ }
15138
15509
  var sectionClassNameTransform = {
15139
15510
  id: "sectionStyles.resolveClassName",
15140
15511
  kind: "string",
@@ -15202,6 +15573,17 @@ var sectionClassNameTransform = {
15202
15573
  `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
15203
15574
  );
15204
15575
  }
15576
+ const eventListTreatment = input?.eventListTreatment;
15577
+ if (isEventListTreatment(eventListTreatment)) {
15578
+ const eventListTreatmentClass = eventListTreatmentClassMap[eventListTreatment];
15579
+ if (eventListTreatmentClass) {
15580
+ classes.push(eventListTreatmentClass);
15581
+ }
15582
+ } else if (typeof eventListTreatment === "string" && process.env.NODE_ENV !== "production") {
15583
+ console.warn(
15584
+ `[sectionStyles] Invalid eventListTreatment value in _sectionStyles: "${eventListTreatment}". Expected one of: ${eventListTreatmentValues.join(", ")}.`
15585
+ );
15586
+ }
15205
15587
  if (hasFixedFrameBackgroundMotion(input)) {
15206
15588
  classes.push(fixedFrameScopeClass);
15207
15589
  }
@@ -15637,6 +16019,35 @@ function sectionState(opts) {
15637
16019
  );
15638
16020
  }
15639
16021
 
16022
+ // ../blocks/src/system/node/fragments/headingDecoration.ts
16023
+ var defaultBindFrom = "_sectionStyles.headingDecoration";
16024
+ function headingDecoration({
16025
+ bindFrom = defaultBindFrom,
16026
+ family,
16027
+ placement,
16028
+ className
16029
+ }) {
16030
+ return el(
16031
+ "div",
16032
+ {
16033
+ "aria-hidden": "true",
16034
+ className: {
16035
+ $bind: {
16036
+ from: bindFrom,
16037
+ transforms: [
16038
+ {
16039
+ id: "ui.headingDecorationClassName",
16040
+ options: { baseClass: className, family }
16041
+ }
16042
+ ]
16043
+ }
16044
+ }
16045
+ },
16046
+ null,
16047
+ when(`${bindFrom}.placement`, { equals: placement })
16048
+ );
16049
+ }
16050
+
15640
16051
  // ../blocks/src/system/fragments/types.ts
15641
16052
  import { z as z27 } from "zod";
15642
16053
  var FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
@@ -16415,6 +16826,10 @@ var testimonialsHeadingFragment = defineFragment({
16415
16826
  when("content.heading"),
16416
16827
  bind("content.heading")
16417
16828
  ),
16829
+ headingDecoration({
16830
+ family: "short-center-rule",
16831
+ placement: "under-centered-heading"
16832
+ }),
16418
16833
  text(
16419
16834
  {
16420
16835
  as: "p",
@@ -17086,6 +17501,41 @@ var faqHeadingFragment = defineFragment({
17086
17501
  });
17087
17502
 
17088
17503
  // ../blocks/src/system/fragments/library/faqAccordion.ts
17504
+ function createFaqAccordionLayout(options = {}) {
17505
+ return accordionList({
17506
+ collection: "content.items",
17507
+ itemName: "faqItem",
17508
+ indexName: "faqIndex",
17509
+ accordionProps: {
17510
+ className: options.rootClassName ?? "accordion-root",
17511
+ type: "single",
17512
+ collapsible: true
17513
+ },
17514
+ itemProps: {
17515
+ className: {
17516
+ $bind: {
17517
+ from: "content._cardStyles",
17518
+ transforms: [
17519
+ {
17520
+ id: "boxStyles.all",
17521
+ options: {
17522
+ axis: "all",
17523
+ includeSpacing: false,
17524
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
17525
+ }
17526
+ }
17527
+ ]
17528
+ },
17529
+ fallback: "rb-faq-item"
17530
+ },
17531
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17532
+ // Legacy theme accordion style
17533
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17534
+ },
17535
+ triggerFrom: "faqItem.question",
17536
+ contentFrom: "faqItem.answer"
17537
+ });
17538
+ }
17089
17539
  var faqAccordionFragment = defineFragment({
17090
17540
  id: "faqAccordion",
17091
17541
  title: "FAQ Accordion",
@@ -17119,40 +17569,7 @@ var faqAccordionFragment = defineFragment({
17119
17569
  }
17120
17570
  }
17121
17571
  ],
17122
- layout: accordionList({
17123
- collection: "content.items",
17124
- itemName: "faqItem",
17125
- indexName: "faqIndex",
17126
- accordionProps: {
17127
- className: "accordion-root",
17128
- // CSS-first: all styling handled by theme CSS
17129
- type: "single",
17130
- collapsible: true
17131
- },
17132
- itemProps: {
17133
- className: {
17134
- $bind: {
17135
- from: "content._cardStyles",
17136
- transforms: [
17137
- {
17138
- id: "boxStyles.all",
17139
- options: {
17140
- axis: "all",
17141
- includeSpacing: false,
17142
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden rb-border"
17143
- }
17144
- }
17145
- ]
17146
- },
17147
- fallback: "rb-faq-item"
17148
- },
17149
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17150
- // Legacy theme accordion style
17151
- iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17152
- },
17153
- triggerFrom: "faqItem.question",
17154
- contentFrom: "faqItem.answer"
17155
- })
17572
+ layout: createFaqAccordionLayout()
17156
17573
  });
17157
17574
 
17158
17575
  // ../blocks/src/system/fragments/library/card.ts
@@ -18205,6 +18622,7 @@ var microLayout = styledSection({
18205
18622
  function splitLayoutWith(children) {
18206
18623
  return styledSection({
18207
18624
  children: styledContainer({
18625
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
18208
18626
  children: {
18209
18627
  type: "grid",
18210
18628
  props: {
@@ -18229,6 +18647,7 @@ function splitLayoutWith(children) {
18229
18647
  // The split variants render the image as a real grid column, so suppress
18230
18648
  // the default absolute background image layer while keeping color/overlay.
18231
18649
  renderBackgroundImage: false,
18650
+ allowOverflow: true,
18232
18651
  baseClass: ""
18233
18652
  });
18234
18653
  }
@@ -18382,6 +18801,21 @@ function introHeading(className) {
18382
18801
  bind("content.title")
18383
18802
  );
18384
18803
  }
18804
+ function introHeadingGroup(className) {
18805
+ return stack(
18806
+ {
18807
+ gap: "sm",
18808
+ className: "rb-intro-heading-group"
18809
+ },
18810
+ [
18811
+ introHeading(className),
18812
+ headingDecoration({
18813
+ family: "organic-squiggle",
18814
+ placement: "after-heading"
18815
+ })
18816
+ ]
18817
+ );
18818
+ }
18385
18819
  function introBody(className = "rb-prose rb-max-w-none") {
18386
18820
  return richText({ className }, bind("content.body"));
18387
18821
  }
@@ -18400,6 +18834,10 @@ function introCopyStack(options = {}) {
18400
18834
  },
18401
18835
  [
18402
18836
  introHeading(options.headingClassName ?? "rb-intro-title"),
18837
+ headingDecoration({
18838
+ family: "organic-squiggle",
18839
+ placement: "after-heading"
18840
+ }),
18403
18841
  introBody(options.bodyClassName),
18404
18842
  introCtas(options.ctaJustify)
18405
18843
  ]
@@ -18439,7 +18877,7 @@ var statementCopyLayout = styledSection({
18439
18877
  className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
18440
18878
  },
18441
18879
  [
18442
- introHeading("rb-intro-title rb-max-w-xl"),
18880
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18443
18881
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18444
18882
  introBody(),
18445
18883
  introCtas("start")
@@ -18460,7 +18898,7 @@ var statementMediaLayout = styledSection({
18460
18898
  className: "rb-intro rb-intro-statement-media rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-3 rb-lg-items-center"
18461
18899
  },
18462
18900
  [
18463
- introHeading("rb-intro-title rb-max-w-xl"),
18901
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18464
18902
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18465
18903
  introBody(),
18466
18904
  introCtas("start")
@@ -19462,6 +19900,9 @@ function isNodeDefinitionArray(layout) {
19462
19900
  }
19463
19901
  var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
19464
19902
  var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
19903
+ var questionColumnsAccordionLayout = createFaqAccordionLayout({
19904
+ rootClassName: "accordion-root rb-faq-question-columns rb-grid rb-grid-cols-1 rb-gap-4 rb-lg-grid-cols-2"
19905
+ });
19465
19906
  var defaultLayout = styledSection({
19466
19907
  children: styledContainer({
19467
19908
  baseClassName: "rb-relative rb-isolate",
@@ -19475,11 +19916,24 @@ var twoColumnLayout = styledSection({
19475
19916
  children: el(
19476
19917
  "div",
19477
19918
  {
19478
- className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19919
+ className: "rb-faq-split-heading rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19479
19920
  },
19480
19921
  [
19481
- el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
19482
- el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
19922
+ el("div", { className: "rb-faq-split-heading-copy" }, [headingLayout]),
19923
+ el("div", { className: "rb-faq-split-heading-accordion" }, [accordionLayout])
19924
+ ]
19925
+ )
19926
+ }),
19927
+ baseClass: ""
19928
+ });
19929
+ var questionColumnsLayout = styledSection({
19930
+ children: styledContainer({
19931
+ baseClassName: "rb-relative rb-isolate",
19932
+ children: stack(
19933
+ { gap: "xl", className: "rb-w-full" },
19934
+ [
19935
+ headingLayout,
19936
+ questionColumnsAccordionLayout
19483
19937
  ]
19484
19938
  )
19485
19939
  }),
@@ -19504,7 +19958,8 @@ var faqManifest = createBlockManifest({
19504
19958
  layout: defaultLayout,
19505
19959
  variants: {
19506
19960
  default: defaultLayout,
19507
- "two-column": twoColumnLayout
19961
+ "two-column": twoColumnLayout,
19962
+ "question-columns": questionColumnsLayout
19508
19963
  },
19509
19964
  defaultVariant: "default",
19510
19965
  variantOptions: {
@@ -19515,6 +19970,10 @@ var faqManifest = createBlockManifest({
19515
19970
  "two-column": {
19516
19971
  label: "Two column",
19517
19972
  description: "A left heading column with FAQ items on the right."
19973
+ },
19974
+ "question-columns": {
19975
+ label: "Question columns",
19976
+ description: "A full-width heading above FAQ items split into two columns."
19518
19977
  }
19519
19978
  },
19520
19979
  description: "Accordion of frequently asked questions and answers.",
@@ -19636,9 +20095,21 @@ var eyebrowTreatmentClassMap = {
19636
20095
  "accent-pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent rb-eyebrow-treatment-pill-bounce"
19637
20096
  };
19638
20097
  var eyebrowTreatmentSet = new Set(eyebrowTreatmentValues);
20098
+ var headingDecorationFamilySet = new Set(visibleHeadingDecorationFamilyValues);
20099
+ var headingDecorationPlacementSet = new Set(visibleHeadingDecorationPlacementValues);
20100
+ var headingDecorationColorTokenSet = new Set(headingDecorationColorTokenValues);
19639
20101
  function isEyebrowTreatment(value) {
19640
20102
  return typeof value === "string" && eyebrowTreatmentSet.has(value);
19641
20103
  }
20104
+ function isHeadingDecorationFamily(value) {
20105
+ return typeof value === "string" && headingDecorationFamilySet.has(value);
20106
+ }
20107
+ function isHeadingDecorationPlacement(value) {
20108
+ return typeof value === "string" && headingDecorationPlacementSet.has(value);
20109
+ }
20110
+ function isHeadingDecorationColorToken(value) {
20111
+ return typeof value === "string" && headingDecorationColorTokenSet.has(value);
20112
+ }
19642
20113
  var imageGalleryCornerClassMap = {
19643
20114
  none: "",
19644
20115
  sm: "rb-rounded-sm",
@@ -19742,6 +20213,10 @@ var sectionStateToneTransform = {
19742
20213
  summary: "Map semantic section-state kind to feedback tone",
19743
20214
  run: (value) => sectionStateToneFromUnknown(value)
19744
20215
  };
20216
+ var heroTitleLengthThresholds = {
20217
+ medium: { maxCharacters: 42, maxWords: 6 },
20218
+ long: { maxCharacters: 78, maxWords: 11 }
20219
+ };
19745
20220
  function isPlainObject(value) {
19746
20221
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
19747
20222
  }
@@ -19749,6 +20224,14 @@ function readString(obj, key) {
19749
20224
  const v = obj[key];
19750
20225
  return typeof v === "string" ? v : void 0;
19751
20226
  }
20227
+ function resolveGeneratedHeroLayoutStyles(content) {
20228
+ const raw = content._heroLayoutStyles;
20229
+ return isPlainObject(raw) ? raw : null;
20230
+ }
20231
+ function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
20232
+ const generated = resolveGeneratedHeroLayoutStyles(content);
20233
+ return generated && typeof generated[generatedKey] === "string" ? generated[generatedKey] : readString(content, fallbackKey);
20234
+ }
19752
20235
  function resolveHeroVariant(content) {
19753
20236
  const variant = readString(content, "variant");
19754
20237
  if (variant && variant.trim()) return variant.trim();
@@ -19757,14 +20240,14 @@ function resolveHeroVariant(content) {
19757
20240
  return null;
19758
20241
  }
19759
20242
  function resolveHeroContentAlignment(content) {
19760
- const raw = readString(content, "contentAlignment");
20243
+ const raw = readHeroLayoutString(content, "contentAlignment");
19761
20244
  if (raw === "left" || raw === "center" || raw === "right") return raw;
19762
20245
  const variant = resolveHeroVariant(content);
19763
20246
  if (variant === "split" || variant === "splitReverse") return "left";
19764
20247
  return "center";
19765
20248
  }
19766
20249
  function resolveHeroVerticalAlignment(content) {
19767
- const raw = readString(content, "verticalAlignment");
20250
+ const raw = readHeroLayoutString(content, "verticalAlignment");
19768
20251
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
19769
20252
  const sectionStyles = asPartialObject(content._sectionStyles);
19770
20253
  const minHeight = sectionStyles?.minHeight;
@@ -19774,11 +20257,29 @@ function resolveHeroVerticalAlignment(content) {
19774
20257
  return "top";
19775
20258
  }
19776
20259
  function resolveHeroContentMaxWidth(content) {
19777
- const raw = readString(content, "contentMaxWidth");
20260
+ const raw = readHeroLayoutString(content, "contentMaxWidth");
19778
20261
  if (raw === "default" || raw === "narrow" || raw === "medium" || raw === "wide")
19779
20262
  return raw;
19780
20263
  return "default";
19781
20264
  }
20265
+ function resolveHeroTypographyScale(content) {
20266
+ const raw = readHeroLayoutString(
20267
+ content,
20268
+ "typographyScale",
20269
+ "heroTypographyScale"
20270
+ );
20271
+ if (raw === "quiet" || raw === "editorial" || raw === "display" || raw === "poster") {
20272
+ return raw;
20273
+ }
20274
+ return null;
20275
+ }
20276
+ function resolveHeroTitleLength(content) {
20277
+ const headline = readString(content, "headline")?.trim() ?? "";
20278
+ const wordCount = headline.length === 0 ? 0 : headline.split(/\s+/).length;
20279
+ if (headline.length > heroTitleLengthThresholds.long.maxCharacters || wordCount > heroTitleLengthThresholds.long.maxWords) return "long";
20280
+ if (headline.length > heroTitleLengthThresholds.medium.maxCharacters || wordCount > heroTitleLengthThresholds.medium.maxWords) return "medium";
20281
+ return "short";
20282
+ }
19782
20283
  var heroContentWrapperClassSchema = z33.object({
19783
20284
  base: z33.string().optional()
19784
20285
  });
@@ -19791,6 +20292,8 @@ var heroContentWrapperClassTransform = {
19791
20292
  const content = isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {};
19792
20293
  const alignment = resolveHeroContentAlignment(content);
19793
20294
  const maxWidth = resolveHeroContentMaxWidth(content);
20295
+ const typographyScale = resolveHeroTypographyScale(content);
20296
+ const titleLength = resolveHeroTitleLength(content);
19794
20297
  const textAlignClass = alignment === "center" ? "rb-text-center" : alignment === "right" ? "rb-text-right" : "rb-text-left";
19795
20298
  const maxWidthClass = maxWidth === "narrow" ? "rb-max-w-2xl" : maxWidth === "medium" ? "rb-max-w-3xl" : maxWidth === "wide" ? "rb-max-w-5xl" : "";
19796
20299
  const positionClass = alignment === "center" ? "rb-mx-auto" : alignment === "right" ? "rb-ml-auto" : "";
@@ -19798,7 +20301,9 @@ var heroContentWrapperClassTransform = {
19798
20301
  options?.base,
19799
20302
  textAlignClass,
19800
20303
  maxWidthClass,
19801
- positionClass
20304
+ positionClass,
20305
+ typographyScale ? `rb-hero-typography-${typographyScale}` : "",
20306
+ `rb-hero-title-${titleLength}`
19802
20307
  ]);
19803
20308
  }
19804
20309
  };
@@ -20098,11 +20603,67 @@ var uiTransforms = [
20098
20603
  const treatment = isEyebrowTreatment(value) ? value : "plain";
20099
20604
  return joinClasses3([baseClass, eyebrowTreatmentClassMap[treatment]]);
20100
20605
  }
20606
+ },
20607
+ {
20608
+ id: "ui.headingDecorationClassName",
20609
+ kind: "string",
20610
+ summary: "Apply constrained Theme V2 heading decoration classes",
20611
+ run: (value, options) => {
20612
+ const baseClass = typeof options?.baseClass === "string" && options.baseClass.trim() ? options.baseClass : "rb-heading-decoration";
20613
+ const decoration = asPartialObject(value);
20614
+ const family = isHeadingDecorationFamily(decoration?.family) ? decoration.family : null;
20615
+ const allowedFamily = isHeadingDecorationFamily(options?.family) ? options.family : null;
20616
+ const placement = isHeadingDecorationPlacement(decoration?.placement) ? decoration.placement : null;
20617
+ const colorToken = isHeadingDecorationColorToken(decoration?.colorToken) ? decoration.colorToken : "primary";
20618
+ if (!family || !placement) return "rb-hidden";
20619
+ if (allowedFamily && family !== allowedFamily) return "rb-hidden";
20620
+ return joinClasses3([
20621
+ baseClass,
20622
+ `rb-heading-decoration-${family}`,
20623
+ `rb-heading-decoration-placement-${placement}`,
20624
+ `rb-heading-decoration-color-${colorToken}`
20625
+ ]);
20626
+ }
20101
20627
  }
20102
20628
  ];
20103
20629
 
20104
20630
  // ../blocks/src/system/transforms/registry/layout.ts
20105
20631
  import { z as z34 } from "zod";
20632
+
20633
+ // ../theme-core/src/siteChromePlacement.ts
20634
+ var HEADER_POSITIONINGS = ["static", "sticky", "fixed"];
20635
+ function parseHeaderPositioning(value) {
20636
+ return isHeaderPositioning(value) ? value : "static";
20637
+ }
20638
+ function isHeaderPositioning(value) {
20639
+ return typeof value === "string" && HEADER_POSITIONINGS.includes(value);
20640
+ }
20641
+ function planSiteChromePlacement(positioning) {
20642
+ switch (positioning) {
20643
+ case "static":
20644
+ return {
20645
+ kind: "static",
20646
+ headerRootClassName: null,
20647
+ standaloneShellClassName: null
20648
+ };
20649
+ case "sticky":
20650
+ return {
20651
+ kind: "sticky",
20652
+ headerRootClassName: "rb-sticky rb-top-0",
20653
+ standaloneShellClassName: "sticky top-0 z-40 w-full"
20654
+ };
20655
+ case "fixed":
20656
+ return {
20657
+ kind: "fixed",
20658
+ headerRootClassName: "rb-fixed rb-top-0 rb-left-0 rb-right-0",
20659
+ standaloneShellClassName: "fixed left-0 right-0 top-0 z-40 w-full"
20660
+ };
20661
+ default:
20662
+ return assertNever(positioning);
20663
+ }
20664
+ }
20665
+
20666
+ // ../blocks/src/system/transforms/registry/layout.ts
20106
20667
  var joinClasses4 = (parts) => parts.filter(
20107
20668
  (part) => typeof part === "string" && part.trim().length > 0
20108
20669
  ).join(" ").replace(/\s+/g, " ").trim();
@@ -20218,7 +20779,8 @@ var headerRootClassTransform = {
20218
20779
  ...options
20219
20780
  };
20220
20781
  const content = asPartialObject(value) ?? {};
20221
- const positioning = typeof content.positioning === "string" ? content.positioning : "static";
20782
+ const positioning = parseHeaderPositioning(content.positioning);
20783
+ const placement = planSiteChromePlacement(positioning);
20222
20784
  const shrinkOnScroll = Boolean(content.shrinkOnScroll);
20223
20785
  const header = asPartialObject(value);
20224
20786
  const visuals = resolveHeaderVisualStyles(header, context.theme);
@@ -20230,14 +20792,14 @@ var headerRootClassTransform = {
20230
20792
  if (config.blur) classes.push(config.blur);
20231
20793
  if (config.blurSupport) classes.push(config.blurSupport);
20232
20794
  }
20233
- if (positioning === "sticky") {
20795
+ if (placement.kind === "sticky") {
20234
20796
  classes.push(
20235
20797
  visuals.isTransparent ? config.stickyTransparent : config.sticky
20236
20798
  );
20237
- } else if (positioning === "fixed") {
20799
+ } else if (placement.kind === "fixed") {
20238
20800
  classes.push(config.fixed);
20239
20801
  }
20240
- if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
20802
+ if (shrinkOnScroll && placement.kind !== "static") {
20241
20803
  classes.push(config.shrink);
20242
20804
  }
20243
20805
  const VALID_VARIANTS = [
@@ -20769,6 +21331,10 @@ function desktopOnlyDisplay(display) {
20769
21331
  return `rb-hidden ${LARGE_DISPLAY_CLASSES[display]}`;
20770
21332
  }
20771
21333
 
21334
+ // ../theme-core/src/siteChromeOverlayClearance.ts
21335
+ var SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
21336
+ var SITE_CHROME_VISIBLE_HEADER_SELECTOR = `[${SITE_CHROME_VISIBLE_HEADER_ATTR}="true"]`;
21337
+
20772
21338
  // ../blocks/src/system/blocks/site-header.ts
20773
21339
  var logoRow = link(
20774
21340
  {
@@ -21041,6 +21607,7 @@ var transparentLayout = inline(
21041
21607
  );
21042
21608
  var floatingLayout = inline(
21043
21609
  {
21610
+ [SITE_CHROME_VISIBLE_HEADER_ATTR]: "true",
21044
21611
  className: bindProp("$root.theme.header.maxWidth", {
21045
21612
  transforms: pipe(
21046
21613
  tx("layout.maxWidthClass", {
@@ -21986,6 +22553,10 @@ var sectionHeading = stack(
21986
22553
  when("content.title"),
21987
22554
  bind("content.title")
21988
22555
  ),
22556
+ headingDecoration({
22557
+ family: "short-center-rule",
22558
+ placement: "under-centered-heading"
22559
+ }),
21989
22560
  richText(
21990
22561
  {
21991
22562
  className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
@@ -24409,7 +24980,7 @@ var COLUMN_CLASSES = {
24409
24980
  };
24410
24981
  function getContainerClass(layout, columns) {
24411
24982
  if (layout === "compact") {
24412
- return "event-listing-compact-container rb-flex rb-flex-col rb-gap-2";
24983
+ return "event-listing-compact-container rb-flex rb-flex-col";
24413
24984
  }
24414
24985
  if (layout === "stack") {
24415
24986
  return "rb-flex rb-flex-col rb-gap-6";
@@ -27237,6 +27808,7 @@ import { z as z53 } from "zod";
27237
27808
  var storedProductCartItemSchema = z53.object({
27238
27809
  kind: z53.literal("product"),
27239
27810
  productId: z53.string().min(1),
27811
+ productCategoryId: z53.string().min(1).optional().nullable(),
27240
27812
  variantId: z53.string().min(1).optional().nullable(),
27241
27813
  title: z53.string().min(1),
27242
27814
  variantTitle: z53.string().optional().nullable(),
@@ -29741,6 +30313,10 @@ var scheduleTileTreatments = [
29741
30313
  "quiet",
29742
30314
  "brand-depth"
29743
30315
  ];
30316
+ var eventListTreatments = [
30317
+ "plain",
30318
+ "lined-panel"
30319
+ ];
29744
30320
  function scheduleDetailsCapable() {
29745
30321
  return declareBlockDesignCapability({
29746
30322
  sectionSurfaces: "supported",
@@ -29749,6 +30325,14 @@ function scheduleDetailsCapable() {
29749
30325
  tileTreatments: scheduleTileTreatments
29750
30326
  });
29751
30327
  }
30328
+ function eventListCapable() {
30329
+ return declareBlockDesignCapability({
30330
+ sectionSurfaces: "supported",
30331
+ contentFrames: ["plain"],
30332
+ itemSurfaces: "unsupported",
30333
+ eventListTreatments
30334
+ });
30335
+ }
29752
30336
  function defaultBoundaryBias(visualWeight) {
29753
30337
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
29754
30338
  }
@@ -29968,7 +30552,8 @@ var systemBlockDefinitionsRaw = [
29968
30552
  flow: bodyFlow,
29969
30553
  layoutProfiles: [
29970
30554
  layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
29971
- layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
30555
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" }),
30556
+ layoutProfile({ variantKey: "question-columns", family: "grid", weight: "standard" })
29972
30557
  ]
29973
30558
  })),
29974
30559
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
@@ -30062,11 +30647,11 @@ var systemBlockDefinitionsRaw = [
30062
30647
  flow: offeringsFlow,
30063
30648
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "centered", weight: "featured" })]
30064
30649
  })),
30065
- withDesignCapability("block.event-listing", eventListingBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30650
+ withDesignCapability("block.event-listing", eventListingBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
30066
30651
  flow: offeringsFlow,
30067
30652
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
30068
30653
  })),
30069
- withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30654
+ withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
30070
30655
  flow: offeringsFlow,
30071
30656
  layoutProfiles: [
30072
30657
  layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
@@ -31138,6 +31723,15 @@ ${root} {
31138
31723
  `;
31139
31724
  }
31140
31725
 
31726
+ // ../theme-core/src/runtime/themeCssVarNames.ts
31727
+ var THEME_RADIUS_CSS_VARS = {
31728
+ block: "--rb-block-radius",
31729
+ button: "--rb-button-radius",
31730
+ input: "--rb-input-radius",
31731
+ legacyCard: "--radius-card",
31732
+ legacyControl: "--radius-control"
31733
+ };
31734
+
31141
31735
  // ../theme-core/src/blocks/vars/customer-portal.ts
31142
31736
  function generateCustomerPortalVars({
31143
31737
  themeId
@@ -31151,6 +31745,11 @@ ${root} {
31151
31745
  --cp-muted: rgb(var(--tb-mutedText));
31152
31746
  --cp-border: rgb(var(--tb-border));
31153
31747
  --cp-shadow: var(--shadow-elev);
31748
+ --cp-primary: rgb(var(--tb-primary));
31749
+ --cp-primary-hover: rgb(var(--tb-primary-700, var(--tb-primary)));
31750
+ --cp-error: rgb(var(--tb-destructive));
31751
+ --cp-card-radius: var(${THEME_RADIUS_CSS_VARS.block}, var(${THEME_RADIUS_CSS_VARS.legacyCard}, 0.75rem));
31752
+ --cp-control-radius: var(${THEME_RADIUS_CSS_VARS.input}, var(${THEME_RADIUS_CSS_VARS.legacyControl}, 0.5rem));
31154
31753
 
31155
31754
  /* Shared tab bar (underline style) */
31156
31755
  --rb-tab-border-width: 1px;
@@ -31201,7 +31800,7 @@ ${root} {
31201
31800
  --rb-modal-bg: var(--cp-card-bg);
31202
31801
  --rb-modal-border: var(--cp-card-border);
31203
31802
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
31204
- --rb-modal-radius: var(--radius-card);
31803
+ --rb-modal-radius: var(--cp-card-radius);
31205
31804
  --rb-modal-max-width: 560px;
31206
31805
 
31207
31806
  /* Header */
@@ -32582,6 +33181,9 @@ import { jsx as jsx5 } from "react/jsx-runtime";
32582
33181
  import * as React from "react";
32583
33182
  import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
32584
33183
 
33184
+ // ../theme-core/src/fonts/uploadFormat.ts
33185
+ var MAX_FONT_UPLOAD_BYTES = 5 * 1024 * 1024;
33186
+
32585
33187
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
32586
33188
  import { z as z60 } from "zod";
32587
33189
  var themeBridgeConfigSchema = z60.object({
@@ -33028,6 +33630,7 @@ var COURSE_ENROLLMENT_REFUND_FAILED_CODES = [
33028
33630
  ];
33029
33631
 
33030
33632
  // ../api/src/bookingVerticals.ts
33633
+ import { z as z63 } from "zod";
33031
33634
  var VERTICAL_IDS = [
33032
33635
  "yoga_wellness",
33033
33636
  "fitness_pt",
@@ -33106,6 +33709,132 @@ var VERTICAL_ID_SET = new Set(VERTICAL_IDS);
33106
33709
  var VERTICAL_PRESET_ID_SET = new Set(
33107
33710
  VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id)
33108
33711
  );
33712
+ function parseVerticalId(value) {
33713
+ return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
33714
+ }
33715
+ function parseVerticalPresetId(value) {
33716
+ return typeof value === "string" && VERTICAL_PRESET_ID_SET.has(value) ? value : null;
33717
+ }
33718
+ function getVerticalPresetDefinition(presetId) {
33719
+ const definition = VERTICAL_BOOKING_PRESETS.find((presetDefinition) => presetDefinition.id === presetId);
33720
+ if (!definition) {
33721
+ throw new Error(`Unhandled vertical preset id: ${presetId}`);
33722
+ }
33723
+ return definition;
33724
+ }
33725
+ function toNonEmptyVerticalPresetIds(presetIds) {
33726
+ const firstPresetId = presetIds[0];
33727
+ return firstPresetId ? [firstPresetId, ...presetIds.slice(1)] : null;
33728
+ }
33729
+ function createConfiguredSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33730
+ return {
33731
+ verticalId,
33732
+ selectedPresetIds
33733
+ };
33734
+ }
33735
+ function createSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33736
+ const nonEmptyPresetIds = toNonEmptyVerticalPresetIds(selectedPresetIds);
33737
+ return nonEmptyPresetIds ? createConfiguredSiteVerticalBookingConfig(verticalId, nonEmptyPresetIds) : null;
33738
+ }
33739
+ function resolveSiteVerticalBookingConfig(rawConfig) {
33740
+ if (!rawConfig) {
33741
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33742
+ }
33743
+ const verticalId = parseVerticalId(rawConfig.verticalId);
33744
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33745
+ const selectedPresetIds = rawPresetIds.map(parseVerticalPresetId).filter((presetId) => Boolean(presetId));
33746
+ const config = {
33747
+ verticalId,
33748
+ selectedPresetIds
33749
+ };
33750
+ if (!verticalId && selectedPresetIds.length === 0) {
33751
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33752
+ }
33753
+ const issues = getSiteVerticalConfigIssues(rawConfig, config);
33754
+ if (issues.length > 0) {
33755
+ return { kind: "invalid", config, issues };
33756
+ }
33757
+ const configuredConfig = verticalId ? createSiteVerticalBookingConfig(verticalId, selectedPresetIds) : null;
33758
+ if (!configuredConfig) {
33759
+ return { kind: "invalid", config, issues: ["empty_selected_presets"] };
33760
+ }
33761
+ return {
33762
+ kind: "configured",
33763
+ config: configuredConfig,
33764
+ selectedPresets: configuredConfig.selectedPresetIds.map(getVerticalPresetDefinition)
33765
+ };
33766
+ }
33767
+ function getSiteVerticalConfigIssues(rawConfig, config) {
33768
+ const issues = /* @__PURE__ */ new Set();
33769
+ if (rawConfig.verticalId != null && !config.verticalId) {
33770
+ issues.add("unknown_vertical");
33771
+ }
33772
+ if (!config.verticalId && config.selectedPresetIds.length > 0) {
33773
+ issues.add("missing_vertical");
33774
+ }
33775
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33776
+ if (rawPresetIds.some((presetId) => parseVerticalPresetId(presetId) === null)) {
33777
+ issues.add("unknown_preset");
33778
+ }
33779
+ if (config.verticalId && config.selectedPresetIds.length === 0) {
33780
+ issues.add("empty_selected_presets");
33781
+ }
33782
+ const seenBehaviours = /* @__PURE__ */ new Set();
33783
+ for (const presetId of config.selectedPresetIds) {
33784
+ const presetDefinition = getVerticalPresetDefinition(presetId);
33785
+ if (config.verticalId && presetDefinition.verticalId !== config.verticalId) {
33786
+ issues.add("preset_vertical_mismatch");
33787
+ }
33788
+ if (presetDefinition.availability === "future") {
33789
+ issues.add("future_preset_selected");
33790
+ }
33791
+ if (seenBehaviours.has(presetDefinition.canonicalBehaviour)) {
33792
+ issues.add("duplicate_canonical_behaviour");
33793
+ }
33794
+ seenBehaviours.add(presetDefinition.canonicalBehaviour);
33795
+ }
33796
+ return [...issues];
33797
+ }
33798
+ var VerticalIdSchema = z63.string().trim().transform((value, ctx) => {
33799
+ const parsed = parseVerticalId(value);
33800
+ if (!parsed) {
33801
+ ctx.addIssue({
33802
+ code: z63.ZodIssueCode.custom,
33803
+ message: "Unknown booking vertical"
33804
+ });
33805
+ return z63.NEVER;
33806
+ }
33807
+ return parsed;
33808
+ });
33809
+ var VerticalPresetIdSchema = z63.string().trim().transform((value, ctx) => {
33810
+ const parsed = parseVerticalPresetId(value);
33811
+ if (!parsed) {
33812
+ ctx.addIssue({
33813
+ code: z63.ZodIssueCode.custom,
33814
+ message: "Unknown booking preset"
33815
+ });
33816
+ return z63.NEVER;
33817
+ }
33818
+ return parsed;
33819
+ });
33820
+ var BookingVerticalConfigSchema = z63.object({
33821
+ verticalId: VerticalIdSchema.nullable(),
33822
+ selectedPresetIds: z63.array(VerticalPresetIdSchema).max(20)
33823
+ }).transform((value, ctx) => {
33824
+ const resolved = resolveSiteVerticalBookingConfig(value);
33825
+ if (resolved.kind === "invalid") {
33826
+ ctx.addIssue({
33827
+ code: z63.ZodIssueCode.custom,
33828
+ message: `Invalid booking vertical config: ${resolved.issues.join(", ")}`
33829
+ });
33830
+ return z63.NEVER;
33831
+ }
33832
+ return resolved.config;
33833
+ });
33834
+ var DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
33835
+ verticalId: null,
33836
+ selectedPresetIds: []
33837
+ };
33109
33838
  function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
33110
33839
  return {
33111
33840
  id,
@@ -33125,51 +33854,51 @@ function isRecord3(value) {
33125
33854
  }
33126
33855
 
33127
33856
  // ../api/src/appointmentSetup.ts
33128
- import { z as z63 } from "zod";
33857
+ import { z as z64 } from "zod";
33129
33858
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
33130
- var appointmentSetupRefSchema = z63.discriminatedUnion("kind", [
33131
- z63.object({ kind: z63.literal("existing"), id: z63.string().min(1) }),
33132
- z63.object({ kind: z63.literal("new"), draftId: z63.string().min(1) })
33859
+ var appointmentSetupRefSchema = z64.discriminatedUnion("kind", [
33860
+ z64.object({ kind: z64.literal("existing"), id: z64.string().min(1) }),
33861
+ z64.object({ kind: z64.literal("new"), draftId: z64.string().min(1) })
33133
33862
  ]);
33134
- var appointmentSetupVenueChoiceSchema = z63.discriminatedUnion("kind", [
33135
- z63.object({ kind: z63.literal("none") }),
33136
- z63.object({ kind: z63.literal("existing"), venueId: z63.string().min(1) }),
33137
- z63.object({
33138
- kind: z63.literal("create"),
33139
- draftId: z63.string().min(1),
33140
- title: z63.string().trim().min(1),
33141
- description: z63.string().nullable(),
33142
- timezone: z63.string().trim().min(1).nullable(),
33143
- addressJson: z63.record(z63.string(), z63.unknown()),
33144
- locationJson: z63.object({ lat: z63.number(), lng: z63.number() }).nullable()
33863
+ var appointmentSetupVenueChoiceSchema = z64.discriminatedUnion("kind", [
33864
+ z64.object({ kind: z64.literal("none") }),
33865
+ z64.object({ kind: z64.literal("existing"), venueId: z64.string().min(1) }),
33866
+ z64.object({
33867
+ kind: z64.literal("create"),
33868
+ draftId: z64.string().min(1),
33869
+ title: z64.string().trim().min(1),
33870
+ description: z64.string().nullable(),
33871
+ timezone: z64.string().trim().min(1).nullable(),
33872
+ addressJson: z64.record(z64.string(), z64.unknown()),
33873
+ locationJson: z64.object({ lat: z64.number(), lng: z64.number() }).nullable()
33145
33874
  })
33146
33875
  ]);
33147
- var appointmentSetupPaymentDraftSchema = z63.object({
33148
- priceType: z63.union([z63.literal("free"), z63.literal("paid")])
33149
- });
33150
- var appointmentSetupServiceAssignmentDraftSchema = z63.discriminatedUnion("kind", [
33151
- z63.object({ kind: z63.literal("all_practitioners") }),
33152
- z63.object({
33153
- kind: z63.literal("selected_practitioners"),
33154
- resourceRefs: z63.array(appointmentSetupRefSchema)
33876
+ var appointmentSetupPaymentDraftSchema = z64.object({
33877
+ priceType: z64.union([z64.literal("free"), z64.literal("paid")])
33878
+ });
33879
+ var appointmentSetupServiceAssignmentDraftSchema = z64.discriminatedUnion("kind", [
33880
+ z64.object({ kind: z64.literal("all_practitioners") }),
33881
+ z64.object({
33882
+ kind: z64.literal("selected_practitioners"),
33883
+ resourceRefs: z64.array(appointmentSetupRefSchema)
33155
33884
  })
33156
33885
  ]);
33157
- var appointmentSetupServiceDraftSchema = z63.object({
33886
+ var appointmentSetupServiceDraftSchema = z64.object({
33158
33887
  ref: appointmentSetupRefSchema,
33159
- title: z63.string().trim().min(1),
33160
- description: z63.string().nullable(),
33161
- durationMinutes: z63.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
33162
- prepMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33163
- cleanupMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33164
- priceAmount: z63.number().int().nonnegative().nullable(),
33165
- isActive: z63.boolean(),
33166
- locationType: z63.union([
33167
- z63.literal("virtual"),
33168
- z63.literal("in_person"),
33169
- z63.literal("hybrid")
33888
+ title: z64.string().trim().min(1),
33889
+ description: z64.string().nullable(),
33890
+ durationMinutes: z64.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
33891
+ prepMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33892
+ cleanupMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33893
+ priceAmount: z64.number().int().nonnegative().nullable(),
33894
+ isActive: z64.boolean(),
33895
+ locationType: z64.union([
33896
+ z64.literal("virtual"),
33897
+ z64.literal("in_person"),
33898
+ z64.literal("hybrid")
33170
33899
  ]),
33171
33900
  venue: appointmentSetupVenueChoiceSchema,
33172
- timezone: z63.string().trim().min(1).nullable(),
33901
+ timezone: z64.string().trim().min(1).nullable(),
33173
33902
  payment: appointmentSetupPaymentDraftSchema,
33174
33903
  assignment: appointmentSetupServiceAssignmentDraftSchema
33175
33904
  }).superRefine((service, ctx) => {
@@ -33188,49 +33917,49 @@ var appointmentSetupServiceDraftSchema = z63.object({
33188
33917
  });
33189
33918
  }
33190
33919
  });
33191
- var appointmentSetupPractitionerDraftSchema = z63.object({
33920
+ var appointmentSetupPractitionerDraftSchema = z64.object({
33192
33921
  ref: appointmentSetupRefSchema,
33193
- displayName: z63.string().trim().min(1),
33194
- bio: z63.string().nullable(),
33195
- timezone: z63.string().trim().min(1),
33196
- colorHex: z63.string().nullable()
33197
- });
33198
- var appointmentSetupWeeklyWindowDraftSchema = z63.object({
33199
- weekday: z63.number().int().min(0).max(6),
33200
- startTime: z63.string(),
33201
- endTime: z63.string()
33202
- });
33203
- var appointmentSetupStartTimePolicyDraftSchema = z63.discriminatedUnion("kind", [
33204
- z63.object({ kind: z63.literal("automatic_spacing") }),
33205
- z63.object({
33206
- kind: z63.literal("regular_interval"),
33207
- intervalMinutes: z63.union([
33208
- z63.literal(10),
33209
- z63.literal(15),
33210
- z63.literal(20),
33211
- z63.literal(30),
33212
- z63.literal(45),
33213
- z63.literal(60)
33922
+ displayName: z64.string().trim().min(1),
33923
+ bio: z64.string().nullable(),
33924
+ timezone: z64.string().trim().min(1),
33925
+ colorHex: z64.string().nullable()
33926
+ });
33927
+ var appointmentSetupWeeklyWindowDraftSchema = z64.object({
33928
+ weekday: z64.number().int().min(0).max(6),
33929
+ startTime: z64.string(),
33930
+ endTime: z64.string()
33931
+ });
33932
+ var appointmentSetupStartTimePolicyDraftSchema = z64.discriminatedUnion("kind", [
33933
+ z64.object({ kind: z64.literal("automatic_spacing") }),
33934
+ z64.object({
33935
+ kind: z64.literal("regular_interval"),
33936
+ intervalMinutes: z64.union([
33937
+ z64.literal(10),
33938
+ z64.literal(15),
33939
+ z64.literal(20),
33940
+ z64.literal(30),
33941
+ z64.literal(45),
33942
+ z64.literal(60)
33214
33943
  ])
33215
33944
  })
33216
33945
  ]);
33217
- var appointmentSetupAvailabilityDraftSchema = z63.object({
33218
- kind: z63.literal("weekly_windows"),
33946
+ var appointmentSetupAvailabilityDraftSchema = z64.object({
33947
+ kind: z64.literal("weekly_windows"),
33219
33948
  resourceRef: appointmentSetupRefSchema,
33220
33949
  serviceRef: appointmentSetupRefSchema.nullable(),
33221
- windows: z63.array(appointmentSetupWeeklyWindowDraftSchema),
33950
+ windows: z64.array(appointmentSetupWeeklyWindowDraftSchema),
33222
33951
  startTimePolicy: appointmentSetupStartTimePolicyDraftSchema.optional()
33223
33952
  });
33224
33953
  var APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX = 28 * 24 * 60;
33225
33954
  var APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX = 10 * 365 * 24 * 60;
33226
- var appointmentSetupBookingNoticeSchema = z63.object({
33227
- minLeadMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
33228
- maxBookingNoticeMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
33229
- });
33230
- var applyAppointmentSetupRequestSchema = z63.object({
33231
- services: z63.array(appointmentSetupServiceDraftSchema),
33232
- practitioners: z63.array(appointmentSetupPractitionerDraftSchema),
33233
- availability: z63.array(appointmentSetupAvailabilityDraftSchema),
33955
+ var appointmentSetupBookingNoticeSchema = z64.object({
33956
+ minLeadMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
33957
+ maxBookingNoticeMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
33958
+ });
33959
+ var applyAppointmentSetupRequestSchema = z64.object({
33960
+ services: z64.array(appointmentSetupServiceDraftSchema),
33961
+ practitioners: z64.array(appointmentSetupPractitionerDraftSchema),
33962
+ availability: z64.array(appointmentSetupAvailabilityDraftSchema),
33234
33963
  bookingNotice: appointmentSetupBookingNoticeSchema
33235
33964
  });
33236
33965
 
@@ -33263,24 +33992,24 @@ var STAFF_CANCELLATION_CONTEXT_CATEGORIES = [
33263
33992
  ];
33264
33993
 
33265
33994
  // ../api/src/siteBanner.ts
33266
- import { z as z64 } from "zod";
33995
+ import { z as z65 } from "zod";
33267
33996
  var SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
33268
33997
  var SITE_BANNER_TONE_VALUES = ["announcement", "promotion", "notice", "warning"];
33269
33998
  var SITE_BANNER_MAX_TEXT_LENGTH = 320;
33270
33999
  var SITE_BANNER_MAX_PARAGRAPHS = 2;
33271
- var siteBannerScopeSchema = z64.enum(SITE_BANNER_SCOPE_VALUES);
33272
- var siteBannerToneSchema = z64.enum(SITE_BANNER_TONE_VALUES);
33273
- var siteBannerBodySchema = z64.unknown().transform(unwrapRichTextValue);
33274
- var siteBannerCtaSchema = z64.object({
33275
- label: z64.string().trim().min(1),
34000
+ var siteBannerScopeSchema = z65.enum(SITE_BANNER_SCOPE_VALUES);
34001
+ var siteBannerToneSchema = z65.enum(SITE_BANNER_TONE_VALUES);
34002
+ var siteBannerBodySchema = z65.unknown().transform(unwrapRichTextValue);
34003
+ var siteBannerCtaSchema = z65.object({
34004
+ label: z65.string().trim().min(1),
33276
34005
  link: linkPayloadSchema
33277
34006
  });
33278
- var siteBannerSettingsSchema = z64.discriminatedUnion("enabled", [
33279
- z64.object({
33280
- enabled: z64.literal(false)
34007
+ var siteBannerSettingsSchema = z65.discriminatedUnion("enabled", [
34008
+ z65.object({
34009
+ enabled: z65.literal(false)
33281
34010
  }),
33282
- z64.object({
33283
- enabled: z64.literal(true),
34011
+ z65.object({
34012
+ enabled: z65.literal(true),
33284
34013
  scope: siteBannerScopeSchema,
33285
34014
  tone: siteBannerToneSchema,
33286
34015
  body: siteBannerBodySchema,
@@ -33294,7 +34023,7 @@ var siteBannerSettingsInputSchema = siteBannerSettingsSchema.superRefine((value,
33294
34023
  const analysis = analyzeSiteBannerBody(value.body);
33295
34024
  for (const issue of analysis.issues) {
33296
34025
  ctx.addIssue({
33297
- code: z64.ZodIssueCode.custom,
34026
+ code: z65.ZodIssueCode.custom,
33298
34027
  path: ["body"],
33299
34028
  message: siteBannerBodyIssueMessage(issue)
33300
34029
  });
@@ -33562,76 +34291,109 @@ function isNavigationMenuValidationItem(value) {
33562
34291
  return typeof value.label === "string";
33563
34292
  }
33564
34293
 
34294
+ // ../api/src/navigation/dashboardSiteNav.ts
34295
+ var hiddenDemoSiteNavSurfaceIds = [
34296
+ "site.newsletter"
34297
+ ];
34298
+ var hiddenDemoSiteNavIds = new Set(
34299
+ hiddenDemoSiteNavSurfaceIds
34300
+ );
34301
+ var websiteSurfaceIds = [
34302
+ "site.content",
34303
+ "site.footerBlocks",
34304
+ "site.navigation",
34305
+ "site.media",
34306
+ "site.style",
34307
+ "site.performance"
34308
+ ];
34309
+ var websiteSurfaceIdSet = new Set(
34310
+ websiteSurfaceIds
34311
+ );
34312
+
34313
+ // ../api/src/navigation/dashboardSettingsNav.ts
34314
+ var hiddenDemoSettingsNavSurfaceIds = [
34315
+ "settings.features",
34316
+ "settings.domains",
34317
+ "settings.bookings",
34318
+ "settings.emails",
34319
+ "settings.team",
34320
+ "settings.billing",
34321
+ "settings.developer",
34322
+ "settings.apiKeys",
34323
+ "settings.backup"
34324
+ ];
34325
+ var hiddenDemoSettingsNavIds = new Set(hiddenDemoSettingsNavSurfaceIds);
34326
+
33565
34327
  // ../api/src/aiPlayground.ts
33566
- import { z as z65 } from "zod";
33567
- var Rfc6902PatchOp = z65.discriminatedUnion("op", [
34328
+ import { z as z66 } from "zod";
34329
+ var Rfc6902PatchOp = z66.discriminatedUnion("op", [
33568
34330
  // Standard RFC-6902 operations
33569
- z65.object({
33570
- op: z65.literal("add"),
33571
- path: z65.string(),
33572
- value: z65.unknown()
34331
+ z66.object({
34332
+ op: z66.literal("add"),
34333
+ path: z66.string(),
34334
+ value: z66.unknown()
33573
34335
  }),
33574
- z65.object({
33575
- op: z65.literal("remove"),
33576
- path: z65.string()
34336
+ z66.object({
34337
+ op: z66.literal("remove"),
34338
+ path: z66.string()
33577
34339
  }),
33578
- z65.object({
33579
- op: z65.literal("replace"),
33580
- path: z65.string(),
33581
- value: z65.unknown()
34340
+ z66.object({
34341
+ op: z66.literal("replace"),
34342
+ path: z66.string(),
34343
+ value: z66.unknown()
33582
34344
  }),
33583
- z65.object({
33584
- op: z65.literal("move"),
33585
- from: z65.string(),
33586
- path: z65.string()
34345
+ z66.object({
34346
+ op: z66.literal("move"),
34347
+ from: z66.string(),
34348
+ path: z66.string()
33587
34349
  }),
33588
- z65.object({
33589
- op: z65.literal("copy"),
33590
- from: z65.string(),
33591
- path: z65.string()
34350
+ z66.object({
34351
+ op: z66.literal("copy"),
34352
+ from: z66.string(),
34353
+ path: z66.string()
33592
34354
  }),
33593
34355
  // Block-level operations (Phase 2)
33594
- z65.object({
33595
- op: z65.literal("add_block"),
33596
- blockKind: z65.string(),
33597
- afterBlockId: z65.string().nullable(),
33598
- content: z65.record(z65.string(), z65.unknown()),
33599
- rationale: z65.string()
34356
+ z66.object({
34357
+ op: z66.literal("add_block"),
34358
+ blockKind: z66.string(),
34359
+ afterBlockId: z66.string().nullable(),
34360
+ content: z66.record(z66.string(), z66.unknown()),
34361
+ rationale: z66.string()
33600
34362
  }),
33601
- z65.object({
33602
- op: z65.literal("delete_block"),
33603
- blockId: z65.string(),
33604
- rationale: z65.string()
34363
+ z66.object({
34364
+ op: z66.literal("delete_block"),
34365
+ blockId: z66.string(),
34366
+ rationale: z66.string()
33605
34367
  }),
33606
- z65.object({
33607
- op: z65.literal("reorder_block"),
33608
- blockId: z65.string(),
33609
- afterBlockId: z65.string().nullable(),
33610
- rationale: z65.string()
34368
+ z66.object({
34369
+ op: z66.literal("reorder_block"),
34370
+ blockId: z66.string(),
34371
+ afterBlockId: z66.string().nullable(),
34372
+ rationale: z66.string()
33611
34373
  })
33612
34374
  ]);
33613
- var PlaygroundProposeRequest = z65.object({
33614
- request: z65.string().min(1).max(2e3)
34375
+ var PlaygroundProposeRequest = z66.object({
34376
+ request: z66.string().min(1).max(2e3)
33615
34377
  });
33616
- var MultiPagePatchEnvelope = z65.object({
33617
- pageId: z65.string(),
33618
- blockId: z65.string().optional(),
34378
+ var MultiPagePatchEnvelope = z66.object({
34379
+ pageId: z66.string(),
34380
+ blockId: z66.string().optional(),
33619
34381
  // Not present for page-level ops
33620
- blockKind: z65.string().optional(),
33621
- blockPurpose: z65.string().optional().nullable(),
33622
- ops: z65.array(Rfc6902PatchOp),
33623
- rationale: z65.string(),
33624
- currentContent: z65.record(z65.string(), z65.unknown()).optional()
34382
+ blockKind: z66.string().optional(),
34383
+ blockPurpose: z66.string().optional().nullable(),
34384
+ ops: z66.array(Rfc6902PatchOp),
34385
+ rationale: z66.string(),
34386
+ currentContent: z66.record(z66.string(), z66.unknown()).optional()
33625
34387
  });
33626
- var MultiPageUpdateResponse = z65.object({
33627
- patches: z65.array(MultiPagePatchEnvelope),
33628
- assistantMessage: z65.string(),
33629
- pagesModified: z65.number(),
33630
- toolCallsUsed: z65.number()
34388
+ var MultiPageUpdateResponse = z66.object({
34389
+ patches: z66.array(MultiPagePatchEnvelope),
34390
+ assistantMessage: z66.string(),
34391
+ pagesModified: z66.number(),
34392
+ toolCallsUsed: z66.number()
33631
34393
  });
33632
34394
 
33633
34395
  // src/config/content-validation.ts
33634
- import { z as z66 } from "zod";
34396
+ import { z as z67 } from "zod";
33635
34397
 
33636
34398
  // src/types/block-kinds.ts
33637
34399
  var SYSTEM_BLOCK_KINDS = [
@@ -33773,32 +34535,32 @@ function describeInvalidBindingTransform(transform) {
33773
34535
  }
33774
34536
 
33775
34537
  // src/config/content-validation.ts
33776
- var jsonDataSchema = z66.record(z66.string(), z66.any());
33777
- var contentTypeKeySchema = z66.string().min(1).regex(
34538
+ var jsonDataSchema = z67.record(z67.string(), z67.any());
34539
+ var contentTypeKeySchema = z67.string().min(1).regex(
33778
34540
  /^[a-z][a-z0-9-]*$/,
33779
34541
  "Key must be lowercase, start with a letter, and contain only letters, numbers, and hyphens"
33780
34542
  );
33781
- var templateConfigSchemaForward = z66.object({
33782
- blocks: z66.array(
33783
- z66.object({
33784
- identifier: z66.string().min(1),
33785
- kind: z66.string(),
33786
- scope: z66.enum(["entry", "template"]),
33787
- bindings: z66.record(z66.string(), z66.any()).optional(),
33788
- content: z66.record(z66.string(), z66.any()).optional()
34543
+ var templateConfigSchemaForward = z67.object({
34544
+ blocks: z67.array(
34545
+ z67.object({
34546
+ identifier: z67.string().min(1),
34547
+ kind: z67.string(),
34548
+ scope: z67.enum(["entry", "template"]),
34549
+ bindings: z67.record(z67.string(), z67.any()).optional(),
34550
+ content: z67.record(z67.string(), z67.any()).optional()
33789
34551
  })
33790
34552
  )
33791
34553
  }).optional();
33792
- var contentTypeConfigSchema = z66.object({
34554
+ var contentTypeConfigSchema = z67.object({
33793
34555
  key: contentTypeKeySchema,
33794
- name: z66.string().min(1),
33795
- description: z66.string().optional(),
33796
- hasPages: z66.boolean(),
33797
- routePattern: z66.string().optional(),
34556
+ name: z67.string().min(1),
34557
+ description: z67.string().optional(),
34558
+ hasPages: z67.boolean(),
34559
+ routePattern: z67.string().optional(),
33798
34560
  // Fields are validated as unknown[] here - deep field validation happens in @riverbankcms/blocks
33799
- fields: z66.array(z66.any()).min(1, "At least one field is required"),
33800
- titleField: z66.string().optional(),
33801
- isSingleton: z66.boolean().optional().default(false),
34561
+ fields: z67.array(z67.any()).min(1, "At least one field is required"),
34562
+ titleField: z67.string().optional(),
34563
+ isSingleton: z67.boolean().optional().default(false),
33802
34564
  template: templateConfigSchemaForward
33803
34565
  }).refine(
33804
34566
  (data) => {
@@ -33820,7 +34582,7 @@ var contentTypeConfigSchema = z66.object({
33820
34582
  }
33821
34583
  if (!data.routePattern) {
33822
34584
  ctx.addIssue({
33823
- code: z66.ZodIssueCode.custom,
34585
+ code: z67.ZodIssueCode.custom,
33824
34586
  path: ["routePattern"],
33825
34587
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33826
34588
  });
@@ -33829,7 +34591,7 @@ var contentTypeConfigSchema = z66.object({
33829
34591
  const parseResult = safeParseRouteTemplate(data.routePattern);
33830
34592
  if (!parseResult.success) {
33831
34593
  ctx.addIssue({
33832
- code: z66.ZodIssueCode.custom,
34594
+ code: z67.ZodIssueCode.custom,
33833
34595
  path: ["routePattern"],
33834
34596
  message: describeRouteTemplateParseError(parseResult.error)
33835
34597
  });
@@ -33837,44 +34599,44 @@ var contentTypeConfigSchema = z66.object({
33837
34599
  }
33838
34600
  if (!data.isSingleton && parseResult.routeTemplate.kind !== "slug-template") {
33839
34601
  ctx.addIssue({
33840
- code: z66.ZodIssueCode.custom,
34602
+ code: z67.ZodIssueCode.custom,
33841
34603
  path: ["routePattern"],
33842
34604
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33843
34605
  });
33844
34606
  }
33845
34607
  });
33846
- var fieldBindingSchema = z66.object({
33847
- source: z66.literal("field"),
33848
- path: z66.string().min(1, "Field path is required")
34608
+ var fieldBindingSchema = z67.object({
34609
+ source: z67.literal("field"),
34610
+ path: z67.string().min(1, "Field path is required")
33849
34611
  });
33850
- var metaBindingSchema = z66.object({
33851
- source: z66.literal("meta"),
33852
- path: z66.enum(TEMPLATE_BINDING_META_PATHS, {
34612
+ var metaBindingSchema = z67.object({
34613
+ source: z67.literal("meta"),
34614
+ path: z67.enum(TEMPLATE_BINDING_META_PATHS, {
33853
34615
  error: (issue) => describeInvalidTemplateBindingMetaPath(String(issue.input))
33854
34616
  })
33855
34617
  });
33856
- var literalBindingSchema = z66.object({
33857
- source: z66.literal("literal"),
33858
- value: z66.unknown()
34618
+ var literalBindingSchema = z67.object({
34619
+ source: z67.literal("literal"),
34620
+ value: z67.unknown()
33859
34621
  });
33860
- var transformBindingSchema = z66.object({
33861
- source: z66.literal("transform"),
33862
- path: z66.string().min(1, "Transform path is required"),
33863
- transform: z66.enum(BINDING_TRANSFORM_VALUES, {
34622
+ var transformBindingSchema = z67.object({
34623
+ source: z67.literal("transform"),
34624
+ path: z67.string().min(1, "Transform path is required"),
34625
+ transform: z67.enum(BINDING_TRANSFORM_VALUES, {
33864
34626
  error: (issue) => describeInvalidBindingTransform(String(issue.input))
33865
34627
  })
33866
34628
  });
33867
- var baseBindingSchema = z66.discriminatedUnion("source", [
34629
+ var baseBindingSchema = z67.discriminatedUnion("source", [
33868
34630
  fieldBindingSchema,
33869
34631
  metaBindingSchema,
33870
34632
  literalBindingSchema,
33871
34633
  transformBindingSchema
33872
34634
  ]);
33873
- var fallbackBindingSchema = z66.object({
33874
- source: z66.literal("fallback"),
33875
- sources: z66.array(z66.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
34635
+ var fallbackBindingSchema = z67.object({
34636
+ source: z67.literal("fallback"),
34637
+ sources: z67.array(z67.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
33876
34638
  });
33877
- var bindingSourceSchema = z66.union([
34639
+ var bindingSourceSchema = z67.union([
33878
34640
  baseBindingSchema,
33879
34641
  fallbackBindingSchema
33880
34642
  ]);
@@ -33888,12 +34650,12 @@ function isValidBlockKind(kind) {
33888
34650
  return false;
33889
34651
  }
33890
34652
  var BLOCK_KIND_ERROR_MESSAGE = 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.myBlock")';
33891
- var blockKindSchema = z66.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
33892
- var templateBlockConfigSchema = z66.object({
33893
- identifier: z66.string().min(1, "Block identifier is required"),
34653
+ var blockKindSchema = z67.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
34654
+ var templateBlockConfigSchema = z67.object({
34655
+ identifier: z67.string().min(1, "Block identifier is required"),
33894
34656
  kind: blockKindSchema,
33895
- scope: z66.enum(["entry", "template"]),
33896
- bindings: z66.record(z66.string(), bindingSourceSchema).optional(),
34657
+ scope: z67.enum(["entry", "template"]),
34658
+ bindings: z67.record(z67.string(), bindingSourceSchema).optional(),
33897
34659
  content: jsonDataSchema.optional()
33898
34660
  }).refine(
33899
34661
  (data) => {
@@ -33912,8 +34674,8 @@ var templateBlockConfigSchema = z66.object({
33912
34674
  },
33913
34675
  { message: "Template-scoped blocks should define static content, not bindings" }
33914
34676
  );
33915
- var templateConfigSchema = z66.object({
33916
- blocks: z66.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
34677
+ var templateConfigSchema = z67.object({
34678
+ blocks: z67.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
33917
34679
  }).refine(
33918
34680
  (data) => {
33919
34681
  const identifiers = data.blocks.map((b) => b.identifier);
@@ -33922,77 +34684,77 @@ var templateConfigSchema = z66.object({
33922
34684
  },
33923
34685
  { message: "Template block identifiers must be unique" }
33924
34686
  );
33925
- var blockConfigSchema = z66.object({
34687
+ var blockConfigSchema = z67.object({
33926
34688
  kind: blockKindSchema,
33927
34689
  content: jsonDataSchema,
33928
- orderIndex: z66.number().optional()
33929
- });
33930
- var pageConfigSchema = z66.object({
33931
- identifier: z66.string().min(1, "Identifier is required"),
33932
- title: z66.string().min(1, "Title is required"),
33933
- path: z66.string().regex(/^\//, "Path must start with /"),
33934
- purpose: z66.string().default("content"),
33935
- blocks: z66.array(blockConfigSchema).optional(),
33936
- status: z66.enum(["draft", "published"]).default("draft"),
33937
- metaTitle: z66.string().optional(),
33938
- metaDescription: z66.string().optional()
33939
- });
33940
- var entryConfigSchema = z66.object({
33941
- identifier: z66.string().min(1, "Identifier is required"),
33942
- contentType: z66.string().min(1, "Content type is required"),
34690
+ orderIndex: z67.number().optional()
34691
+ });
34692
+ var pageConfigSchema = z67.object({
34693
+ identifier: z67.string().min(1, "Identifier is required"),
34694
+ title: z67.string().min(1, "Title is required"),
34695
+ path: z67.string().regex(/^\//, "Path must start with /"),
34696
+ purpose: z67.string().default("content"),
34697
+ blocks: z67.array(blockConfigSchema).optional(),
34698
+ status: z67.enum(["draft", "published"]).default("draft"),
34699
+ metaTitle: z67.string().optional(),
34700
+ metaDescription: z67.string().optional()
34701
+ });
34702
+ var entryConfigSchema = z67.object({
34703
+ identifier: z67.string().min(1, "Identifier is required"),
34704
+ contentType: z67.string().min(1, "Content type is required"),
33943
34705
  data: jsonDataSchema,
33944
- status: z66.enum(["draft", "published"]).default("draft"),
33945
- slug: z66.string().optional(),
33946
- summary: z66.string().optional(),
34706
+ status: z67.enum(["draft", "published"]).default("draft"),
34707
+ slug: z67.string().optional(),
34708
+ summary: z67.string().optional(),
33947
34709
  // Hard remove legacy config-only titles: titles must live in entry `data`.
33948
- title: z66.any().optional().refine((value) => value === void 0, {
34710
+ title: z67.any().optional().refine((value) => value === void 0, {
33949
34711
  message: "Entry titles are now derived from entry data. Remove `title` and move it into `data` (e.g. `data.title`, or your configured `titleField`). Run `riverbankcms migrate entries` for guided migration."
33950
34712
  }),
33951
- metaTitle: z66.string().optional(),
33952
- metaDescription: z66.string().optional()
34713
+ metaTitle: z67.string().optional(),
34714
+ metaDescription: z67.string().optional()
33953
34715
  });
33954
- var dropdownLinkSchema = z66.object({
33955
- kind: z66.literal("dropdown")
34716
+ var dropdownLinkSchema = z67.object({
34717
+ kind: z67.literal("dropdown")
33956
34718
  });
33957
- var navigationLinkSchema = z66.discriminatedUnion("kind", [
34719
+ var navigationLinkSchema = z67.discriminatedUnion("kind", [
33958
34720
  ...navigationLinkInputSchemaOptions,
33959
34721
  dropdownLinkSchema
33960
34722
  ]);
33961
- var baseNavigationItemSchema = z66.object({
33962
- label: z66.string().min(1, "Label is required"),
34723
+ var baseNavigationItemSchema = z67.object({
34724
+ label: z67.string().min(1, "Label is required"),
33963
34725
  link: navigationLinkSchema,
33964
- isCta: z66.boolean().optional()
34726
+ isCta: z67.boolean().optional()
33965
34727
  });
33966
34728
  var navigationItemConfigSchema = baseNavigationItemSchema.extend({
33967
- children: z66.lazy(() => z66.array(navigationItemConfigSchema)).optional()
33968
- });
33969
- var navigationMenuConfigSchema = z66.object({
33970
- identifier: z66.string().min(1, "Identifier is required"),
33971
- name: z66.string().min(1, "Name is required"),
33972
- isPrimary: z66.boolean().optional(),
33973
- isFooter: z66.boolean().optional(),
33974
- items: z66.array(navigationItemConfigSchema)
34729
+ children: z67.lazy(() => z67.array(navigationItemConfigSchema)).optional()
34730
+ });
34731
+ var navigationMenuConfigSchema = z67.object({
34732
+ identifier: z67.string().min(1, "Identifier is required"),
34733
+ name: z67.string().min(1, "Name is required"),
34734
+ isPrimary: z67.boolean().optional(),
34735
+ isFooter: z67.boolean().optional(),
34736
+ items: z67.array(navigationItemConfigSchema)
33975
34737
  }).superRefine((menu, ctx) => {
33976
34738
  const portalStats = collectPortalLinkStats(
33977
34739
  menu.items
33978
34740
  );
33979
34741
  if (portalStats.count > 1) {
33980
34742
  ctx.addIssue({
33981
- code: z66.ZodIssueCode.custom,
34743
+ code: z67.ZodIssueCode.custom,
33982
34744
  message: "Only one portal link is allowed per navigation menu",
33983
34745
  path: ["items"]
33984
34746
  });
33985
34747
  }
33986
34748
  if (portalStats.nestedLabels.length > 0) {
33987
34749
  ctx.addIssue({
33988
- code: z66.ZodIssueCode.custom,
34750
+ code: z67.ZodIssueCode.custom,
33989
34751
  message: `Portal links must be root-level items: ${portalStats.nestedLabels.join(", ")}`,
33990
34752
  path: ["items"]
33991
34753
  });
33992
34754
  }
33993
34755
  if (portalStats.withChildrenLabels.length > 0) {
33994
34756
  ctx.addIssue({
33995
- code: z66.ZodIssueCode.custom,
34757
+ code: z67.ZodIssueCode.custom,
33996
34758
  message: `Portal links cannot contain child items: ${portalStats.withChildrenLabels.join(", ")}`,
33997
34759
  path: ["items"]
33998
34760
  });
@@ -34002,44 +34764,44 @@ var navigationMenuConfigSchema = z66.object({
34002
34764
  );
34003
34765
  if (cartStats.nestedLabels.length > 0) {
34004
34766
  ctx.addIssue({
34005
- code: z66.ZodIssueCode.custom,
34767
+ code: z67.ZodIssueCode.custom,
34006
34768
  message: `Cart links must be root-level items: ${cartStats.nestedLabels.join(", ")}`,
34007
34769
  path: ["items"]
34008
34770
  });
34009
34771
  }
34010
34772
  if (cartStats.withChildrenLabels.length > 0) {
34011
34773
  ctx.addIssue({
34012
- code: z66.ZodIssueCode.custom,
34774
+ code: z67.ZodIssueCode.custom,
34013
34775
  message: `Cart links cannot contain child items: ${cartStats.withChildrenLabels.join(", ")}`,
34014
34776
  path: ["items"]
34015
34777
  });
34016
34778
  }
34017
34779
  if (cartStats.ctaLabels.length > 0) {
34018
34780
  ctx.addIssue({
34019
- code: z66.ZodIssueCode.custom,
34781
+ code: z67.ZodIssueCode.custom,
34020
34782
  message: `Cart links cannot be marked as CTA: ${cartStats.ctaLabels.join(", ")}`,
34021
34783
  path: ["items"]
34022
34784
  });
34023
34785
  }
34024
34786
  if (cartStats.missingVisibleTextLabels.length > 0) {
34025
34787
  ctx.addIssue({
34026
- code: z66.ZodIssueCode.custom,
34788
+ code: z67.ZodIssueCode.custom,
34027
34789
  message: `Cart links with icon-with-label must provide a visible label: ${cartStats.missingVisibleTextLabels.join(", ")}`,
34028
34790
  path: ["items"]
34029
34791
  });
34030
34792
  }
34031
34793
  });
34032
- var siteSettingsConfigSchema = z66.object({
34033
- homepagePath: z66.string().optional(),
34034
- siteTitle: z66.string().optional(),
34035
- siteDescription: z66.string().optional(),
34036
- defaultTemplates: z66.record(z66.string(), z66.string()).optional()
34794
+ var siteSettingsConfigSchema = z67.object({
34795
+ homepagePath: z67.string().optional(),
34796
+ siteTitle: z67.string().optional(),
34797
+ siteDescription: z67.string().optional(),
34798
+ defaultTemplates: z67.record(z67.string(), z67.string()).optional()
34037
34799
  });
34038
- var contentConfigBaseSchema = z66.object({
34039
- contentTypes: z66.array(contentTypeConfigSchema).optional(),
34040
- entries: z66.array(entryConfigSchema).optional(),
34041
- pages: z66.array(pageConfigSchema).optional(),
34042
- navigationMenus: z66.array(navigationMenuConfigSchema).optional(),
34800
+ var contentConfigBaseSchema = z67.object({
34801
+ contentTypes: z67.array(contentTypeConfigSchema).optional(),
34802
+ entries: z67.array(entryConfigSchema).optional(),
34803
+ pages: z67.array(pageConfigSchema).optional(),
34804
+ navigationMenus: z67.array(navigationMenuConfigSchema).optional(),
34043
34805
  settings: siteSettingsConfigSchema.optional()
34044
34806
  });
34045
34807
  var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
@@ -34048,7 +34810,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34048
34810
  const duplicateKeys = keys.filter((key, i) => keys.indexOf(key) !== i);
34049
34811
  if (duplicateKeys.length > 0) {
34050
34812
  ctx.addIssue({
34051
- code: z66.ZodIssueCode.custom,
34813
+ code: z67.ZodIssueCode.custom,
34052
34814
  message: `Content type keys must be unique. Duplicates: ${duplicateKeys.join(", ")}`,
34053
34815
  path: ["contentTypes"]
34054
34816
  });
@@ -34059,7 +34821,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34059
34821
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34060
34822
  if (duplicateIds.length > 0) {
34061
34823
  ctx.addIssue({
34062
- code: z66.ZodIssueCode.custom,
34824
+ code: z67.ZodIssueCode.custom,
34063
34825
  message: `Page identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34064
34826
  path: ["pages"]
34065
34827
  });
@@ -34068,7 +34830,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34068
34830
  const duplicatePaths = paths.filter((path, i) => paths.indexOf(path) !== i);
34069
34831
  if (duplicatePaths.length > 0) {
34070
34832
  ctx.addIssue({
34071
- code: z66.ZodIssueCode.custom,
34833
+ code: z67.ZodIssueCode.custom,
34072
34834
  message: `Page paths must be unique. Duplicates: ${duplicatePaths.join(", ")}`,
34073
34835
  path: ["pages"]
34074
34836
  });
@@ -34079,7 +34841,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34079
34841
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34080
34842
  if (duplicateIds.length > 0) {
34081
34843
  ctx.addIssue({
34082
- code: z66.ZodIssueCode.custom,
34844
+ code: z67.ZodIssueCode.custom,
34083
34845
  message: `Entry identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34084
34846
  path: ["entries"]
34085
34847
  });
@@ -34090,7 +34852,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34090
34852
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34091
34853
  if (duplicateIds.length > 0) {
34092
34854
  ctx.addIssue({
34093
- code: z66.ZodIssueCode.custom,
34855
+ code: z67.ZodIssueCode.custom,
34094
34856
  message: `Navigation menu identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34095
34857
  path: ["navigationMenus"]
34096
34858
  });
@@ -34104,7 +34866,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34104
34866
  const entriesForType = data.entries.filter((e) => e.contentType === singletonKey);
34105
34867
  if (entriesForType.length > 1) {
34106
34868
  ctx.addIssue({
34107
- code: z66.ZodIssueCode.custom,
34869
+ code: z67.ZodIssueCode.custom,
34108
34870
  message: `Singleton content type "${singletonKey}" cannot have more than one entry. Found ${entriesForType.length} entries.`,
34109
34871
  path: ["entries"]
34110
34872
  });
@@ -34217,18 +34979,18 @@ function validateLayout(layout) {
34217
34979
  }
34218
34980
 
34219
34981
  // src/config/dashboard-validation.ts
34220
- import { z as z67 } from "zod";
34221
- var navIdListSchema2 = z67.preprocess((value) => {
34982
+ import { z as z68 } from "zod";
34983
+ var navIdListSchema2 = z68.preprocess((value) => {
34222
34984
  if (!Array.isArray(value)) return void 0;
34223
34985
  const filtered = value.filter((v) => typeof v === "string" && v.trim().length > 0);
34224
34986
  return filtered.length > 0 ? filtered : void 0;
34225
- }, z67.array(z67.string()).max(200, "Maximum 200 nav IDs").optional());
34226
- var dashboardNavVisibilityBaseSchema2 = z67.object({
34227
- mode: z67.enum(["augment", "restrict"]).optional(),
34987
+ }, z68.array(z68.string()).max(200, "Maximum 200 nav IDs").optional());
34988
+ var dashboardNavVisibilityBaseSchema2 = z68.object({
34989
+ mode: z68.enum(["augment", "restrict"]).optional(),
34228
34990
  allowIds: navIdListSchema2,
34229
34991
  denyIds: navIdListSchema2
34230
34992
  }).strip();
34231
- var dashboardNavVisibilityRolesSchema2 = z67.object({
34993
+ var dashboardNavVisibilityRolesSchema2 = z68.object({
34232
34994
  administrator: dashboardNavVisibilityBaseSchema2.optional(),
34233
34995
  editor: dashboardNavVisibilityBaseSchema2.optional(),
34234
34996
  team_member: dashboardNavVisibilityBaseSchema2.optional()
@@ -34236,20 +34998,20 @@ var dashboardNavVisibilityRolesSchema2 = z67.object({
34236
34998
  var dashboardNavVisibilitySchema2 = dashboardNavVisibilityBaseSchema2.extend({
34237
34999
  roles: dashboardNavVisibilityRolesSchema2
34238
35000
  }).strip();
34239
- var dashboardNavigationConfigSchema2 = z67.object({
35001
+ var dashboardNavigationConfigSchema2 = z68.object({
34240
35002
  siteNav: dashboardNavVisibilitySchema2.optional(),
34241
35003
  settingsNav: dashboardNavVisibilitySchema2.optional()
34242
35004
  }).strip();
34243
- var dashboardConfigSchema2 = z67.object({
34244
- previewEditingEnabled: z67.boolean().optional(),
35005
+ var dashboardConfigSchema2 = z68.object({
35006
+ previewEditingEnabled: z68.boolean().optional(),
34245
35007
  navigation: dashboardNavigationConfigSchema2.optional()
34246
35008
  }).strip();
34247
35009
 
34248
35010
  // src/zod/titleSourceSchema.ts
34249
- import { z as z68 } from "zod";
34250
- var titleSourceValueSchema = z68.union([
34251
- z68.string().min(1),
34252
- z68.array(z68.string().min(1)).min(1)
35011
+ import { z as z69 } from "zod";
35012
+ var titleSourceValueSchema = z69.union([
35013
+ z69.string().min(1),
35014
+ z69.array(z69.string().min(1)).min(1)
34253
35015
  ]);
34254
35016
 
34255
35017
  // src/data/prefetchBlockData.ts
@@ -34268,11 +35030,11 @@ var SUPPORTED_LOADER_ENDPOINTS2 = [
34268
35030
  ];
34269
35031
 
34270
35032
  // src/config/validation.ts
34271
- var sdkThemePaletteSchema2 = z69.record(z69.string(), z69.string());
34272
- var sdkThemeConfigSchema2 = z69.object({
35033
+ var sdkThemePaletteSchema2 = z70.record(z70.string(), z70.string());
35034
+ var sdkThemeConfigSchema2 = z70.object({
34273
35035
  palette: sdkThemePaletteSchema2
34274
35036
  });
34275
- var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
35037
+ var sdkSiteUrlSchema = z70.string().url("Must be a valid URL").refine((url) => {
34276
35038
  try {
34277
35039
  const parsed = new URL(url);
34278
35040
  const isLocal = parsed.hostname === "localhost" || parsed.hostname.endsWith(".localhost") || parsed.hostname.endsWith(".local") || parsed.hostname.endsWith(".test");
@@ -34281,97 +35043,97 @@ var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
34281
35043
  return false;
34282
35044
  }
34283
35045
  }, { message: "Production URLs must use HTTPS" }).transform((url) => url.replace(/\/$/, ""));
34284
- var sectionBackgroundSchema = z69.object({
34285
- id: z69.string(),
34286
- label: z69.string(),
34287
- token: z69.string()
35046
+ var sectionBackgroundSchema = z70.object({
35047
+ id: z70.string(),
35048
+ label: z70.string(),
35049
+ token: z70.string()
34288
35050
  // Reference to theme palette token
34289
35051
  });
34290
- var sectionSpacingSchema = z69.enum(["compact", "default", "spacious"]);
34291
- var containerMaxWidthSchema = z69.enum(["narrow", "default", "wide", "full"]);
34292
- var containerAlignmentSchema = z69.enum(["left", "center", "right"]);
34293
- var sectionOptionsSchema = z69.object({
34294
- backgroundColor: z69.boolean().optional(),
34295
- backgroundImage: z69.boolean().optional(),
34296
- backgroundGradient: z69.boolean().optional(),
34297
- spacing: z69.union([
34298
- z69.array(sectionSpacingSchema),
34299
- z69.boolean()
35052
+ var sectionSpacingSchema = z70.enum(["compact", "default", "spacious"]);
35053
+ var containerMaxWidthSchema = z70.enum(["narrow", "default", "wide", "full"]);
35054
+ var containerAlignmentSchema = z70.enum(["left", "center", "right"]);
35055
+ var sectionOptionsSchema = z70.object({
35056
+ backgroundColor: z70.boolean().optional(),
35057
+ backgroundImage: z70.boolean().optional(),
35058
+ backgroundGradient: z70.boolean().optional(),
35059
+ spacing: z70.union([
35060
+ z70.array(sectionSpacingSchema),
35061
+ z70.boolean()
34300
35062
  ]).optional(),
34301
- textColor: z69.boolean().optional()
35063
+ textColor: z70.boolean().optional()
34302
35064
  }).optional();
34303
- var containerOptionsSchema = z69.object({
34304
- maxWidth: z69.union([
34305
- z69.array(containerMaxWidthSchema),
34306
- z69.boolean()
35065
+ var containerOptionsSchema = z70.object({
35066
+ maxWidth: z70.union([
35067
+ z70.array(containerMaxWidthSchema),
35068
+ z70.boolean()
34307
35069
  ]).optional(),
34308
- alignment: z69.union([
34309
- z69.array(containerAlignmentSchema),
34310
- z69.boolean()
35070
+ alignment: z70.union([
35071
+ z70.array(containerAlignmentSchema),
35072
+ z70.boolean()
34311
35073
  ]).optional()
34312
35074
  }).optional();
34313
- var siteStyleConfigSchema = z69.object({
34314
- sectionBackgrounds: z69.array(sectionBackgroundSchema).optional(),
35075
+ var siteStyleConfigSchema = z70.object({
35076
+ sectionBackgrounds: z70.array(sectionBackgroundSchema).optional(),
34315
35077
  sectionOptions: sectionOptionsSchema,
34316
35078
  containerOptions: containerOptionsSchema
34317
35079
  }).optional();
34318
- var sdkLoaderEndpointSchema2 = z69.enum(SUPPORTED_LOADER_ENDPOINTS2);
35080
+ var sdkLoaderEndpointSchema2 = z70.enum(SUPPORTED_LOADER_ENDPOINTS2);
34319
35081
  var allowedTransformIds = new Set(builtinTransformDefinitions.map((transform) => transform.id));
34320
- var loaderTransformStepSchema = z69.object({
34321
- id: z69.string().refine((id) => allowedTransformIds.has(id), {
35082
+ var loaderTransformStepSchema = z70.object({
35083
+ id: z70.string().refine((id) => allowedTransformIds.has(id), {
34322
35084
  message: "Unknown transform id"
34323
35085
  }),
34324
- options: z69.record(z69.string(), z69.unknown()).optional()
35086
+ options: z70.record(z70.string(), z70.unknown()).optional()
34325
35087
  });
34326
- var loaderParamBindingSchema2 = z69.object({
34327
- $bind: z69.object({
34328
- from: z69.string().min(1, "Binding path is required"),
35088
+ var loaderParamBindingSchema2 = z70.object({
35089
+ $bind: z70.object({
35090
+ from: z70.string().min(1, "Binding path is required"),
34329
35091
  // Loader params are ultimately string-normalized for query strings, so fallbacks should
34330
35092
  // stay scalar. Use transforms (e.g. `value.jsonArray`) when you need to serialize
34331
35093
  // more complex values into a string.
34332
- fallback: z69.union([z69.string(), z69.number(), z69.boolean(), z69.null()]).optional(),
34333
- transforms: z69.array(loaderTransformStepSchema).default([]),
34334
- pick: z69.enum(["value", "collection", "context"]).default("value"),
34335
- coerce: z69.enum(["number", "boolean", "string"]).optional()
35094
+ fallback: z70.union([z70.string(), z70.number(), z70.boolean(), z70.null()]).optional(),
35095
+ transforms: z70.array(loaderTransformStepSchema).default([]),
35096
+ pick: z70.enum(["value", "collection", "context"]).default("value"),
35097
+ coerce: z70.enum(["number", "boolean", "string"]).optional()
34336
35098
  })
34337
35099
  });
34338
- var loaderParamValueSchema2 = z69.union([
34339
- z69.string(),
34340
- z69.number(),
34341
- z69.boolean(),
35100
+ var loaderParamValueSchema2 = z70.union([
35101
+ z70.string(),
35102
+ z70.number(),
35103
+ z70.boolean(),
34342
35104
  loaderParamBindingSchema2
34343
35105
  ]);
34344
- var loaderWhenValueSchema = z69.union([
34345
- z69.boolean(),
35106
+ var loaderWhenValueSchema = z70.union([
35107
+ z70.boolean(),
34346
35108
  loaderParamBindingSchema2
34347
35109
  ]);
34348
- var sdkConfigLoaderSchema2 = z69.object({
35110
+ var sdkConfigLoaderSchema2 = z70.object({
34349
35111
  endpoint: sdkLoaderEndpointSchema2,
34350
- params: z69.record(z69.string(), loaderParamValueSchema2),
34351
- mode: z69.enum(["server", "client"]).default("server"),
35112
+ params: z70.record(z70.string(), loaderParamValueSchema2),
35113
+ mode: z70.enum(["server", "client"]).default("server"),
34352
35114
  when: loaderWhenValueSchema.optional()
34353
35115
  });
34354
- var sdkDataLoadersSchema2 = z69.record(z69.string(), sdkConfigLoaderSchema2).refine(
35116
+ var sdkDataLoadersSchema2 = z70.record(z70.string(), sdkConfigLoaderSchema2).refine(
34355
35117
  (loaders) => Object.keys(loaders).length <= 5,
34356
35118
  { message: "Maximum 5 data loaders per block" }
34357
35119
  ).optional();
34358
- var fieldSelectOptionSchema = z69.object({
34359
- value: z69.string().min(1, "Option value is required"),
34360
- label: z69.string().min(1, "Option label is required")
35120
+ var fieldSelectOptionSchema = z70.object({
35121
+ value: z70.string().min(1, "Option value is required"),
35122
+ label: z70.string().min(1, "Option label is required")
34361
35123
  });
34362
- var blockFieldConfigSchema = z69.object({
34363
- options: z69.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
35124
+ var blockFieldConfigSchema = z70.object({
35125
+ options: z70.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
34364
35126
  });
34365
- var blockFieldOptionsSchema = z69.record(
34366
- z69.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
35127
+ var blockFieldOptionsSchema = z70.record(
35128
+ z70.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
34367
35129
  message: "Block ID must be 'block.*' or 'custom.*' format"
34368
35130
  }),
34369
- z69.record(
34370
- z69.string().min(1, "Field ID is required"),
35131
+ z70.record(
35132
+ z70.string().min(1, "Field ID is required"),
34371
35133
  blockFieldConfigSchema
34372
35134
  )
34373
35135
  ).optional();
34374
- var blockFieldExtensionSchema = z69.object({
35136
+ var blockFieldExtensionSchema = z70.object({
34375
35137
  fields: fieldSchema.array().min(1, "At least one field is required")
34376
35138
  }).refine(
34377
35139
  (data) => {
@@ -34385,10 +35147,10 @@ var blockFieldExtensionSchema = z69.object({
34385
35147
  message: "Required fields must have a defaultValue to support existing blocks"
34386
35148
  }
34387
35149
  );
34388
- var blockFieldExtensionsMapSchema = z69.record(
35150
+ var blockFieldExtensionsMapSchema = z70.record(
34389
35151
  // System blocks are kebab-case: block.body-text, block.event-calendar, ...
34390
35152
  // Enforce: lowercase alphanumerics with single hyphens (no trailing hyphen, no consecutive hyphens).
34391
- z69.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
35153
+ z70.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
34392
35154
  message: "Block ID must be 'block.*' format (system blocks only)"
34393
35155
  }),
34394
35156
  blockFieldExtensionSchema
@@ -34404,7 +35166,7 @@ var blockFieldExtensionsMapSchema = z69.record(
34404
35166
  (field) => field.id === collision.fieldId
34405
35167
  );
34406
35168
  ctx.addIssue({
34407
- code: z69.ZodIssueCode.custom,
35169
+ code: z70.ZodIssueCode.custom,
34408
35170
  message: collision.message,
34409
35171
  path: [
34410
35172
  APPOINTMENT_BOOKING_BLOCK_ID,
@@ -34419,24 +35181,24 @@ var blockFieldExtensionsSchema = blockFieldExtensionsMapSchema.optional();
34419
35181
  function collectAppointmentBookingExtensionReservedFieldCollisions(extension) {
34420
35182
  return collectBookingReservedFieldCollisions(extension, { type: "booking" });
34421
35183
  }
34422
- var syncConfigSchema = z69.object({
34423
- existingEntries: z69.enum(["skip", "update"]).optional()
35184
+ var syncConfigSchema = z70.object({
35185
+ existingEntries: z70.enum(["skip", "update"]).optional()
34424
35186
  }).optional();
34425
- var deployConfigSchema = z69.object({
34426
- verifyCommand: z69.string().optional(),
34427
- prebuildOutput: z69.string().optional()
35187
+ var deployConfigSchema = z70.object({
35188
+ verifyCommand: z70.string().optional(),
35189
+ prebuildOutput: z70.string().optional()
34428
35190
  }).optional();
34429
- var sdkCustomBlockSchema = z69.object({
35191
+ var sdkCustomBlockSchema = z70.object({
34430
35192
  // Block ID must start with 'custom.'
34431
- id: z69.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
35193
+ id: z70.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
34432
35194
  message: "Block ID must start with 'custom.' followed by lowercase letters, numbers, or hyphens"
34433
35195
  }),
34434
- title: z69.string().min(1, "Title is required"),
35196
+ title: z70.string().min(1, "Title is required"),
34435
35197
  titleSource: titleSourceValueSchema.optional(),
34436
- description: z69.string().optional(),
35198
+ description: z70.string().optional(),
34437
35199
  category: blockCategoryEnum,
34438
- icon: z69.string().optional(),
34439
- tags: z69.array(z69.string()).optional(),
35200
+ icon: z70.string().optional(),
35201
+ tags: z70.array(z70.string()).optional(),
34440
35202
  // Reuse the exact field schema from @riverbankcms/blocks - all field types supported
34441
35203
  fields: fieldSchema.array().min(1, "Custom blocks must have at least one field"),
34442
35204
  // Data loaders for CMS endpoints
@@ -34444,14 +35206,14 @@ var sdkCustomBlockSchema = z69.object({
34444
35206
  // Optional declarative layout - when present, block can render without React override
34445
35207
  layout: NodeSchema.optional(),
34446
35208
  // Optional variants system (preferred when a block has multiple structural layouts)
34447
- variants: z69.record(z69.string().min(1), NodeSchema).optional(),
34448
- defaultVariant: z69.string().min(1).optional(),
34449
- variantOptions: z69.record(
34450
- z69.string().min(1),
34451
- z69.object({
34452
- label: z69.string().min(1).optional(),
34453
- description: z69.string().min(1).optional(),
34454
- icon: z69.string().min(1).optional()
35209
+ variants: z70.record(z70.string().min(1), NodeSchema).optional(),
35210
+ defaultVariant: z70.string().min(1).optional(),
35211
+ variantOptions: z70.record(
35212
+ z70.string().min(1),
35213
+ z70.object({
35214
+ label: z70.string().min(1).optional(),
35215
+ description: z70.string().min(1).optional(),
35216
+ icon: z70.string().min(1).optional()
34455
35217
  })
34456
35218
  ).optional()
34457
35219
  }).superRefine((data, ctx) => {
@@ -34462,7 +35224,7 @@ var sdkCustomBlockSchema = z69.object({
34462
35224
  const exists = fields3.some((field) => field.id === source);
34463
35225
  if (!exists) {
34464
35226
  ctx.addIssue({
34465
- code: z69.ZodIssueCode.custom,
35227
+ code: z70.ZodIssueCode.custom,
34466
35228
  message: `titleSource must reference a valid field ID (got "${source}")`,
34467
35229
  path: Array.isArray(data.titleSource) ? ["titleSource", index] : ["titleSource"]
34468
35230
  });
@@ -34471,7 +35233,7 @@ var sdkCustomBlockSchema = z69.object({
34471
35233
  }
34472
35234
  if (data.layout && data.variants) {
34473
35235
  ctx.addIssue({
34474
- code: z69.ZodIssueCode.custom,
35236
+ code: z70.ZodIssueCode.custom,
34475
35237
  message: "Custom block must define either `layout` or `variants`, not both",
34476
35238
  path: ["variants"]
34477
35239
  });
@@ -34481,7 +35243,7 @@ var sdkCustomBlockSchema = z69.object({
34481
35243
  if (!result.valid) {
34482
35244
  for (const error of result.errors) {
34483
35245
  ctx.addIssue({
34484
- code: z69.ZodIssueCode.custom,
35246
+ code: z70.ZodIssueCode.custom,
34485
35247
  message: error.message,
34486
35248
  path: ["layout"]
34487
35249
  });
@@ -34492,14 +35254,14 @@ var sdkCustomBlockSchema = z69.object({
34492
35254
  const keys = Object.keys(data.variants);
34493
35255
  if (keys.length === 0) {
34494
35256
  ctx.addIssue({
34495
- code: z69.ZodIssueCode.custom,
35257
+ code: z70.ZodIssueCode.custom,
34496
35258
  message: "`variants` must contain at least one variant key",
34497
35259
  path: ["variants"]
34498
35260
  });
34499
35261
  }
34500
35262
  if (data.defaultVariant && !Object.prototype.hasOwnProperty.call(data.variants, data.defaultVariant)) {
34501
35263
  ctx.addIssue({
34502
- code: z69.ZodIssueCode.custom,
35264
+ code: z70.ZodIssueCode.custom,
34503
35265
  message: "`defaultVariant` must be a key present in `variants`",
34504
35266
  path: ["defaultVariant"]
34505
35267
  });
@@ -34509,7 +35271,7 @@ var sdkCustomBlockSchema = z69.object({
34509
35271
  if (!result.valid) {
34510
35272
  for (const error of result.errors) {
34511
35273
  ctx.addIssue({
34512
- code: z69.ZodIssueCode.custom,
35274
+ code: z70.ZodIssueCode.custom,
34513
35275
  message: `${key}: ${error.message}`,
34514
35276
  path: ["variants", key]
34515
35277
  });
@@ -34520,7 +35282,7 @@ var sdkCustomBlockSchema = z69.object({
34520
35282
  for (const key of Object.keys(data.variantOptions)) {
34521
35283
  if (!Object.prototype.hasOwnProperty.call(data.variants, key)) {
34522
35284
  ctx.addIssue({
34523
- code: z69.ZodIssueCode.custom,
35285
+ code: z70.ZodIssueCode.custom,
34524
35286
  message: "`variantOptions` key must exist in `variants`",
34525
35287
  path: ["variantOptions", key]
34526
35288
  });
@@ -34529,58 +35291,58 @@ var sdkCustomBlockSchema = z69.object({
34529
35291
  }
34530
35292
  }
34531
35293
  });
34532
- var themeSourceSchema = z69.enum(["local", "cms"]).optional();
34533
- var activeThemeSchema = z69.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
35294
+ var themeSourceSchema = z70.enum(["local", "cms"]).optional();
35295
+ var activeThemeSchema = z70.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
34534
35296
  message: "Theme name must be lowercase alphanumeric with hyphens/underscores"
34535
35297
  }).max(64, "Theme name too long").optional();
34536
35298
  function isValidConfigBlockKind(kind) {
34537
35299
  if (getBlockDefinition(kind)) return true;
34538
35300
  return /^custom\.[a-z][a-z0-9-]*$/.test(kind);
34539
35301
  }
34540
- var layoutBlockKindSchema = z69.string().refine(isValidConfigBlockKind, {
35302
+ var layoutBlockKindSchema = z70.string().refine(isValidConfigBlockKind, {
34541
35303
  message: 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.my-block")'
34542
35304
  });
34543
- var layoutFooterBlockSchema = z69.object({
34544
- id: z69.string().min(1).optional(),
35305
+ var layoutFooterBlockSchema = z70.object({
35306
+ id: z70.string().min(1).optional(),
34545
35307
  kind: layoutBlockKindSchema,
34546
35308
  // Allow omitted content for blocks that rely on defaults.
34547
- content: z69.record(z69.string(), z69.unknown()).optional()
35309
+ content: z70.record(z70.string(), z70.unknown()).optional()
34548
35310
  }).strict();
34549
- var layoutConfigSchema = z69.object({
34550
- footerBlocks: z69.array(layoutFooterBlockSchema).optional()
35311
+ var layoutConfigSchema = z70.object({
35312
+ footerBlocks: z70.array(layoutFooterBlockSchema).optional()
34551
35313
  }).strict();
34552
- var sdkWorkflowIdSchema2 = z69.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
35314
+ var sdkWorkflowIdSchema2 = z70.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
34553
35315
  message: "Workflow ID must start with a lowercase letter and use lowercase letters, numbers, dots, underscores, or hyphens"
34554
35316
  });
34555
- 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 "/"' });
34556
- var sdkWorkflowTriggerSchema2 = z69.discriminatedUnion("type", [
34557
- z69.object({ type: z69.literal("manual") }).strict()
35317
+ var sdkWorkflowEndpointSchema2 = z70.string().min(1).max(SDK_WORKFLOW_ENDPOINT_MAX_LENGTH).regex(SDK_WORKFLOW_ENDPOINT_PATTERN, { message: 'Workflow endpoint must be a site-relative path starting with "/"' });
35318
+ var sdkWorkflowTriggerSchema2 = z70.discriminatedUnion("type", [
35319
+ z70.object({ type: z70.literal("manual") }).strict()
34558
35320
  ]);
34559
- var sdkWorkflowConfirmationSchema2 = z69.object({
34560
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
34561
- body: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
35321
+ var sdkWorkflowConfirmationSchema2 = z70.object({
35322
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
35323
+ body: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
34562
35324
  }).strict();
34563
- var sdkWorkflowConfigSchema2 = z69.object({
35325
+ var sdkWorkflowConfigSchema2 = z70.object({
34564
35326
  id: sdkWorkflowIdSchema2,
34565
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
34566
- description: z69.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
34567
- contentType: z69.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
35327
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
35328
+ description: z70.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
35329
+ contentType: z70.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
34568
35330
  endpoint: sdkWorkflowEndpointSchema2,
34569
- triggers: z69.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
35331
+ triggers: z70.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
34570
35332
  confirmation: sdkWorkflowConfirmationSchema2.optional()
34571
35333
  }).strict();
34572
- var sdkWorkflowsSchema2 = z69.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
35334
+ var sdkWorkflowsSchema2 = z70.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
34573
35335
  const ids = workflows.map((workflow) => workflow.id);
34574
35336
  return ids.length === new Set(ids).size;
34575
35337
  }, { message: "Workflow IDs must be unique" }).optional();
34576
- var riverbankSiteConfigSchema = z69.object({
34577
- siteId: z69.string().uuid(),
35338
+ var riverbankSiteConfigSchema = z70.object({
35339
+ siteId: z70.string().uuid(),
34578
35340
  previewUrl: sdkSiteUrlSchema.optional(),
34579
35341
  liveUrl: sdkSiteUrlSchema.optional(),
34580
35342
  theme: sdkThemeConfigSchema2.optional(),
34581
35343
  styles: siteStyleConfigSchema,
34582
35344
  layout: layoutConfigSchema.optional(),
34583
- customBlocks: z69.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
35345
+ customBlocks: z70.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
34584
35346
  // Ensure unique block IDs
34585
35347
  (blocks) => {
34586
35348
  const ids = blocks.map((b) => b.id);
@@ -34593,7 +35355,7 @@ var riverbankSiteConfigSchema = z69.object({
34593
35355
  workflows: sdkWorkflowsSchema2,
34594
35356
  content: contentConfigSchema.optional(),
34595
35357
  // CLI-related configuration (Phase 4)
34596
- contentDir: z69.string().optional(),
35358
+ contentDir: z70.string().optional(),
34597
35359
  sync: syncConfigSchema,
34598
35360
  deploy: deployConfigSchema,
34599
35361
  // Theme sync configuration (Phase 5)