@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
@@ -3955,6 +3955,14 @@ var ENDPOINT_DEFINITIONS = {
3955
3955
  responseKind: "json",
3956
3956
  errors: []
3957
3957
  },
3958
+ applyDiscountCode: {
3959
+ path: "/public/sites/{siteId}/bookings/discounts/apply",
3960
+ method: "POST",
3961
+ tags: ["site-{siteId}", "booking-discounts"],
3962
+ auth: "public",
3963
+ responseKind: "json",
3964
+ errors: ["validation:invalid_input", "rate_limit:exceeded"]
3965
+ },
3958
3966
  // Batch endpoint for block loader requests (reduces SSR fan-out)
3959
3967
  batchBlockLoaders: {
3960
3968
  path: "/public/sites/{siteId}/block-loaders/batch",
@@ -6842,7 +6850,7 @@ var SimpleCache = class {
6842
6850
  };
6843
6851
 
6844
6852
  // src/version.ts
6845
- var SDK_VERSION = "0.77.1";
6853
+ var SDK_VERSION = "0.78.0";
6846
6854
 
6847
6855
  // src/client/error.ts
6848
6856
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -6987,6 +6995,16 @@ var RiverbankApiError = class _RiverbankApiError extends Error {
6987
6995
  return lines.join("\n");
6988
6996
  }
6989
6997
  };
6998
+ var resilienceStatusSymbol = /* @__PURE__ */ Symbol.for("riverbankcms.sdk.resilienceStatus");
6999
+ function attachResilienceStatusToError(error, resilienceStatus) {
7000
+ const target = error !== null && (typeof error === "object" || typeof error === "function") ? error : new Error(error === void 0 ? "Unknown error" : String(error));
7001
+ Object.defineProperty(target, resilienceStatusSymbol, {
7002
+ configurable: true,
7003
+ enumerable: false,
7004
+ value: resilienceStatus
7005
+ });
7006
+ return target;
7007
+ }
6990
7008
 
6991
7009
  // src/client/resilience.ts
