@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
@@ -1,5 +1,5 @@
1
1
  // src/config/validation.ts
2
- import { z as z69 } from "zod";
2
+ import { z as z70 } from "zod";
3
3
 
4
4
  // ../api/src/apiEndpointTypes.ts
5
5
  function blockedDemoMutationPolicy(classification, publicMessage) {
@@ -3903,6 +3903,14 @@ var ENDPOINT_DEFINITIONS = {
3903
3903
  responseKind: "json",
3904
3904
  errors: []
3905
3905
  },
3906
+ applyDiscountCode: {
3907
+ path: "/public/sites/{siteId}/bookings/discounts/apply",
3908
+ method: "POST",
3909
+ tags: ["site-{siteId}", "booking-discounts"],
3910
+ auth: "public",
3911
+ responseKind: "json",
3912
+ errors: ["validation:invalid_input", "rate_limit:exceeded"]
3913
+ },
3906
3914
  // Batch endpoint for block loader requests (reduces SSR fan-out)
3907
3915
  batchBlockLoaders: {
3908
3916
  path: "/public/sites/{siteId}/block-loaders/batch",
@@ -6242,6 +6250,27 @@ var ENDPOINT_DEFINITIONS = {
6242
6250
  }
6243
6251
  };
6244
6252
 
6253
+ // ../core/src/location.ts
6254
+ function normalizeLocationAddressText(value) {
6255
+ if (typeof value !== "string") {
6256
+ return null;
6257
+ }
6258
+ const trimmed = value.trim();
6259
+ return trimmed ? trimmed : null;
6260
+ }
6261
+ function hasLocationCoordinates(value) {
6262
+ return typeof value?.lat === "number" && typeof value?.lng === "number";
6263
+ }
6264
+ function toLocationCoordinates(value) {
6265
+ if (!hasLocationCoordinates(value)) {
6266
+ return null;
6267
+ }
6268
+ return {
6269
+ lat: value.lat,
6270
+ lng: value.lng
6271
+ };
6272
+ }
6273
+
6245
6274
  // ../api/src/accessAdmin.ts
6246
6275
  import { z } from "zod";
6247
6276
  var managedDomainAddOnPricingSnapshotSchema = z.object({
@@ -6384,27 +6413,6 @@ function formatKeyAsLabel(key) {
6384
6413
  // ../blocks/src/system/manifest/schema.ts
6385
6414
  import { z as z4 } from "zod";
6386
6415
 
6387
- // ../core/src/location.ts
6388
- function normalizeLocationAddressText(value) {
6389
- if (typeof value !== "string") {
6390
- return null;
6391
- }
6392
- const trimmed = value.trim();
6393
- return trimmed ? trimmed : null;
6394
- }
6395
- function hasLocationCoordinates(value) {
6396
- return typeof value?.lat === "number" && typeof value?.lng === "number";
6397
- }
6398
- function toLocationCoordinates(value) {
6399
- if (!hasLocationCoordinates(value)) {
6400
- return null;
6401
- }
6402
- return {
6403
- lat: value.lat,
6404
- lng: value.lng
6405
- };
6406
- }
6407
-
6408
6416
  // ../media-core/src/transformRect.ts
6409
6417
  function isValidTransformRectStructure(rect) {
6410
6418
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -7529,6 +7537,9 @@ function makeBoundaryId(previousBlockId, nextBlockId) {
7529
7537
  const next = encodeURIComponent(nextBlockId);
7530
7538
  return asDesignBoundaryId(`boundary:${previous}:${next}`);
7531
7539
  }
7540
+ function assertNever(value, message = "Unhandled Theme V2 variant") {
7541
+ throw new Error(`${message}: ${String(value)}`);
7542
+ }
7532
7543
  function brandNonEmptyString(value, label) {
7533
7544
  if (value.length === 0) {
7534
7545
  throw new Error(`${label} must be a non-empty string.`);
@@ -7556,6 +7567,10 @@ var tileTreatmentValues = [
7556
7567
  "quiet",
7557
7568
  "brand-depth"
7558
7569
  ];
7570
+ var eventListTreatmentValues = [
7571
+ "plain",
7572
+ "lined-panel"
7573
+ ];
7559
7574
  var eyebrowTreatmentValues = [
7560
7575
  "plain",
7561
7576
  "pill",
@@ -7613,6 +7628,7 @@ function defineBlockDesignCapability(capability) {
7613
7628
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7614
7629
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7615
7630
  tileTreatments: capability.tileTreatments ?? ["default"],
7631
+ eventListTreatments: capability.eventListTreatments ?? ["plain"],
7616
7632
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
7617
7633
  ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
7618
7634
  ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
@@ -7637,9 +7653,98 @@ var blockAppearancePresets = [
7637
7653
  transitionAfter: "soft-fade-short",
7638
7654
  emphasis: "high",
7639
7655
  sectionHeight: "hero",
7656
+ heroComposition: "center",
7657
+ heroTypographyScale: "display",
7640
7658
  imageSurfaceTreatment: { kind: "neutral-wash" }
7641
7659
  }
7642
7660
  }),
7661
+ defineBlockAppearancePreset({
7662
+ kind: "block-design",
7663
+ id: "hero-bottom-left-panel",
7664
+ target: "hero",
7665
+ label: "Bottom-left panel hero",
7666
+ blockKinds: ["block.hero"],
7667
+ constraints: {
7668
+ layoutFamilies: ["centered", "compact"]
7669
+ },
7670
+ optionGroups: [
7671
+ {
7672
+ id: "image-surface-treatment",
7673
+ label: "Treatment",
7674
+ selectedOptionId: "neutral-scrim",
7675
+ options: [
7676
+ {
7677
+ id: "neutral-scrim",
7678
+ label: "Neutral scrim",
7679
+ designPatch: {
7680
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7681
+ }
7682
+ },
7683
+ {
7684
+ id: "brand-scrim-primary",
7685
+ label: "Brand scrim",
7686
+ designPatch: {
7687
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "balanced" }
7688
+ }
7689
+ }
7690
+ ]
7691
+ }
7692
+ ],
7693
+ layoutPatches: [
7694
+ {
7695
+ constraints: {
7696
+ layoutVariantKeys: ["micro"]
7697
+ },
7698
+ designPatch: {
7699
+ sectionHeight: "banner",
7700
+ heroTypographyScale: "editorial"
7701
+ }
7702
+ }
7703
+ ],
7704
+ design: {
7705
+ sectionSurface: "hero-image",
7706
+ contentFrame: panelFrame("raised"),
7707
+ itemSurface: "none",
7708
+ transitionAfter: "soft-fade-short",
7709
+ emphasis: "high",
7710
+ sectionHeight: "immersive",
7711
+ heroComposition: "bottom-left",
7712
+ heroTypographyScale: "display",
7713
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7714
+ }
7715
+ }),
7716
+ defineBlockAppearancePreset({
7717
+ kind: "block-design",
7718
+ id: "hero-poster-image",
7719
+ target: "hero",
7720
+ label: "Poster image hero",
7721
+ blockKinds: ["block.hero"],
7722
+ constraints: {
7723
+ layoutFamilies: ["centered", "compact"]
7724
+ },
7725
+ layoutPatches: [
7726
+ {
7727
+ constraints: {
7728
+ layoutVariantKeys: ["micro"]
7729
+ },
7730
+ designPatch: {
7731
+ sectionHeight: "banner",
7732
+ heroTypographyScale: "display"
7733
+ }
7734
+ }
7735
+ ],
7736
+ design: {
7737
+ sectionSurface: "hero-image",
7738
+ contentFrame: plainFrame,
7739
+ itemSurface: "none",
7740
+ transitionAfter: "soft-fade-short",
7741
+ emphasis: "high",
7742
+ sectionHeight: "immersive",
7743
+ heroComposition: "center",
7744
+ heroTypographyScale: "poster",
7745
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "strong" }
7746
+ }
7747
+ }),
7643
7748
  defineBlockAppearancePreset({
7644
7749
  kind: "block-design",
7645
7750
  id: "hero-brand-scrim",
@@ -7689,6 +7794,8 @@ var blockAppearancePresets = [
7689
7794
  transitionAfter: "soft-fade-short",
7690
7795
  emphasis: "high",
7691
7796
  sectionHeight: "immersive",
7797
+ heroComposition: "center",
7798
+ heroTypographyScale: "display",
7692
7799
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7693
7800
  }
7694
7801
  }),
@@ -7741,6 +7848,8 @@ var blockAppearancePresets = [
7741
7848
  transitionAfter: "soft-fade-short",
7742
7849
  emphasis: "high",
7743
7850
  sectionHeight: "immersive",
7851
+ heroComposition: "center",
7852
+ heroTypographyScale: "display",
7744
7853
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7745
7854
  imageSurfaceMotion: "fixed-frame",
7746
7855
  eyebrowTreatment: "accent-pill-bounce"
@@ -7761,6 +7870,8 @@ var blockAppearancePresets = [
7761
7870
  itemSurface: "none",
7762
7871
  transitionAfter: "soft-fade-short",
7763
7872
  emphasis: "high",
7873
+ heroComposition: "center",
7874
+ heroTypographyScale: "editorial",
7764
7875
  eyebrowTreatment: "accent-pill-bounce"
7765
7876
  }
7766
7877
  }),
@@ -7775,7 +7886,82 @@ var blockAppearancePresets = [
7775
7886
  contentFrame: panelFrame("inset"),
7776
7887
  itemSurface: "none",
7777
7888
  transitionAfter: "none",
7778
- emphasis: "high"
7889
+ emphasis: "high",
7890
+ heroComposition: "center",
7891
+ heroTypographyScale: "editorial"
7892
+ }
7893
+ }),
7894
+ defineBlockAppearancePreset({
7895
+ kind: "block-design",
7896
+ id: "hero-split-editorial",
7897
+ target: "hero",
7898
+ label: "Editorial split hero",
7899
+ blockKinds: ["block.hero"],
7900
+ constraints: {
7901
+ layoutFamilies: ["split"]
7902
+ },
7903
+ design: {
7904
+ sectionSurface: "base",
7905
+ contentFrame: plainFrame,
7906
+ itemSurface: "none",
7907
+ transitionAfter: "soft-fade-short",
7908
+ emphasis: "high",
7909
+ heroTypographyScale: "editorial"
7910
+ }
7911
+ }),
7912
+ defineBlockAppearancePreset({
7913
+ kind: "block-design",
7914
+ id: "hero-split-brand",
7915
+ target: "hero",
7916
+ label: "Brand split hero",
7917
+ blockKinds: ["block.hero"],
7918
+ constraints: {
7919
+ layoutFamilies: ["split"]
7920
+ },
7921
+ design: {
7922
+ sectionSurface: "brand-depth-band",
7923
+ contentFrame: plainFrame,
7924
+ itemSurface: "none",
7925
+ transitionAfter: "soft-fade-short",
7926
+ emphasis: "high",
7927
+ heroTypographyScale: "display",
7928
+ eyebrowTreatment: "accent-pill-bounce"
7929
+ }
7930
+ }),
7931
+ defineBlockAppearancePreset({
7932
+ kind: "block-design",
7933
+ id: "hero-split-soft-panel",
7934
+ target: "hero",
7935
+ label: "Soft panel split hero",
7936
+ blockKinds: ["block.hero"],
7937
+ constraints: {
7938
+ layoutFamilies: ["split"]
7939
+ },
7940
+ design: {
7941
+ sectionSurface: "muted-band",
7942
+ contentFrame: panelFrame("raised"),
7943
+ itemSurface: "none",
7944
+ transitionAfter: "soft-fade-short",
7945
+ emphasis: "high",
7946
+ heroTypographyScale: "editorial"
7947
+ }
7948
+ }),
7949
+ defineBlockAppearancePreset({
7950
+ kind: "block-design",
7951
+ id: "hero-split-accent",
7952
+ target: "hero",
7953
+ label: "Accent split hero",
7954
+ blockKinds: ["block.hero"],
7955
+ constraints: {
7956
+ layoutFamilies: ["split"]
7957
+ },
7958
+ design: {
7959
+ sectionSurface: "accent-band",
7960
+ contentFrame: panelFrame("raised"),
7961
+ itemSurface: "none",
7962
+ transitionAfter: "soft-fade-short",
7963
+ emphasis: "high",
7964
+ heroTypographyScale: "display"
7779
7965
  }
7780
7966
  }),
7781
7967
  defineBlockAppearancePreset({
@@ -7808,9 +7994,9 @@ var blockAppearancePresets = [
7808
7994
  }),
7809
7995
  defineBlockAppearancePreset({
7810
7996
  kind: "block-design",
7811
- id: "intro-soft-earth-statement",
7997
+ id: "intro-organic-statement",
7812
7998
  target: "intro",
7813
- label: "Soft Earth intro statement",
7999
+ label: "Organic intro statement",
7814
8000
  blockKinds: ["block.intro"],
7815
8001
  design: {
7816
8002
  sectionSurface: "base",
@@ -7841,9 +8027,9 @@ var blockAppearancePresets = [
7841
8027
  }),
7842
8028
  defineBlockAppearancePreset({
7843
8029
  kind: "block-design",
7844
- id: "feature-cards-soft-earth-offerings",
8030
+ id: "feature-cards-raised-rule",
7845
8031
  target: "feature-cards",
7846
- label: "Soft Earth offering cards",
8032
+ label: "Raised cards with rule",
7847
8033
  blockKinds: ["block.feature-cards"],
7848
8034
  design: {
7849
8035
  sectionSurface: "base",
@@ -7872,6 +8058,21 @@ var blockAppearancePresets = [
7872
8058
  emphasis: "medium"
7873
8059
  }
7874
8060
  }),
8061
+ defineBlockAppearancePreset({
8062
+ kind: "block-design",
8063
+ id: "events-lined-panel",
8064
+ target: "events",
8065
+ label: "Lined event panel",
8066
+ blockKinds: ["block.event-calendar", "block.event-listing"],
8067
+ design: {
8068
+ sectionSurface: "base",
8069
+ contentFrame: plainFrame,
8070
+ itemSurface: "none",
8071
+ transitionAfter: "none",
8072
+ emphasis: "medium",
8073
+ eventListTreatment: "lined-panel"
8074
+ }
8075
+ }),
7875
8076
  defineBlockAppearancePreset({
7876
8077
  kind: "block-design",
7877
8078
  id: "schedule-details-accent-section",
@@ -7931,9 +8132,9 @@ var blockAppearancePresets = [
7931
8132
  }),
7932
8133
  defineBlockAppearancePreset({
7933
8134
  kind: "block-design",
7934
- id: "testimonials-carded-proof",
8135
+ id: "testimonials-simple-cards",
7935
8136
  target: "testimonials",
7936
- label: "Carded social proof",
8137
+ label: "Simple testimonial cards",
7937
8138
  blockKinds: ["block.testimonials"],
7938
8139
  design: {
7939
8140
  sectionSurface: "base",
@@ -7945,9 +8146,9 @@ var blockAppearancePresets = [
7945
8146
  }),
7946
8147
  defineBlockAppearancePreset({
7947
8148
  kind: "block-design",
7948
- id: "testimonials-contained-proof",
8149
+ id: "testimonials-raised-panel",
7949
8150
  target: "testimonials",
7950
- label: "Contained social proof",
8151
+ label: "Raised testimonial panel",
7951
8152
  blockKinds: ["block.testimonials"],
7952
8153
  design: {
7953
8154
  sectionSurface: "muted-band",
@@ -7959,9 +8160,9 @@ var blockAppearancePresets = [
7959
8160
  }),
7960
8161
  defineBlockAppearancePreset({
7961
8162
  kind: "block-design",
7962
- id: "testimonials-dark-proof",
8163
+ id: "testimonials-accent-panel",
7963
8164
  target: "testimonials",
7964
- label: "Dark proof panel",
8165
+ label: "Accent testimonial panel",
7965
8166
  blockKinds: ["block.testimonials"],
7966
8167
  design: {
7967
8168
  sectionSurface: "accent-band",
@@ -7973,9 +8174,9 @@ var blockAppearancePresets = [
7973
8174
  }),
7974
8175
  defineBlockAppearancePreset({
7975
8176
  kind: "block-design",
7976
- id: "testimonials-accent-quote-proof",
8177
+ id: "testimonials-accent-quote-cards",
7977
8178
  target: "testimonials",
7978
- label: "Accent quote proof",
8179
+ label: "Accent quote cards",
7979
8180
  blockKinds: ["block.testimonials"],
7980
8181
  design: {
7981
8182
  sectionSurface: "accent-band",
@@ -7988,9 +8189,9 @@ var blockAppearancePresets = [
7988
8189
  }),
7989
8190
  defineBlockAppearancePreset({
7990
8191
  kind: "block-design",
7991
- id: "testimonials-soft-earth-proof-band",
8192
+ id: "testimonials-brand-background-quotes",
7992
8193
  target: "testimonials",
7993
- label: "Soft Earth proof band",
8194
+ label: "Brand background quotes",
7994
8195
  blockKinds: ["block.testimonials"],
7995
8196
  design: {
7996
8197
  sectionSurface: "brand-depth-band",
@@ -8034,25 +8235,6 @@ var blockAppearancePresets = [
8034
8235
  emphasis: "low"
8035
8236
  }
8036
8237
  }),
8037
- defineBlockAppearancePreset({
8038
- kind: "block-design",
8039
- id: "faq-soft-earth-two-column",
8040
- target: "faq",
8041
- label: "Soft Earth two-column FAQ",
8042
- blockKinds: ["block.faq"],
8043
- design: {
8044
- sectionSurface: "base",
8045
- contentFrame: plainFrame,
8046
- itemSurface: "flat",
8047
- transitionAfter: "none",
8048
- emphasis: "medium",
8049
- accordionIconTreatment: {
8050
- iconSet: "plus",
8051
- colorToken: "primary",
8052
- motion: "swap"
8053
- }
8054
- }
8055
- }),
8056
8238
  defineBlockAppearancePreset({
8057
8239
  kind: "block-design",
8058
8240
  id: "contact-form-panel",
@@ -9431,7 +9613,8 @@ var accordionSystemSchema = z12.object({
9431
9613
  icon: z12.object({
9432
9614
  style: accordionIconSchema,
9433
9615
  position: z12.enum(["left", "right"]),
9434
- size: z12.enum(["sm", "md", "lg"])
9616
+ size: z12.enum(["sm", "md", "lg"]),
9617
+ colorToken: themeColorTokenSchema.optional()
9435
9618
  }),
9436
9619
  // Trigger (question) styling
9437
9620
  trigger: z12.object({
@@ -9565,6 +9748,7 @@ var navLinkPaddingXSchema = z16.enum(["none", "tight", "compact", "default", "re
9565
9748
  var navLinkBorderRadiusSchema = z16.enum(["none", "sm", "md", "full"]);
9566
9749
  var navLinkTextSizeSchema = z16.enum(["xs", "sm", "base", "lg"]);
9567
9750
  var navLinkLetterSpacingSchema = z16.enum(["normal", "wide", "wider", "widest"]);
9751
+ var navLinkContrastTreatmentSchema = z16.enum(["none", "soft-glow"]);
9568
9752
  var navLinkStyleSchema = z16.object({
9569
9753
  /** Display name for the style */
9570
9754
  name: z16.string().min(1).max(30).optional(),
@@ -9576,6 +9760,8 @@ var navLinkStyleSchema = z16.object({
9576
9760
  textSize: navLinkTextSizeSchema.optional(),
9577
9761
  /** Optional letter spacing override */
9578
9762
  letterSpacing: navLinkLetterSpacingSchema.optional(),
9763
+ /** Optional text-only contrast treatment for transparent/overlay navigation */
9764
+ contrastTreatment: navLinkContrastTreatmentSchema.optional(),
9579
9765
  /** Hover/active color token (for color-change effects) */
9580
9766
  hoverColorToken: themeColorTokenSchema.nullable().optional(),
9581
9767
  /** Padding preset */
@@ -10005,6 +10191,7 @@ var sectionStylesOverrideSchema = z21.object({
10005
10191
  spacing: semanticSpacingSchema.nullable().optional(),
10006
10192
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
10007
10193
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
10194
+ eventListTreatment: z21.enum(eventListTreatmentValues).nullable().optional(),
10008
10195
  eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
10009
10196
  headingDecoration: headingDecorationSchema.nullable().optional(),
10010
10197
  // Author-level override consumed by later block/editor rendering phases.
@@ -10838,6 +11025,34 @@ var paletteVariantsById = new Map(
10838
11025
  paletteVariants.map((v) => [v.id, v])
10839
11026
  );
10840
11027
 
11028
+ // ../theme-core/src/accordions/siteStyleDefaults.ts
11029
+ var softEarthAccordionSystem = {
11030
+ background: {
11031
+ type: "solid",
11032
+ colorToken: "background"
11033
+ },
11034
+ spacing: "comfortable",
11035
+ corners: "square",
11036
+ border: null,
11037
+ shadow: null,
11038
+ icon: {
11039
+ style: "plus-minus",
11040
+ position: "right",
11041
+ size: "md",
11042
+ colorToken: "primary"
11043
+ },
11044
+ trigger: {
11045
+ textColorToken: "text",
11046
+ fontWeight: "medium"
11047
+ },
11048
+ hover: {
11049
+ textColorToken: "primary"
11050
+ },
11051
+ content: {
11052
+ textColorToken: "neutral-700"
11053
+ }
11054
+ };
11055
+
10841
11056
  // ../theme-core/src/site-styles/headerLooks.ts
10842
11057
  function asHeaderLookId(value) {
10843
11058
  return value;
@@ -10893,7 +11108,7 @@ var headerLayoutCatalog = [
10893
11108
  description: "Detached header chrome that sits over the opening section.",
10894
11109
  structure: "floating-shell",
10895
11110
  variant: "floating",
10896
- defaultPositioning: "fixed",
11111
+ defaultPositioning: "sticky",
10897
11112
  shrinkOnScroll: true,
10898
11113
  maxRecommendedNavItems: 5,
10899
11114
  allowedLogoShapes: ["none", "text-only", "horizontal"]
@@ -10910,7 +11125,9 @@ var headerStyleCatalog = [
10910
11125
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10911
11126
  navInteraction: "color-change",
10912
11127
  surface: "neutral",
10913
- navTypography: "plain"
11128
+ defaultDepth: "none",
11129
+ navTypography: "plain",
11130
+ moods: ["calm", "professional", "editorial"]
10914
11131
  },
10915
11132
  {
10916
11133
  id: asHeaderStyleId("fine-line"),
@@ -10919,7 +11136,9 @@ var headerStyleCatalog = [
10919
11136
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10920
11137
  navInteraction: "underline-grow",
10921
11138
  surface: "bordered",
10922
- navTypography: "plain"
11139
+ defaultDepth: "line",
11140
+ navTypography: "plain",
11141
+ moods: ["calm", "professional", "editorial"]
10923
11142
  },
10924
11143
  {
10925
11144
  id: asHeaderStyleId("soft-bar"),
@@ -10928,7 +11147,9 @@ var headerStyleCatalog = [
10928
11147
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10929
11148
  navInteraction: "pill-background",
10930
11149
  surface: "soft",
10931
- navTypography: "plain"
11150
+ defaultDepth: "line",
11151
+ navTypography: "plain",
11152
+ moods: ["calm", "professional"]
10932
11153
  },
10933
11154
  {
10934
11155
  id: asHeaderStyleId("pill-nav"),
@@ -10937,7 +11158,9 @@ var headerStyleCatalog = [
10937
11158
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10938
11159
  navInteraction: "pill-background",
10939
11160
  surface: "soft",
10940
- navTypography: "plain"
11161
+ defaultDepth: "none",
11162
+ navTypography: "plain",
11163
+ moods: ["calm"]
10941
11164
  },
10942
11165
  {
10943
11166
  id: asHeaderStyleId("brand-bar"),
@@ -10946,7 +11169,9 @@ var headerStyleCatalog = [
10946
11169
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10947
11170
  navInteraction: "color-change",
10948
11171
  surface: "brand-solid",
10949
- navTypography: "brand-caps"
11172
+ defaultDepth: "none",
11173
+ navTypography: "brand-caps",
11174
+ moods: ["professional", "expressive", "utility"]
10950
11175
  },
10951
11176
  {
10952
11177
  id: asHeaderStyleId("brand-underline"),
@@ -10955,7 +11180,9 @@ var headerStyleCatalog = [
10955
11180
  supportedLayoutIds: supportedLayouts(["classic"]),
10956
11181
  navInteraction: "underline-grow",
10957
11182
  surface: "brand-solid",
10958
- navTypography: "brand-caps"
11183
+ defaultDepth: "none",
11184
+ navTypography: "brand-caps",
11185
+ moods: ["expressive"]
10959
11186
  },
10960
11187
  {
10961
11188
  id: asHeaderStyleId("brand-pill"),
@@ -10964,7 +11191,9 @@ var headerStyleCatalog = [
10964
11191
  supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
10965
11192
  navInteraction: "pill-background",
10966
11193
  surface: "brand-solid",
10967
- navTypography: "brand-caps"
11194
+ defaultDepth: "none",
11195
+ navTypography: "brand-caps",
11196
+ moods: ["expressive"]
10968
11197
  },
10969
11198
  {
10970
11199
  id: asHeaderStyleId("serif-line"),
@@ -10973,7 +11202,9 @@ var headerStyleCatalog = [
10973
11202
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10974
11203
  navInteraction: "underline-grow",
10975
11204
  surface: "bordered",
10976
- navTypography: "heading"
11205
+ defaultDepth: "line",
11206
+ navTypography: "heading",
11207
+ moods: ["editorial", "calm"]
10977
11208
  },
10978
11209
  {
10979
11210
  id: asHeaderStyleId("flat-tabs"),
@@ -10982,16 +11213,20 @@ var headerStyleCatalog = [
10982
11213
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10983
11214
  navInteraction: "flat-block",
10984
11215
  surface: "bordered",
10985
- navTypography: "quiet-caps"
11216
+ defaultDepth: "shadow",
11217
+ navTypography: "quiet-caps",
11218
+ moods: ["professional", "utility", "expressive"]
10986
11219
  },
10987
11220
  {
10988
11221
  id: asHeaderStyleId("glass"),
10989
11222
  label: "Glass",
10990
11223
  description: "Translucent chrome with frosted navigation backing.",
10991
- supportedLayoutIds: supportedLayouts(["classic", "floating"]),
11224
+ supportedLayoutIds: supportedLayouts(["floating"]),
10992
11225
  navInteraction: "glass-backed",
10993
11226
  surface: "floating",
10994
- navTypography: "plain"
11227
+ defaultDepth: "shadow",
11228
+ navTypography: "plain",
11229
+ moods: ["expressive", "calm"]
10995
11230
  },
10996
11231
  {
10997
11232
  id: asHeaderStyleId("minimal-surface"),
@@ -11000,7 +11235,9 @@ var headerStyleCatalog = [
11000
11235
  supportedLayoutIds: supportedLayouts(["floating"]),
11001
11236
  navInteraction: "color-change",
11002
11237
  surface: "floating",
11003
- navTypography: "plain"
11238
+ defaultDepth: "none",
11239
+ navTypography: "plain",
11240
+ moods: ["editorial", "calm"]
11004
11241
  },
11005
11242
  {
11006
11243
  id: asHeaderStyleId("soft-shell"),
@@ -11009,7 +11246,9 @@ var headerStyleCatalog = [
11009
11246
  supportedLayoutIds: supportedLayouts(["floating"]),
11010
11247
  navInteraction: "pill-background",
11011
11248
  surface: "floating",
11012
- navTypography: "plain"
11249
+ defaultDepth: "shadow",
11250
+ navTypography: "plain",
11251
+ moods: ["calm", "professional"]
11013
11252
  },
11014
11253
  {
11015
11254
  id: asHeaderStyleId("split-glass"),
@@ -11018,7 +11257,9 @@ var headerStyleCatalog = [
11018
11257
  supportedLayoutIds: supportedLayouts(["floating"]),
11019
11258
  navInteraction: "glass-backed",
11020
11259
  surface: "floating",
11021
- navTypography: "quiet-caps"
11260
+ defaultDepth: "shadow",
11261
+ navTypography: "quiet-caps",
11262
+ moods: ["expressive"]
11022
11263
  },
11023
11264
  {
11024
11265
  id: asHeaderStyleId("split-pill"),
@@ -11027,7 +11268,9 @@ var headerStyleCatalog = [
11027
11268
  supportedLayoutIds: supportedLayouts(["floating"]),
11028
11269
  navInteraction: "pill-background",
11029
11270
  surface: "floating",
11030
- navTypography: "heading"
11271
+ defaultDepth: "shadow",
11272
+ navTypography: "heading",
11273
+ moods: ["calm", "editorial"]
11031
11274
  }
11032
11275
  ];
11033
11276
  var headerLayoutsById = new Map(
@@ -11041,7 +11284,6 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11041
11284
  asHeaderLayoutId("classic"),
11042
11285
  headerStyleRepairChain([
11043
11286
  "minimal",
11044
- "glass",
11045
11287
  "fine-line",
11046
11288
  "soft-bar",
11047
11289
  "pill-nav",
@@ -11108,7 +11350,13 @@ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
11108
11350
  ],
11109
11351
  [
11110
11352
  asHeaderStyleId("glass"),
11111
- headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
11353
+ headerStyleRepairChain([
11354
+ "glass",
11355
+ "soft-shell",
11356
+ "fine-line",
11357
+ "minimal-surface",
11358
+ "minimal"
11359
+ ])
11112
11360
  ],
11113
11361
  [
11114
11362
  asHeaderStyleId("soft-shell"),
@@ -11220,6 +11468,23 @@ function getCompatibleHeaderStyleIds(layoutId) {
11220
11468
  }
11221
11469
  );
11222
11470
  }
11471
+ function themedHeaderShadow(theme) {
11472
+ switch (theme.shadow.elevation) {
11473
+ case "none":
11474
+ return void 0;
11475
+ case "low":
11476
+ return { elevation: "sm" };
11477
+ case "medium":
11478
+ return { elevation: "md" };
11479
+ case "high":
11480
+ return { elevation: "lg" };
11481
+ default:
11482
+ return assertNever(
11483
+ theme.shadow.elevation,
11484
+ "Unhandled theme shadow elevation"
11485
+ );
11486
+ }
11487
+ }
11223
11488
  function solidBrandHeader(theme) {
11224
11489
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
11225
11490
  return {
@@ -11369,9 +11634,7 @@ function practicalUtilityHeader(theme) {
11369
11634
  navColor: "text",
11370
11635
  navStyle: "solid",
11371
11636
  navWeight: "semibold",
11372
- shadow: {
11373
- elevation: "sm"
11374
- },
11637
+ shadow: themedHeaderShadow(theme),
11375
11638
  border: {
11376
11639
  style: "solid",
11377
11640
  width: "thin",
@@ -11440,6 +11703,7 @@ function floatingGlassHeader(theme) {
11440
11703
  return {
11441
11704
  ...transparentOverlayHeader(theme),
11442
11705
  variant: "floating",
11706
+ positioning: "sticky",
11443
11707
  navStyle: "frosted",
11444
11708
  navContainer: {
11445
11709
  type: "glass",
@@ -11955,7 +12219,7 @@ var typographyPresets = [
11955
12219
  heroTypography: {
11956
12220
  headlineSize: "6xl",
11957
12221
  headlineLineHeight: "tight",
11958
- subheadlineSize: "editorial",
12222
+ subheadlineSize: "2xl",
11959
12223
  subheadlineLineHeight: "normal",
11960
12224
  microHeadlineSize: "6xl",
11961
12225
  microHeadlineLineHeight: "tight",
@@ -11973,6 +12237,8 @@ var typographyPresetsById = new Map(
11973
12237
  );
11974
12238
 
11975
12239
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
12240
+ var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
12241
+ var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
11976
12242
  var curatedSiteStyleIdValues = [
11977
12243
  "site-style:calm-studio",
11978
12244
  "site-style:clear-professional",
@@ -11984,7 +12250,7 @@ var curatedSiteStyleIdValues = [
11984
12250
  "site-style:personal-retreat-journal",
11985
12251
  "site-style:tactile-workshop",
11986
12252
  "site-style:modern-wellness",
11987
- "site-style:soft-earth",
12253
+ SOFT_EARTH_SITE_STYLE_ID_VALUE,
11988
12254
  "site-style:bold-launch",
11989
12255
  "site-style:south-west-twerk-school"
11990
12256
  ];
@@ -12066,7 +12332,10 @@ function uniqueContentFrameKinds() {
12066
12332
  var generatedContentFrameKinds = uniqueContentFrameKinds();
12067
12333
  function defineCuratedSiteStyle(input) {
12068
12334
  const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
12069
- const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
12335
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(
12336
+ legacyHeaderLookIds,
12337
+ input.tokenRecipes
12338
+ );
12070
12339
  const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
12071
12340
  const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
12072
12341
  if (!typographyPresetChoices.some(
@@ -12099,6 +12368,7 @@ function defineCuratedSiteStyle(input) {
12099
12368
  supportedTransitions: generatedDesignOptionCatalog.transitions
12100
12369
  },
12101
12370
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
12371
+ ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
12102
12372
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
12103
12373
  defaultHeaderSelection: input.defaultHeaderSelection ? {
12104
12374
  layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
@@ -12157,7 +12427,69 @@ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
12157
12427
  };
12158
12428
  return [first, ...choices.slice(1)];
12159
12429
  }
12160
- function inferHeaderCurationFromLegacyLooks(lookIds) {
12430
+ function uniqueCompatibleHeaderStyleChoices(choices, fallbackLayoutId) {
12431
+ const compatible = new Set(getCompatibleHeaderStyleIds(fallbackLayoutId));
12432
+ const seen = /* @__PURE__ */ new Set();
12433
+ const unique = choices.filter((choice) => {
12434
+ if (!compatible.has(choice.id)) return false;
12435
+ if (seen.has(choice.id)) return false;
12436
+ seen.add(choice.id);
12437
+ return true;
12438
+ });
12439
+ return nonEmptyHeaderStyleChoices(unique, fallbackLayoutId);
12440
+ }
12441
+ function inferredHeaderStyleValuesForRecipes(layoutId, recipes) {
12442
+ switch (layoutId) {
12443
+ case "classic":
12444
+ if (isExpressiveRecipe(recipes)) {
12445
+ return [
12446
+ "brand-bar",
12447
+ "brand-underline",
12448
+ "flat-tabs",
12449
+ "brand-pill",
12450
+ "fine-line"
12451
+ ];
12452
+ }
12453
+ if (recipes.spacing === "compact") {
12454
+ return ["flat-tabs", "fine-line", "minimal", "brand-bar"];
12455
+ }
12456
+ if (isSerifTypographyRecipe(recipes)) {
12457
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12458
+ }
12459
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12460
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12461
+ }
12462
+ return ["fine-line", "minimal", "soft-bar", "brand-bar"];
12463
+ case "centered":
12464
+ if (isSerifTypographyRecipe(recipes)) {
12465
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12466
+ }
12467
+ if (isExpressiveRecipe(recipes)) {
12468
+ return ["brand-pill", "flat-tabs", "brand-bar", "fine-line"];
12469
+ }
12470
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12471
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12472
+ }
12473
+ return ["minimal", "fine-line", "soft-bar"];
12474
+ case "floating":
12475
+ if (isExpressiveRecipe(recipes)) {
12476
+ return ["glass", "split-glass", "brand-pill", "soft-shell"];
12477
+ }
12478
+ if (isSerifTypographyRecipe(recipes)) {
12479
+ return ["split-pill", "minimal-surface", "soft-shell"];
12480
+ }
12481
+ return ["soft-shell", "minimal-surface", "glass"];
12482
+ default:
12483
+ return [];
12484
+ }
12485
+ }
12486
+ function isExpressiveRecipe(recipes) {
12487
+ return recipes.contrast === "maximum" || recipes.shadow === "layered" || recipes.motion === "expressive";
12488
+ }
12489
+ function isSerifTypographyRecipe(recipes) {
12490
+ return recipes.typography === "serif-editorial" || recipes.typography === "classic-serif";
12491
+ }
12492
+ function inferHeaderCurationFromLegacyLooks(lookIds, recipes) {
12161
12493
  const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
12162
12494
  (selection) => Boolean(selection)
12163
12495
  );
@@ -12170,8 +12502,15 @@ function inferHeaderCurationFromLegacyLooks(lookIds) {
12170
12502
  );
12171
12503
  const stylesByLayout = {};
12172
12504
  for (const layoutChoice of layoutChoices) {
12173
- const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12174
- stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
12505
+ const legacyStyleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12506
+ const inferredStyleChoices = inferredHeaderStyleValuesForRecipes(
12507
+ layoutChoice.id,
12508
+ recipes
12509
+ ).map((styleId) => headerStyleChoice(styleId));
12510
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = uniqueCompatibleHeaderStyleChoices(
12511
+ [...legacyStyleChoices, ...inferredStyleChoices],
12512
+ layoutChoice.id
12513
+ );
12175
12514
  }
12176
12515
  return {
12177
12516
  defaultHeaderSelection,
@@ -12591,10 +12930,10 @@ var curatedSiteStyles = [
12591
12930
  ]
12592
12931
  }),
12593
12932
  defineCuratedSiteStyle({
12594
- id: "site-style:soft-earth",
12933
+ id: SOFT_EARTH_SITE_STYLE_ID,
12595
12934
  name: "Soft Earth",
12596
12935
  description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
12597
- 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.",
12936
+ generationBrief: "Use cream space, terracotta CTAs, olive quote bands, natural imagery, generous but composed spacing, and editorial serif headings. Prefer a real intro section, image-led offering cards, warm community quotes, and an FAQ with a full-width intro above two columns of questions when content allows.",
12598
12937
  siteCreatorSelection: {
12599
12938
  kind: "site_creator_keyword_heuristic",
12600
12939
  priority: 45
@@ -12664,14 +13003,18 @@ var curatedSiteStyles = [
12664
13003
  paragraphSize: "default",
12665
13004
  headingSize: "editorial"
12666
13005
  }
12667
- }
13006
+ },
13007
+ accordions: softEarthAccordionSystem
13008
+ },
13009
+ defaultBlockVariants: {
13010
+ "block.faq": "question-columns"
12668
13011
  },
12669
13012
  recommendedAppearancePresetIds: [
12670
13013
  "hero-brand-scrim",
12671
- "intro-soft-earth-statement",
12672
- "feature-cards-soft-earth-offerings",
12673
- "testimonials-soft-earth-proof-band",
12674
- "faq-soft-earth-two-column",
13014
+ "intro-organic-statement",
13015
+ "feature-cards-raised-rule",
13016
+ "events-lined-panel",
13017
+ "testimonials-brand-background-quotes",
12675
13018
  "contact-form-panel"
12676
13019
  ],
12677
13020
  recommendedHeaderLookIds: [
@@ -12775,7 +13118,7 @@ var curatedSiteStyles = [
12775
13118
  "hero-brand-scrim-fixed-frame",
12776
13119
  "body-text-editorial-intro",
12777
13120
  "schedule-details-brand-depth",
12778
- "testimonials-accent-quote-proof",
13121
+ "testimonials-accent-quote-cards",
12779
13122
  "contact-form-brand-depth-card"
12780
13123
  ],
12781
13124
  recommendedHeaderLookIds: [
@@ -12870,6 +13213,7 @@ var themeV2RuntimeStyleFieldNames = [
12870
13213
  ];
12871
13214
  var themeV2BlockSpecificRawStyleFieldNames = [
12872
13215
  "_contentCardStyles",
13216
+ "_heroLayoutStyles",
12873
13217
  "_textCardStyles"
12874
13218
  ];
12875
13219
  var themeV2NormalEditorRawStyleFieldNames = [
@@ -12879,6 +13223,10 @@ var themeV2NormalEditorRawStyleFieldNames = [
12879
13223
  var themeV2NormalEditorRawStyleFieldNameSet = new Set(
12880
13224
  themeV2NormalEditorRawStyleFieldNames
12881
13225
  );
13226
+ var themeV2CompilerOwnedFieldNames = [
13227
+ ...themeV2RuntimeStyleFieldNames,
13228
+ ...themeV2BlockSpecificRawStyleFieldNames
13229
+ ];
12882
13230
 
12883
13231
  // ../theme-core/src/site-styles/designState.ts
12884
13232
  var themeV2DesignStateSchemaVersion = 1;
@@ -12893,6 +13241,16 @@ var heroLegibilityStrategySchema = z23.enum([
12893
13241
  "scrim-gradient",
12894
13242
  "solid-panel"
12895
13243
  ]);
13244
+ var heroCompositionIntentSchema = z23.enum([
13245
+ "center",
13246
+ "bottom-left"
13247
+ ]);
13248
+ var heroTypographyScaleIntentSchema = z23.enum([
13249
+ "quiet",
13250
+ "editorial",
13251
+ "display",
13252
+ "poster"
13253
+ ]);
12896
13254
  var sectionHeightIntentSchema = z23.enum([
12897
13255
  "default",
12898
13256
  "banner",
@@ -12928,6 +13286,7 @@ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
12928
13286
  ]);
12929
13287
  var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
12930
13288
  var tileTreatmentSchema = z23.enum(tileTreatmentValues);
13289
+ var eventListTreatmentSchema = z23.enum(eventListTreatmentValues);
12931
13290
  var eyebrowTreatmentSchema = z23.enum(eyebrowTreatmentValues);
12932
13291
  function uniqueNonEmpty(values) {
12933
13292
  const uniqueValues = [...new Set(values)];
@@ -12969,10 +13328,13 @@ var blockDesignPlanSchema = z23.object({
12969
13328
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
12970
13329
  sectionHeight: sectionHeightIntentSchema.optional(),
12971
13330
  heroLegibility: heroLegibilityStrategySchema.optional(),
13331
+ heroComposition: heroCompositionIntentSchema.optional(),
13332
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
12972
13333
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
12973
13334
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
12974
13335
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
12975
13336
  tileTreatment: tileTreatmentSchema.optional(),
13337
+ eventListTreatment: eventListTreatmentSchema.optional(),
12976
13338
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
12977
13339
  }).strict();
12978
13340
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
@@ -14372,6 +14734,7 @@ function styledSection(config) {
14372
14734
  renderBackgroundImage = true,
14373
14735
  backgroundImageLoading,
14374
14736
  backgroundImageFetchPriority,
14737
+ allowOverflow = false,
14375
14738
  fullWidthPath
14376
14739
  } = config;
14377
14740
  const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
@@ -14406,7 +14769,7 @@ function styledSection(config) {
14406
14769
  // No fallback needed - transform handles all cases via defaultSpacing
14407
14770
  }
14408
14771
  },
14409
- allowOverflow: {
14772
+ allowOverflow: allowOverflow ? true : {
14410
14773
  $bind: {
14411
14774
  from: `${bindFrom}.background`,
14412
14775
  transforms: [{ id: "background.resolveAllowOverflow" }],
@@ -15090,6 +15453,14 @@ var tileTreatmentSet = new Set(tileTreatmentValues);
15090
15453
  function isTileTreatment(value) {
15091
15454
  return typeof value === "string" && tileTreatmentSet.has(value);
15092
15455
  }
15456
+ var eventListTreatmentClassMap = {
15457
+ plain: "",
15458
+ "lined-panel": "rb-event-list-treatment-lined-panel"
15459
+ };
15460
+ var eventListTreatmentSet = new Set(eventListTreatmentValues);
15461
+ function isEventListTreatment(value) {
15462
+ return typeof value === "string" && eventListTreatmentSet.has(value);
15463
+ }
15093
15464
  var sectionClassNameTransform = {
15094
15465
  id: "sectionStyles.resolveClassName",
15095
15466
  kind: "string",
@@ -15157,6 +15528,17 @@ var sectionClassNameTransform = {
15157
15528
  `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
15158
15529
  );
15159
15530
  }
15531
+ const eventListTreatment = input?.eventListTreatment;
15532
+ if (isEventListTreatment(eventListTreatment)) {
15533
+ const eventListTreatmentClass = eventListTreatmentClassMap[eventListTreatment];
15534
+ if (eventListTreatmentClass) {
15535
+ classes.push(eventListTreatmentClass);
15536
+ }
15537
+ } else if (typeof eventListTreatment === "string" && process.env.NODE_ENV !== "production") {
15538
+ console.warn(
15539
+ `[sectionStyles] Invalid eventListTreatment value in _sectionStyles: "${eventListTreatment}". Expected one of: ${eventListTreatmentValues.join(", ")}.`
15540
+ );
15541
+ }
15160
15542
  if (hasFixedFrameBackgroundMotion(input)) {
15161
15543
  classes.push(fixedFrameScopeClass);
15162
15544
  }
@@ -15592,6 +15974,35 @@ function sectionState(opts) {
15592
15974
  );
15593
15975
  }
15594
15976
 
15977
+ // ../blocks/src/system/node/fragments/headingDecoration.ts
15978
+ var defaultBindFrom = "_sectionStyles.headingDecoration";
15979
+ function headingDecoration({
15980
+ bindFrom = defaultBindFrom,
15981
+ family,
15982
+ placement,
15983
+ className
15984
+ }) {
15985
+ return el(
15986
+ "div",
15987
+ {
15988
+ "aria-hidden": "true",
15989
+ className: {
15990
+ $bind: {
15991
+ from: bindFrom,
15992
+ transforms: [
15993
+ {
15994
+ id: "ui.headingDecorationClassName",
15995
+ options: { baseClass: className, family }
15996
+ }
15997
+ ]
15998
+ }
15999
+ }
16000
+ },
16001
+ null,
16002
+ when(`${bindFrom}.placement`, { equals: placement })
16003
+ );
16004
+ }
16005
+
15595
16006
  // ../blocks/src/system/fragments/types.ts
15596
16007
  import { z as z27 } from "zod";
15597
16008
  var FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
@@ -16370,6 +16781,10 @@ var testimonialsHeadingFragment = defineFragment({
16370
16781
  when("content.heading"),
16371
16782
  bind("content.heading")
16372
16783
  ),
16784
+ headingDecoration({
16785
+ family: "short-center-rule",
16786
+ placement: "under-centered-heading"
16787
+ }),
16373
16788
  text(
16374
16789
  {
16375
16790
  as: "p",
@@ -17041,6 +17456,41 @@ var faqHeadingFragment = defineFragment({
17041
17456
  });
17042
17457
 
17043
17458
  // ../blocks/src/system/fragments/library/faqAccordion.ts
17459
+ function createFaqAccordionLayout(options = {}) {
17460
+ return accordionList({
17461
+ collection: "content.items",
17462
+ itemName: "faqItem",
17463
+ indexName: "faqIndex",
17464
+ accordionProps: {
17465
+ className: options.rootClassName ?? "accordion-root",
17466
+ type: "single",
17467
+ collapsible: true
17468
+ },
17469
+ itemProps: {
17470
+ className: {
17471
+ $bind: {
17472
+ from: "content._cardStyles",
17473
+ transforms: [
17474
+ {
17475
+ id: "boxStyles.all",
17476
+ options: {
17477
+ axis: "all",
17478
+ includeSpacing: false,
17479
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
17480
+ }
17481
+ }
17482
+ ]
17483
+ },
17484
+ fallback: "rb-faq-item"
17485
+ },
17486
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17487
+ // Legacy theme accordion style
17488
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17489
+ },
17490
+ triggerFrom: "faqItem.question",
17491
+ contentFrom: "faqItem.answer"
17492
+ });
17493
+ }
17044
17494
  var faqAccordionFragment = defineFragment({
17045
17495
  id: "faqAccordion",
17046
17496
  title: "FAQ Accordion",
@@ -17074,40 +17524,7 @@ var faqAccordionFragment = defineFragment({
17074
17524
  }
17075
17525
  }
17076
17526
  ],
17077
- layout: accordionList({
17078
- collection: "content.items",
17079
- itemName: "faqItem",
17080
- indexName: "faqIndex",
17081
- accordionProps: {
17082
- className: "accordion-root",
17083
- // CSS-first: all styling handled by theme CSS
17084
- type: "single",
17085
- collapsible: true
17086
- },
17087
- itemProps: {
17088
- className: {
17089
- $bind: {
17090
- from: "content._cardStyles",
17091
- transforms: [
17092
- {
17093
- id: "boxStyles.all",
17094
- options: {
17095
- axis: "all",
17096
- includeSpacing: false,
17097
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden rb-border"
17098
- }
17099
- }
17100
- ]
17101
- },
17102
- fallback: "rb-faq-item"
17103
- },
17104
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17105
- // Legacy theme accordion style
17106
- iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17107
- },
17108
- triggerFrom: "faqItem.question",
17109
- contentFrom: "faqItem.answer"
17110
- })
17527
+ layout: createFaqAccordionLayout()
17111
17528
  });
17112
17529
 
17113
17530
  // ../blocks/src/system/fragments/library/card.ts
@@ -18160,6 +18577,7 @@ var microLayout = styledSection({
18160
18577
  function splitLayoutWith(children) {
18161
18578
  return styledSection({
18162
18579
  children: styledContainer({
18580
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
18163
18581
  children: {
18164
18582
  type: "grid",
18165
18583
  props: {
@@ -18184,6 +18602,7 @@ function splitLayoutWith(children) {
18184
18602
  // The split variants render the image as a real grid column, so suppress
18185
18603
  // the default absolute background image layer while keeping color/overlay.
18186
18604
  renderBackgroundImage: false,
18605
+ allowOverflow: true,
18187
18606
  baseClass: ""
18188
18607
  });
18189
18608
  }
@@ -18337,6 +18756,21 @@ function introHeading(className) {
18337
18756
  bind("content.title")
18338
18757
  );
18339
18758
  }
18759
+ function introHeadingGroup(className) {
18760
+ return stack(
18761
+ {
18762
+ gap: "sm",
18763
+ className: "rb-intro-heading-group"
18764
+ },
18765
+ [
18766
+ introHeading(className),
18767
+ headingDecoration({
18768
+ family: "organic-squiggle",
18769
+ placement: "after-heading"
18770
+ })
18771
+ ]
18772
+ );
18773
+ }
18340
18774
  function introBody(className = "rb-prose rb-max-w-none") {
18341
18775
  return richText({ className }, bind("content.body"));
18342
18776
  }
@@ -18355,6 +18789,10 @@ function introCopyStack(options = {}) {
18355
18789
  },
18356
18790
  [
18357
18791
  introHeading(options.headingClassName ?? "rb-intro-title"),
18792
+ headingDecoration({
18793
+ family: "organic-squiggle",
18794
+ placement: "after-heading"
18795
+ }),
18358
18796
  introBody(options.bodyClassName),
18359
18797
  introCtas(options.ctaJustify)
18360
18798
  ]
@@ -18394,7 +18832,7 @@ var statementCopyLayout = styledSection({
18394
18832
  className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
18395
18833
  },
18396
18834
  [
18397
- introHeading("rb-intro-title rb-max-w-xl"),
18835
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18398
18836
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18399
18837
  introBody(),
18400
18838
  introCtas("start")
@@ -18415,7 +18853,7 @@ var statementMediaLayout = styledSection({
18415
18853
  className: "rb-intro rb-intro-statement-media rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-3 rb-lg-items-center"
18416
18854
  },
18417
18855
  [
18418
- introHeading("rb-intro-title rb-max-w-xl"),
18856
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18419
18857
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18420
18858
  introBody(),
18421
18859
  introCtas("start")
@@ -19417,6 +19855,9 @@ function isNodeDefinitionArray(layout) {
19417
19855
  }
19418
19856
  var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
19419
19857
  var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
19858
+ var questionColumnsAccordionLayout = createFaqAccordionLayout({
19859
+ rootClassName: "accordion-root rb-faq-question-columns rb-grid rb-grid-cols-1 rb-gap-4 rb-lg-grid-cols-2"
19860
+ });
19420
19861
  var defaultLayout = styledSection({
19421
19862
  children: styledContainer({
19422
19863
  baseClassName: "rb-relative rb-isolate",
@@ -19430,11 +19871,24 @@ var twoColumnLayout = styledSection({
19430
19871
  children: el(
19431
19872
  "div",
19432
19873
  {
19433
- className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19874
+ className: "rb-faq-split-heading rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19434
19875
  },
19435
19876
  [
19436
- el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
19437
- el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
19877
+ el("div", { className: "rb-faq-split-heading-copy" }, [headingLayout]),
19878
+ el("div", { className: "rb-faq-split-heading-accordion" }, [accordionLayout])
19879
+ ]
19880
+ )
19881
+ }),
19882
+ baseClass: ""
19883
+ });
19884
+ var questionColumnsLayout = styledSection({
19885
+ children: styledContainer({
19886
+ baseClassName: "rb-relative rb-isolate",
19887
+ children: stack(
19888
+ { gap: "xl", className: "rb-w-full" },
19889
+ [
19890
+ headingLayout,
19891
+ questionColumnsAccordionLayout
19438
19892
  ]
19439
19893
  )
19440
19894
  }),
@@ -19459,7 +19913,8 @@ var faqManifest = createBlockManifest({
19459
19913
  layout: defaultLayout,
19460
19914
  variants: {
19461
19915
  default: defaultLayout,
19462
- "two-column": twoColumnLayout
19916
+ "two-column": twoColumnLayout,
19917
+ "question-columns": questionColumnsLayout
19463
19918
  },
19464
19919
  defaultVariant: "default",
19465
19920
  variantOptions: {
@@ -19470,6 +19925,10 @@ var faqManifest = createBlockManifest({
19470
19925
  "two-column": {
19471
19926
  label: "Two column",
19472
19927
  description: "A left heading column with FAQ items on the right."
19928
+ },
19929
+ "question-columns": {
19930
+ label: "Question columns",
19931
+ description: "A full-width heading above FAQ items split into two columns."
19473
19932
  }
19474
19933
  },
19475
19934
  description: "Accordion of frequently asked questions and answers.",
@@ -19591,9 +20050,21 @@ var eyebrowTreatmentClassMap = {
19591
20050
  "accent-pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent rb-eyebrow-treatment-pill-bounce"
19592
20051
  };
19593
20052
  var eyebrowTreatmentSet = new Set(eyebrowTreatmentValues);
20053
+ var headingDecorationFamilySet = new Set(visibleHeadingDecorationFamilyValues);
20054
+ var headingDecorationPlacementSet = new Set(visibleHeadingDecorationPlacementValues);
20055
+ var headingDecorationColorTokenSet = new Set(headingDecorationColorTokenValues);
19594
20056
  function isEyebrowTreatment(value) {
19595
20057
  return typeof value === "string" && eyebrowTreatmentSet.has(value);
19596
20058
  }
20059
+ function isHeadingDecorationFamily(value) {
20060
+ return typeof value === "string" && headingDecorationFamilySet.has(value);
20061
+ }
20062
+ function isHeadingDecorationPlacement(value) {
20063
+ return typeof value === "string" && headingDecorationPlacementSet.has(value);
20064
+ }
20065
+ function isHeadingDecorationColorToken(value) {
20066
+ return typeof value === "string" && headingDecorationColorTokenSet.has(value);
20067
+ }
19597
20068
  var imageGalleryCornerClassMap = {
19598
20069
  none: "",
19599
20070
  sm: "rb-rounded-sm",
@@ -19697,6 +20168,10 @@ var sectionStateToneTransform = {
19697
20168
  summary: "Map semantic section-state kind to feedback tone",
19698
20169
  run: (value) => sectionStateToneFromUnknown(value)
19699
20170
  };
20171
+ var heroTitleLengthThresholds = {
20172
+ medium: { maxCharacters: 42, maxWords: 6 },
20173
+ long: { maxCharacters: 78, maxWords: 11 }
20174
+ };
19700
20175
  function isPlainObject(value) {
19701
20176
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
19702
20177
  }
@@ -19704,6 +20179,14 @@ function readString(obj, key) {
19704
20179
  const v = obj[key];
19705
20180
  return typeof v === "string" ? v : void 0;
19706
20181
  }
20182
+ function resolveGeneratedHeroLayoutStyles(content) {
20183
+ const raw = content._heroLayoutStyles;
20184
+ return isPlainObject(raw) ? raw : null;
20185
+ }
20186
+ function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
20187
+ const generated = resolveGeneratedHeroLayoutStyles(content);
20188
+ return generated && typeof generated[generatedKey] === "string" ? generated[generatedKey] : readString(content, fallbackKey);
20189
+ }
19707
20190
  function resolveHeroVariant(content) {
19708
20191
  const variant = readString(content, "variant");
19709
20192
  if (variant && variant.trim()) return variant.trim();
@@ -19712,14 +20195,14 @@ function resolveHeroVariant(content) {
19712
20195
  return null;
19713
20196
  }
19714
20197
  function resolveHeroContentAlignment(content) {
19715
- const raw = readString(content, "contentAlignment");
20198
+ const raw = readHeroLayoutString(content, "contentAlignment");
19716
20199
  if (raw === "left" || raw === "center" || raw === "right") return raw;
19717
20200
  const variant = resolveHeroVariant(content);
19718
20201
  if (variant === "split" || variant === "splitReverse") return "left";
19719
20202
  return "center";
19720
20203
  }
19721
20204
  function resolveHeroVerticalAlignment(content) {
19722
- const raw = readString(content, "verticalAlignment");
20205
+ const raw = readHeroLayoutString(content, "verticalAlignment");
19723
20206
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
19724
20207
  const sectionStyles = asPartialObject(content._sectionStyles);
19725
20208
  const minHeight = sectionStyles?.minHeight;
@@ -19729,11 +20212,29 @@ function resolveHeroVerticalAlignment(content) {
19729
20212
  return "top";
19730
20213
  }
19731
20214
  function resolveHeroContentMaxWidth(content) {
19732
- const raw = readString(content, "contentMaxWidth");
20215
+ const raw = readHeroLayoutString(content, "contentMaxWidth");
19733
20216
  if (raw === "default" || raw === "narrow" || raw === "medium" || raw === "wide")
19734
20217
  return raw;
19735
20218
  return "default";
19736
20219
  }
20220
+ function resolveHeroTypographyScale(content) {
20221
+ const raw = readHeroLayoutString(
20222
+ content,
20223
+ "typographyScale",
20224
+ "heroTypographyScale"
20225
+ );
20226
+ if (raw === "quiet" || raw === "editorial" || raw === "display" || raw === "poster") {
20227
+ return raw;
20228
+ }
20229
+ return null;
20230
+ }
20231
+ function resolveHeroTitleLength(content) {
20232
+ const headline = readString(content, "headline")?.trim() ?? "";
20233
+ const wordCount = headline.length === 0 ? 0 : headline.split(/\s+/).length;
20234
+ if (headline.length > heroTitleLengthThresholds.long.maxCharacters || wordCount > heroTitleLengthThresholds.long.maxWords) return "long";
20235
+ if (headline.length > heroTitleLengthThresholds.medium.maxCharacters || wordCount > heroTitleLengthThresholds.medium.maxWords) return "medium";
20236
+ return "short";
20237
+ }
19737
20238
  var heroContentWrapperClassSchema = z33.object({
19738
20239
  base: z33.string().optional()
19739
20240
  });
@@ -19746,6 +20247,8 @@ var heroContentWrapperClassTransform = {
19746
20247
  const content = isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {};
19747
20248
  const alignment = resolveHeroContentAlignment(content);
19748
20249
  const maxWidth = resolveHeroContentMaxWidth(content);
20250
+ const typographyScale = resolveHeroTypographyScale(content);
20251
+ const titleLength = resolveHeroTitleLength(content);
19749
20252
  const textAlignClass = alignment === "center" ? "rb-text-center" : alignment === "right" ? "rb-text-right" : "rb-text-left";
19750
20253
  const maxWidthClass = maxWidth === "narrow" ? "rb-max-w-2xl" : maxWidth === "medium" ? "rb-max-w-3xl" : maxWidth === "wide" ? "rb-max-w-5xl" : "";
19751
20254
  const positionClass = alignment === "center" ? "rb-mx-auto" : alignment === "right" ? "rb-ml-auto" : "";
@@ -19753,7 +20256,9 @@ var heroContentWrapperClassTransform = {
19753
20256
  options?.base,
19754
20257
  textAlignClass,
19755
20258
  maxWidthClass,
19756
- positionClass
20259
+ positionClass,
20260
+ typographyScale ? `rb-hero-typography-${typographyScale}` : "",
20261
+ `rb-hero-title-${titleLength}`
19757
20262
  ]);
19758
20263
  }
19759
20264
  };
@@ -20053,11 +20558,67 @@ var uiTransforms = [
20053
20558
  const treatment = isEyebrowTreatment(value) ? value : "plain";
20054
20559
  return joinClasses3([baseClass, eyebrowTreatmentClassMap[treatment]]);
20055
20560
  }
20561
+ },
20562
+ {
20563
+ id: "ui.headingDecorationClassName",
20564
+ kind: "string",
20565
+ summary: "Apply constrained Theme V2 heading decoration classes",
20566
+ run: (value, options) => {
20567
+ const baseClass = typeof options?.baseClass === "string" && options.baseClass.trim() ? options.baseClass : "rb-heading-decoration";
20568
+ const decoration = asPartialObject(value);
20569
+ const family = isHeadingDecorationFamily(decoration?.family) ? decoration.family : null;
20570
+ const allowedFamily = isHeadingDecorationFamily(options?.family) ? options.family : null;
20571
+ const placement = isHeadingDecorationPlacement(decoration?.placement) ? decoration.placement : null;
20572
+ const colorToken = isHeadingDecorationColorToken(decoration?.colorToken) ? decoration.colorToken : "primary";
20573
+ if (!family || !placement) return "rb-hidden";
20574
+ if (allowedFamily && family !== allowedFamily) return "rb-hidden";
20575
+ return joinClasses3([
20576
+ baseClass,
20577
+ `rb-heading-decoration-${family}`,
20578
+ `rb-heading-decoration-placement-${placement}`,
20579
+ `rb-heading-decoration-color-${colorToken}`
20580
+ ]);
20581
+ }
20056
20582
  }
20057
20583
  ];
20058
20584
 
20059
20585
  // ../blocks/src/system/transforms/registry/layout.ts
20060
20586
  import { z as z34 } from "zod";
20587
+
20588
+ // ../theme-core/src/siteChromePlacement.ts
20589
+ var HEADER_POSITIONINGS = ["static", "sticky", "fixed"];
20590
+ function parseHeaderPositioning(value) {
20591
+ return isHeaderPositioning(value) ? value : "static";
20592
+ }
20593
+ function isHeaderPositioning(value) {
20594
+ return typeof value === "string" && HEADER_POSITIONINGS.includes(value);
20595
+ }
20596
+ function planSiteChromePlacement(positioning) {
20597
+ switch (positioning) {
20598
+ case "static":
20599
+ return {
20600
+ kind: "static",
20601
+ headerRootClassName: null,
20602
+ standaloneShellClassName: null
20603
+ };
20604
+ case "sticky":
20605
+ return {
20606
+ kind: "sticky",
20607
+ headerRootClassName: "rb-sticky rb-top-0",
20608
+ standaloneShellClassName: "sticky top-0 z-40 w-full"
20609
+ };
20610
+ case "fixed":
20611
+ return {
20612
+ kind: "fixed",
20613
+ headerRootClassName: "rb-fixed rb-top-0 rb-left-0 rb-right-0",
20614
+ standaloneShellClassName: "fixed left-0 right-0 top-0 z-40 w-full"
20615
+ };
20616
+ default:
20617
+ return assertNever(positioning);
20618
+ }
20619
+ }
20620
+
20621
+ // ../blocks/src/system/transforms/registry/layout.ts
20061
20622
  var joinClasses4 = (parts) => parts.filter(
20062
20623
  (part) => typeof part === "string" && part.trim().length > 0
20063
20624
  ).join(" ").replace(/\s+/g, " ").trim();
@@ -20173,7 +20734,8 @@ var headerRootClassTransform = {
20173
20734
  ...options
20174
20735
  };
20175
20736
  const content = asPartialObject(value) ?? {};
20176
- const positioning = typeof content.positioning === "string" ? content.positioning : "static";
20737
+ const positioning = parseHeaderPositioning(content.positioning);
20738
+ const placement = planSiteChromePlacement(positioning);
20177
20739
  const shrinkOnScroll = Boolean(content.shrinkOnScroll);
20178
20740
  const header = asPartialObject(value);
20179
20741
  const visuals = resolveHeaderVisualStyles(header, context.theme);
@@ -20185,14 +20747,14 @@ var headerRootClassTransform = {
20185
20747
  if (config.blur) classes.push(config.blur);
20186
20748
  if (config.blurSupport) classes.push(config.blurSupport);
20187
20749
  }
20188
- if (positioning === "sticky") {
20750
+ if (placement.kind === "sticky") {
20189
20751
  classes.push(
20190
20752
  visuals.isTransparent ? config.stickyTransparent : config.sticky
20191
20753
  );
20192
- } else if (positioning === "fixed") {
20754
+ } else if (placement.kind === "fixed") {
20193
20755
  classes.push(config.fixed);
20194
20756
  }
20195
- if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
20757
+ if (shrinkOnScroll && placement.kind !== "static") {
20196
20758
  classes.push(config.shrink);
20197
20759
  }
20198
20760
  const VALID_VARIANTS = [
@@ -20724,6 +21286,10 @@ function desktopOnlyDisplay(display) {
20724
21286
  return `rb-hidden ${LARGE_DISPLAY_CLASSES[display]}`;
20725
21287
  }
20726
21288
 
21289
+ // ../theme-core/src/siteChromeOverlayClearance.ts
21290
+ var SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
21291
+ var SITE_CHROME_VISIBLE_HEADER_SELECTOR = `[${SITE_CHROME_VISIBLE_HEADER_ATTR}="true"]`;
21292
+
20727
21293
  // ../blocks/src/system/blocks/site-header.ts
20728
21294
  var logoRow = link(
20729
21295
  {
@@ -20996,6 +21562,7 @@ var transparentLayout = inline(
20996
21562
  );
20997
21563
  var floatingLayout = inline(
20998
21564
  {
21565
+ [SITE_CHROME_VISIBLE_HEADER_ATTR]: "true",
20999
21566
  className: bindProp("$root.theme.header.maxWidth", {
21000
21567
  transforms: pipe(
21001
21568
  tx("layout.maxWidthClass", {
@@ -21941,6 +22508,10 @@ var sectionHeading = stack(
21941
22508
  when("content.title"),
21942
22509
  bind("content.title")
21943
22510
  ),
22511
+ headingDecoration({
22512
+ family: "short-center-rule",
22513
+ placement: "under-centered-heading"
22514
+ }),
21944
22515
  richText(
21945
22516
  {
21946
22517
  className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
@@ -24364,7 +24935,7 @@ var COLUMN_CLASSES = {
24364
24935
  };
24365
24936
  function getContainerClass(layout, columns) {
24366
24937
  if (layout === "compact") {
24367
- return "event-listing-compact-container rb-flex rb-flex-col rb-gap-2";
24938
+ return "event-listing-compact-container rb-flex rb-flex-col";
24368
24939
  }
24369
24940
  if (layout === "stack") {
24370
24941
  return "rb-flex rb-flex-col rb-gap-6";
@@ -27192,6 +27763,7 @@ import { z as z53 } from "zod";
27192
27763
  var storedProductCartItemSchema = z53.object({
27193
27764
  kind: z53.literal("product"),
27194
27765
  productId: z53.string().min(1),
27766
+ productCategoryId: z53.string().min(1).optional().nullable(),
27195
27767
  variantId: z53.string().min(1).optional().nullable(),
27196
27768
  title: z53.string().min(1),
27197
27769
  variantTitle: z53.string().optional().nullable(),
@@ -29696,6 +30268,10 @@ var scheduleTileTreatments = [
29696
30268
  "quiet",
29697
30269
  "brand-depth"
29698
30270
  ];
30271
+ var eventListTreatments = [
30272
+ "plain",
30273
+ "lined-panel"
30274
+ ];
29699
30275
  function scheduleDetailsCapable() {
29700
30276
  return declareBlockDesignCapability({
29701
30277
  sectionSurfaces: "supported",
@@ -29704,6 +30280,14 @@ function scheduleDetailsCapable() {
29704
30280
  tileTreatments: scheduleTileTreatments
29705
30281
  });
29706
30282
  }
30283
+ function eventListCapable() {
30284
+ return declareBlockDesignCapability({
30285
+ sectionSurfaces: "supported",
30286
+ contentFrames: ["plain"],
30287
+ itemSurfaces: "unsupported",
30288
+ eventListTreatments
30289
+ });
30290
+ }
29707
30291
  function defaultBoundaryBias(visualWeight) {
29708
30292
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
29709
30293
  }
@@ -29923,7 +30507,8 @@ var systemBlockDefinitionsRaw = [
29923
30507
  flow: bodyFlow,
29924
30508
  layoutProfiles: [
29925
30509
  layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
29926
- layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
30510
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" }),
30511
+ layoutProfile({ variantKey: "question-columns", family: "grid", weight: "standard" })
29927
30512
  ]
29928
30513
  })),
29929
30514
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
@@ -30017,11 +30602,11 @@ var systemBlockDefinitionsRaw = [
30017
30602
  flow: offeringsFlow,
30018
30603
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "centered", weight: "featured" })]
30019
30604
  })),
30020
- withDesignCapability("block.event-listing", eventListingBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30605
+ withDesignCapability("block.event-listing", eventListingBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
30021
30606
  flow: offeringsFlow,
30022
30607
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
30023
30608
  })),
30024
- withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30609
+ withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
30025
30610
  flow: offeringsFlow,
30026
30611
  layoutProfiles: [
30027
30612
  layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
@@ -31093,6 +31678,15 @@ ${root} {
31093
31678
  `;
31094
31679
  }
31095
31680
 
31681
+ // ../theme-core/src/runtime/themeCssVarNames.ts
31682
+ var THEME_RADIUS_CSS_VARS = {
31683
+ block: "--rb-block-radius",
31684
+ button: "--rb-button-radius",
31685
+ input: "--rb-input-radius",
31686
+ legacyCard: "--radius-card",
31687
+ legacyControl: "--radius-control"
31688
+ };
31689
+
31096
31690
  // ../theme-core/src/blocks/vars/customer-portal.ts
31097
31691
  function generateCustomerPortalVars({
31098
31692
  themeId
@@ -31106,6 +31700,11 @@ ${root} {
31106
31700
  --cp-muted: rgb(var(--tb-mutedText));
31107
31701
  --cp-border: rgb(var(--tb-border));
31108
31702
  --cp-shadow: var(--shadow-elev);
31703
+ --cp-primary: rgb(var(--tb-primary));
31704
+ --cp-primary-hover: rgb(var(--tb-primary-700, var(--tb-primary)));
31705
+ --cp-error: rgb(var(--tb-destructive));
31706
+ --cp-card-radius: var(${THEME_RADIUS_CSS_VARS.block}, var(${THEME_RADIUS_CSS_VARS.legacyCard}, 0.75rem));
31707
+ --cp-control-radius: var(${THEME_RADIUS_CSS_VARS.input}, var(${THEME_RADIUS_CSS_VARS.legacyControl}, 0.5rem));
31109
31708
 
31110
31709
  /* Shared tab bar (underline style) */
31111
31710
  --rb-tab-border-width: 1px;
@@ -31156,7 +31755,7 @@ ${root} {
31156
31755
  --rb-modal-bg: var(--cp-card-bg);
31157
31756
  --rb-modal-border: var(--cp-card-border);
31158
31757
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
31159
- --rb-modal-radius: var(--radius-card);
31758
+ --rb-modal-radius: var(--cp-card-radius);
31160
31759
  --rb-modal-max-width: 560px;
31161
31760
 
31162
31761
  /* Header */
@@ -32537,6 +33136,9 @@ import { jsx as jsx5 } from "react/jsx-runtime";
32537
33136
  import * as React from "react";
32538
33137
  import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
32539
33138
 
33139
+ // ../theme-core/src/fonts/uploadFormat.ts
33140
+ var MAX_FONT_UPLOAD_BYTES = 5 * 1024 * 1024;
33141
+
32540
33142
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
32541
33143
  import { z as z60 } from "zod";
32542
33144
  var themeBridgeConfigSchema = z60.object({
@@ -32983,6 +33585,7 @@ var COURSE_ENROLLMENT_REFUND_FAILED_CODES = [
32983
33585
  ];
32984
33586
 
32985
33587
  // ../api/src/bookingVerticals.ts
33588
+ import { z as z63 } from "zod";
32986
33589
  var VERTICAL_IDS = [
32987
33590
  "yoga_wellness",
32988
33591
  "fitness_pt",
@@ -33061,6 +33664,132 @@ var VERTICAL_ID_SET = new Set(VERTICAL_IDS);
33061
33664
  var VERTICAL_PRESET_ID_SET = new Set(
33062
33665
  VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id)
33063
33666
  );
33667
+ function parseVerticalId(value) {
33668
+ return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
33669
+ }
33670
+ function parseVerticalPresetId(value) {
33671
+ return typeof value === "string" && VERTICAL_PRESET_ID_SET.has(value) ? value : null;
33672
+ }
33673
+ function getVerticalPresetDefinition(presetId) {
33674
+ const definition = VERTICAL_BOOKING_PRESETS.find((presetDefinition) => presetDefinition.id === presetId);
33675
+ if (!definition) {
33676
+ throw new Error(`Unhandled vertical preset id: ${presetId}`);
33677
+ }
33678
+ return definition;
33679
+ }
33680
+ function toNonEmptyVerticalPresetIds(presetIds) {
33681
+ const firstPresetId = presetIds[0];
33682
+ return firstPresetId ? [firstPresetId, ...presetIds.slice(1)] : null;
33683
+ }
33684
+ function createConfiguredSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33685
+ return {
33686
+ verticalId,
33687
+ selectedPresetIds
33688
+ };
33689
+ }
33690
+ function createSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33691
+ const nonEmptyPresetIds = toNonEmptyVerticalPresetIds(selectedPresetIds);
33692
+ return nonEmptyPresetIds ? createConfiguredSiteVerticalBookingConfig(verticalId, nonEmptyPresetIds) : null;
33693
+ }
33694
+ function resolveSiteVerticalBookingConfig(rawConfig) {
33695
+ if (!rawConfig) {
33696
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33697
+ }
33698
+ const verticalId = parseVerticalId(rawConfig.verticalId);
33699
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33700
+ const selectedPresetIds = rawPresetIds.map(parseVerticalPresetId).filter((presetId) => Boolean(presetId));
33701
+ const config = {
33702
+ verticalId,
33703
+ selectedPresetIds
33704
+ };
33705
+ if (!verticalId && selectedPresetIds.length === 0) {
33706
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33707
+ }
33708
+ const issues = getSiteVerticalConfigIssues(rawConfig, config);
33709
+ if (issues.length > 0) {
33710
+ return { kind: "invalid", config, issues };
33711
+ }
33712
+ const configuredConfig = verticalId ? createSiteVerticalBookingConfig(verticalId, selectedPresetIds) : null;
33713
+ if (!configuredConfig) {
33714
+ return { kind: "invalid", config, issues: ["empty_selected_presets"] };
33715
+ }
33716
+ return {
33717
+ kind: "configured",
33718
+ config: configuredConfig,
33719
+ selectedPresets: configuredConfig.selectedPresetIds.map(getVerticalPresetDefinition)
33720
+ };
33721
+ }
33722
+ function getSiteVerticalConfigIssues(rawConfig, config) {
33723
+ const issues = /* @__PURE__ */ new Set();
33724
+ if (rawConfig.verticalId != null && !config.verticalId) {
33725
+ issues.add("unknown_vertical");
33726
+ }
33727
+ if (!config.verticalId && config.selectedPresetIds.length > 0) {
33728
+ issues.add("missing_vertical");
33729
+ }
33730
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33731
+ if (rawPresetIds.some((presetId) => parseVerticalPresetId(presetId) === null)) {
33732
+ issues.add("unknown_preset");
33733
+ }
33734
+ if (config.verticalId && config.selectedPresetIds.length === 0) {
33735
+ issues.add("empty_selected_presets");
33736
+ }
33737
+ const seenBehaviours = /* @__PURE__ */ new Set();
33738
+ for (const presetId of config.selectedPresetIds) {
33739
+ const presetDefinition = getVerticalPresetDefinition(presetId);
33740
+ if (config.verticalId && presetDefinition.verticalId !== config.verticalId) {
33741
+ issues.add("preset_vertical_mismatch");
33742
+ }
33743
+ if (presetDefinition.availability === "future") {
33744
+ issues.add("future_preset_selected");
33745
+ }
33746
+ if (seenBehaviours.has(presetDefinition.canonicalBehaviour)) {
33747
+ issues.add("duplicate_canonical_behaviour");
33748
+ }
33749
+ seenBehaviours.add(presetDefinition.canonicalBehaviour);
33750
+ }
33751
+ return [...issues];
33752
+ }
33753
+ var VerticalIdSchema = z63.string().trim().transform((value, ctx) => {
33754
+ const parsed = parseVerticalId(value);
33755
+ if (!parsed) {
33756
+ ctx.addIssue({
33757
+ code: z63.ZodIssueCode.custom,
33758
+ message: "Unknown booking vertical"
33759
+ });
33760
+ return z63.NEVER;
33761
+ }
33762
+ return parsed;
33763
+ });
33764
+ var VerticalPresetIdSchema = z63.string().trim().transform((value, ctx) => {
33765
+ const parsed = parseVerticalPresetId(value);
33766
+ if (!parsed) {
33767
+ ctx.addIssue({
33768
+ code: z63.ZodIssueCode.custom,
33769
+ message: "Unknown booking preset"
33770
+ });
33771
+ return z63.NEVER;
33772
+ }
33773
+ return parsed;
33774
+ });
33775
+ var BookingVerticalConfigSchema = z63.object({
33776
+ verticalId: VerticalIdSchema.nullable(),
33777
+ selectedPresetIds: z63.array(VerticalPresetIdSchema).max(20)
33778
+ }).transform((value, ctx) => {
33779
+ const resolved = resolveSiteVerticalBookingConfig(value);
33780
+ if (resolved.kind === "invalid") {
33781
+ ctx.addIssue({
33782
+ code: z63.ZodIssueCode.custom,
33783
+ message: `Invalid booking vertical config: ${resolved.issues.join(", ")}`
33784
+ });
33785
+ return z63.NEVER;
33786
+ }
33787
+ return resolved.config;
33788
+ });
33789
+ var DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
33790
+ verticalId: null,
33791
+ selectedPresetIds: []
33792
+ };
33064
33793
  function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
33065
33794
  return {
33066
33795
  id,
@@ -33080,51 +33809,51 @@ function isRecord3(value) {
33080
33809
  }
33081
33810
 
33082
33811
  // ../api/src/appointmentSetup.ts
33083
- import { z as z63 } from "zod";
33812
+ import { z as z64 } from "zod";
33084
33813
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
33085
- var appointmentSetupRefSchema = z63.discriminatedUnion("kind", [
33086
- z63.object({ kind: z63.literal("existing"), id: z63.string().min(1) }),
33087
- z63.object({ kind: z63.literal("new"), draftId: z63.string().min(1) })
33814
+ var appointmentSetupRefSchema = z64.discriminatedUnion("kind", [
33815
+ z64.object({ kind: z64.literal("existing"), id: z64.string().min(1) }),
33816
+ z64.object({ kind: z64.literal("new"), draftId: z64.string().min(1) })
33088
33817
  ]);
33089
- var appointmentSetupVenueChoiceSchema = z63.discriminatedUnion("kind", [
33090
- z63.object({ kind: z63.literal("none") }),
33091
- z63.object({ kind: z63.literal("existing"), venueId: z63.string().min(1) }),
33092
- z63.object({
33093
- kind: z63.literal("create"),
33094
- draftId: z63.string().min(1),
33095
- title: z63.string().trim().min(1),
33096
- description: z63.string().nullable(),
33097
- timezone: z63.string().trim().min(1).nullable(),
33098
- addressJson: z63.record(z63.string(), z63.unknown()),
33099
- locationJson: z63.object({ lat: z63.number(), lng: z63.number() }).nullable()
33818
+ var appointmentSetupVenueChoiceSchema = z64.discriminatedUnion("kind", [
33819
+ z64.object({ kind: z64.literal("none") }),
33820
+ z64.object({ kind: z64.literal("existing"), venueId: z64.string().min(1) }),
33821
+ z64.object({
33822
+ kind: z64.literal("create"),
33823
+ draftId: z64.string().min(1),
33824
+ title: z64.string().trim().min(1),
33825
+ description: z64.string().nullable(),
33826
+ timezone: z64.string().trim().min(1).nullable(),
33827
+ addressJson: z64.record(z64.string(), z64.unknown()),
33828
+ locationJson: z64.object({ lat: z64.number(), lng: z64.number() }).nullable()
33100
33829
  })
33101
33830
  ]);
33102
- var appointmentSetupPaymentDraftSchema = z63.object({
33103
- priceType: z63.union([z63.literal("free"), z63.literal("paid")])
33104
- });
33105
- var appointmentSetupServiceAssignmentDraftSchema = z63.discriminatedUnion("kind", [
33106
- z63.object({ kind: z63.literal("all_practitioners") }),
33107
- z63.object({
33108
- kind: z63.literal("selected_practitioners"),
33109
- resourceRefs: z63.array(appointmentSetupRefSchema)
33831
+ var appointmentSetupPaymentDraftSchema = z64.object({
33832
+ priceType: z64.union([z64.literal("free"), z64.literal("paid")])
33833
+ });
33834
+ var appointmentSetupServiceAssignmentDraftSchema = z64.discriminatedUnion("kind", [
33835
+ z64.object({ kind: z64.literal("all_practitioners") }),
33836
+ z64.object({
33837
+ kind: z64.literal("selected_practitioners"),
33838
+ resourceRefs: z64.array(appointmentSetupRefSchema)
33110
33839
  })
33111
33840
  ]);
33112
- var appointmentSetupServiceDraftSchema = z63.object({
33841
+ var appointmentSetupServiceDraftSchema = z64.object({
33113
33842
  ref: appointmentSetupRefSchema,
33114
- title: z63.string().trim().min(1),
33115
- description: z63.string().nullable(),
33116
- durationMinutes: z63.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
33117
- prepMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33118
- cleanupMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33119
- priceAmount: z63.number().int().nonnegative().nullable(),
33120
- isActive: z63.boolean(),
33121
- locationType: z63.union([
33122
- z63.literal("virtual"),
33123
- z63.literal("in_person"),
33124
- z63.literal("hybrid")
33843
+ title: z64.string().trim().min(1),
33844
+ description: z64.string().nullable(),
33845
+ durationMinutes: z64.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
33846
+ prepMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33847
+ cleanupMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33848
+ priceAmount: z64.number().int().nonnegative().nullable(),
33849
+ isActive: z64.boolean(),
33850
+ locationType: z64.union([
33851
+ z64.literal("virtual"),
33852
+ z64.literal("in_person"),
33853
+ z64.literal("hybrid")
33125
33854
  ]),
33126
33855
  venue: appointmentSetupVenueChoiceSchema,
33127
- timezone: z63.string().trim().min(1).nullable(),
33856
+ timezone: z64.string().trim().min(1).nullable(),
33128
33857
  payment: appointmentSetupPaymentDraftSchema,
33129
33858
  assignment: appointmentSetupServiceAssignmentDraftSchema
33130
33859
  }).superRefine((service, ctx) => {
@@ -33143,49 +33872,49 @@ var appointmentSetupServiceDraftSchema = z63.object({
33143
33872
  });
33144
33873
  }
33145
33874
  });
33146
- var appointmentSetupPractitionerDraftSchema = z63.object({
33875
+ var appointmentSetupPractitionerDraftSchema = z64.object({
33147
33876
  ref: appointmentSetupRefSchema,
33148
- displayName: z63.string().trim().min(1),
33149
- bio: z63.string().nullable(),
33150
- timezone: z63.string().trim().min(1),
33151
- colorHex: z63.string().nullable()
33152
- });
33153
- var appointmentSetupWeeklyWindowDraftSchema = z63.object({
33154
- weekday: z63.number().int().min(0).max(6),
33155
- startTime: z63.string(),
33156
- endTime: z63.string()
33157
- });
33158
- var appointmentSetupStartTimePolicyDraftSchema = z63.discriminatedUnion("kind", [
33159
- z63.object({ kind: z63.literal("automatic_spacing") }),
33160
- z63.object({
33161
- kind: z63.literal("regular_interval"),
33162
- intervalMinutes: z63.union([
33163
- z63.literal(10),
33164
- z63.literal(15),
33165
- z63.literal(20),
33166
- z63.literal(30),
33167
- z63.literal(45),
33168
- z63.literal(60)
33877
+ displayName: z64.string().trim().min(1),
33878
+ bio: z64.string().nullable(),
33879
+ timezone: z64.string().trim().min(1),
33880
+ colorHex: z64.string().nullable()
33881
+ });
33882
+ var appointmentSetupWeeklyWindowDraftSchema = z64.object({
33883
+ weekday: z64.number().int().min(0).max(6),
33884
+ startTime: z64.string(),
33885
+ endTime: z64.string()
33886
+ });
33887
+ var appointmentSetupStartTimePolicyDraftSchema = z64.discriminatedUnion("kind", [
33888
+ z64.object({ kind: z64.literal("automatic_spacing") }),
33889
+ z64.object({
33890
+ kind: z64.literal("regular_interval"),
33891
+ intervalMinutes: z64.union([
33892
+ z64.literal(10),
33893
+ z64.literal(15),
33894
+ z64.literal(20),
33895
+ z64.literal(30),
33896
+ z64.literal(45),
33897
+ z64.literal(60)
33169
33898
  ])
33170
33899
  })
33171
33900
  ]);
33172
- var appointmentSetupAvailabilityDraftSchema = z63.object({
33173
- kind: z63.literal("weekly_windows"),
33901
+ var appointmentSetupAvailabilityDraftSchema = z64.object({
33902
+ kind: z64.literal("weekly_windows"),
33174
33903
  resourceRef: appointmentSetupRefSchema,
33175
33904
  serviceRef: appointmentSetupRefSchema.nullable(),
33176
- windows: z63.array(appointmentSetupWeeklyWindowDraftSchema),
33905
+ windows: z64.array(appointmentSetupWeeklyWindowDraftSchema),
33177
33906
  startTimePolicy: appointmentSetupStartTimePolicyDraftSchema.optional()
33178
33907
  });
33179
33908
  var APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX = 28 * 24 * 60;
33180
33909
  var APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX = 10 * 365 * 24 * 60;
33181
- var appointmentSetupBookingNoticeSchema = z63.object({
33182
- minLeadMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
33183
- maxBookingNoticeMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
33184
- });
33185
- var applyAppointmentSetupRequestSchema = z63.object({
33186
- services: z63.array(appointmentSetupServiceDraftSchema),
33187
- practitioners: z63.array(appointmentSetupPractitionerDraftSchema),
33188
- availability: z63.array(appointmentSetupAvailabilityDraftSchema),
33910
+ var appointmentSetupBookingNoticeSchema = z64.object({
33911
+ minLeadMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
33912
+ maxBookingNoticeMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
33913
+ });
33914
+ var applyAppointmentSetupRequestSchema = z64.object({
33915
+ services: z64.array(appointmentSetupServiceDraftSchema),
33916
+ practitioners: z64.array(appointmentSetupPractitionerDraftSchema),
33917
+ availability: z64.array(appointmentSetupAvailabilityDraftSchema),
33189
33918
  bookingNotice: appointmentSetupBookingNoticeSchema
33190
33919
  });
33191
33920
 
@@ -33218,24 +33947,24 @@ var STAFF_CANCELLATION_CONTEXT_CATEGORIES = [
33218
33947
  ];
33219
33948
 
33220
33949
  // ../api/src/siteBanner.ts
33221
- import { z as z64 } from "zod";
33950
+ import { z as z65 } from "zod";
33222
33951
  var SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
33223
33952
  var SITE_BANNER_TONE_VALUES = ["announcement", "promotion", "notice", "warning"];
33224
33953
  var SITE_BANNER_MAX_TEXT_LENGTH = 320;
33225
33954
  var SITE_BANNER_MAX_PARAGRAPHS = 2;
33226
- var siteBannerScopeSchema = z64.enum(SITE_BANNER_SCOPE_VALUES);
33227
- var siteBannerToneSchema = z64.enum(SITE_BANNER_TONE_VALUES);
33228
- var siteBannerBodySchema = z64.unknown().transform(unwrapRichTextValue);
33229
- var siteBannerCtaSchema = z64.object({
33230
- label: z64.string().trim().min(1),
33955
+ var siteBannerScopeSchema = z65.enum(SITE_BANNER_SCOPE_VALUES);
33956
+ var siteBannerToneSchema = z65.enum(SITE_BANNER_TONE_VALUES);
33957
+ var siteBannerBodySchema = z65.unknown().transform(unwrapRichTextValue);
33958
+ var siteBannerCtaSchema = z65.object({
33959
+ label: z65.string().trim().min(1),
33231
33960
  link: linkPayloadSchema
33232
33961
  });
33233
- var siteBannerSettingsSchema = z64.discriminatedUnion("enabled", [
33234
- z64.object({
33235
- enabled: z64.literal(false)
33962
+ var siteBannerSettingsSchema = z65.discriminatedUnion("enabled", [
33963
+ z65.object({
33964
+ enabled: z65.literal(false)
33236
33965
  }),
33237
- z64.object({
33238
- enabled: z64.literal(true),
33966
+ z65.object({
33967
+ enabled: z65.literal(true),
33239
33968
  scope: siteBannerScopeSchema,
33240
33969
  tone: siteBannerToneSchema,
33241
33970
  body: siteBannerBodySchema,
@@ -33249,7 +33978,7 @@ var siteBannerSettingsInputSchema = siteBannerSettingsSchema.superRefine((value,
33249
33978
  const analysis = analyzeSiteBannerBody(value.body);
33250
33979
  for (const issue of analysis.issues) {
33251
33980
  ctx.addIssue({
33252
- code: z64.ZodIssueCode.custom,
33981
+ code: z65.ZodIssueCode.custom,
33253
33982
  path: ["body"],
33254
33983
  message: siteBannerBodyIssueMessage(issue)
33255
33984
  });
@@ -33517,76 +34246,109 @@ function isNavigationMenuValidationItem(value) {
33517
34246
  return typeof value.label === "string";
33518
34247
  }
33519
34248
 
34249
+ // ../api/src/navigation/dashboardSiteNav.ts
34250
+ var hiddenDemoSiteNavSurfaceIds = [
34251
+ "site.newsletter"
34252
+ ];
34253
+ var hiddenDemoSiteNavIds = new Set(
34254
+ hiddenDemoSiteNavSurfaceIds
34255
+ );
34256
+ var websiteSurfaceIds = [
34257
+ "site.content",
34258
+ "site.footerBlocks",
34259
+ "site.navigation",
34260
+ "site.media",
34261
+ "site.style",
34262
+ "site.performance"
34263
+ ];
34264
+ var websiteSurfaceIdSet = new Set(
34265
+ websiteSurfaceIds
34266
+ );
34267
+
34268
+ // ../api/src/navigation/dashboardSettingsNav.ts
34269
+ var hiddenDemoSettingsNavSurfaceIds = [
34270
+ "settings.features",
34271
+ "settings.domains",
34272
+ "settings.bookings",
34273
+ "settings.emails",
34274
+ "settings.team",
34275
+ "settings.billing",
34276
+ "settings.developer",
34277
+ "settings.apiKeys",
34278
+ "settings.backup"
34279
+ ];
34280
+ var hiddenDemoSettingsNavIds = new Set(hiddenDemoSettingsNavSurfaceIds);
34281
+
33520
34282
  // ../api/src/aiPlayground.ts
33521
- import { z as z65 } from "zod";
33522
- var Rfc6902PatchOp = z65.discriminatedUnion("op", [
34283
+ import { z as z66 } from "zod";
34284
+ var Rfc6902PatchOp = z66.discriminatedUnion("op", [
33523
34285
  // Standard RFC-6902 operations
33524
- z65.object({
33525
- op: z65.literal("add"),
33526
- path: z65.string(),
33527
- value: z65.unknown()
34286
+ z66.object({
34287
+ op: z66.literal("add"),
34288
+ path: z66.string(),
34289
+ value: z66.unknown()
33528
34290
  }),
33529
- z65.object({
33530
- op: z65.literal("remove"),
33531
- path: z65.string()
34291
+ z66.object({
34292
+ op: z66.literal("remove"),
34293
+ path: z66.string()
33532
34294
  }),
33533
- z65.object({
33534
- op: z65.literal("replace"),
33535
- path: z65.string(),
33536
- value: z65.unknown()
34295
+ z66.object({
34296
+ op: z66.literal("replace"),
34297
+ path: z66.string(),
34298
+ value: z66.unknown()
33537
34299
  }),
33538
- z65.object({
33539
- op: z65.literal("move"),
33540
- from: z65.string(),
33541
- path: z65.string()
34300
+ z66.object({
34301
+ op: z66.literal("move"),
34302
+ from: z66.string(),
34303
+ path: z66.string()
33542
34304
  }),
33543
- z65.object({
33544
- op: z65.literal("copy"),
33545
- from: z65.string(),
33546
- path: z65.string()
34305
+ z66.object({
34306
+ op: z66.literal("copy"),
34307
+ from: z66.string(),
34308
+ path: z66.string()
33547
34309
  }),
33548
34310
  // Block-level operations (Phase 2)
33549
- z65.object({
33550
- op: z65.literal("add_block"),
33551
- blockKind: z65.string(),
33552
- afterBlockId: z65.string().nullable(),
33553
- content: z65.record(z65.string(), z65.unknown()),
33554
- rationale: z65.string()
34311
+ z66.object({
34312
+ op: z66.literal("add_block"),
34313
+ blockKind: z66.string(),
34314
+ afterBlockId: z66.string().nullable(),
34315
+ content: z66.record(z66.string(), z66.unknown()),
34316
+ rationale: z66.string()
33555
34317
  }),
33556
- z65.object({
33557
- op: z65.literal("delete_block"),
33558
- blockId: z65.string(),
33559
- rationale: z65.string()
34318
+ z66.object({
34319
+ op: z66.literal("delete_block"),
34320
+ blockId: z66.string(),
34321
+ rationale: z66.string()
33560
34322
  }),
33561
- z65.object({
33562
- op: z65.literal("reorder_block"),
33563
- blockId: z65.string(),
33564
- afterBlockId: z65.string().nullable(),
33565
- rationale: z65.string()
34323
+ z66.object({
34324
+ op: z66.literal("reorder_block"),
34325
+ blockId: z66.string(),
34326
+ afterBlockId: z66.string().nullable(),
34327
+ rationale: z66.string()
33566
34328
  })
33567
34329
  ]);
33568
- var PlaygroundProposeRequest = z65.object({
33569
- request: z65.string().min(1).max(2e3)
34330
+ var PlaygroundProposeRequest = z66.object({
34331
+ request: z66.string().min(1).max(2e3)
33570
34332
  });
33571
- var MultiPagePatchEnvelope = z65.object({
33572
- pageId: z65.string(),
33573
- blockId: z65.string().optional(),
34333
+ var MultiPagePatchEnvelope = z66.object({
34334
+ pageId: z66.string(),
34335
+ blockId: z66.string().optional(),
33574
34336
  // Not present for page-level ops
33575
- blockKind: z65.string().optional(),
33576
- blockPurpose: z65.string().optional().nullable(),
33577
- ops: z65.array(Rfc6902PatchOp),
33578
- rationale: z65.string(),
33579
- currentContent: z65.record(z65.string(), z65.unknown()).optional()
34337
+ blockKind: z66.string().optional(),
34338
+ blockPurpose: z66.string().optional().nullable(),
34339
+ ops: z66.array(Rfc6902PatchOp),
34340
+ rationale: z66.string(),
34341
+ currentContent: z66.record(z66.string(), z66.unknown()).optional()
33580
34342
  });
33581
- var MultiPageUpdateResponse = z65.object({
33582
- patches: z65.array(MultiPagePatchEnvelope),
33583
- assistantMessage: z65.string(),
33584
- pagesModified: z65.number(),
33585
- toolCallsUsed: z65.number()
34343
+ var MultiPageUpdateResponse = z66.object({
34344
+ patches: z66.array(MultiPagePatchEnvelope),
34345
+ assistantMessage: z66.string(),
34346
+ pagesModified: z66.number(),
34347
+ toolCallsUsed: z66.number()
33586
34348
  });
33587
34349
 
33588
34350
  // src/config/content-validation.ts
33589
- import { z as z66 } from "zod";
34351
+ import { z as z67 } from "zod";
33590
34352
 
33591
34353
  // src/types/block-kinds.ts
33592
34354
  var SYSTEM_BLOCK_KINDS = [
@@ -33740,32 +34502,32 @@ function describeInvalidBindingTransform(transform) {
33740
34502
  }
33741
34503
 
33742
34504
  // src/config/content-validation.ts
33743
- var jsonDataSchema = z66.record(z66.string(), z66.any());
33744
- var contentTypeKeySchema = z66.string().min(1).regex(
34505
+ var jsonDataSchema = z67.record(z67.string(), z67.any());
34506
+ var contentTypeKeySchema = z67.string().min(1).regex(
33745
34507
  /^[a-z][a-z0-9-]*$/,
33746
34508
  "Key must be lowercase, start with a letter, and contain only letters, numbers, and hyphens"
33747
34509
  );
33748
- var templateConfigSchemaForward = z66.object({
33749
- blocks: z66.array(
33750
- z66.object({
33751
- identifier: z66.string().min(1),
33752
- kind: z66.string(),
33753
- scope: z66.enum(["entry", "template"]),
33754
- bindings: z66.record(z66.string(), z66.any()).optional(),
33755
- content: z66.record(z66.string(), z66.any()).optional()
34510
+ var templateConfigSchemaForward = z67.object({
34511
+ blocks: z67.array(
34512
+ z67.object({
34513
+ identifier: z67.string().min(1),
34514
+ kind: z67.string(),
34515
+ scope: z67.enum(["entry", "template"]),
34516
+ bindings: z67.record(z67.string(), z67.any()).optional(),
34517
+ content: z67.record(z67.string(), z67.any()).optional()
33756
34518
  })
33757
34519
  )
33758
34520
  }).optional();
33759
- var contentTypeConfigSchema = z66.object({
34521
+ var contentTypeConfigSchema = z67.object({
33760
34522
  key: contentTypeKeySchema,
33761
- name: z66.string().min(1),
33762
- description: z66.string().optional(),
33763
- hasPages: z66.boolean(),
33764
- routePattern: z66.string().optional(),
34523
+ name: z67.string().min(1),
34524
+ description: z67.string().optional(),
34525
+ hasPages: z67.boolean(),
34526
+ routePattern: z67.string().optional(),
33765
34527
  // Fields are validated as unknown[] here - deep field validation happens in @riverbankcms/blocks
33766
- fields: z66.array(z66.any()).min(1, "At least one field is required"),
33767
- titleField: z66.string().optional(),
33768
- isSingleton: z66.boolean().optional().default(false),
34528
+ fields: z67.array(z67.any()).min(1, "At least one field is required"),
34529
+ titleField: z67.string().optional(),
34530
+ isSingleton: z67.boolean().optional().default(false),
33769
34531
  template: templateConfigSchemaForward
33770
34532
  }).refine(
33771
34533
  (data) => {
@@ -33787,7 +34549,7 @@ var contentTypeConfigSchema = z66.object({
33787
34549
  }
33788
34550
  if (!data.routePattern) {
33789
34551
  ctx.addIssue({
33790
- code: z66.ZodIssueCode.custom,
34552
+ code: z67.ZodIssueCode.custom,
33791
34553
  path: ["routePattern"],
33792
34554
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33793
34555
  });
@@ -33796,7 +34558,7 @@ var contentTypeConfigSchema = z66.object({
33796
34558
  const parseResult = safeParseRouteTemplate(data.routePattern);
33797
34559
  if (!parseResult.success) {
33798
34560
  ctx.addIssue({
33799
- code: z66.ZodIssueCode.custom,
34561
+ code: z67.ZodIssueCode.custom,
33800
34562
  path: ["routePattern"],
33801
34563
  message: describeRouteTemplateParseError(parseResult.error)
33802
34564
  });
@@ -33804,44 +34566,44 @@ var contentTypeConfigSchema = z66.object({
33804
34566
  }
33805
34567
  if (!data.isSingleton && parseResult.routeTemplate.kind !== "slug-template") {
33806
34568
  ctx.addIssue({
33807
- code: z66.ZodIssueCode.custom,
34569
+ code: z67.ZodIssueCode.custom,
33808
34570
  path: ["routePattern"],
33809
34571
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33810
34572
  });
33811
34573
  }
33812
34574
  });
33813
- var fieldBindingSchema = z66.object({
33814
- source: z66.literal("field"),
33815
- path: z66.string().min(1, "Field path is required")
34575
+ var fieldBindingSchema = z67.object({
34576
+ source: z67.literal("field"),
34577
+ path: z67.string().min(1, "Field path is required")
33816
34578
  });
33817
- var metaBindingSchema = z66.object({
33818
- source: z66.literal("meta"),
33819
- path: z66.enum(TEMPLATE_BINDING_META_PATHS, {
34579
+ var metaBindingSchema = z67.object({
34580
+ source: z67.literal("meta"),
34581
+ path: z67.enum(TEMPLATE_BINDING_META_PATHS, {
33820
34582
  error: (issue) => describeInvalidTemplateBindingMetaPath(String(issue.input))
33821
34583
  })
33822
34584
  });
33823
- var literalBindingSchema = z66.object({
33824
- source: z66.literal("literal"),
33825
- value: z66.unknown()
34585
+ var literalBindingSchema = z67.object({
34586
+ source: z67.literal("literal"),
34587
+ value: z67.unknown()
33826
34588
  });
33827
- var transformBindingSchema = z66.object({
33828
- source: z66.literal("transform"),
33829
- path: z66.string().min(1, "Transform path is required"),
33830
- transform: z66.enum(BINDING_TRANSFORM_VALUES, {
34589
+ var transformBindingSchema = z67.object({
34590
+ source: z67.literal("transform"),
34591
+ path: z67.string().min(1, "Transform path is required"),
34592
+ transform: z67.enum(BINDING_TRANSFORM_VALUES, {
33831
34593
  error: (issue) => describeInvalidBindingTransform(String(issue.input))
33832
34594
  })
33833
34595
  });
33834
- var baseBindingSchema = z66.discriminatedUnion("source", [
34596
+ var baseBindingSchema = z67.discriminatedUnion("source", [
33835
34597
  fieldBindingSchema,
33836
34598
  metaBindingSchema,
33837
34599
  literalBindingSchema,
33838
34600
  transformBindingSchema
33839
34601
  ]);
33840
- var fallbackBindingSchema = z66.object({
33841
- source: z66.literal("fallback"),
33842
- sources: z66.array(z66.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
34602
+ var fallbackBindingSchema = z67.object({
34603
+ source: z67.literal("fallback"),
34604
+ sources: z67.array(z67.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
33843
34605
  });
33844
- var bindingSourceSchema = z66.union([
34606
+ var bindingSourceSchema = z67.union([
33845
34607
  baseBindingSchema,
33846
34608
  fallbackBindingSchema
33847
34609
  ]);
@@ -33855,12 +34617,12 @@ function isValidBlockKind(kind) {
33855
34617
  return false;
33856
34618
  }
33857
34619
  var BLOCK_KIND_ERROR_MESSAGE = 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.myBlock")';
33858
- var blockKindSchema = z66.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
33859
- var templateBlockConfigSchema = z66.object({
33860
- identifier: z66.string().min(1, "Block identifier is required"),
34620
+ var blockKindSchema = z67.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
34621
+ var templateBlockConfigSchema = z67.object({
34622
+ identifier: z67.string().min(1, "Block identifier is required"),
33861
34623
  kind: blockKindSchema,
33862
- scope: z66.enum(["entry", "template"]),
33863
- bindings: z66.record(z66.string(), bindingSourceSchema).optional(),
34624
+ scope: z67.enum(["entry", "template"]),
34625
+ bindings: z67.record(z67.string(), bindingSourceSchema).optional(),
33864
34626
  content: jsonDataSchema.optional()
33865
34627
  }).refine(
33866
34628
  (data) => {
@@ -33879,8 +34641,8 @@ var templateBlockConfigSchema = z66.object({
33879
34641
  },
33880
34642
  { message: "Template-scoped blocks should define static content, not bindings" }
33881
34643
  );
33882
- var templateConfigSchema = z66.object({
33883
- blocks: z66.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
34644
+ var templateConfigSchema = z67.object({
34645
+ blocks: z67.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
33884
34646
  }).refine(
33885
34647
  (data) => {
33886
34648
  const identifiers = data.blocks.map((b) => b.identifier);
@@ -33889,77 +34651,77 @@ var templateConfigSchema = z66.object({
33889
34651
  },
33890
34652
  { message: "Template block identifiers must be unique" }
33891
34653
  );
33892
- var blockConfigSchema = z66.object({
34654
+ var blockConfigSchema = z67.object({
33893
34655
  kind: blockKindSchema,
33894
34656
  content: jsonDataSchema,
33895
- orderIndex: z66.number().optional()
33896
- });
33897
- var pageConfigSchema = z66.object({
33898
- identifier: z66.string().min(1, "Identifier is required"),
33899
- title: z66.string().min(1, "Title is required"),
33900
- path: z66.string().regex(/^\//, "Path must start with /"),
33901
- purpose: z66.string().default("content"),
33902
- blocks: z66.array(blockConfigSchema).optional(),
33903
- status: z66.enum(["draft", "published"]).default("draft"),
33904
- metaTitle: z66.string().optional(),
33905
- metaDescription: z66.string().optional()
33906
- });
33907
- var entryConfigSchema = z66.object({
33908
- identifier: z66.string().min(1, "Identifier is required"),
33909
- contentType: z66.string().min(1, "Content type is required"),
34657
+ orderIndex: z67.number().optional()
34658
+ });
34659
+ var pageConfigSchema = z67.object({
34660
+ identifier: z67.string().min(1, "Identifier is required"),
34661
+ title: z67.string().min(1, "Title is required"),
34662
+ path: z67.string().regex(/^\//, "Path must start with /"),
34663
+ purpose: z67.string().default("content"),
34664
+ blocks: z67.array(blockConfigSchema).optional(),
34665
+ status: z67.enum(["draft", "published"]).default("draft"),
34666
+ metaTitle: z67.string().optional(),
34667
+ metaDescription: z67.string().optional()
34668
+ });
34669
+ var entryConfigSchema = z67.object({
34670
+ identifier: z67.string().min(1, "Identifier is required"),
34671
+ contentType: z67.string().min(1, "Content type is required"),
33910
34672
  data: jsonDataSchema,
33911
- status: z66.enum(["draft", "published"]).default("draft"),
33912
- slug: z66.string().optional(),
33913
- summary: z66.string().optional(),
34673
+ status: z67.enum(["draft", "published"]).default("draft"),
34674
+ slug: z67.string().optional(),
34675
+ summary: z67.string().optional(),
33914
34676
  // Hard remove legacy config-only titles: titles must live in entry `data`.
33915
- title: z66.any().optional().refine((value) => value === void 0, {
34677
+ title: z67.any().optional().refine((value) => value === void 0, {
33916
34678
  message: "Entry titles are now derived from entry data. Remove `title` and move it into `data` (e.g. `data.title`, or your configured `titleField`). Run `riverbankcms migrate entries` for guided migration."
33917
34679
  }),
33918
- metaTitle: z66.string().optional(),
33919
- metaDescription: z66.string().optional()
34680
+ metaTitle: z67.string().optional(),
34681
+ metaDescription: z67.string().optional()
33920
34682
  });
33921
- var dropdownLinkSchema = z66.object({
33922
- kind: z66.literal("dropdown")
34683
+ var dropdownLinkSchema = z67.object({
34684
+ kind: z67.literal("dropdown")
33923
34685
  });
33924
- var navigationLinkSchema = z66.discriminatedUnion("kind", [
34686
+ var navigationLinkSchema = z67.discriminatedUnion("kind", [
33925
34687
  ...navigationLinkInputSchemaOptions,
33926
34688
  dropdownLinkSchema
33927
34689
  ]);
33928
- var baseNavigationItemSchema = z66.object({
33929
- label: z66.string().min(1, "Label is required"),
34690
+ var baseNavigationItemSchema = z67.object({
34691
+ label: z67.string().min(1, "Label is required"),
33930
34692
  link: navigationLinkSchema,
33931
- isCta: z66.boolean().optional()
34693
+ isCta: z67.boolean().optional()
33932
34694
  });
33933
34695
  var navigationItemConfigSchema = baseNavigationItemSchema.extend({
33934
- children: z66.lazy(() => z66.array(navigationItemConfigSchema)).optional()
33935
- });
33936
- var navigationMenuConfigSchema = z66.object({
33937
- identifier: z66.string().min(1, "Identifier is required"),
33938
- name: z66.string().min(1, "Name is required"),
33939
- isPrimary: z66.boolean().optional(),
33940
- isFooter: z66.boolean().optional(),
33941
- items: z66.array(navigationItemConfigSchema)
34696
+ children: z67.lazy(() => z67.array(navigationItemConfigSchema)).optional()
34697
+ });
34698
+ var navigationMenuConfigSchema = z67.object({
34699
+ identifier: z67.string().min(1, "Identifier is required"),
34700
+ name: z67.string().min(1, "Name is required"),
34701
+ isPrimary: z67.boolean().optional(),
34702
+ isFooter: z67.boolean().optional(),
34703
+ items: z67.array(navigationItemConfigSchema)
33942
34704
  }).superRefine((menu, ctx) => {
33943
34705
  const portalStats = collectPortalLinkStats(
33944
34706
  menu.items
33945
34707
  );
33946
34708
  if (portalStats.count > 1) {
33947
34709
  ctx.addIssue({
33948
- code: z66.ZodIssueCode.custom,
34710
+ code: z67.ZodIssueCode.custom,
33949
34711
  message: "Only one portal link is allowed per navigation menu",
33950
34712
  path: ["items"]
33951
34713
  });
33952
34714
  }
33953
34715
  if (portalStats.nestedLabels.length > 0) {
33954
34716
  ctx.addIssue({
33955
- code: z66.ZodIssueCode.custom,
34717
+ code: z67.ZodIssueCode.custom,
33956
34718
  message: `Portal links must be root-level items: ${portalStats.nestedLabels.join(", ")}`,
33957
34719
  path: ["items"]
33958
34720
  });
33959
34721
  }
33960
34722
  if (portalStats.withChildrenLabels.length > 0) {
33961
34723
  ctx.addIssue({
33962
- code: z66.ZodIssueCode.custom,
34724
+ code: z67.ZodIssueCode.custom,
33963
34725
  message: `Portal links cannot contain child items: ${portalStats.withChildrenLabels.join(", ")}`,
33964
34726
  path: ["items"]
33965
34727
  });
@@ -33969,44 +34731,44 @@ var navigationMenuConfigSchema = z66.object({
33969
34731
  );
33970
34732
  if (cartStats.nestedLabels.length > 0) {
33971
34733
  ctx.addIssue({
33972
- code: z66.ZodIssueCode.custom,
34734
+ code: z67.ZodIssueCode.custom,
33973
34735
  message: `Cart links must be root-level items: ${cartStats.nestedLabels.join(", ")}`,
33974
34736
  path: ["items"]
33975
34737
  });
33976
34738
  }
33977
34739
  if (cartStats.withChildrenLabels.length > 0) {
33978
34740
  ctx.addIssue({
33979
- code: z66.ZodIssueCode.custom,
34741
+ code: z67.ZodIssueCode.custom,
33980
34742
  message: `Cart links cannot contain child items: ${cartStats.withChildrenLabels.join(", ")}`,
33981
34743
  path: ["items"]
33982
34744
  });
33983
34745
  }
33984
34746
  if (cartStats.ctaLabels.length > 0) {
33985
34747
  ctx.addIssue({
33986
- code: z66.ZodIssueCode.custom,
34748
+ code: z67.ZodIssueCode.custom,
33987
34749
  message: `Cart links cannot be marked as CTA: ${cartStats.ctaLabels.join(", ")}`,
33988
34750
  path: ["items"]
33989
34751
  });
33990
34752
  }
33991
34753
  if (cartStats.missingVisibleTextLabels.length > 0) {
33992
34754
  ctx.addIssue({
33993
- code: z66.ZodIssueCode.custom,
34755
+ code: z67.ZodIssueCode.custom,
33994
34756
  message: `Cart links with icon-with-label must provide a visible label: ${cartStats.missingVisibleTextLabels.join(", ")}`,
33995
34757
  path: ["items"]
33996
34758
  });
33997
34759
  }
33998
34760
  });
33999
- var siteSettingsConfigSchema = z66.object({
34000
- homepagePath: z66.string().optional(),
34001
- siteTitle: z66.string().optional(),
34002
- siteDescription: z66.string().optional(),
34003
- defaultTemplates: z66.record(z66.string(), z66.string()).optional()
34761
+ var siteSettingsConfigSchema = z67.object({
34762
+ homepagePath: z67.string().optional(),
34763
+ siteTitle: z67.string().optional(),
34764
+ siteDescription: z67.string().optional(),
34765
+ defaultTemplates: z67.record(z67.string(), z67.string()).optional()
34004
34766
  });
34005
- var contentConfigBaseSchema = z66.object({
34006
- contentTypes: z66.array(contentTypeConfigSchema).optional(),
34007
- entries: z66.array(entryConfigSchema).optional(),
34008
- pages: z66.array(pageConfigSchema).optional(),
34009
- navigationMenus: z66.array(navigationMenuConfigSchema).optional(),
34767
+ var contentConfigBaseSchema = z67.object({
34768
+ contentTypes: z67.array(contentTypeConfigSchema).optional(),
34769
+ entries: z67.array(entryConfigSchema).optional(),
34770
+ pages: z67.array(pageConfigSchema).optional(),
34771
+ navigationMenus: z67.array(navigationMenuConfigSchema).optional(),
34010
34772
  settings: siteSettingsConfigSchema.optional()
34011
34773
  });
34012
34774
  var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
@@ -34015,7 +34777,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34015
34777
  const duplicateKeys = keys.filter((key, i) => keys.indexOf(key) !== i);
34016
34778
  if (duplicateKeys.length > 0) {
34017
34779
  ctx.addIssue({
34018
- code: z66.ZodIssueCode.custom,
34780
+ code: z67.ZodIssueCode.custom,
34019
34781
  message: `Content type keys must be unique. Duplicates: ${duplicateKeys.join(", ")}`,
34020
34782
  path: ["contentTypes"]
34021
34783
  });
@@ -34026,7 +34788,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34026
34788
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34027
34789
  if (duplicateIds.length > 0) {
34028
34790
  ctx.addIssue({
34029
- code: z66.ZodIssueCode.custom,
34791
+ code: z67.ZodIssueCode.custom,
34030
34792
  message: `Page identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34031
34793
  path: ["pages"]
34032
34794
  });
@@ -34035,7 +34797,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34035
34797
  const duplicatePaths = paths.filter((path, i) => paths.indexOf(path) !== i);
34036
34798
  if (duplicatePaths.length > 0) {
34037
34799
  ctx.addIssue({
34038
- code: z66.ZodIssueCode.custom,
34800
+ code: z67.ZodIssueCode.custom,
34039
34801
  message: `Page paths must be unique. Duplicates: ${duplicatePaths.join(", ")}`,
34040
34802
  path: ["pages"]
34041
34803
  });
@@ -34046,7 +34808,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34046
34808
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34047
34809
  if (duplicateIds.length > 0) {
34048
34810
  ctx.addIssue({
34049
- code: z66.ZodIssueCode.custom,
34811
+ code: z67.ZodIssueCode.custom,
34050
34812
  message: `Entry identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34051
34813
  path: ["entries"]
34052
34814
  });
@@ -34057,7 +34819,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34057
34819
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34058
34820
  if (duplicateIds.length > 0) {
34059
34821
  ctx.addIssue({
34060
- code: z66.ZodIssueCode.custom,
34822
+ code: z67.ZodIssueCode.custom,
34061
34823
  message: `Navigation menu identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34062
34824
  path: ["navigationMenus"]
34063
34825
  });
@@ -34071,7 +34833,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34071
34833
  const entriesForType = data.entries.filter((e) => e.contentType === singletonKey);
34072
34834
  if (entriesForType.length > 1) {
34073
34835
  ctx.addIssue({
34074
- code: z66.ZodIssueCode.custom,
34836
+ code: z67.ZodIssueCode.custom,
34075
34837
  message: `Singleton content type "${singletonKey}" cannot have more than one entry. Found ${entriesForType.length} entries.`,
34076
34838
  path: ["entries"]
34077
34839
  });
@@ -34184,18 +34946,18 @@ function validateLayout(layout) {
34184
34946
  }
34185
34947
 
34186
34948
  // src/config/dashboard-validation.ts
34187
- import { z as z67 } from "zod";
34188
- var navIdListSchema2 = z67.preprocess((value) => {
34949
+ import { z as z68 } from "zod";
34950
+ var navIdListSchema2 = z68.preprocess((value) => {
34189
34951
  if (!Array.isArray(value)) return void 0;
34190
34952
  const filtered = value.filter((v) => typeof v === "string" && v.trim().length > 0);
34191
34953
  return filtered.length > 0 ? filtered : void 0;
34192
- }, z67.array(z67.string()).max(200, "Maximum 200 nav IDs").optional());
34193
- var dashboardNavVisibilityBaseSchema2 = z67.object({
34194
- mode: z67.enum(["augment", "restrict"]).optional(),
34954
+ }, z68.array(z68.string()).max(200, "Maximum 200 nav IDs").optional());
34955
+ var dashboardNavVisibilityBaseSchema2 = z68.object({
34956
+ mode: z68.enum(["augment", "restrict"]).optional(),
34195
34957
  allowIds: navIdListSchema2,
34196
34958
  denyIds: navIdListSchema2
34197
34959
  }).strip();
34198
- var dashboardNavVisibilityRolesSchema2 = z67.object({
34960
+ var dashboardNavVisibilityRolesSchema2 = z68.object({
34199
34961
  administrator: dashboardNavVisibilityBaseSchema2.optional(),
34200
34962
  editor: dashboardNavVisibilityBaseSchema2.optional(),
34201
34963
  team_member: dashboardNavVisibilityBaseSchema2.optional()
@@ -34203,20 +34965,20 @@ var dashboardNavVisibilityRolesSchema2 = z67.object({
34203
34965
  var dashboardNavVisibilitySchema2 = dashboardNavVisibilityBaseSchema2.extend({
34204
34966
  roles: dashboardNavVisibilityRolesSchema2
34205
34967
  }).strip();
34206
- var dashboardNavigationConfigSchema2 = z67.object({
34968
+ var dashboardNavigationConfigSchema2 = z68.object({
34207
34969
  siteNav: dashboardNavVisibilitySchema2.optional(),
34208
34970
  settingsNav: dashboardNavVisibilitySchema2.optional()
34209
34971
  }).strip();
34210
- var dashboardConfigSchema2 = z67.object({
34211
- previewEditingEnabled: z67.boolean().optional(),
34972
+ var dashboardConfigSchema2 = z68.object({
34973
+ previewEditingEnabled: z68.boolean().optional(),
34212
34974
  navigation: dashboardNavigationConfigSchema2.optional()
34213
34975
  }).strip();
34214
34976
 
34215
34977
  // src/zod/titleSourceSchema.ts
34216
- import { z as z68 } from "zod";
34217
- var titleSourceValueSchema = z68.union([
34218
- z68.string().min(1),
34219
- z68.array(z68.string().min(1)).min(1)
34978
+ import { z as z69 } from "zod";
34979
+ var titleSourceValueSchema = z69.union([
34980
+ z69.string().min(1),
34981
+ z69.array(z69.string().min(1)).min(1)
34220
34982
  ]);
34221
34983
 
34222
34984
  // src/data/prefetchBlockData.ts
@@ -34235,11 +34997,11 @@ var SUPPORTED_LOADER_ENDPOINTS2 = [
34235
34997
  ];
34236
34998
 
34237
34999
  // src/config/validation.ts
34238
- var sdkThemePaletteSchema2 = z69.record(z69.string(), z69.string());
34239
- var sdkThemeConfigSchema2 = z69.object({
35000
+ var sdkThemePaletteSchema2 = z70.record(z70.string(), z70.string());
35001
+ var sdkThemeConfigSchema2 = z70.object({
34240
35002
  palette: sdkThemePaletteSchema2
34241
35003
  });
34242
- var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
35004
+ var sdkSiteUrlSchema = z70.string().url("Must be a valid URL").refine((url) => {
34243
35005
  try {
34244
35006
  const parsed = new URL(url);
34245
35007
  const isLocal = parsed.hostname === "localhost" || parsed.hostname.endsWith(".localhost") || parsed.hostname.endsWith(".local") || parsed.hostname.endsWith(".test");
@@ -34248,97 +35010,97 @@ var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
34248
35010
  return false;
34249
35011
  }
34250
35012
  }, { message: "Production URLs must use HTTPS" }).transform((url) => url.replace(/\/$/, ""));
34251
- var sectionBackgroundSchema = z69.object({
34252
- id: z69.string(),
34253
- label: z69.string(),
34254
- token: z69.string()
35013
+ var sectionBackgroundSchema = z70.object({
35014
+ id: z70.string(),
35015
+ label: z70.string(),
35016
+ token: z70.string()
34255
35017
  // Reference to theme palette token
34256
35018
  });
34257
- var sectionSpacingSchema = z69.enum(["compact", "default", "spacious"]);
34258
- var containerMaxWidthSchema = z69.enum(["narrow", "default", "wide", "full"]);
34259
- var containerAlignmentSchema = z69.enum(["left", "center", "right"]);
34260
- var sectionOptionsSchema = z69.object({
34261
- backgroundColor: z69.boolean().optional(),
34262
- backgroundImage: z69.boolean().optional(),
34263
- backgroundGradient: z69.boolean().optional(),
34264
- spacing: z69.union([
34265
- z69.array(sectionSpacingSchema),
34266
- z69.boolean()
35019
+ var sectionSpacingSchema = z70.enum(["compact", "default", "spacious"]);
35020
+ var containerMaxWidthSchema = z70.enum(["narrow", "default", "wide", "full"]);
35021
+ var containerAlignmentSchema = z70.enum(["left", "center", "right"]);
35022
+ var sectionOptionsSchema = z70.object({
35023
+ backgroundColor: z70.boolean().optional(),
35024
+ backgroundImage: z70.boolean().optional(),
35025
+ backgroundGradient: z70.boolean().optional(),
35026
+ spacing: z70.union([
35027
+ z70.array(sectionSpacingSchema),
35028
+ z70.boolean()
34267
35029
  ]).optional(),
34268
- textColor: z69.boolean().optional()
35030
+ textColor: z70.boolean().optional()
34269
35031
  }).optional();
34270
- var containerOptionsSchema = z69.object({
34271
- maxWidth: z69.union([
34272
- z69.array(containerMaxWidthSchema),
34273
- z69.boolean()
35032
+ var containerOptionsSchema = z70.object({
35033
+ maxWidth: z70.union([
35034
+ z70.array(containerMaxWidthSchema),
35035
+ z70.boolean()
34274
35036
  ]).optional(),
34275
- alignment: z69.union([
34276
- z69.array(containerAlignmentSchema),
34277
- z69.boolean()
35037
+ alignment: z70.union([
35038
+ z70.array(containerAlignmentSchema),
35039
+ z70.boolean()
34278
35040
  ]).optional()
34279
35041
  }).optional();
34280
- var siteStyleConfigSchema = z69.object({
34281
- sectionBackgrounds: z69.array(sectionBackgroundSchema).optional(),
35042
+ var siteStyleConfigSchema = z70.object({
35043
+ sectionBackgrounds: z70.array(sectionBackgroundSchema).optional(),
34282
35044
  sectionOptions: sectionOptionsSchema,
34283
35045
  containerOptions: containerOptionsSchema
34284
35046
  }).optional();
34285
- var sdkLoaderEndpointSchema2 = z69.enum(SUPPORTED_LOADER_ENDPOINTS2);
35047
+ var sdkLoaderEndpointSchema2 = z70.enum(SUPPORTED_LOADER_ENDPOINTS2);
34286
35048
  var allowedTransformIds = new Set(builtinTransformDefinitions.map((transform) => transform.id));
34287
- var loaderTransformStepSchema = z69.object({
34288
- id: z69.string().refine((id) => allowedTransformIds.has(id), {
35049
+ var loaderTransformStepSchema = z70.object({
35050
+ id: z70.string().refine((id) => allowedTransformIds.has(id), {
34289
35051
  message: "Unknown transform id"
34290
35052
  }),
34291
- options: z69.record(z69.string(), z69.unknown()).optional()
35053
+ options: z70.record(z70.string(), z70.unknown()).optional()
34292
35054
  });
34293
- var loaderParamBindingSchema2 = z69.object({
34294
- $bind: z69.object({
34295
- from: z69.string().min(1, "Binding path is required"),
35055
+ var loaderParamBindingSchema2 = z70.object({
35056
+ $bind: z70.object({
35057
+ from: z70.string().min(1, "Binding path is required"),
34296
35058
  // Loader params are ultimately string-normalized for query strings, so fallbacks should
34297
35059
  // stay scalar. Use transforms (e.g. `value.jsonArray`) when you need to serialize
34298
35060
  // more complex values into a string.
34299
- fallback: z69.union([z69.string(), z69.number(), z69.boolean(), z69.null()]).optional(),
34300
- transforms: z69.array(loaderTransformStepSchema).default([]),
34301
- pick: z69.enum(["value", "collection", "context"]).default("value"),
34302
- coerce: z69.enum(["number", "boolean", "string"]).optional()
35061
+ fallback: z70.union([z70.string(), z70.number(), z70.boolean(), z70.null()]).optional(),
35062
+ transforms: z70.array(loaderTransformStepSchema).default([]),
35063
+ pick: z70.enum(["value", "collection", "context"]).default("value"),
35064
+ coerce: z70.enum(["number", "boolean", "string"]).optional()
34303
35065
  })
34304
35066
  });
34305
- var loaderParamValueSchema2 = z69.union([
34306
- z69.string(),
34307
- z69.number(),
34308
- z69.boolean(),
35067
+ var loaderParamValueSchema2 = z70.union([
35068
+ z70.string(),
35069
+ z70.number(),
35070
+ z70.boolean(),
34309
35071
  loaderParamBindingSchema2
34310
35072
  ]);
34311
- var loaderWhenValueSchema = z69.union([
34312
- z69.boolean(),
35073
+ var loaderWhenValueSchema = z70.union([
35074
+ z70.boolean(),
34313
35075
  loaderParamBindingSchema2
34314
35076
  ]);
34315
- var sdkConfigLoaderSchema2 = z69.object({
35077
+ var sdkConfigLoaderSchema2 = z70.object({
34316
35078
  endpoint: sdkLoaderEndpointSchema2,
34317
- params: z69.record(z69.string(), loaderParamValueSchema2),
34318
- mode: z69.enum(["server", "client"]).default("server"),
35079
+ params: z70.record(z70.string(), loaderParamValueSchema2),
35080
+ mode: z70.enum(["server", "client"]).default("server"),
34319
35081
  when: loaderWhenValueSchema.optional()
34320
35082
  });
34321
- var sdkDataLoadersSchema2 = z69.record(z69.string(), sdkConfigLoaderSchema2).refine(
35083
+ var sdkDataLoadersSchema2 = z70.record(z70.string(), sdkConfigLoaderSchema2).refine(
34322
35084
  (loaders) => Object.keys(loaders).length <= 5,
34323
35085
  { message: "Maximum 5 data loaders per block" }
34324
35086
  ).optional();
34325
- var fieldSelectOptionSchema = z69.object({
34326
- value: z69.string().min(1, "Option value is required"),
34327
- label: z69.string().min(1, "Option label is required")
35087
+ var fieldSelectOptionSchema = z70.object({
35088
+ value: z70.string().min(1, "Option value is required"),
35089
+ label: z70.string().min(1, "Option label is required")
34328
35090
  });
34329
- var blockFieldConfigSchema = z69.object({
34330
- options: z69.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
35091
+ var blockFieldConfigSchema = z70.object({
35092
+ options: z70.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
34331
35093
  });
34332
- var blockFieldOptionsSchema = z69.record(
34333
- z69.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
35094
+ var blockFieldOptionsSchema = z70.record(
35095
+ z70.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
34334
35096
  message: "Block ID must be 'block.*' or 'custom.*' format"
34335
35097
  }),
34336
- z69.record(
34337
- z69.string().min(1, "Field ID is required"),
35098
+ z70.record(
35099
+ z70.string().min(1, "Field ID is required"),
34338
35100
  blockFieldConfigSchema
34339
35101
  )
34340
35102
  ).optional();
34341
- var blockFieldExtensionSchema = z69.object({
35103
+ var blockFieldExtensionSchema = z70.object({
34342
35104
  fields: fieldSchema.array().min(1, "At least one field is required")
34343
35105
  }).refine(
34344
35106
  (data) => {
@@ -34352,10 +35114,10 @@ var blockFieldExtensionSchema = z69.object({
34352
35114
  message: "Required fields must have a defaultValue to support existing blocks"
34353
35115
  }
34354
35116
  );
34355
- var blockFieldExtensionsMapSchema = z69.record(
35117
+ var blockFieldExtensionsMapSchema = z70.record(
34356
35118
  // System blocks are kebab-case: block.body-text, block.event-calendar, ...
34357
35119
  // Enforce: lowercase alphanumerics with single hyphens (no trailing hyphen, no consecutive hyphens).
34358
- z69.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
35120
+ z70.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
34359
35121
  message: "Block ID must be 'block.*' format (system blocks only)"
34360
35122
  }),
34361
35123
  blockFieldExtensionSchema
@@ -34371,7 +35133,7 @@ var blockFieldExtensionsMapSchema = z69.record(
34371
35133
  (field) => field.id === collision.fieldId
34372
35134
  );
34373
35135
  ctx.addIssue({
34374
- code: z69.ZodIssueCode.custom,
35136
+ code: z70.ZodIssueCode.custom,
34375
35137
  message: collision.message,
34376
35138
  path: [
34377
35139
  APPOINTMENT_BOOKING_BLOCK_ID,
@@ -34437,24 +35199,24 @@ function validateFieldIdConflicts(blockFieldExtensions) {
34437
35199
  }
34438
35200
  return conflicts;
34439
35201
  }
34440
- var syncConfigSchema = z69.object({
34441
- existingEntries: z69.enum(["skip", "update"]).optional()
35202
+ var syncConfigSchema = z70.object({
35203
+ existingEntries: z70.enum(["skip", "update"]).optional()
34442
35204
  }).optional();
34443
- var deployConfigSchema = z69.object({
34444
- verifyCommand: z69.string().optional(),
34445
- prebuildOutput: z69.string().optional()
35205
+ var deployConfigSchema = z70.object({
35206
+ verifyCommand: z70.string().optional(),
35207
+ prebuildOutput: z70.string().optional()
34446
35208
  }).optional();
34447
- var sdkCustomBlockSchema = z69.object({
35209
+ var sdkCustomBlockSchema = z70.object({
34448
35210
  // Block ID must start with 'custom.'
34449
- id: z69.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
35211
+ id: z70.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
34450
35212
  message: "Block ID must start with 'custom.' followed by lowercase letters, numbers, or hyphens"
34451
35213
  }),
34452
- title: z69.string().min(1, "Title is required"),
35214
+ title: z70.string().min(1, "Title is required"),
34453
35215
  titleSource: titleSourceValueSchema.optional(),
34454
- description: z69.string().optional(),
35216
+ description: z70.string().optional(),
34455
35217
  category: blockCategoryEnum,
34456
- icon: z69.string().optional(),
34457
- tags: z69.array(z69.string()).optional(),
35218
+ icon: z70.string().optional(),
35219
+ tags: z70.array(z70.string()).optional(),
34458
35220
  // Reuse the exact field schema from @riverbankcms/blocks - all field types supported
34459
35221
  fields: fieldSchema.array().min(1, "Custom blocks must have at least one field"),
34460
35222
  // Data loaders for CMS endpoints
@@ -34462,14 +35224,14 @@ var sdkCustomBlockSchema = z69.object({
34462
35224
  // Optional declarative layout - when present, block can render without React override
34463
35225
  layout: NodeSchema.optional(),
34464
35226
  // Optional variants system (preferred when a block has multiple structural layouts)
34465
- variants: z69.record(z69.string().min(1), NodeSchema).optional(),
34466
- defaultVariant: z69.string().min(1).optional(),
34467
- variantOptions: z69.record(
34468
- z69.string().min(1),
34469
- z69.object({
34470
- label: z69.string().min(1).optional(),
34471
- description: z69.string().min(1).optional(),
34472
- icon: z69.string().min(1).optional()
35227
+ variants: z70.record(z70.string().min(1), NodeSchema).optional(),
35228
+ defaultVariant: z70.string().min(1).optional(),
35229
+ variantOptions: z70.record(
35230
+ z70.string().min(1),
35231
+ z70.object({
35232
+ label: z70.string().min(1).optional(),
35233
+ description: z70.string().min(1).optional(),
35234
+ icon: z70.string().min(1).optional()
34473
35235
  })
34474
35236
  ).optional()
34475
35237
  }).superRefine((data, ctx) => {
@@ -34480,7 +35242,7 @@ var sdkCustomBlockSchema = z69.object({
34480
35242
  const exists = fields3.some((field) => field.id === source);
34481
35243
  if (!exists) {
34482
35244
  ctx.addIssue({
34483
- code: z69.ZodIssueCode.custom,
35245
+ code: z70.ZodIssueCode.custom,
34484
35246
  message: `titleSource must reference a valid field ID (got "${source}")`,
34485
35247
  path: Array.isArray(data.titleSource) ? ["titleSource", index] : ["titleSource"]
34486
35248
  });
@@ -34489,7 +35251,7 @@ var sdkCustomBlockSchema = z69.object({
34489
35251
  }
34490
35252
  if (data.layout && data.variants) {
34491
35253
  ctx.addIssue({
34492
- code: z69.ZodIssueCode.custom,
35254
+ code: z70.ZodIssueCode.custom,
34493
35255
  message: "Custom block must define either `layout` or `variants`, not both",
34494
35256
  path: ["variants"]
34495
35257
  });
@@ -34499,7 +35261,7 @@ var sdkCustomBlockSchema = z69.object({
34499
35261
  if (!result.valid) {
34500
35262
  for (const error of result.errors) {
34501
35263
  ctx.addIssue({
34502
- code: z69.ZodIssueCode.custom,
35264
+ code: z70.ZodIssueCode.custom,
34503
35265
  message: error.message,
34504
35266
  path: ["layout"]
34505
35267
  });
@@ -34510,14 +35272,14 @@ var sdkCustomBlockSchema = z69.object({
34510
35272
  const keys = Object.keys(data.variants);
34511
35273
  if (keys.length === 0) {
34512
35274
  ctx.addIssue({
34513
- code: z69.ZodIssueCode.custom,
35275
+ code: z70.ZodIssueCode.custom,
34514
35276
  message: "`variants` must contain at least one variant key",
34515
35277
  path: ["variants"]
34516
35278
  });
34517
35279
  }
34518
35280
  if (data.defaultVariant && !Object.prototype.hasOwnProperty.call(data.variants, data.defaultVariant)) {
34519
35281
  ctx.addIssue({
34520
- code: z69.ZodIssueCode.custom,
35282
+ code: z70.ZodIssueCode.custom,
34521
35283
  message: "`defaultVariant` must be a key present in `variants`",
34522
35284
  path: ["defaultVariant"]
34523
35285
  });
@@ -34527,7 +35289,7 @@ var sdkCustomBlockSchema = z69.object({
34527
35289
  if (!result.valid) {
34528
35290
  for (const error of result.errors) {
34529
35291
  ctx.addIssue({
34530
- code: z69.ZodIssueCode.custom,
35292
+ code: z70.ZodIssueCode.custom,
34531
35293
  message: `${key}: ${error.message}`,
34532
35294
  path: ["variants", key]
34533
35295
  });
@@ -34538,7 +35300,7 @@ var sdkCustomBlockSchema = z69.object({
34538
35300
  for (const key of Object.keys(data.variantOptions)) {
34539
35301
  if (!Object.prototype.hasOwnProperty.call(data.variants, key)) {
34540
35302
  ctx.addIssue({
34541
- code: z69.ZodIssueCode.custom,
35303
+ code: z70.ZodIssueCode.custom,
34542
35304
  message: "`variantOptions` key must exist in `variants`",
34543
35305
  path: ["variantOptions", key]
34544
35306
  });
@@ -34547,58 +35309,58 @@ var sdkCustomBlockSchema = z69.object({
34547
35309
  }
34548
35310
  }
34549
35311
  });
34550
- var themeSourceSchema = z69.enum(["local", "cms"]).optional();
34551
- var activeThemeSchema = z69.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
35312
+ var themeSourceSchema = z70.enum(["local", "cms"]).optional();
35313
+ var activeThemeSchema = z70.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
34552
35314
  message: "Theme name must be lowercase alphanumeric with hyphens/underscores"
34553
35315
  }).max(64, "Theme name too long").optional();
34554
35316
  function isValidConfigBlockKind(kind) {
34555
35317
  if (getBlockDefinition(kind)) return true;
34556
35318
  return /^custom\.[a-z][a-z0-9-]*$/.test(kind);
34557
35319
  }
34558
- var layoutBlockKindSchema = z69.string().refine(isValidConfigBlockKind, {
35320
+ var layoutBlockKindSchema = z70.string().refine(isValidConfigBlockKind, {
34559
35321
  message: 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.my-block")'
34560
35322
  });
34561
- var layoutFooterBlockSchema = z69.object({
34562
- id: z69.string().min(1).optional(),
35323
+ var layoutFooterBlockSchema = z70.object({
35324
+ id: z70.string().min(1).optional(),
34563
35325
  kind: layoutBlockKindSchema,
34564
35326
  // Allow omitted content for blocks that rely on defaults.
34565
- content: z69.record(z69.string(), z69.unknown()).optional()
35327
+ content: z70.record(z70.string(), z70.unknown()).optional()
34566
35328
  }).strict();
34567
- var layoutConfigSchema = z69.object({
34568
- footerBlocks: z69.array(layoutFooterBlockSchema).optional()
35329
+ var layoutConfigSchema = z70.object({
35330
+ footerBlocks: z70.array(layoutFooterBlockSchema).optional()
34569
35331
  }).strict();
34570
- var sdkWorkflowIdSchema2 = z69.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
35332
+ var sdkWorkflowIdSchema2 = z70.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
34571
35333
  message: "Workflow ID must start with a lowercase letter and use lowercase letters, numbers, dots, underscores, or hyphens"
34572
35334
  });
34573
- 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 "/"' });
34574
- var sdkWorkflowTriggerSchema2 = z69.discriminatedUnion("type", [
34575
- z69.object({ type: z69.literal("manual") }).strict()
35335
+ var sdkWorkflowEndpointSchema2 = z70.string().min(1).max(SDK_WORKFLOW_ENDPOINT_MAX_LENGTH).regex(SDK_WORKFLOW_ENDPOINT_PATTERN, { message: 'Workflow endpoint must be a site-relative path starting with "/"' });
35336
+ var sdkWorkflowTriggerSchema2 = z70.discriminatedUnion("type", [
35337
+ z70.object({ type: z70.literal("manual") }).strict()
34576
35338
  ]);
34577
- var sdkWorkflowConfirmationSchema2 = z69.object({
34578
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
34579
- body: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
35339
+ var sdkWorkflowConfirmationSchema2 = z70.object({
35340
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
35341
+ body: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
34580
35342
  }).strict();
34581
- var sdkWorkflowConfigSchema2 = z69.object({
35343
+ var sdkWorkflowConfigSchema2 = z70.object({
34582
35344
  id: sdkWorkflowIdSchema2,
34583
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
34584
- description: z69.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
34585
- contentType: z69.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
35345
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
35346
+ description: z70.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
35347
+ contentType: z70.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
34586
35348
  endpoint: sdkWorkflowEndpointSchema2,
34587
- triggers: z69.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
35349
+ triggers: z70.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
34588
35350
  confirmation: sdkWorkflowConfirmationSchema2.optional()
34589
35351
  }).strict();
34590
- var sdkWorkflowsSchema2 = z69.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
35352
+ var sdkWorkflowsSchema2 = z70.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
34591
35353
  const ids = workflows.map((workflow) => workflow.id);
34592
35354
  return ids.length === new Set(ids).size;
34593
35355
  }, { message: "Workflow IDs must be unique" }).optional();
34594
- var riverbankSiteConfigSchema = z69.object({
34595
- siteId: z69.string().uuid(),
35356
+ var riverbankSiteConfigSchema = z70.object({
35357
+ siteId: z70.string().uuid(),
34596
35358
  previewUrl: sdkSiteUrlSchema.optional(),
34597
35359
  liveUrl: sdkSiteUrlSchema.optional(),
34598
35360
  theme: sdkThemeConfigSchema2.optional(),
34599
35361
  styles: siteStyleConfigSchema,
34600
35362
  layout: layoutConfigSchema.optional(),
34601
- customBlocks: z69.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
35363
+ customBlocks: z70.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
34602
35364
  // Ensure unique block IDs
34603
35365
  (blocks) => {
34604
35366
  const ids = blocks.map((b) => b.id);
@@ -34611,7 +35373,7 @@ var riverbankSiteConfigSchema = z69.object({
34611
35373
  workflows: sdkWorkflowsSchema2,
34612
35374
  content: contentConfigSchema.optional(),
34613
35375
  // CLI-related configuration (Phase 4)
34614
- contentDir: z69.string().optional(),
35376
+ contentDir: z70.string().optional(),
34615
35377
  sync: syncConfigSchema,
34616
35378
  deploy: deployConfigSchema,
34617
35379
  // Theme sync configuration (Phase 5)