6992
7010
  var DEFAULT_RETRY_CONFIG = {
@@ -7245,7 +7263,9 @@ var CircuitOpenError = class extends Error {
7245
7263
  var prebuildModule = null;
7246
7264
  function tryRequire(modulePath) {
7247
7265
  try {
7248
- const req = Function('return typeof require === "function" ? require : null')();
7266
+ const req = Function(
7267
+ 'return typeof require === "function" ? require : null'
7268
+ )();
7249
7269
  return req ? req(modulePath) : null;
7250
7270
  } catch {
7251
7271
  return null;
@@ -7264,7 +7284,9 @@ function getPrebuildModule() {
7264
7284
  return null;
7265
7285
  }
7266
7286
  try {
7267
- prebuildModule = tryRequire("../prebuild/loader");
7287
+ prebuildModule = tryRequire(
7288
+ "../prebuild/loader"
7289
+ );
7268
7290
  return prebuildModule;
7269
7291
  } catch {
7270
7292
  return null;
@@ -7324,7 +7346,9 @@ function normalizePublicFormResult(result) {
7324
7346
  }
7325
7347
  function normalizePublicFormsResponse(response) {
7326
7348
  return {
7327
- forms: response.forms.map((form2) => normalizePublicFormResponse({ form: form2 }).form)
7349
+ forms: response.forms.map(
7350
+ (form2) => normalizePublicFormResponse({ form: form2 }).form
7351
+ )
7328
7352
  };
7329
7353
  }
7330
7354
  function normalizePublicFormsResult(result) {
@@ -7523,7 +7547,10 @@ function createRiverbankClient(config) {
7523
7547
  isDegraded = nowDegraded;
7524
7548
  config.resilience?.onDegradedMode?.(nowDegraded, status);
7525
7549
  }
7526
- return data;
7550
+ return {
7551
+ data,
7552
+ resilience: status
7553
+ };
7527
7554
  }
7528
7555
  async function resilientFetch(cacheKey, fetcher, options) {
7529
7556
  const requestId = generateRequestId2();
@@ -7547,25 +7574,43 @@ function createRiverbankClient(config) {
7547
7574
  if (allowFallbacks && !isPreview && staleIfError) {
7548
7575
  const stale = cache.getStale(cacheKey);
7549
7576
  if (stale) {
7550
- return emitStatus("stale", stale.value, statusDetails({
7551
- staleAgeSec: stale.staleAgeSec,
7552
- error: { code: "circuit_open", message: "Circuit breaker is open" }
7553
- }));
7577
+ return emitStatus(
7578
+ "stale",
7579
+ stale.value,
7580
+ statusDetails({
7581
+ staleAgeSec: stale.staleAgeSec,
7582
+ error: {
7583
+ code: "circuit_open",
7584
+ message: "Circuit breaker is open"
7585
+ }
7586
+ })
7587
+ );
7554
7588
  }
7555
7589
  }
7556
7590
  if (allowFallbacks && !isPreview && options.prebuildFallback) {
7557
7591
  const prebuildResult = options.prebuildFallback();
7558
7592
  if (prebuildResult) {
7559
- return emitStatus("prebuild", prebuildResult.data, statusDetails({
7560
- prebuildAgeSec: prebuildResult.prebuildAgeSec,
7561
- error: { code: "circuit_open", message: "Circuit breaker is open" }
7562
- }));
7593
+ return emitStatus(
7594
+ "prebuild",
7595
+ prebuildResult.data,
7596
+ statusDetails({
7597
+ prebuildAgeSec: prebuildResult.prebuildAgeSec,
7598
+ error: {
7599
+ code: "circuit_open",
7600
+ message: "Circuit breaker is open"
7601
+ }
7602
+ })
7603
+ );
7563
7604
  }
7564
7605
  }
7565
7606
  const circuitState = circuitBreaker.getState();
7566
- emitStatus("error", null, statusDetails({
7567
- error: { code: "circuit_open", message: "Circuit breaker is open" }
7568
- }));
7607
+ emitStatus(
7608
+ "error",
7609
+ null,
7610
+ statusDetails({
7611
+ error: { code: "circuit_open", message: "Circuit breaker is open" }
7612
+ })
7613
+ );
7569
7614
  throw new CircuitOpenError(circuitState);
7570
7615
  }
7571
7616
  try {
@@ -7592,7 +7637,9 @@ function createRiverbankClient(config) {
7592
7637
  circuitBreaker.recordSuccess();
7593
7638
  } else {
7594
7639
  try {
7595
- const response = await fetcher(options.signal ?? new AbortController().signal);
7640
+ const response = await fetcher(
7641
+ options.signal ?? new AbortController().signal
7642
+ );
7596
7643
  data = unwrapResponse(response);
7597
7644
  } catch (error) {
7598
7645
  convertToTypedError(error);
@@ -7609,28 +7656,51 @@ function createRiverbankClient(config) {
7609
7656
  if (allowFallbacks && !isPreview && staleIfError && cacheEnabled) {
7610
7657
  const stale = cache.getStale(cacheKey);
7611
7658
  if (stale) {
7612
- const errorInfo2 = error instanceof RiverbankApiError ? { code: error.code, message: error.message } : { message: error.message };
7613
- return emitStatus("stale", stale.value, statusDetails({
7614
- staleAgeSec: stale.staleAgeSec,
7615
- error: errorInfo2
7616
- }));
7659
+ const errorInfo2 = error instanceof RiverbankApiError ? {
7660
+ code: error.code,
7661
+ message: error.message,
7662
+ status: error.status
7663
+ } : { message: error.message };
7664
+ return emitStatus(
7665
+ "stale",
7666
+ stale.value,
7667
+ statusDetails({
7668
+ staleAgeSec: stale.staleAgeSec,
7669
+ error: errorInfo2
7670
+ })
7671
+ );
7617
7672
  }
7618
7673
  }
7619
7674
  if (allowFallbacks && !isPreview && options.prebuildFallback) {
7620
7675
  const prebuildResult = options.prebuildFallback();
7621
7676
  if (prebuildResult) {
7622
- const errorInfo2 = error instanceof RiverbankApiError ? { code: error.code, message: error.message } : { message: error.message };
7623
- return emitStatus("prebuild", prebuildResult.data, statusDetails({
7624
- prebuildAgeSec: prebuildResult.prebuildAgeSec,
7625
- error: errorInfo2
7626
- }));
7677
+ const errorInfo2 = error instanceof RiverbankApiError ? {
7678
+ code: error.code,
7679
+ message: error.message,
7680
+ status: error.status
7681
+ } : { message: error.message };
7682
+ return emitStatus(
7683
+ "prebuild",
7684
+ prebuildResult.data,
7685
+ statusDetails({
7686
+ prebuildAgeSec: prebuildResult.prebuildAgeSec,
7687
+ error: errorInfo2
7688
+ })
7689
+ );
7627
7690
  }
7628
7691
  }
7629
- const errorInfo = error instanceof RiverbankApiError ? { code: error.code, message: error.message } : { message: error.message };
7630
- emitStatus("error", null, statusDetails({ error: errorInfo }));
7631
- throw error;
7692
+ const errorInfo = error instanceof RiverbankApiError ? { code: error.code, message: error.message, status: error.status } : { message: error.message };
7693
+ const failure = emitStatus(
7694
+ "error",
7695
+ null,
7696
+ statusDetails({ error: errorInfo })
7697
+ );
7698
+ throw attachResilienceStatusToError(error, failure.resilience);
7632
7699
  }
7633
7700
  }
7701
+ async function resilientFetchData(cacheKey, fetcher, options) {
7702
+ return (await resilientFetch(cacheKey, fetcher, options)).data;
7703
+ }
7634
7704
  function combineAbortSignals(...signals) {
7635
7705
  const controller = new AbortController();
7636
7706
  for (const signal of signals) {
@@ -7638,32 +7708,45 @@ function createRiverbankClient(config) {
7638
7708
  controller.abort(signal.reason);
7639
7709
  break;
7640
7710
  }
7641
- signal.addEventListener("abort", () => controller.abort(signal.reason), { once: true });
7711
+ signal.addEventListener("abort", () => controller.abort(signal.reason), {
7712
+ once: true
7713
+ });
7642
7714
  }
7643
7715
  return controller.signal;
7644
7716
  }
7645
7717
  async function resolveEntrySubrouteInternal(args) {
7646
7718
  const { siteId, entryId, kind, segment, stage, signal } = args;
7647
7719
  const cacheKey = `entry-subroute:${siteId}:${entryId}:${kind}:${segment}:${stage ?? "published"}`;
7648
- return resilientFetch(cacheKey, async (sig) => {
7649
- return await apiClient({
7650
- endpoint: "resolveEntrySubroute",
7651
- params: { siteId, entryId, kind, segment, ...stage ? { stage } : {} },
7652
- options: { signal: sig }
7653
- });
7654
- }, { signal });
7720
+ return resilientFetchData(
7721
+ cacheKey,
7722
+ async (sig) => {
7723
+ return await apiClient({
7724
+ endpoint: "resolveEntrySubroute",
7725
+ params: {
7726
+ siteId,
7727
+ entryId,
7728
+ kind,
7729
+ segment,
7730
+ ...stage ? { stage } : {}
7731
+ },
7732
+ options: { signal: sig }
7733
+ });
7734
+ },
7735
+ { signal }
7736
+ );
7655
7737
  }
7656
- return {
7657
- async getSite(params) {
7658
- const { slug, domain, id, signal, force, currentPath } = params;
7659
- if (!slug && !domain && !id) {
7660
- throw new Error(
7661
- `getSite() requires at least one identifier: slug, domain, or id. Received: ${JSON.stringify(params)}`
7662
- );
7663
- }
7664
- const cacheKey = `site:${slug || domain || id}:${currentPath ?? ""}`;
7665
- const siteId = id || slug || domain;
7666
- return resilientFetch(cacheKey, async (sig) => {
7738
+ async function getSiteWithResilienceInternal(params) {
7739
+ const { slug, domain, id, signal, force, currentPath } = params;
7740
+ if (!slug && !domain && !id) {
7741
+ throw new Error(
7742
+ `getSite() requires at least one identifier: slug, domain, or id. Received: ${JSON.stringify(params)}`
7743
+ );
7744
+ }
7745
+ const cacheKey = `site:${slug || domain || id}:${currentPath ?? ""}`;
7746
+ const siteId = id || slug || domain;
7747
+ return resilientFetch(
7748
+ cacheKey,
7749
+ async (sig) => {
7667
7750
  const apiParams = {};
7668
7751
  if (params.slug) apiParams.slug = params.slug;
7669
7752
  if (params.domain) apiParams.domain = params.domain;
@@ -7674,66 +7757,120 @@ function createRiverbankClient(config) {
7674
7757
  endpoint: "getSite",
7675
7758
  params: apiParams,
7676
7759
  // When force=true, bypass Next.js fetch caching (revalidate) as well.
7677
- options: { signal: sig, ...force ? { cache: "no-store" } : {} }
7760
+ options: {
7761
+ signal: sig,
7762
+ ...force ? { cache: "no-store" } : {}
7763
+ }
7678
7764
  });
7679
- }, {
7765
+ },
7766
+ {
7680
7767
  signal,
7681
7768
  force,
7682
7769
  prebuildFallback: prebuildLoader && siteId ? () => prebuildLoader.loadSite(siteId) : void 0
7683
- });
7684
- },
7685
- async getPage(params) {
7686
- const { siteId, path, preview = false, signal } = params;
7687
- const cacheKey = `page:${siteId}:${path}:${preview}`;
7688
- return resilientFetch(cacheKey, async (sig) => {
7689
- return await apiClient({ endpoint: "getContentByPath", params: { siteId }, body: { path, preview }, options: { signal: sig } });
7690
- }, {
7770
+ }
7771
+ );
7772
+ }
7773
+ async function getPageWithResilienceInternal(params) {
7774
+ const { siteId, path, preview = false, signal } = params;
7775
+ const cacheKey = `page:${siteId}:${path}:${preview}`;
7776
+ return resilientFetch(
7777
+ cacheKey,
7778
+ async (sig) => {
7779
+ return await apiClient({
7780
+ endpoint: "getContentByPath",
7781
+ params: { siteId },
7782
+ body: { path, preview },
7783
+ options: { signal: sig }
7784
+ });
7785
+ },
7786
+ {
7691
7787
  preview,
7692
7788
  signal,
7693
7789
  // Prebuild fallback only for published pages (not preview)
7694
7790
  prebuildFallback: prebuildLoader && !preview ? () => prebuildLoader.loadPage(siteId, path) : void 0
7695
- });
7791
+ }
7792
+ );
7793
+ }
7794
+ return {
7795
+ async getSite(params) {
7796
+ return (await getSiteWithResilienceInternal(params)).data;
7797
+ },
7798
+ async getSiteWithResilience(params) {
7799
+ return getSiteWithResilienceInternal(params);
7800
+ },
7801
+ async getPage(params) {
7802
+ return (await getPageWithResilienceInternal(params)).data;
7803
+ },
7804
+ async getPageWithResilience(params) {
7805
+ return getPageWithResilienceInternal(params);
7696
7806
  },
7697
7807
  async getEntries(params) {
7698
- const { siteId, contentType, limit, offset, order, preview = false, mode, entryIds, includeMeta, signal } = params;
7808
+ const {
7809
+ siteId,
7810
+ contentType,
7811
+ limit,
7812
+ offset,
7813
+ order,
7814
+ preview = false,
7815
+ mode,
7816
+ entryIds,
7817
+ includeMeta,
7818
+ signal
7819
+ } = params;
7699
7820
  const entryIdsCacheKey = mode === "manual" && entryIds?.length ? entryIds.join(",") : "";
7700
7821
  const cacheKey = `entries:${siteId}:${contentType}:${limit ?? ""}:${offset ?? ""}:${order ?? ""}:${preview}:${mode ?? ""}:${entryIdsCacheKey}:${includeMeta ?? ""}`;
7701
- return resilientFetch(cacheKey, async (sig) => {
7702
- let orderParam;
7703
- if (order === "newest") {
7704
- orderParam = "published_at.desc";
7705
- } else if (order === "oldest") {
7706
- orderParam = "published_at.asc";
7707
- } else if (order === "title") {
7708
- orderParam = "title.asc";
7709
- }
7710
- const apiParams = {
7711
- siteId,
7712
- type: contentType,
7713
- ...typeof limit === "number" && { limit: String(limit) },
7714
- ...typeof offset === "number" && { offset: String(offset) },
7715
- ...includeMeta && { meta: "true" },
7716
- ...orderParam && { order: orderParam },
7717
- ...preview && { stage: "preview" },
7718
- ...mode === "manual" && entryIds?.length && {
7719
- mode: "manual",
7720
- entryIds: JSON.stringify(entryIds)
7822
+ return resilientFetchData(
7823
+ cacheKey,
7824
+ async (sig) => {
7825
+ let orderParam;
7826
+ if (order === "newest") {
7827
+ orderParam = "published_at.desc";
7828
+ } else if (order === "oldest") {
7829
+ orderParam = "published_at.asc";
7830
+ } else if (order === "title") {
7831
+ orderParam = "title.asc";
7721
7832
  }
7722
- };
7723
- return await apiClient({ endpoint: "listPublishedEntries", params: apiParams, options: { signal: sig } });
7724
- }, {
7725
- preview,
7726
- signal,
7727
- // Prebuild fallback only for published entries (not preview, not manual mode)
7728
- prebuildFallback: prebuildLoader && !preview ? () => prebuildLoader.loadEntries(siteId, params) : void 0
7729
- });
7833
+ const apiParams = {
7834
+ siteId,
7835
+ type: contentType,
7836
+ ...typeof limit === "number" && { limit: String(limit) },
7837
+ ...typeof offset === "number" && { offset: String(offset) },
7838
+ ...includeMeta && { meta: "true" },
7839
+ ...orderParam && { order: orderParam },
7840
+ ...preview && { stage: "preview" },
7841
+ ...mode === "manual" && entryIds?.length && {
7842
+ mode: "manual",
7843
+ entryIds: JSON.stringify(entryIds)
7844
+ }
7845
+ };
7846
+ return await apiClient({
7847
+ endpoint: "listPublishedEntries",
7848
+ params: apiParams,
7849
+ options: { signal: sig }
7850
+ });
7851
+ },
7852
+ {
7853
+ preview,
7854
+ signal,
7855
+ // Prebuild fallback only for published entries (not preview, not manual mode)
7856
+ prebuildFallback: prebuildLoader && !preview ? () => prebuildLoader.loadEntries(siteId, params) : void 0
7857
+ }
7858
+ );
7730
7859
  },
7731
7860
  async getEntry(params) {
7732
7861
  const { siteId, contentType, slug, signal } = params;
7733
7862
  const cacheKey = `entry:${siteId}:${contentType}:${slug}`;
7734
- return resilientFetch(cacheKey, async (sig) => {
7735
- return await apiClient({ endpoint: "getPublishedEntryPreview", params: { siteId, type: contentType, slug }, options: { signal: sig } });
7736
- }, { signal });
7863
+ return resilientFetchData(
7864
+ cacheKey,
7865
+ async (sig) => {
7866
+ return await apiClient({
7867
+ endpoint: "getPublishedEntryPreview",
7868
+ params: { siteId, type: contentType, slug },
7869
+ options: { signal: sig }
7870
+ });
7871
+ },
7872
+ { signal }
7873
+ );
7737
7874
  },
7738
7875
  async getPublicFormById(params) {
7739
7876
  const { formId, siteId, signal } = params;
@@ -7741,10 +7878,18 @@ function createRiverbankClient(config) {
7741
7878
  throw new Error("getPublicFormById() requires formId and siteId");
7742
7879
  }
7743
7880
  const cacheKey = `public-form:${siteId}:${formId}`;
7744
- return resilientFetch(cacheKey, async (sig) => {
7745
- const response = await apiClient({ endpoint: "getPublicFormById", params: { formId, siteId }, options: { signal: sig } });
7746
- return normalizePublicFormResult(response);
7747
- }, { signal });
7881
+ return resilientFetchData(
7882
+ cacheKey,
7883
+ async (sig) => {
7884
+ const response = await apiClient({
7885
+ endpoint: "getPublicFormById",
7886
+ params: { formId, siteId },
7887
+ options: { signal: sig }
7888
+ });
7889
+ return normalizePublicFormResult(response);
7890
+ },
7891
+ { signal }
7892
+ );
7748
7893
  },
7749
7894
  async getForms(params) {
7750
7895
  const { siteId, signal } = params;
@@ -7752,34 +7897,42 @@ function createRiverbankClient(config) {
7752
7897
  throw new Error("getForms() requires siteId");
7753
7898
  }
7754
7899
  const cacheKey = `forms:${siteId}`;
7755
- return resilientFetch(cacheKey, async (sig) => {
7756
- const response = await apiClient({ endpoint: "listPublicForms", params: { siteId }, options: { signal: sig } });
7757
- return normalizePublicFormsResult(response);
7758
- }, {
7759
- signal,
7760
- prebuildFallback: prebuildLoader ? () => {
7761
- const result = prebuildLoader.loadForms();
7762
- if (result) {
7763
- return {
7764
- data: {
7765
- forms: result.data.map((form2) => ({
7766
- id: form2.id,
7767
- slug: form2.slug,
7768
- name: form2.name,
7769
- schema: form2.schema,
7770
- settings: form2.settings,
7771
- schemaJson: form2.schema,
7772
- settingsJson: form2.settings,
7773
- createdAt: null,
7774
- updatedAt: null
7775
- }))
7776
- },
7777
- prebuildAgeSec: result.prebuildAgeSec
7778
- };
7779
- }
7780
- return null;
7781
- } : void 0
7782
- });
7900
+ return resilientFetchData(
7901
+ cacheKey,
7902
+ async (sig) => {
7903
+ const response = await apiClient({
7904
+ endpoint: "listPublicForms",
7905
+ params: { siteId },
7906
+ options: { signal: sig }
7907
+ });
7908
+ return normalizePublicFormsResult(response);
7909
+ },
7910
+ {
7911
+ signal,
7912
+ prebuildFallback: prebuildLoader ? () => {
7913
+ const result = prebuildLoader.loadForms();
7914
+ if (result) {
7915
+ return {
7916
+ data: {
7917
+ forms: result.data.map((form2) => ({
7918
+ id: form2.id,
7919
+ slug: form2.slug,
7920
+ name: form2.name,
7921
+ schema: form2.schema,
7922
+ settings: form2.settings,
7923
+ schemaJson: form2.schema,
7924
+ settingsJson: form2.settings,
7925
+ createdAt: null,
7926
+ updatedAt: null
7927
+ }))
7928
+ },
7929
+ prebuildAgeSec: result.prebuildAgeSec
7930
+ };
7931
+ }
7932
+ return null;
7933
+ } : void 0
7934
+ }
7935
+ );
7783
7936
  },
7784
7937
  async getPublicBookingServices(params) {
7785
7938
  const { siteId, ids, signal } = params;
@@ -7787,13 +7940,21 @@ function createRiverbankClient(config) {
7787
7940
  throw new Error("getPublicBookingServices() requires siteId");
7788
7941
  }
7789
7942
  const cacheKey = `public-booking-services:${siteId}:${ids ?? ""}`;
7790
- return resilientFetch(cacheKey, async (sig) => {
7791
- const apiParams = {
7792
- siteId,
7793
- ...ids && { ids }
7794
- };
7795
- return await apiClient({ endpoint: "getPublicBookingServices", params: apiParams, options: { signal: sig } });
7796
- }, { signal });
7943
+ return resilientFetchData(
7944
+ cacheKey,
7945
+ async (sig) => {
7946
+ const apiParams = {
7947
+ siteId,
7948
+ ...ids && { ids }
7949
+ };
7950
+ return await apiClient({
7951
+ endpoint: "getPublicBookingServices",
7952
+ params: apiParams,
7953
+ options: { signal: sig }
7954
+ });
7955
+ },
7956
+ { signal }
7957
+ );
7797
7958
  },
7798
7959
  async listPublicEvents(params) {
7799
7960
  const {
@@ -7814,22 +7975,30 @@ function createRiverbankClient(config) {
7814
7975
  throw new Error("listPublicEvents() requires siteId");
7815
7976
  }
7816
7977
  const cacheKey = `public-events:${siteId}:${limit ?? ""}:${from ?? ""}:${to ?? ""}:${stage ?? ""}:${categoryIds ?? ""}:${venueId ?? ""}:${kind ?? ""}:${entryId ?? ""}:${seriesId ?? ""}:${includeOccurrenceId ?? ""}`;
7817
- return resilientFetch(cacheKey, async (sig) => {
7818
- const apiParams = {
7819
- siteId,
7820
- ...typeof limit === "number" && { limit: String(limit) },
7821
- ...from && { from },
7822
- ...to && { to },
7823
- ...stage && { stage },
7824
- ...categoryIds && { categoryIds },
7825
- ...venueId && { venueId },
7826
- ...kind && { kind },
7827
- ...entryId && { entryId },
7828
- ...seriesId && { seriesId },
7829
- ...includeOccurrenceId && { includeOccurrenceId }
7830
- };
7831
- return await apiClient({ endpoint: "listPublicEvents", params: apiParams, options: { signal: sig } });
7832
- }, { signal });
7978
+ return resilientFetchData(
7979
+ cacheKey,
7980
+ async (sig) => {
7981
+ const apiParams = {
7982
+ siteId,
7983
+ ...typeof limit === "number" && { limit: String(limit) },
7984
+ ...from && { from },
7985
+ ...to && { to },
7986
+ ...stage && { stage },
7987
+ ...categoryIds && { categoryIds },
7988
+ ...venueId && { venueId },
7989
+ ...kind && { kind },
7990
+ ...entryId && { entryId },
7991
+ ...seriesId && { seriesId },
7992
+ ...includeOccurrenceId && { includeOccurrenceId }
7993
+ };
7994
+ return await apiClient({
7995
+ endpoint: "listPublicEvents",
7996
+ params: apiParams,
7997
+ options: { signal: sig }
7998
+ });
7999
+ },
8000
+ { signal }
8001
+ );
7833
8002
  },
7834
8003
  async getPublicEventDetails(params) {
7835
8004
  const {
@@ -7853,37 +8022,44 @@ function createRiverbankClient(config) {
7853
8022
  throw new Error("getPublicEventDetails() requires siteId");
7854
8023
  }
7855
8024
  const cacheKey = `public-event-details:${siteId}:${limit ?? ""}:${from ?? ""}:${to ?? ""}:${afterStartsAt ?? ""}:${afterId ?? ""}:${stage ?? ""}:${categoryIds ?? ""}:${venueId ?? ""}:${staffMemberId ?? ""}:${kind ?? ""}:${entryId ?? ""}:${seriesId ?? ""}:${includeOccurrenceId ?? ""}`;
7856
- return resilientFetch(cacheKey, async (sig) => {
7857
- const requestId = "eventDetails";
7858
- const response = await apiClient({
7859
- endpoint: "batchBlockLoaders",
7860
- params: { siteId, ...stage && { stage } },
7861
- body: {
7862
- requests: [
7863
- {
7864
- id: requestId,
7865
- endpoint: "getPublicEventDetails",
7866
- params: {
7867
- ...typeof limit === "number" && { limit: String(limit) },
7868
- ...from && { from },
7869
- ...to && { to },
7870
- ...afterStartsAt && { afterStartsAt },
7871
- ...afterId && { afterId },
7872
- ...categoryIds && { categoryIds },
7873
- ...venueId && { venueId },
7874
- ...staffMemberId && { staffMemberId },
7875
- ...kind && { kind },
7876
- ...entryId && { entryId },
7877
- ...seriesId && { seriesId },
7878
- ...includeOccurrenceId && { includeOccurrenceId }
8025
+ return resilientFetchData(
8026
+ cacheKey,
8027
+ async (sig) => {
8028
+ const requestId = "eventDetails";
8029
+ const response = await apiClient({
8030
+ endpoint: "batchBlockLoaders",
8031
+ params: { siteId, ...stage && { stage } },
8032
+ body: {
8033
+ requests: [
8034
+ {
8035
+ id: requestId,
8036
+ endpoint: "getPublicEventDetails",
8037
+ params: {
8038
+ ...typeof limit === "number" && { limit: String(limit) },
8039
+ ...from && { from },
8040
+ ...to && { to },
8041
+ ...afterStartsAt && { afterStartsAt },
8042
+ ...afterId && { afterId },
8043
+ ...categoryIds && { categoryIds },
8044
+ ...venueId && { venueId },
8045
+ ...staffMemberId && { staffMemberId },
8046
+ ...kind && { kind },
8047
+ ...entryId && { entryId },
8048
+ ...seriesId && { seriesId },
8049
+ ...includeOccurrenceId && { includeOccurrenceId }
8050
+ }
7879
8051
  }
7880
- }
7881
- ]
7882
- },
7883
- options: { signal: sig }
7884
- });
7885
- return normalizeBatchBlockLoaderResult(response, requestId);
7886
- }, { signal });
8052
+ ]
8053
+ },
8054
+ options: { signal: sig }
8055
+ });
8056
+ return normalizeBatchBlockLoaderResult(
8057
+ response,
8058
+ requestId
8059
+ );
8060
+ },
8061
+ { signal }
8062
+ );
7887
8063
  },
7888
8064
  async listPublicCourses(params) {
7889
8065
  const { siteId, limit, stage, signal } = params;
@@ -7891,14 +8067,22 @@ function createRiverbankClient(config) {
7891
8067
  throw new Error("listPublicCourses() requires siteId");
7892
8068
  }
7893
8069
  const cacheKey = `public-courses:${siteId}:${limit ?? ""}:${stage ?? ""}`;
7894
- return resilientFetch(cacheKey, async (sig) => {
7895
- const apiParams = {
7896
- siteId,
7897
- ...typeof limit === "number" && { limit: String(limit) },
7898
- ...stage && { stage }
7899
- };
7900
- return await apiClient({ endpoint: "listPublicCourses", params: apiParams, options: { signal: sig } });
7901
- }, { signal });
8070
+ return resilientFetchData(
8071
+ cacheKey,
8072
+ async (sig) => {
8073
+ const apiParams = {
8074
+ siteId,
8075
+ ...typeof limit === "number" && { limit: String(limit) },
8076
+ ...stage && { stage }
8077
+ };
8078
+ return await apiClient({
8079
+ endpoint: "listPublicCourses",
8080
+ params: apiParams,
8081
+ options: { signal: sig }
8082
+ });
8083
+ },
8084
+ { signal }
8085
+ );
7902
8086
  },
7903
8087
  async listPublicTeamMembers(params) {
7904
8088
  const { siteId, stage, signal } = params;
@@ -7906,17 +8090,21 @@ function createRiverbankClient(config) {
7906
8090
  throw new Error("listPublicTeamMembers() requires siteId");
7907
8091
  }
7908
8092
  const cacheKey = `public-team-members:${siteId}:${stage ?? ""}`;
7909
- return resilientFetch(cacheKey, async (sig) => {
7910
- const apiParams = {
7911
- siteId,
7912
- ...stage && { stage }
7913
- };
7914
- return await apiClient({
7915
- endpoint: "listPublicTeamMembers",
7916
- params: apiParams,
7917
- options: { signal: sig }
7918
- });
7919
- }, { signal });
8093
+ return resilientFetchData(
8094
+ cacheKey,
8095
+ async (sig) => {
8096
+ const apiParams = {
8097
+ siteId,
8098
+ ...stage && { stage }
8099
+ };
8100
+ return await apiClient({
8101
+ endpoint: "listPublicTeamMembers",
8102
+ params: apiParams,
8103
+ options: { signal: sig }
8104
+ });
8105
+ },
8106
+ { signal }
8107
+ );
7920
8108
  },
7921
8109
  async listPublicProducts(params) {
7922
8110
  const { siteId, stage, categorySelector, signal } = params;
@@ -7925,14 +8113,22 @@ function createRiverbankClient(config) {
7925
8113
  }
7926
8114
  const selectorKey = categorySelector ? categorySelector.kind === "category" ? `category:${categorySelector.productCategoryId}` : `current-category-page:${categorySelector.productCategoryEntryId}` : "";
7927
8115
  const cacheKey = `public-products:${siteId}:${stage ?? ""}:${selectorKey}`;
7928
- return resilientFetch(cacheKey, async (sig) => {
7929
- const apiParams = {
7930
- siteId,
7931
- ...stage && { stage },
7932
- ...encodePublicProductCategorySelector(categorySelector)
7933
- };
7934
- return await apiClient({ endpoint: "listPublicProducts", params: apiParams, options: { signal: sig } });
7935
- }, { signal });
8116
+ return resilientFetchData(
8117
+ cacheKey,
8118
+ async (sig) => {
8119
+ const apiParams = {
8120
+ siteId,
8121
+ ...stage && { stage },
8122
+ ...encodePublicProductCategorySelector(categorySelector)
8123
+ };
8124
+ return await apiClient({
8125
+ endpoint: "listPublicProducts",
8126
+ params: apiParams,
8127
+ options: { signal: sig }
8128
+ });
8129
+ },
8130
+ { signal }
8131
+ );
7936
8132
  },
7937
8133
  async listPublicPasses(params) {
7938
8134
  const { siteId, categories, signal } = params;
@@ -7940,13 +8136,21 @@ function createRiverbankClient(config) {
7940
8136
  throw new Error("listPublicPasses() requires siteId");
7941
8137
  }
7942
8138
  const cacheKey = `public-passes:${siteId}:${categories ?? ""}`;
7943
- return resilientFetch(cacheKey, async (sig) => {
7944
- const apiParams = {
7945
- siteId,
7946
- ...categories && { categories }
7947
- };
7948
- return await apiClient({ endpoint: "listPublicPasses", params: apiParams, options: { signal: sig } });
7949
- }, { signal });
8139
+ return resilientFetchData(
8140
+ cacheKey,
8141
+ async (sig) => {
8142
+ const apiParams = {
8143
+ siteId,
8144
+ ...categories && { categories }
8145
+ };
8146
+ return await apiClient({
8147
+ endpoint: "listPublicPasses",
8148
+ params: apiParams,
8149
+ options: { signal: sig }
8150
+ });
8151
+ },
8152
+ { signal }
8153
+ );
7950
8154
  },
7951
8155
  async listPublicMemberships(params) {
7952
8156
  const { siteId, categories, signal } = params;
@@ -7954,25 +8158,44 @@ function createRiverbankClient(config) {
7954
8158
  throw new Error("listPublicMemberships() requires siteId");
7955
8159
  }
7956
8160
  const cacheKey = `public-memberships:${siteId}:${categories ?? ""}`;
7957
- return resilientFetch(cacheKey, async (sig) => {
7958
- const apiParams = {
7959
- siteId,
7960
- ...categories && { categories }
7961
- };
7962
- return await apiClient({ endpoint: "listPublicMemberships", params: apiParams, options: { signal: sig } });
7963
- }, { signal });
8161
+ return resilientFetchData(
8162
+ cacheKey,
8163
+ async (sig) => {
8164
+ const apiParams = {
8165
+ siteId,
8166
+ ...categories && { categories }
8167
+ };
8168
+ return await apiClient({
8169
+ endpoint: "listPublicMemberships",
8170
+ params: apiParams,
8171
+ options: { signal: sig }
8172
+ });
8173
+ },
8174
+ { signal }
8175
+ );
7964
8176
  },
7965
8177
  async resolveEntrySubroute(params) {
7966
8178
  const { siteId, entryId, kind, segment, stage, signal } = params;
7967
8179
  if (!siteId || !entryId || !kind || !segment) {
7968
- throw new Error("resolveEntrySubroute() requires siteId, entryId, kind, and segment");
8180
+ throw new Error(
8181
+ "resolveEntrySubroute() requires siteId, entryId, kind, and segment"
8182
+ );
7969
8183
  }
7970
- return resolveEntrySubrouteInternal({ siteId, entryId, kind, segment, stage, signal });
8184
+ return resolveEntrySubrouteInternal({
8185
+ siteId,
8186
+ entryId,
8187
+ kind,
8188
+ segment,
8189
+ stage,
8190
+ signal
8191
+ });
7971
8192
  },
7972
8193
  async resolveEventOccurrence(params) {
7973
8194
  const { siteId, entryId, segment, signal } = params;
7974
8195
  if (!siteId || !entryId || !segment) {
7975
- throw new Error("resolveEventOccurrence() requires siteId, entryId, and segment");
8196
+ throw new Error(
8197
+ "resolveEventOccurrence() requires siteId, entryId, and segment"
8198
+ );
7976
8199
  }
7977
8200
  const result = await resolveEntrySubrouteInternal({
7978
8201
  siteId,
@@ -7991,13 +8214,17 @@ function createRiverbankClient(config) {
7991
8214
  throw new Error("checkRedirect() requires siteId and path");
7992
8215
  }
7993
8216
  const cacheKey = `redirect:${siteId}:${path}`;
7994
- return resilientFetch(cacheKey, async (sig) => {
7995
- return await apiClient({
7996
- endpoint: "checkRedirect",
7997
- params: { site: siteId, path },
7998
- options: { signal: sig }
7999
- });
8000
- }, { signal });
8217
+ return resilientFetchData(
8218
+ cacheKey,
8219
+ async (sig) => {
8220
+ return await apiClient({
8221
+ endpoint: "checkRedirect",
8222
+ params: { site: siteId, path },
8223
+ options: { signal: sig }
8224
+ });
8225
+ },
8226
+ { signal }
8227
+ );
8001
8228
  },
8002
8229
  async getAllPublishedRoutes(params) {
8003
8230
  const { siteId, signal } = params;
@@ -8005,13 +8232,17 @@ function createRiverbankClient(config) {
8005
8232
  throw new Error("getAllPublishedRoutes() requires siteId");
8006
8233
  }
8007
8234
  const cacheKey = `routable-content:${siteId}:published`;
8008
- return resilientFetch(cacheKey, async (sig) => {
8009
- return await apiClient({
8010
- endpoint: "getPublicRoutableContent",
8011
- params: { siteId, publishedOnly: "true" },
8012
- options: { signal: sig }
8013
- });
8014
- }, { signal });
8235
+ return resilientFetchData(
8236
+ cacheKey,
8237
+ async (sig) => {
8238
+ return await apiClient({
8239
+ endpoint: "getPublicRoutableContent",
8240
+ params: { siteId, publishedOnly: "true" },
8241
+ options: { signal: sig }
8242
+ });
8243
+ },
8244
+ { signal }
8245
+ );
8015
8246
  },
8016
8247
  async getSitemapRoutes(params) {
8017
8248
  const { siteId, page, pageSize, signal } = params;
@@ -8019,17 +8250,21 @@ function createRiverbankClient(config) {
8019
8250
  throw new Error("getSitemapRoutes() requires siteId");
8020
8251
  }
8021
8252
  const cacheKey = `sitemap:${siteId}:${page ?? 1}:${pageSize ?? "default"}`;
8022
- return resilientFetch(cacheKey, async (sig) => {
8023
- return await apiClient({
8024
- endpoint: "getPublicSitemapRoutes",
8025
- params: {
8026
- siteId,
8027
- ...page ? { page: String(page) } : {},
8028
- ...pageSize ? { pageSize: String(pageSize) } : {}
8029
- },
8030
- options: { signal: sig }
8031
- });
8032
- }, { signal });
8253
+ return resilientFetchData(
8254
+ cacheKey,
8255
+ async (sig) => {
8256
+ return await apiClient({
8257
+ endpoint: "getPublicSitemapRoutes",
8258
+ params: {
8259
+ siteId,
8260
+ ...page ? { page: String(page) } : {},
8261
+ ...pageSize ? { pageSize: String(pageSize) } : {}
8262
+ },
8263
+ options: { signal: sig }
8264
+ });
8265
+ },
8266
+ { signal }
8267
+ );
8033
8268
  },
8034
8269
  clearCache() {
8035
8270
  cache.clear();
@@ -8049,6 +8284,27 @@ function createRiverbankClient(config) {
8049
8284
  };
8050
8285
  }
8051
8286
 
8287
+ // ../core/src/location.ts
8288
+ function normalizeLocationAddressText(value) {
8289
+ if (typeof value !== "string") {
8290
+ return null;
8291
+ }
8292
+ const trimmed = value.trim();
8293
+ return trimmed ? trimmed : null;
8294
+ }
8295
+ function hasLocationCoordinates(value) {
8296
+ return typeof value?.lat === "number" && typeof value?.lng === "number";
8297
+ }
8298
+ function toLocationCoordinates(value) {
8299
+ if (!hasLocationCoordinates(value)) {
8300
+ return null;
8301
+ }
8302
+ return {
8303
+ lat: value.lat,
8304
+ lng: value.lng
8305
+ };
8306
+ }
8307
+
8052
8308
  // ../api/src/accessAdmin.ts
8053
8309
  import { z } from "zod";
8054
8310
  var managedDomainAddOnPricingSnapshotSchema = z.object({
@@ -8191,27 +8447,6 @@ function formatKeyAsLabel(key) {
8191
8447
  // ../blocks/src/system/manifest/schema.ts
8192
8448
  import { z as z4 } from "zod";
8193
8449
 
8194
- // ../core/src/location.ts
8195
- function normalizeLocationAddressText(value) {
8196
- if (typeof value !== "string") {
8197
- return null;
8198
- }
8199
- const trimmed = value.trim();
8200
- return trimmed ? trimmed : null;
8201
- }
8202
- function hasLocationCoordinates(value) {
8203
- return typeof value?.lat === "number" && typeof value?.lng === "number";
8204
- }
8205
- function toLocationCoordinates(value) {
8206
- if (!hasLocationCoordinates(value)) {
8207
- return null;
8208
- }
8209
- return {
8210
- lat: value.lat,
8211
- lng: value.lng
8212
- };
8213
- }
8214
-
8215
8450
  // ../media-core/src/transformRect.ts
8216
8451
  function isValidTransformRectStructure(rect) {
8217
8452
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -9236,6 +9471,9 @@ function makeBoundaryId(previousBlockId, nextBlockId) {
9236
9471
  const next = encodeURIComponent(nextBlockId);
9237
9472
  return asDesignBoundaryId(`boundary:${previous}:${next}`);
9238
9473
  }
9474
+ function assertNever(value, message = "Unhandled Theme V2 variant") {
9475
+ throw new Error(`${message}: ${String(value)}`);
9476
+ }
9239
9477
  function brandNonEmptyString(value, label) {
9240
9478
  if (value.length === 0) {
9241
9479
  throw new Error(`${label} must be a non-empty string.`);
@@ -9263,6 +9501,10 @@ var tileTreatmentValues = [
9263
9501
  "quiet",
9264
9502
  "brand-depth"
9265
9503
  ];
9504
+ var eventListTreatmentValues = [
9505
+ "plain",
9506
+ "lined-panel"
9507
+ ];
9266
9508
  var eyebrowTreatmentValues = [
9267
9509
  "plain",
9268
9510
  "pill",
@@ -9320,6 +9562,7 @@ function defineBlockDesignCapability(capability) {
9320
9562
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
9321
9563
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
9322
9564
  tileTreatments: capability.tileTreatments ?? ["default"],
9565
+ eventListTreatments: capability.eventListTreatments ?? ["plain"],
9323
9566
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
9324
9567
  ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
9325
9568
  ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
@@ -9344,9 +9587,98 @@ var blockAppearancePresets = [
9344
9587
  transitionAfter: "soft-fade-short",
9345
9588
  emphasis: "high",
9346
9589
  sectionHeight: "hero",
9590
+ heroComposition: "center",
9591
+ heroTypographyScale: "display",
9347
9592
  imageSurfaceTreatment: { kind: "neutral-wash" }
9348
9593
  }
9349
9594
  }),
9595
+ defineBlockAppearancePreset({
9596
+ kind: "block-design",
9597
+ id: "hero-bottom-left-panel",
9598
+ target: "hero",
9599
+ label: "Bottom-left panel hero",
9600
+ blockKinds: ["block.hero"],
9601
+ constraints: {
9602
+ layoutFamilies: ["centered", "compact"]
9603
+ },
9604
+ optionGroups: [
9605
+ {
9606
+ id: "image-surface-treatment",
9607
+ label: "Treatment",
9608
+ selectedOptionId: "neutral-scrim",
9609
+ options: [
9610
+ {
9611
+ id: "neutral-scrim",
9612
+ label: "Neutral scrim",
9613
+ designPatch: {
9614
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
9615
+ }
9616
+ },
9617
+ {
9618
+ id: "brand-scrim-primary",
9619
+ label: "Brand scrim",
9620
+ designPatch: {
9621
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "balanced" }
9622
+ }
9623
+ }
9624
+ ]
9625
+ }
9626
+ ],
9627
+ layoutPatches: [
9628
+ {
9629
+ constraints: {
9630
+ layoutVariantKeys: ["micro"]
9631
+ },
9632
+ designPatch: {
9633
+ sectionHeight: "banner",
9634
+ heroTypographyScale: "editorial"
9635
+ }
9636
+ }
9637
+ ],
9638
+ design: {
9639
+ sectionSurface: "hero-image",
9640
+ contentFrame: panelFrame("raised"),
9641
+ itemSurface: "none",
9642
+ transitionAfter: "soft-fade-short",
9643
+ emphasis: "high",
9644
+ sectionHeight: "immersive",
9645
+ heroComposition: "bottom-left",
9646
+ heroTypographyScale: "display",
9647
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
9648
+ }
9649
+ }),
9650
+ defineBlockAppearancePreset({
9651
+ kind: "block-design",
9652
+ id: "hero-poster-image",
9653
+ target: "hero",
9654
+ label: "Poster image hero",
9655
+ blockKinds: ["block.hero"],
9656
+ constraints: {
9657
+ layoutFamilies: ["centered", "compact"]
9658
+ },
9659
+ layoutPatches: [
9660
+ {
9661
+ constraints: {
9662
+ layoutVariantKeys: ["micro"]
9663
+ },
9664
+ designPatch: {
9665
+ sectionHeight: "banner",
9666
+ heroTypographyScale: "display"
9667
+ }
9668
+ }
9669
+ ],
9670
+ design: {
9671
+ sectionSurface: "hero-image",
9672
+ contentFrame: plainFrame,
9673
+ itemSurface: "none",
9674
+ transitionAfter: "soft-fade-short",
9675
+ emphasis: "high",
9676
+ sectionHeight: "immersive",
9677
+ heroComposition: "center",
9678
+ heroTypographyScale: "poster",
9679
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "strong" }
9680
+ }
9681
+ }),
9350
9682
  defineBlockAppearancePreset({
9351
9683
  kind: "block-design",
9352
9684
  id: "hero-brand-scrim",
@@ -9396,6 +9728,8 @@ var blockAppearancePresets = [
9396
9728
  transitionAfter: "soft-fade-short",
9397
9729
  emphasis: "high",
9398
9730
  sectionHeight: "immersive",
9731
+ heroComposition: "center",
9732
+ heroTypographyScale: "display",
9399
9733
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
9400
9734
  }
9401
9735
  }),
@@ -9448,6 +9782,8 @@ var blockAppearancePresets = [
9448
9782
  transitionAfter: "soft-fade-short",
9449
9783
  emphasis: "high",
9450
9784
  sectionHeight: "immersive",
9785
+ heroComposition: "center",
9786
+ heroTypographyScale: "display",
9451
9787
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
9452
9788
  imageSurfaceMotion: "fixed-frame",
9453
9789
  eyebrowTreatment: "accent-pill-bounce"
@@ -9468,6 +9804,8 @@ var blockAppearancePresets = [
9468
9804
  itemSurface: "none",
9469
9805
  transitionAfter: "soft-fade-short",
9470
9806
  emphasis: "high",
9807
+ heroComposition: "center",
9808
+ heroTypographyScale: "editorial",
9471
9809
  eyebrowTreatment: "accent-pill-bounce"
9472
9810
  }
9473
9811
  }),
@@ -9482,7 +9820,82 @@ var blockAppearancePresets = [
9482
9820
  contentFrame: panelFrame("inset"),
9483
9821
  itemSurface: "none",
9484
9822
  transitionAfter: "none",
9485
- emphasis: "high"
9823
+ emphasis: "high",
9824
+ heroComposition: "center",
9825
+ heroTypographyScale: "editorial"
9826
+ }
9827
+ }),
9828
+ defineBlockAppearancePreset({
9829
+ kind: "block-design",
9830
+ id: "hero-split-editorial",
9831
+ target: "hero",
9832
+ label: "Editorial split hero",
9833
+ blockKinds: ["block.hero"],
9834
+ constraints: {
9835
+ layoutFamilies: ["split"]
9836
+ },
9837
+ design: {
9838
+ sectionSurface: "base",
9839
+ contentFrame: plainFrame,
9840
+ itemSurface: "none",
9841
+ transitionAfter: "soft-fade-short",
9842
+ emphasis: "high",
9843
+ heroTypographyScale: "editorial"
9844
+ }
9845
+ }),
9846
+ defineBlockAppearancePreset({
9847
+ kind: "block-design",
9848
+ id: "hero-split-brand",
9849
+ target: "hero",
9850
+ label: "Brand split hero",
9851
+ blockKinds: ["block.hero"],
9852
+ constraints: {
9853
+ layoutFamilies: ["split"]
9854
+ },
9855
+ design: {
9856
+ sectionSurface: "brand-depth-band",
9857
+ contentFrame: plainFrame,
9858
+ itemSurface: "none",
9859
+ transitionAfter: "soft-fade-short",
9860
+ emphasis: "high",
9861
+ heroTypographyScale: "display",
9862
+ eyebrowTreatment: "accent-pill-bounce"
9863
+ }
9864
+ }),
9865
+ defineBlockAppearancePreset({
9866
+ kind: "block-design",
9867
+ id: "hero-split-soft-panel",
9868
+ target: "hero",
9869
+ label: "Soft panel split hero",
9870
+ blockKinds: ["block.hero"],
9871
+ constraints: {
9872
+ layoutFamilies: ["split"]
9873
+ },
9874
+ design: {
9875
+ sectionSurface: "muted-band",
9876
+ contentFrame: panelFrame("raised"),
9877
+ itemSurface: "none",
9878
+ transitionAfter: "soft-fade-short",
9879
+ emphasis: "high",
9880
+ heroTypographyScale: "editorial"
9881
+ }
9882
+ }),
9883
+ defineBlockAppearancePreset({
9884
+ kind: "block-design",
9885
+ id: "hero-split-accent",
9886
+ target: "hero",
9887
+ label: "Accent split hero",
9888
+ blockKinds: ["block.hero"],
9889
+ constraints: {
9890
+ layoutFamilies: ["split"]
9891
+ },
9892
+ design: {
9893
+ sectionSurface: "accent-band",
9894
+ contentFrame: panelFrame("raised"),
9895
+ itemSurface: "none",
9896
+ transitionAfter: "soft-fade-short",
9897
+ emphasis: "high",
9898
+ heroTypographyScale: "display"
9486
9899
  }
9487
9900
  }),
9488
9901
  defineBlockAppearancePreset({
@@ -9515,9 +9928,9 @@ var blockAppearancePresets = [
9515
9928
  }),
9516
9929
  defineBlockAppearancePreset({
9517
9930
  kind: "block-design",
9518
- id: "intro-soft-earth-statement",
9931
+ id: "intro-organic-statement",
9519
9932
  target: "intro",
9520
- label: "Soft Earth intro statement",
9933
+ label: "Organic intro statement",
9521
9934
  blockKinds: ["block.intro"],
9522
9935
  design: {
9523
9936
  sectionSurface: "base",
@@ -9548,9 +9961,9 @@ var blockAppearancePresets = [
9548
9961
  }),
9549
9962
  defineBlockAppearancePreset({
9550
9963
  kind: "block-design",
9551
- id: "feature-cards-soft-earth-offerings",
9964
+ id: "feature-cards-raised-rule",
9552
9965
  target: "feature-cards",
9553
- label: "Soft Earth offering cards",
9966
+ label: "Raised cards with rule",
9554
9967
  blockKinds: ["block.feature-cards"],
9555
9968
  design: {
9556
9969
  sectionSurface: "base",
@@ -9579,6 +9992,21 @@ var blockAppearancePresets = [
9579
9992
  emphasis: "medium"
9580
9993
  }
9581
9994
  }),
9995
+ defineBlockAppearancePreset({
9996
+ kind: "block-design",
9997
+ id: "events-lined-panel",
9998
+ target: "events",
9999
+ label: "Lined event panel",
10000
+ blockKinds: ["block.event-calendar", "block.event-listing"],
10001
+ design: {
10002
+ sectionSurface: "base",
10003
+ contentFrame: plainFrame,
10004
+ itemSurface: "none",
10005
+ transitionAfter: "none",
10006
+ emphasis: "medium",
10007
+ eventListTreatment: "lined-panel"
10008
+ }
10009
+ }),
9582
10010
  defineBlockAppearancePreset({
9583
10011
  kind: "block-design",
9584
10012
  id: "schedule-details-accent-section",
@@ -9638,9 +10066,9 @@ var blockAppearancePresets = [
9638
10066
  }),
9639
10067
  defineBlockAppearancePreset({
9640
10068
  kind: "block-design",
9641
- id: "testimonials-carded-proof",
10069
+ id: "testimonials-simple-cards",
9642
10070
  target: "testimonials",
9643
- label: "Carded social proof",
10071
+ label: "Simple testimonial cards",
9644
10072
  blockKinds: ["block.testimonials"],
9645
10073
  design: {
9646
10074
  sectionSurface: "base",
@@ -9652,9 +10080,9 @@ var blockAppearancePresets = [
9652
10080
  }),
9653
10081
  defineBlockAppearancePreset({
9654
10082
  kind: "block-design",
9655
- id: "testimonials-contained-proof",
10083
+ id: "testimonials-raised-panel",
9656
10084
  target: "testimonials",
9657
- label: "Contained social proof",
10085
+ label: "Raised testimonial panel",
9658
10086
  blockKinds: ["block.testimonials"],
9659
10087
  design: {
9660
10088
  sectionSurface: "muted-band",
@@ -9666,9 +10094,9 @@ var blockAppearancePresets = [
9666
10094
  }),
9667
10095
  defineBlockAppearancePreset({
9668
10096
  kind: "block-design",
9669
- id: "testimonials-dark-proof",
10097
+ id: "testimonials-accent-panel",
9670
10098
  target: "testimonials",
9671
- label: "Dark proof panel",
10099
+ label: "Accent testimonial panel",
9672
10100
  blockKinds: ["block.testimonials"],
9673
10101
  design: {
9674
10102
  sectionSurface: "accent-band",
@@ -9680,9 +10108,9 @@ var blockAppearancePresets = [
9680
10108
  }),
9681
10109
  defineBlockAppearancePreset({
9682
10110
  kind: "block-design",
9683
- id: "testimonials-accent-quote-proof",
10111
+ id: "testimonials-accent-quote-cards",
9684
10112
  target: "testimonials",
9685
- label: "Accent quote proof",
10113
+ label: "Accent quote cards",
9686
10114
  blockKinds: ["block.testimonials"],
9687
10115
  design: {
9688
10116
  sectionSurface: "accent-band",
@@ -9695,9 +10123,9 @@ var blockAppearancePresets = [
9695
10123
  }),
9696
10124
  defineBlockAppearancePreset({
9697
10125
  kind: "block-design",
9698
- id: "testimonials-soft-earth-proof-band",
10126
+ id: "testimonials-brand-background-quotes",
9699
10127
  target: "testimonials",
9700
- label: "Soft Earth proof band",
10128
+ label: "Brand background quotes",
9701
10129
  blockKinds: ["block.testimonials"],
9702
10130
  design: {
9703
10131
  sectionSurface: "brand-depth-band",
@@ -9741,25 +10169,6 @@ var blockAppearancePresets = [
9741
10169
  emphasis: "low"
9742
10170
  }
9743
10171
  }),
9744
- defineBlockAppearancePreset({
9745
- kind: "block-design",
9746
- id: "faq-soft-earth-two-column",
9747
- target: "faq",
9748
- label: "Soft Earth two-column FAQ",
9749
- blockKinds: ["block.faq"],
9750
- design: {
9751
- sectionSurface: "base",
9752
- contentFrame: plainFrame,
9753
- itemSurface: "flat",
9754
- transitionAfter: "none",
9755
- emphasis: "medium",
9756
- accordionIconTreatment: {
9757
- iconSet: "plus",
9758
- colorToken: "primary",
9759
- motion: "swap"
9760
- }
9761
- }
9762
- }),
9763
10172
  defineBlockAppearancePreset({
9764
10173
  kind: "block-design",
9765
10174
  id: "contact-form-panel",
@@ -11138,7 +11547,8 @@ var accordionSystemSchema = z12.object({
11138
11547
  icon: z12.object({
11139
11548
  style: accordionIconSchema,
11140
11549
  position: z12.enum(["left", "right"]),
11141
- size: z12.enum(["sm", "md", "lg"])
11550
+ size: z12.enum(["sm", "md", "lg"]),
11551
+ colorToken: themeColorTokenSchema.optional()
11142
11552
  }),
11143
11553
  // Trigger (question) styling
11144
11554
  trigger: z12.object({
@@ -11272,6 +11682,7 @@ var navLinkPaddingXSchema = z16.enum(["none", "tight", "compact", "default", "re
11272
11682
  var navLinkBorderRadiusSchema = z16.enum(["none", "sm", "md", "full"]);
11273
11683
  var navLinkTextSizeSchema = z16.enum(["xs", "sm", "base", "lg"]);
11274
11684
  var navLinkLetterSpacingSchema = z16.enum(["normal", "wide", "wider", "widest"]);
11685
+ var navLinkContrastTreatmentSchema = z16.enum(["none", "soft-glow"]);
11275
11686
  var navLinkStyleSchema = z16.object({
11276
11687
  /** Display name for the style */
11277
11688
  name: z16.string().min(1).max(30).optional(),
@@ -11283,6 +11694,8 @@ var navLinkStyleSchema = z16.object({
11283
11694
  textSize: navLinkTextSizeSchema.optional(),
11284
11695
  /** Optional letter spacing override */
11285
11696
  letterSpacing: navLinkLetterSpacingSchema.optional(),
11697
+ /** Optional text-only contrast treatment for transparent/overlay navigation */
11698
+ contrastTreatment: navLinkContrastTreatmentSchema.optional(),
11286
11699
  /** Hover/active color token (for color-change effects) */
11287
11700
  hoverColorToken: themeColorTokenSchema.nullable().optional(),
11288
11701
  /** Padding preset */
@@ -11712,6 +12125,7 @@ var sectionStylesOverrideSchema = z21.object({
11712
12125
  spacing: semanticSpacingSchema.nullable().optional(),
11713
12126
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
11714
12127
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
12128
+ eventListTreatment: z21.enum(eventListTreatmentValues).nullable().optional(),
11715
12129
  eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
11716
12130
  headingDecoration: headingDecorationSchema.nullable().optional(),
11717
12131
  // Author-level override consumed by later block/editor rendering phases.
@@ -12545,6 +12959,34 @@ var paletteVariantsById = new Map(
12545
12959
  paletteVariants.map((v) => [v.id, v])
12546
12960
  );
12547
12961
 
12962
+ // ../theme-core/src/accordions/siteStyleDefaults.ts
12963
+ var softEarthAccordionSystem = {
12964
+ background: {
12965
+ type: "solid",
12966
+ colorToken: "background"
12967
+ },
12968
+ spacing: "comfortable",
12969
+ corners: "square",
12970
+ border: null,
12971
+ shadow: null,
12972
+ icon: {
12973
+ style: "plus-minus",
12974
+ position: "right",
12975
+ size: "md",
12976
+ colorToken: "primary"
12977
+ },
12978
+ trigger: {
12979
+ textColorToken: "text",
12980
+ fontWeight: "medium"
12981
+ },
12982
+ hover: {
12983
+ textColorToken: "primary"
12984
+ },
12985
+ content: {
12986
+ textColorToken: "neutral-700"
12987
+ }
12988
+ };
12989
+
12548
12990
  // ../theme-core/src/site-styles/headerLooks.ts
12549
12991
  function asHeaderLookId(value) {
12550
12992
  return value;
@@ -12600,7 +13042,7 @@ var headerLayoutCatalog = [
12600
13042
  description: "Detached header chrome that sits over the opening section.",
12601
13043
  structure: "floating-shell",
12602
13044
  variant: "floating",
12603
- defaultPositioning: "fixed",
13045
+ defaultPositioning: "sticky",
12604
13046
  shrinkOnScroll: true,
12605
13047
  maxRecommendedNavItems: 5,
12606
13048
  allowedLogoShapes: ["none", "text-only", "horizontal"]
@@ -12617,7 +13059,9 @@ var headerStyleCatalog = [
12617
13059
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12618
13060
  navInteraction: "color-change",
12619
13061
  surface: "neutral",
12620
- navTypography: "plain"
13062
+ defaultDepth: "none",
13063
+ navTypography: "plain",
13064
+ moods: ["calm", "professional", "editorial"]
12621
13065
  },
12622
13066
  {
12623
13067
  id: asHeaderStyleId("fine-line"),
@@ -12626,7 +13070,9 @@ var headerStyleCatalog = [
12626
13070
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12627
13071
  navInteraction: "underline-grow",
12628
13072
  surface: "bordered",
12629
- navTypography: "plain"
13073
+ defaultDepth: "line",
13074
+ navTypography: "plain",
13075
+ moods: ["calm", "professional", "editorial"]
12630
13076
  },
12631
13077
  {
12632
13078
  id: asHeaderStyleId("soft-bar"),
@@ -12635,7 +13081,9 @@ var headerStyleCatalog = [
12635
13081
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12636
13082
  navInteraction: "pill-background",
12637
13083
  surface: "soft",
12638
- navTypography: "plain"
13084
+ defaultDepth: "line",
13085
+ navTypography: "plain",
13086
+ moods: ["calm", "professional"]
12639
13087
  },
12640
13088
  {
12641
13089
  id: asHeaderStyleId("pill-nav"),
@@ -12644,7 +13092,9 @@ var headerStyleCatalog = [
12644
13092
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12645
13093
  navInteraction: "pill-background",
12646
13094
  surface: "soft",
12647
- navTypography: "plain"
13095
+ defaultDepth: "none",
13096
+ navTypography: "plain",
13097
+ moods: ["calm"]
12648
13098
  },
12649
13099
  {
12650
13100
  id: asHeaderStyleId("brand-bar"),
@@ -12653,7 +13103,9 @@ var headerStyleCatalog = [
12653
13103
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12654
13104
  navInteraction: "color-change",
12655
13105
  surface: "brand-solid",
12656
- navTypography: "brand-caps"
13106
+ defaultDepth: "none",
13107
+ navTypography: "brand-caps",
13108
+ moods: ["professional", "expressive", "utility"]
12657
13109
  },
12658
13110
  {
12659
13111
  id: asHeaderStyleId("brand-underline"),
@@ -12662,7 +13114,9 @@ var headerStyleCatalog = [
12662
13114
  supportedLayoutIds: supportedLayouts(["classic"]),
12663
13115
  navInteraction: "underline-grow",
12664
13116
  surface: "brand-solid",
12665
- navTypography: "brand-caps"
13117
+ defaultDepth: "none",
13118
+ navTypography: "brand-caps",
13119
+ moods: ["expressive"]
12666
13120
  },
12667
13121
  {
12668
13122
  id: asHeaderStyleId("brand-pill"),
@@ -12671,7 +13125,9 @@ var headerStyleCatalog = [
12671
13125
  supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
12672
13126
  navInteraction: "pill-background",
12673
13127
  surface: "brand-solid",
12674
- navTypography: "brand-caps"
13128
+ defaultDepth: "none",
13129
+ navTypography: "brand-caps",
13130
+ moods: ["expressive"]
12675
13131
  },
12676
13132
  {
12677
13133
  id: asHeaderStyleId("serif-line"),
@@ -12680,7 +13136,9 @@ var headerStyleCatalog = [
12680
13136
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12681
13137
  navInteraction: "underline-grow",
12682
13138
  surface: "bordered",
12683
- navTypography: "heading"
13139
+ defaultDepth: "line",
13140
+ navTypography: "heading",
13141
+ moods: ["editorial", "calm"]
12684
13142
  },
12685
13143
  {
12686
13144
  id: asHeaderStyleId("flat-tabs"),
@@ -12689,16 +13147,20 @@ var headerStyleCatalog = [
12689
13147
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12690
13148
  navInteraction: "flat-block",
12691
13149
  surface: "bordered",
12692
- navTypography: "quiet-caps"
13150
+ defaultDepth: "shadow",
13151
+ navTypography: "quiet-caps",
13152
+ moods: ["professional", "utility", "expressive"]
12693
13153
  },
12694
13154
  {
12695
13155
  id: asHeaderStyleId("glass"),
12696
13156
  label: "Glass",
12697
13157
  description: "Translucent chrome with frosted navigation backing.",
12698
- supportedLayoutIds: supportedLayouts(["classic", "floating"]),
13158
+ supportedLayoutIds: supportedLayouts(["floating"]),
12699
13159
  navInteraction: "glass-backed",
12700
13160
  surface: "floating",
12701
- navTypography: "plain"
13161
+ defaultDepth: "shadow",
13162
+ navTypography: "plain",
13163
+ moods: ["expressive", "calm"]
12702
13164
  },
12703
13165
  {
12704
13166
  id: asHeaderStyleId("minimal-surface"),
@@ -12707,7 +13169,9 @@ var headerStyleCatalog = [
12707
13169
  supportedLayoutIds: supportedLayouts(["floating"]),
12708
13170
  navInteraction: "color-change",
12709
13171
  surface: "floating",
12710
- navTypography: "plain"
13172
+ defaultDepth: "none",
13173
+ navTypography: "plain",
13174
+ moods: ["editorial", "calm"]
12711
13175
  },
12712
13176
  {
12713
13177
  id: asHeaderStyleId("soft-shell"),
@@ -12716,7 +13180,9 @@ var headerStyleCatalog = [
12716
13180
  supportedLayoutIds: supportedLayouts(["floating"]),
12717
13181
  navInteraction: "pill-background",
12718
13182
  surface: "floating",
12719
- navTypography: "plain"
13183
+ defaultDepth: "shadow",
13184
+ navTypography: "plain",
13185
+ moods: ["calm", "professional"]
12720
13186
  },
12721
13187
  {
12722
13188
  id: asHeaderStyleId("split-glass"),
@@ -12725,7 +13191,9 @@ var headerStyleCatalog = [
12725
13191
  supportedLayoutIds: supportedLayouts(["floating"]),
12726
13192
  navInteraction: "glass-backed",
12727
13193
  surface: "floating",
12728
- navTypography: "quiet-caps"
13194
+ defaultDepth: "shadow",
13195
+ navTypography: "quiet-caps",
13196
+ moods: ["expressive"]
12729
13197
  },
12730
13198
  {
12731
13199
  id: asHeaderStyleId("split-pill"),
@@ -12734,7 +13202,9 @@ var headerStyleCatalog = [
12734
13202
  supportedLayoutIds: supportedLayouts(["floating"]),
12735
13203
  navInteraction: "pill-background",
12736
13204
  surface: "floating",
12737
- navTypography: "heading"
13205
+ defaultDepth: "shadow",
13206
+ navTypography: "heading",
13207
+ moods: ["calm", "editorial"]
12738
13208
  }
12739
13209
  ];
12740
13210
  var headerLayoutsById = new Map(
@@ -12748,7 +13218,6 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
12748
13218
  asHeaderLayoutId("classic"),
12749
13219
  headerStyleRepairChain([
12750
13220
  "minimal",
12751
- "glass",
12752
13221
  "fine-line",
12753
13222
  "soft-bar",
12754
13223
  "pill-nav",
@@ -12815,7 +13284,13 @@ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
12815
13284
  ],
12816
13285
  [
12817
13286
  asHeaderStyleId("glass"),
12818
- headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
13287
+ headerStyleRepairChain([
13288
+ "glass",
13289
+ "soft-shell",
13290
+ "fine-line",
13291
+ "minimal-surface",
13292
+ "minimal"
13293
+ ])
12819
13294
  ],
12820
13295
  [
12821
13296
  asHeaderStyleId("soft-shell"),
@@ -12927,6 +13402,23 @@ function getCompatibleHeaderStyleIds(layoutId) {
12927
13402
  }
12928
13403
  );
12929
13404
  }
13405
+ function themedHeaderShadow(theme) {
13406
+ switch (theme.shadow.elevation) {
13407
+ case "none":
13408
+ return void 0;
13409
+ case "low":
13410
+ return { elevation: "sm" };
13411
+ case "medium":
13412
+ return { elevation: "md" };
13413
+ case "high":
13414
+ return { elevation: "lg" };
13415
+ default:
13416
+ return assertNever(
13417
+ theme.shadow.elevation,
13418
+ "Unhandled theme shadow elevation"
13419
+ );
13420
+ }
13421
+ }
12930
13422
  function solidBrandHeader(theme) {
12931
13423
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
12932
13424
  return {
@@ -13076,9 +13568,7 @@ function practicalUtilityHeader(theme) {
13076
13568
  navColor: "text",
13077
13569
  navStyle: "solid",
13078
13570
  navWeight: "semibold",
13079
- shadow: {
13080
- elevation: "sm"
13081
- },
13571
+ shadow: themedHeaderShadow(theme),
13082
13572
  border: {
13083
13573
  style: "solid",
13084
13574
  width: "thin",
@@ -13147,6 +13637,7 @@ function floatingGlassHeader(theme) {
13147
13637
  return {
13148
13638
  ...transparentOverlayHeader(theme),
13149
13639
  variant: "floating",
13640
+ positioning: "sticky",
13150
13641
  navStyle: "frosted",
13151
13642
  navContainer: {
13152
13643
  type: "glass",
@@ -13662,7 +14153,7 @@ var typographyPresets = [
13662
14153
  heroTypography: {
13663
14154
  headlineSize: "6xl",
13664
14155
  headlineLineHeight: "tight",
13665
- subheadlineSize: "editorial",
14156
+ subheadlineSize: "2xl",
13666
14157
  subheadlineLineHeight: "normal",
13667
14158
  microHeadlineSize: "6xl",
13668
14159
  microHeadlineLineHeight: "tight",
@@ -13680,6 +14171,8 @@ var typographyPresetsById = new Map(
13680
14171
  );
13681
14172
 
13682
14173
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
14174
+ var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
14175
+ var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
13683
14176
  var curatedSiteStyleIdValues = [
13684
14177
  "site-style:calm-studio",
13685
14178
  "site-style:clear-professional",
@@ -13691,7 +14184,7 @@ var curatedSiteStyleIdValues = [
13691
14184
  "site-style:personal-retreat-journal",
13692
14185
  "site-style:tactile-workshop",
13693
14186
  "site-style:modern-wellness",
13694
- "site-style:soft-earth",
14187
+ SOFT_EARTH_SITE_STYLE_ID_VALUE,
13695
14188
  "site-style:bold-launch",
13696
14189
  "site-style:south-west-twerk-school"
13697
14190
  ];
@@ -13773,7 +14266,10 @@ function uniqueContentFrameKinds() {
13773
14266
  var generatedContentFrameKinds = uniqueContentFrameKinds();
13774
14267
  function defineCuratedSiteStyle(input) {
13775
14268
  const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
13776
- const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
14269
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(
14270
+ legacyHeaderLookIds,
14271
+ input.tokenRecipes
14272
+ );
13777
14273
  const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
13778
14274
  const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
13779
14275
  if (!typographyPresetChoices.some(
@@ -13806,6 +14302,7 @@ function defineCuratedSiteStyle(input) {
13806
14302
  supportedTransitions: generatedDesignOptionCatalog.transitions
13807
14303
  },
13808
14304
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
14305
+ ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
13809
14306
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
13810
14307
  defaultHeaderSelection: input.defaultHeaderSelection ? {
13811
14308
  layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
@@ -13856,15 +14353,77 @@ function uniqueHeaderLayoutChoices(choices) {
13856
14353
  if (!first) {
13857
14354
  throw new Error("Expected at least one curated header layout choice.");
13858
14355
  }
13859
- return [first, ...unique.slice(1)];
14356
+ return [first, ...unique.slice(1)];
14357
+ }
14358
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
14359
+ const first = choices[0] ?? {
14360
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
14361
+ };
14362
+ return [first, ...choices.slice(1)];
14363
+ }
14364
+ function uniqueCompatibleHeaderStyleChoices(choices, fallbackLayoutId) {
14365
+ const compatible = new Set(getCompatibleHeaderStyleIds(fallbackLayoutId));
14366
+ const seen = /* @__PURE__ */ new Set();
14367
+ const unique = choices.filter((choice) => {
14368
+ if (!compatible.has(choice.id)) return false;
14369
+ if (seen.has(choice.id)) return false;
14370
+ seen.add(choice.id);
14371
+ return true;
14372
+ });
14373
+ return nonEmptyHeaderStyleChoices(unique, fallbackLayoutId);
14374
+ }
14375
+ function inferredHeaderStyleValuesForRecipes(layoutId, recipes) {
14376
+ switch (layoutId) {
14377
+ case "classic":
14378
+ if (isExpressiveRecipe(recipes)) {
14379
+ return [
14380
+ "brand-bar",
14381
+ "brand-underline",
14382
+ "flat-tabs",
14383
+ "brand-pill",
14384
+ "fine-line"
14385
+ ];
14386
+ }
14387
+ if (recipes.spacing === "compact") {
14388
+ return ["flat-tabs", "fine-line", "minimal", "brand-bar"];
14389
+ }
14390
+ if (isSerifTypographyRecipe(recipes)) {
14391
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
14392
+ }
14393
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
14394
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
14395
+ }
14396
+ return ["fine-line", "minimal", "soft-bar", "brand-bar"];
14397
+ case "centered":
14398
+ if (isSerifTypographyRecipe(recipes)) {
14399
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
14400
+ }
14401
+ if (isExpressiveRecipe(recipes)) {
14402
+ return ["brand-pill", "flat-tabs", "brand-bar", "fine-line"];
14403
+ }
14404
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
14405
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
14406
+ }
14407
+ return ["minimal", "fine-line", "soft-bar"];
14408
+ case "floating":
14409
+ if (isExpressiveRecipe(recipes)) {
14410
+ return ["glass", "split-glass", "brand-pill", "soft-shell"];
14411
+ }
14412
+ if (isSerifTypographyRecipe(recipes)) {
14413
+ return ["split-pill", "minimal-surface", "soft-shell"];
14414
+ }
14415
+ return ["soft-shell", "minimal-surface", "glass"];
14416
+ default:
14417
+ return [];
14418
+ }
13860
14419
  }
13861
- function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
13862
- const first = choices[0] ?? {
13863
- id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
13864
- };
13865
- return [first, ...choices.slice(1)];
14420
+ function isExpressiveRecipe(recipes) {
14421
+ return recipes.contrast === "maximum" || recipes.shadow === "layered" || recipes.motion === "expressive";
13866
14422
  }
13867
- function inferHeaderCurationFromLegacyLooks(lookIds) {
14423
+ function isSerifTypographyRecipe(recipes) {
14424
+ return recipes.typography === "serif-editorial" || recipes.typography === "classic-serif";
14425
+ }
14426
+ function inferHeaderCurationFromLegacyLooks(lookIds, recipes) {
13868
14427
  const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
13869
14428
  (selection) => Boolean(selection)
13870
14429
  );
@@ -13877,8 +14436,15 @@ function inferHeaderCurationFromLegacyLooks(lookIds) {
13877
14436
  );
13878
14437
  const stylesByLayout = {};
13879
14438
  for (const layoutChoice of layoutChoices) {
13880
- const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
13881
- stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
14439
+ const legacyStyleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
14440
+ const inferredStyleChoices = inferredHeaderStyleValuesForRecipes(
14441
+ layoutChoice.id,
14442
+ recipes
14443
+ ).map((styleId) => headerStyleChoice(styleId));
14444
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = uniqueCompatibleHeaderStyleChoices(
14445
+ [...legacyStyleChoices, ...inferredStyleChoices],
14446
+ layoutChoice.id
14447
+ );
13882
14448
  }
13883
14449
  return {
13884
14450
  defaultHeaderSelection,
@@ -14298,10 +14864,10 @@ var curatedSiteStyles = [
14298
14864
  ]
14299
14865
  }),
14300
14866
  defineCuratedSiteStyle({
14301
- id: "site-style:soft-earth",
14867
+ id: SOFT_EARTH_SITE_STYLE_ID,
14302
14868
  name: "Soft Earth",
14303
14869
  description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
14304
- 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.",
14870
+ 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.",
14305
14871
  siteCreatorSelection: {
14306
14872
  kind: "site_creator_keyword_heuristic",
14307
14873
  priority: 45
@@ -14371,14 +14937,18 @@ var curatedSiteStyles = [
14371
14937
  paragraphSize: "default",
14372
14938
  headingSize: "editorial"
14373
14939
  }
14374
- }
14940
+ },
14941
+ accordions: softEarthAccordionSystem
14942
+ },
14943
+ defaultBlockVariants: {
14944
+ "block.faq": "question-columns"
14375
14945
  },
14376
14946
  recommendedAppearancePresetIds: [
14377
14947
  "hero-brand-scrim",
14378
- "intro-soft-earth-statement",
14379
- "feature-cards-soft-earth-offerings",
14380
- "testimonials-soft-earth-proof-band",
14381
- "faq-soft-earth-two-column",
14948
+ "intro-organic-statement",
14949
+ "feature-cards-raised-rule",
14950
+ "events-lined-panel",
14951
+ "testimonials-brand-background-quotes",
14382
14952
  "contact-form-panel"
14383
14953
  ],
14384
14954
  recommendedHeaderLookIds: [
@@ -14482,7 +15052,7 @@ var curatedSiteStyles = [
14482
15052
  "hero-brand-scrim-fixed-frame",
14483
15053
  "body-text-editorial-intro",
14484
15054
  "schedule-details-brand-depth",
14485
- "testimonials-accent-quote-proof",
15055
+ "testimonials-accent-quote-cards",
14486
15056
  "contact-form-brand-depth-card"
14487
15057
  ],
14488
15058
  recommendedHeaderLookIds: [
@@ -14577,6 +15147,7 @@ var themeV2RuntimeStyleFieldNames = [
14577
15147
  ];
14578
15148
  var themeV2BlockSpecificRawStyleFieldNames = [
14579
15149
  "_contentCardStyles",
15150
+ "_heroLayoutStyles",
14580
15151
  "_textCardStyles"
14581
15152
  ];
14582
15153
  var themeV2NormalEditorRawStyleFieldNames = [
@@ -14586,6 +15157,10 @@ var themeV2NormalEditorRawStyleFieldNames = [
14586
15157
  var themeV2NormalEditorRawStyleFieldNameSet = new Set(
14587
15158
  themeV2NormalEditorRawStyleFieldNames
14588
15159
  );
15160
+ var themeV2CompilerOwnedFieldNames = [
15161
+ ...themeV2RuntimeStyleFieldNames,
15162
+ ...themeV2BlockSpecificRawStyleFieldNames
15163
+ ];
14589
15164
 
14590
15165
  // ../theme-core/src/site-styles/designState.ts
14591
15166
  var themeV2DesignStateSchemaVersion = 1;
@@ -14600,6 +15175,16 @@ var heroLegibilityStrategySchema = z23.enum([
14600
15175
  "scrim-gradient",
14601
15176
  "solid-panel"
14602
15177
  ]);
15178
+ var heroCompositionIntentSchema = z23.enum([
15179
+ "center",
15180
+ "bottom-left"
15181
+ ]);
15182
+ var heroTypographyScaleIntentSchema = z23.enum([
15183
+ "quiet",
15184
+ "editorial",
15185
+ "display",
15186
+ "poster"
15187
+ ]);
14603
15188
  var sectionHeightIntentSchema = z23.enum([
14604
15189
  "default",
14605
15190
  "banner",
@@ -14635,6 +15220,7 @@ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
14635
15220
  ]);
14636
15221
  var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
14637
15222
  var tileTreatmentSchema = z23.enum(tileTreatmentValues);
15223
+ var eventListTreatmentSchema = z23.enum(eventListTreatmentValues);
14638
15224
  var eyebrowTreatmentSchema = z23.enum(eyebrowTreatmentValues);
14639
15225
  function uniqueNonEmpty(values) {
14640
15226
  const uniqueValues = [...new Set(values)];
@@ -14676,10 +15262,13 @@ var blockDesignPlanSchema = z23.object({
14676
15262
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
14677
15263
  sectionHeight: sectionHeightIntentSchema.optional(),
14678
15264
  heroLegibility: heroLegibilityStrategySchema.optional(),
15265
+ heroComposition: heroCompositionIntentSchema.optional(),
15266
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
14679
15267
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
14680
15268
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
14681
15269
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
14682
15270
  tileTreatment: tileTreatmentSchema.optional(),
15271
+ eventListTreatment: eventListTreatmentSchema.optional(),
14683
15272
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
14684
15273
  }).strict();
14685
15274
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
@@ -16079,6 +16668,7 @@ function styledSection(config) {
16079
16668
  renderBackgroundImage = true,
16080
16669
  backgroundImageLoading,
16081
16670
  backgroundImageFetchPriority,
16671
+ allowOverflow = false,
16082
16672
  fullWidthPath
16083
16673
  } = config;
16084
16674
  const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
@@ -16113,7 +16703,7 @@ function styledSection(config) {
16113
16703
  // No fallback needed - transform handles all cases via defaultSpacing
16114
16704
  }
16115
16705
  },
16116
- allowOverflow: {
16706
+ allowOverflow: allowOverflow ? true : {
16117
16707
  $bind: {
16118
16708
  from: `${bindFrom}.background`,
16119
16709
  transforms: [{ id: "background.resolveAllowOverflow" }],
@@ -16808,6 +17398,14 @@ var tileTreatmentSet = new Set(tileTreatmentValues);
16808
17398
  function isTileTreatment(value) {
16809
17399
  return typeof value === "string" && tileTreatmentSet.has(value);
16810
17400
  }
17401
+ var eventListTreatmentClassMap = {
17402
+ plain: "",
17403
+ "lined-panel": "rb-event-list-treatment-lined-panel"
17404
+ };
17405
+ var eventListTreatmentSet = new Set(eventListTreatmentValues);
17406
+ function isEventListTreatment(value) {
17407
+ return typeof value === "string" && eventListTreatmentSet.has(value);
17408
+ }
16811
17409
  var sectionClassNameTransform = {
16812
17410
  id: "sectionStyles.resolveClassName",
16813
17411
  kind: "string",
@@ -16875,6 +17473,17 @@ var sectionClassNameTransform = {
16875
17473
  `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
16876
17474
  );
16877
17475
  }
17476
+ const eventListTreatment = input?.eventListTreatment;
17477
+ if (isEventListTreatment(eventListTreatment)) {
17478
+ const eventListTreatmentClass = eventListTreatmentClassMap[eventListTreatment];
17479
+ if (eventListTreatmentClass) {
17480
+ classes.push(eventListTreatmentClass);
17481
+ }
17482
+ } else if (typeof eventListTreatment === "string" && process.env.NODE_ENV !== "production") {
17483
+ console.warn(
17484
+ `[sectionStyles] Invalid eventListTreatment value in _sectionStyles: "${eventListTreatment}". Expected one of: ${eventListTreatmentValues.join(", ")}.`
17485
+ );
17486
+ }
16878
17487
  if (hasFixedFrameBackgroundMotion(input)) {
16879
17488
  classes.push(fixedFrameScopeClass);
16880
17489
  }
@@ -17310,6 +17919,35 @@ function sectionState(opts) {
17310
17919
  );
17311
17920
  }
17312
17921
 
17922
+ // ../blocks/src/system/node/fragments/headingDecoration.ts
17923
+ var defaultBindFrom = "_sectionStyles.headingDecoration";
17924
+ function headingDecoration({
17925
+ bindFrom = defaultBindFrom,
17926
+ family,
17927
+ placement,
17928
+ className
17929
+ }) {
17930
+ return el(
17931
+ "div",
17932
+ {
17933
+ "aria-hidden": "true",
17934
+ className: {
17935
+ $bind: {
17936
+ from: bindFrom,
17937
+ transforms: [
17938
+ {
17939
+ id: "ui.headingDecorationClassName",
17940
+ options: { baseClass: className, family }
17941
+ }
17942
+ ]
17943
+ }
17944
+ }
17945
+ },
17946
+ null,
17947
+ when(`${bindFrom}.placement`, { equals: placement })
17948
+ );
17949
+ }
17950
+
17313
17951
  // ../blocks/src/system/fragments/types.ts
17314
17952
  import { z as z27 } from "zod";
17315
17953
  var FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
@@ -18088,6 +18726,10 @@ var testimonialsHeadingFragment = defineFragment({
18088
18726
  when("content.heading"),
18089
18727
  bind("content.heading")
18090
18728
  ),
18729
+ headingDecoration({
18730
+ family: "short-center-rule",
18731
+ placement: "under-centered-heading"
18732
+ }),
18091
18733
  text(
18092
18734
  {
18093
18735
  as: "p",
@@ -18759,6 +19401,41 @@ var faqHeadingFragment = defineFragment({
18759
19401
  });
18760
19402
 
18761
19403
  // ../blocks/src/system/fragments/library/faqAccordion.ts
19404
+ function createFaqAccordionLayout(options = {}) {
19405
+ return accordionList({
19406
+ collection: "content.items",
19407
+ itemName: "faqItem",
19408
+ indexName: "faqIndex",
19409
+ accordionProps: {
19410
+ className: options.rootClassName ?? "accordion-root",
19411
+ type: "single",
19412
+ collapsible: true
19413
+ },
19414
+ itemProps: {
19415
+ className: {
19416
+ $bind: {
19417
+ from: "content._cardStyles",
19418
+ transforms: [
19419
+ {
19420
+ id: "boxStyles.all",
19421
+ options: {
19422
+ axis: "all",
19423
+ includeSpacing: false,
19424
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
19425
+ }
19426
+ }
19427
+ ]
19428
+ },
19429
+ fallback: "rb-faq-item"
19430
+ },
19431
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
19432
+ // Legacy theme accordion style
19433
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
19434
+ },
19435
+ triggerFrom: "faqItem.question",
19436
+ contentFrom: "faqItem.answer"
19437
+ });
19438
+ }
18762
19439
  var faqAccordionFragment = defineFragment({
18763
19440
  id: "faqAccordion",
18764
19441
  title: "FAQ Accordion",
@@ -18792,40 +19469,7 @@ var faqAccordionFragment = defineFragment({
18792
19469
  }
18793
19470
  }
18794
19471
  ],
18795
- layout: accordionList({
18796
- collection: "content.items",
18797
- itemName: "faqItem",
18798
- indexName: "faqIndex",
18799
- accordionProps: {
18800
- className: "accordion-root",
18801
- // CSS-first: all styling handled by theme CSS
18802
- type: "single",
18803
- collapsible: true
18804
- },
18805
- itemProps: {
18806
- className: {
18807
- $bind: {
18808
- from: "content._cardStyles",
18809
- transforms: [
18810
- {
18811
- id: "boxStyles.all",
18812
- options: {
18813
- axis: "all",
18814
- includeSpacing: false,
18815
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden rb-border"
18816
- }
18817
- }
18818
- ]
18819
- },
18820
- fallback: "rb-faq-item"
18821
- },
18822
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
18823
- // Legacy theme accordion style
18824
- iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
18825
- },
18826
- triggerFrom: "faqItem.question",
18827
- contentFrom: "faqItem.answer"
18828
- })
19472
+ layout: createFaqAccordionLayout()
18829
19473
  });
18830
19474
 
18831
19475
  // ../blocks/src/system/fragments/library/card.ts
@@ -19878,6 +20522,7 @@ var microLayout = styledSection({
19878
20522
  function splitLayoutWith(children) {
19879
20523
  return styledSection({
19880
20524
  children: styledContainer({
20525
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
19881
20526
  children: {
19882
20527
  type: "grid",
19883
20528
  props: {
@@ -19902,6 +20547,7 @@ function splitLayoutWith(children) {
19902
20547
  // The split variants render the image as a real grid column, so suppress
19903
20548
  // the default absolute background image layer while keeping color/overlay.
19904
20549
  renderBackgroundImage: false,
20550
+ allowOverflow: true,
19905
20551
  baseClass: ""
19906
20552
  });
19907
20553
  }
@@ -20055,6 +20701,21 @@ function introHeading(className) {
20055
20701
  bind("content.title")
20056
20702
  );
20057
20703
  }
20704
+ function introHeadingGroup(className) {
20705
+ return stack(
20706
+ {
20707
+ gap: "sm",
20708
+ className: "rb-intro-heading-group"
20709
+ },
20710
+ [
20711
+ introHeading(className),
20712
+ headingDecoration({
20713
+ family: "organic-squiggle",
20714
+ placement: "after-heading"
20715
+ })
20716
+ ]
20717
+ );
20718
+ }
20058
20719
  function introBody(className = "rb-prose rb-max-w-none") {
20059
20720
  return richText({ className }, bind("content.body"));
20060
20721
  }
@@ -20073,6 +20734,10 @@ function introCopyStack(options = {}) {
20073
20734
  },
20074
20735
  [
20075
20736
  introHeading(options.headingClassName ?? "rb-intro-title"),
20737
+ headingDecoration({
20738
+ family: "organic-squiggle",
20739
+ placement: "after-heading"
20740
+ }),
20076
20741
  introBody(options.bodyClassName),
20077
20742
  introCtas(options.ctaJustify)
20078
20743
  ]
@@ -20112,7 +20777,7 @@ var statementCopyLayout = styledSection({
20112
20777
  className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
20113
20778
  },
20114
20779
  [
20115
- introHeading("rb-intro-title rb-max-w-xl"),
20780
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
20116
20781
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
20117
20782
  introBody(),
20118
20783
  introCtas("start")
@@ -20133,7 +20798,7 @@ var statementMediaLayout = styledSection({
20133
20798
  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"
20134
20799
  },
20135
20800
  [
20136
- introHeading("rb-intro-title rb-max-w-xl"),
20801
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
20137
20802
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
20138
20803
  introBody(),
20139
20804
  introCtas("start")
@@ -21135,6 +21800,9 @@ function isNodeDefinitionArray(layout) {
21135
21800
  }
21136
21801
  var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
21137
21802
  var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
21803
+ var questionColumnsAccordionLayout = createFaqAccordionLayout({
21804
+ rootClassName: "accordion-root rb-faq-question-columns rb-grid rb-grid-cols-1 rb-gap-4 rb-lg-grid-cols-2"
21805
+ });
21138
21806
  var defaultLayout = styledSection({
21139
21807
  children: styledContainer({
21140
21808
  baseClassName: "rb-relative rb-isolate",
@@ -21148,11 +21816,24 @@ var twoColumnLayout = styledSection({
21148
21816
  children: el(
21149
21817
  "div",
21150
21818
  {
21151
- className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
21819
+ className: "rb-faq-split-heading rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
21152
21820
  },
21153
21821
  [
21154
- el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
21155
- el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
21822
+ el("div", { className: "rb-faq-split-heading-copy" }, [headingLayout]),
21823
+ el("div", { className: "rb-faq-split-heading-accordion" }, [accordionLayout])
21824
+ ]
21825
+ )
21826
+ }),
21827
+ baseClass: ""
21828
+ });
21829
+ var questionColumnsLayout = styledSection({
21830
+ children: styledContainer({
21831
+ baseClassName: "rb-relative rb-isolate",
21832
+ children: stack(
21833
+ { gap: "xl", className: "rb-w-full" },
21834
+ [
21835
+ headingLayout,
21836
+ questionColumnsAccordionLayout
21156
21837
  ]
21157
21838
  )
21158
21839
  }),
@@ -21177,7 +21858,8 @@ var faqManifest = createBlockManifest({
21177
21858
  layout: defaultLayout,
21178
21859
  variants: {
21179
21860
  default: defaultLayout,
21180
- "two-column": twoColumnLayout
21861
+ "two-column": twoColumnLayout,
21862
+ "question-columns": questionColumnsLayout
21181
21863
  },
21182
21864
  defaultVariant: "default",
21183
21865
  variantOptions: {
@@ -21188,6 +21870,10 @@ var faqManifest = createBlockManifest({
21188
21870
  "two-column": {
21189
21871
  label: "Two column",
21190
21872
  description: "A left heading column with FAQ items on the right."
21873
+ },
21874
+ "question-columns": {
21875
+ label: "Question columns",
21876
+ description: "A full-width heading above FAQ items split into two columns."
21191
21877
  }
21192
21878
  },
21193
21879
  description: "Accordion of frequently asked questions and answers.",
@@ -21309,9 +21995,21 @@ var eyebrowTreatmentClassMap = {
21309
21995
  "accent-pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent rb-eyebrow-treatment-pill-bounce"
21310
21996
  };
21311
21997
  var eyebrowTreatmentSet = new Set(eyebrowTreatmentValues);
21998
+ var headingDecorationFamilySet = new Set(visibleHeadingDecorationFamilyValues);
21999
+ var headingDecorationPlacementSet = new Set(visibleHeadingDecorationPlacementValues);
22000
+ var headingDecorationColorTokenSet = new Set(headingDecorationColorTokenValues);
21312
22001
  function isEyebrowTreatment(value) {
21313
22002
  return typeof value === "string" && eyebrowTreatmentSet.has(value);
21314
22003
  }
22004
+ function isHeadingDecorationFamily(value) {
22005
+ return typeof value === "string" && headingDecorationFamilySet.has(value);
22006
+ }
22007
+ function isHeadingDecorationPlacement(value) {
22008
+ return typeof value === "string" && headingDecorationPlacementSet.has(value);
22009
+ }
22010
+ function isHeadingDecorationColorToken(value) {
22011
+ return typeof value === "string" && headingDecorationColorTokenSet.has(value);
22012
+ }
21315
22013
  var imageGalleryCornerClassMap = {
21316
22014
  none: "",
21317
22015
  sm: "rb-rounded-sm",
@@ -21415,6 +22113,10 @@ var sectionStateToneTransform = {
21415
22113
  summary: "Map semantic section-state kind to feedback tone",
21416
22114
  run: (value) => sectionStateToneFromUnknown(value)
21417
22115
  };
22116
+ var heroTitleLengthThresholds = {
22117
+ medium: { maxCharacters: 42, maxWords: 6 },
22118
+ long: { maxCharacters: 78, maxWords: 11 }
22119
+ };
21418
22120
  function isPlainObject(value) {
21419
22121
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
21420
22122
  }
@@ -21422,6 +22124,14 @@ function readString(obj, key) {
21422
22124
  const v = obj[key];
21423
22125
  return typeof v === "string" ? v : void 0;
21424
22126
  }
22127
+ function resolveGeneratedHeroLayoutStyles(content) {
22128
+ const raw = content._heroLayoutStyles;
22129
+ return isPlainObject(raw) ? raw : null;
22130
+ }
22131
+ function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
22132
+ const generated = resolveGeneratedHeroLayoutStyles(content);
22133
+ return generated && typeof generated[generatedKey] === "string" ? generated[generatedKey] : readString(content, fallbackKey);
22134
+ }
21425
22135
  function resolveHeroVariant(content) {
21426
22136
  const variant = readString(content, "variant");
21427
22137
  if (variant && variant.trim()) return variant.trim();
@@ -21430,14 +22140,14 @@ function resolveHeroVariant(content) {
21430
22140
  return null;
21431
22141
  }
21432
22142
  function resolveHeroContentAlignment(content) {
21433
- const raw = readString(content, "contentAlignment");
22143
+ const raw = readHeroLayoutString(content, "contentAlignment");
21434
22144
  if (raw === "left" || raw === "center" || raw === "right") return raw;
21435
22145
  const variant = resolveHeroVariant(content);
21436
22146
  if (variant === "split" || variant === "splitReverse") return "left";
21437
22147
  return "center";
21438
22148
  }
21439
22149
  function resolveHeroVerticalAlignment(content) {
21440
- const raw = readString(content, "verticalAlignment");
22150
+ const raw = readHeroLayoutString(content, "verticalAlignment");
21441
22151
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
21442
22152
  const sectionStyles = asPartialObject(content._sectionStyles);
21443
22153
  const minHeight = sectionStyles?.minHeight;
@@ -21447,11 +22157,29 @@ function resolveHeroVerticalAlignment(content) {
21447
22157
  return "top";
21448
22158
  }
21449
22159
  function resolveHeroContentMaxWidth(content) {
21450
- const raw = readString(content, "contentMaxWidth");
22160
+ const raw = readHeroLayoutString(content, "contentMaxWidth");
21451
22161
  if (raw === "default" || raw === "narrow" || raw === "medium" || raw === "wide")
21452
22162
  return raw;
21453
22163
  return "default";
21454
22164
  }
22165
+ function resolveHeroTypographyScale(content) {
22166
+ const raw = readHeroLayoutString(
22167
+ content,
22168
+ "typographyScale",
22169
+ "heroTypographyScale"
22170
+ );
22171
+ if (raw === "quiet" || raw === "editorial" || raw === "display" || raw === "poster") {
22172
+ return raw;
22173
+ }
22174
+ return null;
22175
+ }
22176
+ function resolveHeroTitleLength(content) {
22177
+ const headline = readString(content, "headline")?.trim() ?? "";
22178
+ const wordCount = headline.length === 0 ? 0 : headline.split(/\s+/).length;
22179
+ if (headline.length > heroTitleLengthThresholds.long.maxCharacters || wordCount > heroTitleLengthThresholds.long.maxWords) return "long";
22180
+ if (headline.length > heroTitleLengthThresholds.medium.maxCharacters || wordCount > heroTitleLengthThresholds.medium.maxWords) return "medium";
22181
+ return "short";
22182
+ }
21455
22183
  var heroContentWrapperClassSchema = z33.object({
21456
22184
  base: z33.string().optional()
21457
22185
  });
@@ -21464,6 +22192,8 @@ var heroContentWrapperClassTransform = {
21464
22192
  const content = isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {};
21465
22193
  const alignment = resolveHeroContentAlignment(content);
21466
22194
  const maxWidth = resolveHeroContentMaxWidth(content);
22195
+ const typographyScale = resolveHeroTypographyScale(content);
22196
+ const titleLength = resolveHeroTitleLength(content);
21467
22197
  const textAlignClass = alignment === "center" ? "rb-text-center" : alignment === "right" ? "rb-text-right" : "rb-text-left";
21468
22198
  const maxWidthClass = maxWidth === "narrow" ? "rb-max-w-2xl" : maxWidth === "medium" ? "rb-max-w-3xl" : maxWidth === "wide" ? "rb-max-w-5xl" : "";
21469
22199
  const positionClass = alignment === "center" ? "rb-mx-auto" : alignment === "right" ? "rb-ml-auto" : "";
@@ -21471,7 +22201,9 @@ var heroContentWrapperClassTransform = {
21471
22201
  options?.base,
21472
22202
  textAlignClass,
21473
22203
  maxWidthClass,
21474
- positionClass
22204
+ positionClass,
22205
+ typographyScale ? `rb-hero-typography-${typographyScale}` : "",
22206
+ `rb-hero-title-${titleLength}`
21475
22207
  ]);
21476
22208
  }
21477
22209
  };
@@ -21771,11 +22503,67 @@ var uiTransforms = [
21771
22503
  const treatment = isEyebrowTreatment(value) ? value : "plain";
21772
22504
  return joinClasses3([baseClass, eyebrowTreatmentClassMap[treatment]]);
21773
22505
  }
22506
+ },
22507
+ {
22508
+ id: "ui.headingDecorationClassName",
22509
+ kind: "string",
22510
+ summary: "Apply constrained Theme V2 heading decoration classes",
22511
+ run: (value, options) => {
22512
+ const baseClass = typeof options?.baseClass === "string" && options.baseClass.trim() ? options.baseClass : "rb-heading-decoration";
22513
+ const decoration = asPartialObject(value);
22514
+ const family = isHeadingDecorationFamily(decoration?.family) ? decoration.family : null;
22515
+ const allowedFamily = isHeadingDecorationFamily(options?.family) ? options.family : null;
22516
+ const placement = isHeadingDecorationPlacement(decoration?.placement) ? decoration.placement : null;
22517
+ const colorToken = isHeadingDecorationColorToken(decoration?.colorToken) ? decoration.colorToken : "primary";
22518
+ if (!family || !placement) return "rb-hidden";
22519
+ if (allowedFamily && family !== allowedFamily) return "rb-hidden";
22520
+ return joinClasses3([
22521
+ baseClass,
22522
+ `rb-heading-decoration-${family}`,
22523
+ `rb-heading-decoration-placement-${placement}`,
22524
+ `rb-heading-decoration-color-${colorToken}`
22525
+ ]);
22526
+ }
21774
22527
  }
21775
22528
  ];
21776
22529
 
21777
22530
  // ../blocks/src/system/transforms/registry/layout.ts
21778
22531
  import { z as z34 } from "zod";
22532
+
22533
+ // ../theme-core/src/siteChromePlacement.ts
22534
+ var HEADER_POSITIONINGS = ["static", "sticky", "fixed"];
22535
+ function parseHeaderPositioning(value) {
22536
+ return isHeaderPositioning(value) ? value : "static";
22537
+ }
22538
+ function isHeaderPositioning(value) {
22539
+ return typeof value === "string" && HEADER_POSITIONINGS.includes(value);
22540
+ }
22541
+ function planSiteChromePlacement(positioning) {
22542
+ switch (positioning) {
22543
+ case "static":
22544
+ return {
22545
+ kind: "static",
22546
+ headerRootClassName: null,
22547
+ standaloneShellClassName: null
22548
+ };
22549
+ case "sticky":
22550
+ return {
22551
+ kind: "sticky",
22552
+ headerRootClassName: "rb-sticky rb-top-0",
22553
+ standaloneShellClassName: "sticky top-0 z-40 w-full"
22554
+ };
22555
+ case "fixed":
22556
+ return {
22557
+ kind: "fixed",
22558
+ headerRootClassName: "rb-fixed rb-top-0 rb-left-0 rb-right-0",
22559
+ standaloneShellClassName: "fixed left-0 right-0 top-0 z-40 w-full"
22560
+ };
22561
+ default:
22562
+ return assertNever(positioning);
22563
+ }
22564
+ }
22565
+
22566
+ // ../blocks/src/system/transforms/registry/layout.ts
21779
22567
  var joinClasses4 = (parts) => parts.filter(
21780
22568
  (part) => typeof part === "string" && part.trim().length > 0
21781
22569
  ).join(" ").replace(/\s+/g, " ").trim();
@@ -21891,7 +22679,8 @@ var headerRootClassTransform = {
21891
22679
  ...options
21892
22680
  };
21893
22681
  const content = asPartialObject(value) ?? {};
21894
- const positioning = typeof content.positioning === "string" ? content.positioning : "static";
22682
+ const positioning = parseHeaderPositioning(content.positioning);
22683
+ const placement = planSiteChromePlacement(positioning);
21895
22684
  const shrinkOnScroll = Boolean(content.shrinkOnScroll);
21896
22685
  const header = asPartialObject(value);
21897
22686
  const visuals = resolveHeaderVisualStyles(header, context.theme);
@@ -21903,14 +22692,14 @@ var headerRootClassTransform = {
21903
22692
  if (config.blur) classes.push(config.blur);
21904
22693
  if (config.blurSupport) classes.push(config.blurSupport);
21905
22694
  }
21906
- if (positioning === "sticky") {
22695
+ if (placement.kind === "sticky") {
21907
22696
  classes.push(
21908
22697
  visuals.isTransparent ? config.stickyTransparent : config.sticky
21909
22698
  );
21910
- } else if (positioning === "fixed") {
22699
+ } else if (placement.kind === "fixed") {
21911
22700
  classes.push(config.fixed);
21912
22701
  }
21913
- if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
22702
+ if (shrinkOnScroll && placement.kind !== "static") {
21914
22703
  classes.push(config.shrink);
21915
22704
  }
21916
22705
  const VALID_VARIANTS = [
@@ -22445,6 +23234,10 @@ function desktopOnlyDisplay(display) {
22445
23234
  return `rb-hidden ${LARGE_DISPLAY_CLASSES[display]}`;
22446
23235
  }
22447
23236
 
23237
+ // ../theme-core/src/siteChromeOverlayClearance.ts
23238
+ var SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
23239
+ var SITE_CHROME_VISIBLE_HEADER_SELECTOR = `[${SITE_CHROME_VISIBLE_HEADER_ATTR}="true"]`;
23240
+
22448
23241
  // ../blocks/src/system/blocks/site-header.ts
22449
23242
  var logoRow = link(
22450
23243
  {
@@ -22717,6 +23510,7 @@ var transparentLayout = inline(
22717
23510
  );
22718
23511
  var floatingLayout = inline(
22719
23512
  {
23513
+ [SITE_CHROME_VISIBLE_HEADER_ATTR]: "true",
22720
23514
  className: bindProp("$root.theme.header.maxWidth", {
22721
23515
  transforms: pipe(
22722
23516
  tx("layout.maxWidthClass", {
@@ -23662,6 +24456,10 @@ var sectionHeading = stack(
23662
24456
  when("content.title"),
23663
24457
  bind("content.title")
23664
24458
  ),
24459
+ headingDecoration({
24460
+ family: "short-center-rule",
24461
+ placement: "under-centered-heading"
24462
+ }),
23665
24463
  richText(
23666
24464
  {
23667
24465
  className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
@@ -26085,7 +26883,7 @@ var COLUMN_CLASSES = {
26085
26883
  };
26086
26884
  function getContainerClass(layout, columns) {
26087
26885
  if (layout === "compact") {
26088
- return "event-listing-compact-container rb-flex rb-flex-col rb-gap-2";
26886
+ return "event-listing-compact-container rb-flex rb-flex-col";
26089
26887
  }
26090
26888
  if (layout === "stack") {
26091
26889
  return "rb-flex rb-flex-col rb-gap-6";
@@ -28913,6 +29711,7 @@ import { z as z53 } from "zod";
28913
29711
  var storedProductCartItemSchema = z53.object({
28914
29712
  kind: z53.literal("product"),
28915
29713
  productId: z53.string().min(1),
29714
+ productCategoryId: z53.string().min(1).optional().nullable(),
28916
29715
  variantId: z53.string().min(1).optional().nullable(),
28917
29716
  title: z53.string().min(1),
28918
29717
  variantTitle: z53.string().optional().nullable(),
@@ -31417,6 +32216,10 @@ var scheduleTileTreatments = [
31417
32216
  "quiet",
31418
32217
  "brand-depth"
31419
32218
  ];
32219
+ var eventListTreatments = [
32220
+ "plain",
32221
+ "lined-panel"
32222
+ ];
31420
32223
  function scheduleDetailsCapable() {
31421
32224
  return declareBlockDesignCapability({
31422
32225
  sectionSurfaces: "supported",
@@ -31425,6 +32228,14 @@ function scheduleDetailsCapable() {
31425
32228
  tileTreatments: scheduleTileTreatments
31426
32229
  });
31427
32230
  }
32231
+ function eventListCapable() {
32232
+ return declareBlockDesignCapability({
32233
+ sectionSurfaces: "supported",
32234
+ contentFrames: ["plain"],
32235
+ itemSurfaces: "unsupported",
32236
+ eventListTreatments
32237
+ });
32238
+ }
31428
32239
  function defaultBoundaryBias(visualWeight) {
31429
32240
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
31430
32241
  }
@@ -31644,7 +32455,8 @@ var systemBlockDefinitionsRaw = [
31644
32455
  flow: bodyFlow,
31645
32456
  layoutProfiles: [
31646
32457
  layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
31647
- layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
32458
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" }),
32459
+ layoutProfile({ variantKey: "question-columns", family: "grid", weight: "standard" })
31648
32460
  ]
31649
32461
  })),
31650
32462
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
@@ -31738,11 +32550,11 @@ var systemBlockDefinitionsRaw = [
31738
32550
  flow: offeringsFlow,
31739
32551
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "centered", weight: "featured" })]
31740
32552
  })),
31741
- withDesignCapability("block.event-listing", eventListingBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
32553
+ withDesignCapability("block.event-listing", eventListingBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
31742
32554
  flow: offeringsFlow,
31743
32555
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
31744
32556
  })),
31745
- withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
32557
+ withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
31746
32558
  flow: offeringsFlow,
31747
32559
  layoutProfiles: [
31748
32560
  layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
@@ -32874,6 +33686,15 @@ ${root} {
32874
33686
  `;
32875
33687
  }
32876
33688
 
33689
+ // ../theme-core/src/runtime/themeCssVarNames.ts
33690
+ var THEME_RADIUS_CSS_VARS = {
33691
+ block: "--rb-block-radius",
33692
+ button: "--rb-button-radius",
33693
+ input: "--rb-input-radius",
33694
+ legacyCard: "--radius-card",
33695
+ legacyControl: "--radius-control"
33696
+ };
33697
+
32877
33698
  // ../theme-core/src/blocks/vars/customer-portal.ts
32878
33699
  function generateCustomerPortalVars({
32879
33700
  themeId
@@ -32887,6 +33708,11 @@ ${root} {
32887
33708
  --cp-muted: rgb(var(--tb-mutedText));
32888
33709
  --cp-border: rgb(var(--tb-border));
32889
33710
  --cp-shadow: var(--shadow-elev);
33711
+ --cp-primary: rgb(var(--tb-primary));
33712
+ --cp-primary-hover: rgb(var(--tb-primary-700, var(--tb-primary)));
33713
+ --cp-error: rgb(var(--tb-destructive));
33714
+ --cp-card-radius: var(${THEME_RADIUS_CSS_VARS.block}, var(${THEME_RADIUS_CSS_VARS.legacyCard}, 0.75rem));
33715
+ --cp-control-radius: var(${THEME_RADIUS_CSS_VARS.input}, var(${THEME_RADIUS_CSS_VARS.legacyControl}, 0.5rem));
32890
33716
 
32891
33717
  /* Shared tab bar (underline style) */
32892
33718
  --rb-tab-border-width: 1px;
@@ -32937,7 +33763,7 @@ ${root} {
32937
33763
  --rb-modal-bg: var(--cp-card-bg);
32938
33764
  --rb-modal-border: var(--cp-card-border);
32939
33765
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
32940
- --rb-modal-radius: var(--radius-card);
33766
+ --rb-modal-radius: var(--cp-card-radius);
32941
33767
  --rb-modal-max-width: 560px;
32942
33768
 
32943
33769
  /* Header */
@@ -34318,6 +35144,9 @@ import { jsx as jsx5 } from "react/jsx-runtime";
34318
35144
  import * as React from "react";
34319
35145
  import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
34320
35146
 
35147
+ // ../theme-core/src/fonts/uploadFormat.ts
35148
+ var MAX_FONT_UPLOAD_BYTES = 5 * 1024 * 1024;
35149
+
34321
35150
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
34322
35151
  import { z as z61 } from "zod";
34323
35152
  var themeBridgeConfigSchema = z61.object({
@@ -35091,6 +35920,7 @@ var COURSE_ENROLLMENT_REFUND_FAILED_CODES = [
35091
35920
  ];
35092
35921
 
35093
35922
  // ../api/src/bookingVerticals.ts
35923
+ import { z as z64 } from "zod";
35094
35924
  var VERTICAL_IDS = [
35095
35925
  "yoga_wellness",
35096
35926
  "fitness_pt",
@@ -35169,6 +35999,132 @@ var VERTICAL_ID_SET = new Set(VERTICAL_IDS);
35169
35999
  var VERTICAL_PRESET_ID_SET = new Set(
35170
36000
  VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id)
35171
36001
  );
36002
+ function parseVerticalId(value) {
36003
+ return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
36004
+ }
36005
+ function parseVerticalPresetId(value) {
36006
+ return typeof value === "string" && VERTICAL_PRESET_ID_SET.has(value) ? value : null;
36007
+ }
36008
+ function getVerticalPresetDefinition(presetId) {
36009
+ const definition = VERTICAL_BOOKING_PRESETS.find((presetDefinition) => presetDefinition.id === presetId);
36010
+ if (!definition) {
36011
+ throw new Error(`Unhandled vertical preset id: ${presetId}`);
36012
+ }
36013
+ return definition;
36014
+ }
36015
+ function toNonEmptyVerticalPresetIds(presetIds) {
36016
+ const firstPresetId = presetIds[0];
36017
+ return firstPresetId ? [firstPresetId, ...presetIds.slice(1)] : null;
36018
+ }
36019
+ function createConfiguredSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
36020
+ return {
36021
+ verticalId,
36022
+ selectedPresetIds
36023
+ };
36024
+ }
36025
+ function createSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
36026
+ const nonEmptyPresetIds = toNonEmptyVerticalPresetIds(selectedPresetIds);
36027
+ return nonEmptyPresetIds ? createConfiguredSiteVerticalBookingConfig(verticalId, nonEmptyPresetIds) : null;
36028
+ }
36029
+ function resolveSiteVerticalBookingConfig(rawConfig) {
36030
+ if (!rawConfig) {
36031
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
36032
+ }
36033
+ const verticalId = parseVerticalId(rawConfig.verticalId);
36034
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
36035
+ const selectedPresetIds = rawPresetIds.map(parseVerticalPresetId).filter((presetId) => Boolean(presetId));
36036
+ const config = {
36037
+ verticalId,
36038
+ selectedPresetIds
36039
+ };
36040
+ if (!verticalId && selectedPresetIds.length === 0) {
36041
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
36042
+ }
36043
+ const issues = getSiteVerticalConfigIssues(rawConfig, config);
36044
+ if (issues.length > 0) {
36045
+ return { kind: "invalid", config, issues };
36046
+ }
36047
+ const configuredConfig = verticalId ? createSiteVerticalBookingConfig(verticalId, selectedPresetIds) : null;
36048
+ if (!configuredConfig) {
36049
+ return { kind: "invalid", config, issues: ["empty_selected_presets"] };
36050
+ }
36051
+ return {
36052
+ kind: "configured",
36053
+ config: configuredConfig,
36054
+ selectedPresets: configuredConfig.selectedPresetIds.map(getVerticalPresetDefinition)
36055
+ };
36056
+ }
36057
+ function getSiteVerticalConfigIssues(rawConfig, config) {
36058
+ const issues = /* @__PURE__ */ new Set();
36059
+ if (rawConfig.verticalId != null && !config.verticalId) {
36060
+ issues.add("unknown_vertical");
36061
+ }
36062
+ if (!config.verticalId && config.selectedPresetIds.length > 0) {
36063
+ issues.add("missing_vertical");
36064
+ }
36065
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
36066
+ if (rawPresetIds.some((presetId) => parseVerticalPresetId(presetId) === null)) {
36067
+ issues.add("unknown_preset");
36068
+ }
36069
+ if (config.verticalId && config.selectedPresetIds.length === 0) {
36070
+ issues.add("empty_selected_presets");
36071
+ }
36072
+ const seenBehaviours = /* @__PURE__ */ new Set();
36073
+ for (const presetId of config.selectedPresetIds) {
36074
+ const presetDefinition = getVerticalPresetDefinition(presetId);
36075
+ if (config.verticalId && presetDefinition.verticalId !== config.verticalId) {
36076
+ issues.add("preset_vertical_mismatch");
36077
+ }
36078
+ if (presetDefinition.availability === "future") {
36079
+ issues.add("future_preset_selected");
36080
+ }
36081
+ if (seenBehaviours.has(presetDefinition.canonicalBehaviour)) {
36082
+ issues.add("duplicate_canonical_behaviour");
36083
+ }
36084
+ seenBehaviours.add(presetDefinition.canonicalBehaviour);
36085
+ }
36086
+ return [...issues];
36087
+ }
36088
+ var VerticalIdSchema = z64.string().trim().transform((value, ctx) => {
36089
+ const parsed = parseVerticalId(value);
36090
+ if (!parsed) {
36091
+ ctx.addIssue({
36092
+ code: z64.ZodIssueCode.custom,
36093
+ message: "Unknown booking vertical"
36094
+ });
36095
+ return z64.NEVER;
36096
+ }
36097
+ return parsed;
36098
+ });
36099
+ var VerticalPresetIdSchema = z64.string().trim().transform((value, ctx) => {
36100
+ const parsed = parseVerticalPresetId(value);
36101
+ if (!parsed) {
36102
+ ctx.addIssue({
36103
+ code: z64.ZodIssueCode.custom,
36104
+ message: "Unknown booking preset"
36105
+ });
36106
+ return z64.NEVER;
36107
+ }
36108
+ return parsed;
36109
+ });
36110
+ var BookingVerticalConfigSchema = z64.object({
36111
+ verticalId: VerticalIdSchema.nullable(),
36112
+ selectedPresetIds: z64.array(VerticalPresetIdSchema).max(20)
36113
+ }).transform((value, ctx) => {
36114
+ const resolved = resolveSiteVerticalBookingConfig(value);
36115
+ if (resolved.kind === "invalid") {
36116
+ ctx.addIssue({
36117
+ code: z64.ZodIssueCode.custom,
36118
+ message: `Invalid booking vertical config: ${resolved.issues.join(", ")}`
36119
+ });
36120
+ return z64.NEVER;
36121
+ }
36122
+ return resolved.config;
36123
+ });
36124
+ var DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
36125
+ verticalId: null,
36126
+ selectedPresetIds: []
36127
+ };
35172
36128
  function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
35173
36129
  return {
35174
36130
  id,
@@ -35188,51 +36144,51 @@ function isRecord3(value) {
35188
36144
  }
35189
36145
 
35190
36146
  // ../api/src/appointmentSetup.ts
35191
- import { z as z64 } from "zod";
36147
+ import { z as z65 } from "zod";
35192
36148
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
35193
- var appointmentSetupRefSchema = z64.discriminatedUnion("kind", [
35194
- z64.object({ kind: z64.literal("existing"), id: z64.string().min(1) }),
35195
- z64.object({ kind: z64.literal("new"), draftId: z64.string().min(1) })
36149
+ var appointmentSetupRefSchema = z65.discriminatedUnion("kind", [
36150
+ z65.object({ kind: z65.literal("existing"), id: z65.string().min(1) }),
36151
+ z65.object({ kind: z65.literal("new"), draftId: z65.string().min(1) })
35196
36152
  ]);
35197
- var appointmentSetupVenueChoiceSchema = z64.discriminatedUnion("kind", [
35198
- z64.object({ kind: z64.literal("none") }),
35199
- z64.object({ kind: z64.literal("existing"), venueId: z64.string().min(1) }),
35200
- z64.object({
35201
- kind: z64.literal("create"),
35202
- draftId: z64.string().min(1),
35203
- title: z64.string().trim().min(1),
35204
- description: z64.string().nullable(),
35205
- timezone: z64.string().trim().min(1).nullable(),
35206
- addressJson: z64.record(z64.string(), z64.unknown()),
35207
- locationJson: z64.object({ lat: z64.number(), lng: z64.number() }).nullable()
36153
+ var appointmentSetupVenueChoiceSchema = z65.discriminatedUnion("kind", [
36154
+ z65.object({ kind: z65.literal("none") }),
36155
+ z65.object({ kind: z65.literal("existing"), venueId: z65.string().min(1) }),
36156
+ z65.object({
36157
+ kind: z65.literal("create"),
36158
+ draftId: z65.string().min(1),
36159
+ title: z65.string().trim().min(1),
36160
+ description: z65.string().nullable(),
36161
+ timezone: z65.string().trim().min(1).nullable(),
36162
+ addressJson: z65.record(z65.string(), z65.unknown()),
36163
+ locationJson: z65.object({ lat: z65.number(), lng: z65.number() }).nullable()
35208
36164
  })
35209
36165
  ]);
35210
- var appointmentSetupPaymentDraftSchema = z64.object({
35211
- priceType: z64.union([z64.literal("free"), z64.literal("paid")])
35212
- });
35213
- var appointmentSetupServiceAssignmentDraftSchema = z64.discriminatedUnion("kind", [
35214
- z64.object({ kind: z64.literal("all_practitioners") }),
35215
- z64.object({
35216
- kind: z64.literal("selected_practitioners"),
35217
- resourceRefs: z64.array(appointmentSetupRefSchema)
36166
+ var appointmentSetupPaymentDraftSchema = z65.object({
36167
+ priceType: z65.union([z65.literal("free"), z65.literal("paid")])
36168
+ });
36169
+ var appointmentSetupServiceAssignmentDraftSchema = z65.discriminatedUnion("kind", [
36170
+ z65.object({ kind: z65.literal("all_practitioners") }),
36171
+ z65.object({
36172
+ kind: z65.literal("selected_practitioners"),
36173
+ resourceRefs: z65.array(appointmentSetupRefSchema)
35218
36174
  })
35219
36175
  ]);
35220
- var appointmentSetupServiceDraftSchema = z64.object({
36176
+ var appointmentSetupServiceDraftSchema = z65.object({
35221
36177
  ref: appointmentSetupRefSchema,
35222
- title: z64.string().trim().min(1),
35223
- description: z64.string().nullable(),
35224
- durationMinutes: z64.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
35225
- prepMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
35226
- cleanupMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
35227
- priceAmount: z64.number().int().nonnegative().nullable(),
35228
- isActive: z64.boolean(),
35229
- locationType: z64.union([
35230
- z64.literal("virtual"),
35231
- z64.literal("in_person"),
35232
- z64.literal("hybrid")
36178
+ title: z65.string().trim().min(1),
36179
+ description: z65.string().nullable(),
36180
+ durationMinutes: z65.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
36181
+ prepMinutes: z65.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
36182
+ cleanupMinutes: z65.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
36183
+ priceAmount: z65.number().int().nonnegative().nullable(),
36184
+ isActive: z65.boolean(),
36185
+ locationType: z65.union([
36186
+ z65.literal("virtual"),
36187
+ z65.literal("in_person"),
36188
+ z65.literal("hybrid")
35233
36189
  ]),
35234
36190
  venue: appointmentSetupVenueChoiceSchema,
35235
- timezone: z64.string().trim().min(1).nullable(),
36191
+ timezone: z65.string().trim().min(1).nullable(),
35236
36192
  payment: appointmentSetupPaymentDraftSchema,
35237
36193
  assignment: appointmentSetupServiceAssignmentDraftSchema
35238
36194
  }).superRefine((service, ctx) => {
@@ -35251,49 +36207,49 @@ var appointmentSetupServiceDraftSchema = z64.object({
35251
36207
  });
35252
36208
  }
35253
36209
  });
35254
- var appointmentSetupPractitionerDraftSchema = z64.object({
36210
+ var appointmentSetupPractitionerDraftSchema = z65.object({
35255
36211
  ref: appointmentSetupRefSchema,
35256
- displayName: z64.string().trim().min(1),
35257
- bio: z64.string().nullable(),
35258
- timezone: z64.string().trim().min(1),
35259
- colorHex: z64.string().nullable()
35260
- });
35261
- var appointmentSetupWeeklyWindowDraftSchema = z64.object({
35262
- weekday: z64.number().int().min(0).max(6),
35263
- startTime: z64.string(),
35264
- endTime: z64.string()
35265
- });
35266
- var appointmentSetupStartTimePolicyDraftSchema = z64.discriminatedUnion("kind", [
35267
- z64.object({ kind: z64.literal("automatic_spacing") }),
35268
- z64.object({
35269
- kind: z64.literal("regular_interval"),
35270
- intervalMinutes: z64.union([
35271
- z64.literal(10),
35272
- z64.literal(15),
35273
- z64.literal(20),
35274
- z64.literal(30),
35275
- z64.literal(45),
35276
- z64.literal(60)
36212
+ displayName: z65.string().trim().min(1),
36213
+ bio: z65.string().nullable(),
36214
+ timezone: z65.string().trim().min(1),
36215
+ colorHex: z65.string().nullable()
36216
+ });
36217
+ var appointmentSetupWeeklyWindowDraftSchema = z65.object({
36218
+ weekday: z65.number().int().min(0).max(6),
36219
+ startTime: z65.string(),
36220
+ endTime: z65.string()
36221
+ });
36222
+ var appointmentSetupStartTimePolicyDraftSchema = z65.discriminatedUnion("kind", [
36223
+ z65.object({ kind: z65.literal("automatic_spacing") }),
36224
+ z65.object({
36225
+ kind: z65.literal("regular_interval"),
36226
+ intervalMinutes: z65.union([
36227
+ z65.literal(10),
36228
+ z65.literal(15),
36229
+ z65.literal(20),
36230
+ z65.literal(30),
36231
+ z65.literal(45),
36232
+ z65.literal(60)
35277
36233
  ])
35278
36234
  })
35279
36235
  ]);
35280
- var appointmentSetupAvailabilityDraftSchema = z64.object({
35281
- kind: z64.literal("weekly_windows"),
36236
+ var appointmentSetupAvailabilityDraftSchema = z65.object({
36237
+ kind: z65.literal("weekly_windows"),
35282
36238
  resourceRef: appointmentSetupRefSchema,
35283
36239
  serviceRef: appointmentSetupRefSchema.nullable(),
35284
- windows: z64.array(appointmentSetupWeeklyWindowDraftSchema),
36240
+ windows: z65.array(appointmentSetupWeeklyWindowDraftSchema),
35285
36241
  startTimePolicy: appointmentSetupStartTimePolicyDraftSchema.optional()
35286
36242
  });
35287
36243
  var APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX = 28 * 24 * 60;
35288
36244
  var APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX = 10 * 365 * 24 * 60;
35289
- var appointmentSetupBookingNoticeSchema = z64.object({
35290
- minLeadMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
35291
- maxBookingNoticeMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
35292
- });
35293
- var applyAppointmentSetupRequestSchema = z64.object({
35294
- services: z64.array(appointmentSetupServiceDraftSchema),
35295
- practitioners: z64.array(appointmentSetupPractitionerDraftSchema),
35296
- availability: z64.array(appointmentSetupAvailabilityDraftSchema),
36245
+ var appointmentSetupBookingNoticeSchema = z65.object({
36246
+ minLeadMinutes: z65.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
36247
+ maxBookingNoticeMinutes: z65.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
36248
+ });
36249
+ var applyAppointmentSetupRequestSchema = z65.object({
36250
+ services: z65.array(appointmentSetupServiceDraftSchema),
36251
+ practitioners: z65.array(appointmentSetupPractitionerDraftSchema),
36252
+ availability: z65.array(appointmentSetupAvailabilityDraftSchema),
35297
36253
  bookingNotice: appointmentSetupBookingNoticeSchema
35298
36254
  });
35299
36255
 
@@ -35326,24 +36282,24 @@ var STAFF_CANCELLATION_CONTEXT_CATEGORIES = [
35326
36282
  ];
35327
36283
 
35328
36284
  // ../api/src/siteBanner.ts
35329
- import { z as z65 } from "zod";
36285
+ import { z as z66 } from "zod";
35330
36286
  var SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
35331
36287
  var SITE_BANNER_TONE_VALUES = ["announcement", "promotion", "notice", "warning"];
35332
36288
  var SITE_BANNER_MAX_TEXT_LENGTH = 320;
35333
36289
  var SITE_BANNER_MAX_PARAGRAPHS = 2;
35334
- var siteBannerScopeSchema = z65.enum(SITE_BANNER_SCOPE_VALUES);
35335
- var siteBannerToneSchema = z65.enum(SITE_BANNER_TONE_VALUES);
35336
- var siteBannerBodySchema = z65.unknown().transform(unwrapRichTextValue);
35337
- var siteBannerCtaSchema = z65.object({
35338
- label: z65.string().trim().min(1),
36290
+ var siteBannerScopeSchema = z66.enum(SITE_BANNER_SCOPE_VALUES);
36291
+ var siteBannerToneSchema = z66.enum(SITE_BANNER_TONE_VALUES);
36292
+ var siteBannerBodySchema = z66.unknown().transform(unwrapRichTextValue);
36293
+ var siteBannerCtaSchema = z66.object({
36294
+ label: z66.string().trim().min(1),
35339
36295
  link: linkPayloadSchema
35340
36296
  });
35341
- var siteBannerSettingsSchema = z65.discriminatedUnion("enabled", [
35342
- z65.object({
35343
- enabled: z65.literal(false)
36297
+ var siteBannerSettingsSchema = z66.discriminatedUnion("enabled", [
36298
+ z66.object({
36299
+ enabled: z66.literal(false)
35344
36300
  }),
35345
- z65.object({
35346
- enabled: z65.literal(true),
36301
+ z66.object({
36302
+ enabled: z66.literal(true),
35347
36303
  scope: siteBannerScopeSchema,
35348
36304
  tone: siteBannerToneSchema,
35349
36305
  body: siteBannerBodySchema,
@@ -35357,7 +36313,7 @@ var siteBannerSettingsInputSchema = siteBannerSettingsSchema.superRefine((value,
35357
36313
  const analysis = analyzeSiteBannerBody(value.body);
35358
36314
  for (const issue of analysis.issues) {
35359
36315
  ctx.addIssue({
35360
- code: z65.ZodIssueCode.custom,
36316
+ code: z66.ZodIssueCode.custom,
35361
36317
  path: ["body"],
35362
36318
  message: siteBannerBodyIssueMessage(issue)
35363
36319
  });
@@ -35545,72 +36501,105 @@ function collectText(node) {
35545
36501
  return (node.content ?? []).map(collectText).join("");
35546
36502
  }
35547
36503
 
36504
+ // ../api/src/navigation/dashboardSiteNav.ts
36505
+ var hiddenDemoSiteNavSurfaceIds = [
36506
+ "site.newsletter"
36507
+ ];
36508
+ var hiddenDemoSiteNavIds = new Set(
36509
+ hiddenDemoSiteNavSurfaceIds
36510
+ );
36511
+ var websiteSurfaceIds = [
36512
+ "site.content",
36513
+ "site.footerBlocks",
36514
+ "site.navigation",
36515
+ "site.media",
36516
+ "site.style",
36517
+ "site.performance"
36518
+ ];
36519
+ var websiteSurfaceIdSet = new Set(
36520
+ websiteSurfaceIds
36521
+ );
36522
+
36523
+ // ../api/src/navigation/dashboardSettingsNav.ts
36524
+ var hiddenDemoSettingsNavSurfaceIds = [
36525
+ "settings.features",
36526
+ "settings.domains",
36527
+ "settings.bookings",
36528
+ "settings.emails",
36529
+ "settings.team",
36530
+ "settings.billing",
36531
+ "settings.developer",
36532
+ "settings.apiKeys",
36533
+ "settings.backup"
36534
+ ];
36535
+ var hiddenDemoSettingsNavIds = new Set(hiddenDemoSettingsNavSurfaceIds);
36536
+
35548
36537
  // ../api/src/aiPlayground.ts
35549
- import { z as z66 } from "zod";
35550
- var Rfc6902PatchOp = z66.discriminatedUnion("op", [
36538
+ import { z as z67 } from "zod";
36539
+ var Rfc6902PatchOp = z67.discriminatedUnion("op", [
35551
36540
  // Standard RFC-6902 operations
35552
- z66.object({
35553
- op: z66.literal("add"),
35554
- path: z66.string(),
35555
- value: z66.unknown()
36541
+ z67.object({
36542
+ op: z67.literal("add"),
36543
+ path: z67.string(),
36544
+ value: z67.unknown()
35556
36545
  }),
35557
- z66.object({
35558
- op: z66.literal("remove"),
35559
- path: z66.string()
36546
+ z67.object({
36547
+ op: z67.literal("remove"),
36548
+ path: z67.string()
35560
36549
  }),
35561
- z66.object({
35562
- op: z66.literal("replace"),
35563
- path: z66.string(),
35564
- value: z66.unknown()
36550
+ z67.object({
36551
+ op: z67.literal("replace"),
36552
+ path: z67.string(),
36553
+ value: z67.unknown()
35565
36554
  }),
35566
- z66.object({
35567
- op: z66.literal("move"),
35568
- from: z66.string(),
35569
- path: z66.string()
36555
+ z67.object({
36556
+ op: z67.literal("move"),
36557
+ from: z67.string(),
36558
+ path: z67.string()
35570
36559
  }),
35571
- z66.object({
35572
- op: z66.literal("copy"),
35573
- from: z66.string(),
35574
- path: z66.string()
36560
+ z67.object({
36561
+ op: z67.literal("copy"),
36562
+ from: z67.string(),
36563
+ path: z67.string()
35575
36564
  }),
35576
36565
  // Block-level operations (Phase 2)
35577
- z66.object({
35578
- op: z66.literal("add_block"),
35579
- blockKind: z66.string(),
35580
- afterBlockId: z66.string().nullable(),
35581
- content: z66.record(z66.string(), z66.unknown()),
35582
- rationale: z66.string()
36566
+ z67.object({
36567
+ op: z67.literal("add_block"),
36568
+ blockKind: z67.string(),
36569
+ afterBlockId: z67.string().nullable(),
36570
+ content: z67.record(z67.string(), z67.unknown()),
36571
+ rationale: z67.string()
35583
36572
  }),
35584
- z66.object({
35585
- op: z66.literal("delete_block"),
35586
- blockId: z66.string(),
35587
- rationale: z66.string()
36573
+ z67.object({
36574
+ op: z67.literal("delete_block"),
36575
+ blockId: z67.string(),
36576
+ rationale: z67.string()
35588
36577
  }),
35589
- z66.object({
35590
- op: z66.literal("reorder_block"),
35591
- blockId: z66.string(),
35592
- afterBlockId: z66.string().nullable(),
35593
- rationale: z66.string()
36578
+ z67.object({
36579
+ op: z67.literal("reorder_block"),
36580
+ blockId: z67.string(),
36581
+ afterBlockId: z67.string().nullable(),
36582
+ rationale: z67.string()
35594
36583
  })
35595
36584
  ]);
35596
- var PlaygroundProposeRequest = z66.object({
35597
- request: z66.string().min(1).max(2e3)
36585
+ var PlaygroundProposeRequest = z67.object({
36586
+ request: z67.string().min(1).max(2e3)
35598
36587
  });
35599
- var MultiPagePatchEnvelope = z66.object({
35600
- pageId: z66.string(),
35601
- blockId: z66.string().optional(),
36588
+ var MultiPagePatchEnvelope = z67.object({
36589
+ pageId: z67.string(),
36590
+ blockId: z67.string().optional(),
35602
36591
  // Not present for page-level ops
35603
- blockKind: z66.string().optional(),
35604
- blockPurpose: z66.string().optional().nullable(),
35605
- ops: z66.array(Rfc6902PatchOp),
35606
- rationale: z66.string(),
35607
- currentContent: z66.record(z66.string(), z66.unknown()).optional()
36592
+ blockKind: z67.string().optional(),
36593
+ blockPurpose: z67.string().optional().nullable(),
36594
+ ops: z67.array(Rfc6902PatchOp),
36595
+ rationale: z67.string(),
36596
+ currentContent: z67.record(z67.string(), z67.unknown()).optional()
35608
36597
  });
35609
- var MultiPageUpdateResponse = z66.object({
35610
- patches: z66.array(MultiPagePatchEnvelope),
35611
- assistantMessage: z66.string(),
35612
- pagesModified: z66.number(),
35613
- toolCallsUsed: z66.number()
36598
+ var MultiPageUpdateResponse = z67.object({
36599
+ patches: z67.array(MultiPagePatchEnvelope),
36600
+ assistantMessage: z67.string(),
36601
+ pagesModified: z67.number(),
36602
+ toolCallsUsed: z67.number()
35614
36603
  });
35615
36604
 
35616
36605
  // src/data/prefetchBlockData.ts
@@ -36239,12 +37228,25 @@ function isPageContent(result) {
36239
37228
  function isEntryContent(result) {
36240
37229
  return result.type === "entry";
36241
37230
  }
37231
+ function isContentLoadNotFoundError(error) {
37232
+ if (typeof error !== "object" || error === null || !("status" in error)) {
37233
+ return false;
37234
+ }
37235
+ return Reflect.get(error, "status") === 404;
37236
+ }
36242
37237
  async function loadContent(params) {
36243
37238
  const { client, siteId, path, preview = false, forceSite } = params;
36244
- const [site, contentResponse] = await Promise.all([
37239
+ const [siteResult, contentResult] = await Promise.allSettled([
36245
37240
  client.getSite({ id: siteId, ...forceSite ? { force: true } : {} }),
36246
37241
  client.getPage({ siteId, path, preview })
36247
37242
  ]);
37243
+ if (siteResult.status === "rejected" || contentResult.status === "rejected") {
37244
+ const failures = [siteResult, contentResult].filter((result) => result.status === "rejected").map((result) => result.reason);
37245
+ const upstreamFailure = failures.find((error) => !isContentLoadNotFoundError(error));
37246
+ throw upstreamFailure ?? failures[0];
37247
+ }
37248
+ const site = siteResult.value;
37249
+ const contentResponse = contentResult.value;
36248
37250
  const customBlocks = resolveSiteCustomBlocks(site);
36249
37251
  const mediaAssets = Array.isArray(contentResponse.mediaAssets) && contentResponse.mediaAssets.length > 0 ? contentResponse.mediaAssets : void 0;
36250
37252
  if (isEntryResponse(contentResponse)) {