@riverbankcms/sdk 0.77.0 → 0.78.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +69 -0
  2. package/dist/{PreviewEditorSidebar-XSX7QKHQ.mjs → PreviewEditorSidebar-RIKFQ72L.mjs} +4916 -4847
  3. package/dist/{PreviewEditorUI-YZNEZ3QD.mjs → PreviewEditorUI-XO7TUWKK.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-LAGYMPNF.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +194 -184
  6. package/dist/_dts/api/src/accessAdmin.d.ts +5 -0
  7. package/dist/_dts/api/src/billing.d.ts +3 -26
  8. package/dist/_dts/api/src/bookingVerticals.d.ts +4 -0
  9. package/dist/_dts/api/src/content-editor.d.ts +1 -0
  10. package/dist/_dts/api/src/demoDashboardMutationSurfaces.d.ts +46 -0
  11. package/dist/_dts/api/src/endpoints.d.ts +8 -0
  12. package/dist/_dts/api/src/index.d.ts +14 -2
  13. package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +87 -0
  14. package/dist/_dts/api/src/navigation/dashboardDemoNav.d.ts +5 -0
  15. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +45 -0
  16. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +42 -0
  17. package/dist/_dts/api/src/navigation/dashboardTeamMemberNav.d.ts +24 -0
  18. package/dist/_dts/api/src/navigation/linkUrlType.d.ts +3 -0
  19. package/dist/_dts/api/src/navigation.d.ts +12 -0
  20. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +55 -26
  21. package/dist/_dts/api/src/staffAccess.d.ts +79 -0
  22. package/dist/_dts/api/src/types.d.ts +3 -1
  23. package/dist/_dts/api/src/workflows/automaticWorkflowTriggers.d.ts +21 -0
  24. package/dist/_dts/blocks/src/client/site-chrome.d.ts +4 -1
  25. package/dist/_dts/blocks/src/customBlockRegistry.d.ts +20 -1
  26. package/dist/_dts/blocks/src/index.d.ts +3 -2
  27. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  28. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  29. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  30. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  32. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +2 -2
  33. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +294 -289
  34. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  35. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  36. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +21 -21
  37. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  38. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  39. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  40. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +2 -2
  41. package/dist/_dts/blocks/src/system/data/index.d.ts +5 -3
  42. package/dist/_dts/blocks/src/system/data/previewResolvedDataState.d.ts +45 -0
  43. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +2 -1
  44. package/dist/_dts/blocks/src/system/fragments/library/faqAccordion.d.ts +5 -0
  45. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +5 -0
  46. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +29 -29
  47. package/dist/_dts/blocks/src/system/node/fragments/headingDecoration.d.ts +10 -0
  48. package/dist/_dts/blocks/src/system/node/fragments/index.d.ts +1 -0
  49. package/dist/_dts/blocks/src/system/node/fragments/styledSection.d.ts +9 -0
  50. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +3 -2
  51. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +8 -0
  52. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  53. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +43 -8
  54. package/dist/_dts/blocks/src/system/runtime/components/multi-step/runtimeFormValidation.d.ts +28 -0
  55. package/dist/_dts/blocks/src/system/runtime/header/shared.d.ts +8 -7
  56. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventCompactRow.d.ts +1 -4
  57. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +7 -0
  58. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.client.d.ts +2 -8
  59. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.server.d.ts +2 -9
  60. package/dist/_dts/blocks/src/system/runtime/nodes/shop-cart-discount-ui.d.ts +5 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout-form.d.ts +76 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout.state.d.ts +1 -4
  63. package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce-store.d.ts +2 -0
  64. package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce.shared.d.ts +1 -0
  65. package/dist/_dts/blocks/src/system/runtime/nodes/shop-discount-apply.state.d.ts +52 -0
  66. package/dist/_dts/blocks/src/system/runtime/nodes/shop.state.d.ts +2 -4
  67. package/dist/_dts/blocks/src/system/runtime/nodes/useDiscountApply.d.ts +21 -0
  68. package/dist/_dts/blocks/src/system/runtime/shared/components/DiscountCodeDisclosure.d.ts +54 -0
  69. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -0
  70. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  71. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +4 -4
  72. package/dist/_dts/blocks/src/system/transforms/registry/ui.d.ts +1 -1
  73. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +1 -1
  74. package/dist/_dts/content-editor/src/contentTypeEditorContentState.d.ts +26 -0
  75. package/dist/_dts/content-editor/src/definitions/factory.d.ts +75 -0
  76. package/dist/_dts/content-editor/src/entryWorkflows.d.ts +2 -0
  77. package/dist/_dts/content-editor/src/footerBlocksEditorState.d.ts +76 -0
  78. package/dist/_dts/content-editor/src/index.d.ts +5 -0
  79. package/dist/_dts/content-editor/src/pageWorkflowContent.d.ts +29 -0
  80. package/dist/_dts/content-model/src/content-types/schema.d.ts +3 -3
  81. package/dist/_dts/content-model/src/index.d.ts +1 -0
  82. package/dist/_dts/content-model/src/routeTemplate.d.ts +4 -0
  83. package/dist/_dts/content-model/src/templates/editorState.d.ts +25 -0
  84. package/dist/_dts/core/src/csv-cells.d.ts +10 -0
  85. package/dist/_dts/core/src/csv-date-filter.d.ts +27 -0
  86. package/dist/_dts/core/src/csv-escape.d.ts +1 -0
  87. package/dist/_dts/core/src/csv-filename.d.ts +18 -0
  88. package/dist/_dts/core/src/csv-render.d.ts +4 -0
  89. package/dist/_dts/core/src/csv-types.d.ts +116 -0
  90. package/dist/_dts/core/src/currency-format.d.ts +4 -0
  91. package/dist/_dts/core/src/demo-capability-policy.d.ts +29 -0
  92. package/dist/_dts/core/src/demo-claim-access.d.ts +14 -0
  93. package/dist/_dts/core/src/demo-lifecycle-status.d.ts +11 -0
  94. package/dist/_dts/core/src/demo-runtime.d.ts +47 -0
  95. package/dist/_dts/core/src/duration.d.ts +14 -0
  96. package/dist/_dts/core/src/email-format.d.ts +10 -0
  97. package/dist/_dts/core/src/field-errors.d.ts +1 -0
  98. package/dist/_dts/core/src/form-submission-preview.d.ts +24 -0
  99. package/dist/_dts/core/src/index.d.ts +20 -0
  100. package/dist/_dts/core/src/number-input.d.ts +22 -0
  101. package/dist/_dts/core/src/public-url-validation.d.ts +12 -0
  102. package/dist/_dts/core/src/slug.d.ts +39 -0
  103. package/dist/_dts/core/src/string.d.ts +19 -0
  104. package/dist/_dts/core/src/uuid.d.ts +6 -0
  105. package/dist/_dts/db/src/schemas/forms.d.ts +50 -50
  106. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +34 -0
  107. package/dist/_dts/media-core/src/bulkDeletePlanning.d.ts +24 -0
  108. package/dist/_dts/media-core/src/canonicalCropReview.d.ts +66 -0
  109. package/dist/_dts/media-core/src/classifyAllPlanning.d.ts +48 -0
  110. package/dist/_dts/media-core/src/filename.d.ts +1 -0
  111. package/dist/_dts/media-core/src/index.d.ts +10 -0
  112. package/dist/_dts/media-core/src/mediaAssetUsageStatus.d.ts +47 -0
  113. package/dist/_dts/media-core/src/mediaSettingsState.d.ts +3 -0
  114. package/dist/_dts/media-core/src/portableMediaReferences.d.ts +38 -0
  115. package/dist/_dts/media-core/src/uploadVerificationContract.d.ts +28 -0
  116. package/dist/_dts/media-core/src/videoAssetRepair.d.ts +38 -0
  117. package/dist/_dts/media-editor/src/mediaEditorDebug.d.ts +1 -0
  118. package/dist/_dts/path-utils/src/index.d.ts +8 -0
  119. package/dist/_dts/path-utils/src/redirectPaths.d.ts +26 -0
  120. package/dist/_dts/path-utils/src/safeAppPath.d.ts +26 -0
  121. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +2 -1
  122. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -0
  123. package/dist/_dts/preview-next/src/client/preview/previewDocumentFrame.d.ts +31 -0
  124. package/dist/_dts/sdk/src/client/error.d.ts +3 -0
  125. package/dist/_dts/sdk/src/client/index.d.ts +2 -2
  126. package/dist/_dts/sdk/src/client/types.d.ts +37 -19
  127. package/dist/_dts/sdk/src/contracts/theme.d.ts +1 -1
  128. package/dist/_dts/sdk/src/index.d.ts +2 -2
  129. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +16 -16
  130. package/dist/_dts/sdk/src/next/content-load-failure.d.ts +51 -0
  131. package/dist/_dts/sdk/src/next/index.d.ts +2 -1
  132. package/dist/_dts/sdk/src/next/types.d.ts +19 -0
  133. package/dist/_dts/sdk/src/portal/redirects.d.ts +1 -1
  134. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +2 -2
  135. package/dist/_dts/sdk/src/routing/index.d.ts +3 -2
  136. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +71 -6
  137. package/dist/_dts/sdk/src/version.d.ts +1 -1
  138. package/dist/_dts/site-commands/src/commands.d.ts +12 -12
  139. package/dist/_dts/site-commands/src/index.d.ts +1 -0
  140. package/dist/_dts/site-commands/src/pagePaths.d.ts +6 -0
  141. package/dist/_dts/theme-core/src/accordions/siteStyleDefaults.d.ts +26 -0
  142. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -0
  143. package/dist/_dts/theme-core/src/blocks/vars/index.d.ts +1 -0
  144. package/dist/_dts/theme-core/src/fonts/index.d.ts +1 -0
  145. package/dist/_dts/theme-core/src/fonts/uploadFormat.d.ts +44 -0
  146. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  147. package/dist/_dts/theme-core/src/index.d.ts +3 -1
  148. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +63 -51
  149. package/dist/_dts/theme-core/src/navigation/generateNavLinkCSS.d.ts +6 -1
  150. package/dist/_dts/theme-core/src/navigation/types.d.ts +12 -0
  151. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +3 -3
  152. package/dist/_dts/theme-core/src/runtime/themeCssVarNames.d.ts +7 -0
  153. package/dist/_dts/theme-core/src/schema.d.ts +90 -48
  154. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +214 -34
  155. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +5 -2
  156. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +214 -34
  157. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +25 -1
  158. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +35 -7
  159. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -4
  160. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +96 -34
  161. package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +4 -2
  162. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +9 -1
  163. package/dist/_dts/theme-core/src/site-styles/types.d.ts +27 -2
  164. package/dist/_dts/theme-core/src/siteChrome.d.ts +17 -34
  165. package/dist/_dts/theme-core/src/siteChromeOverlayClearance.d.ts +22 -0
  166. package/dist/_dts/theme-core/src/siteChromePlacement.d.ts +22 -0
  167. package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +32 -0
  168. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -2
  169. package/dist/{chunk-EAWHBECW.mjs → chunk-F7RTCZYN.mjs} +229 -50
  170. package/dist/{chunk-GSQX43EZ.mjs → chunk-NIDXI46P.mjs} +22 -41
  171. package/dist/{chunk-WLQBJN2Z.mjs → chunk-OECWLDHN.mjs} +4538 -1911
  172. package/dist/{chunk-VX7B5VAC.mjs → chunk-SVMMM2NA.mjs} +8 -0
  173. package/dist/{chunk-6SMUFTXD.mjs → chunk-SXOLGNMX.mjs} +1 -1
  174. package/dist/{chunk-ANKDYZ2E.mjs → chunk-TXDES5P2.mjs} +2 -2
  175. package/dist/cli/index.mjs +2036 -594
  176. package/dist/client/{accordion-RZMQSYLR.mjs → accordion-EVDEOUPR.mjs} +2 -2
  177. package/dist/client/{bookingForm-NF4ASVNV.mjs → bookingForm-DIHBLC64.mjs} +27 -30
  178. package/dist/client/bookings.mjs +3707 -259
  179. package/dist/client/{carousel-LDX47ZIK.mjs → carousel-FEBQHIWI.mjs} +3 -4
  180. package/dist/client/{cart-RGXDS5F4.mjs → cart-7CKSXAE4.mjs} +8 -8
  181. package/dist/client/{checkout-P7WWSNNY.mjs → checkout-WKYCANLV.mjs} +8 -8
  182. package/dist/client/{chunk-JNC7CGHX.mjs → chunk-2SAVKN2M.mjs} +2 -2
  183. package/dist/client/{chunk-TQ5MSPDX.mjs → chunk-36WJCERQ.mjs} +1 -1
  184. package/dist/client/{chunk-R56FQ3RR.mjs → chunk-65F47D7Y.mjs} +280 -71
  185. package/dist/client/{chunk-L3DNHIJX.mjs → chunk-GUK2FPXQ.mjs} +23 -45
  186. package/dist/client/{chunk-PMAIXMAB.mjs → chunk-IVNCUVAV.mjs} +26 -21
  187. package/dist/client/{chunk-II7O4XN3.mjs → chunk-OFMSCGNY.mjs} +2 -2
  188. package/dist/client/chunk-PD6NBCEY.mjs +66 -0
  189. package/dist/client/{chunk-GMVTOKYG.mjs → chunk-RV6FX7UH.mjs} +510 -64
  190. package/dist/client/{chunk-E2TDNXCL.mjs → chunk-RZDWX7QW.mjs} +2 -1
  191. package/dist/client/{chunk-M3L3KYYR.mjs → chunk-UDNSI5PY.mjs} +12 -0
  192. package/dist/client/{chunk-JEZECJ3W.mjs → chunk-VPPMNXCF.mjs} +129 -3
  193. package/dist/client/{chunk-UFSWADAO.mjs → chunk-YDSEG6GZ.mjs} +5 -66
  194. package/dist/client/client.mjs +8983 -6152
  195. package/dist/client/{courseRegistration-7F65K5ZR.mjs → courseRegistration-5QF2PHKM.mjs} +14 -11
  196. package/dist/client/{eventCalendar-GLSC5KTL.mjs → eventCalendar-4ZOSETDU.mjs} +9 -9
  197. package/dist/client/{eventCombined-ZHK4WKUR.mjs → eventCombined-WQGU7JUX.mjs} +9 -9
  198. package/dist/client/{eventDetails-E3PJYBIN.mjs → eventDetails-AYWVUJ5Y.mjs} +9 -9
  199. package/dist/client/{eventListing-EMS3WC3E.mjs → eventListing-NT7C6UT5.mjs} +9 -9
  200. package/dist/client/{eventRegistration-NZOTVNPI.mjs → eventRegistration-OH24F4ZJ.mjs} +9 -9
  201. package/dist/client/{form-ETFZFATW.mjs → form-7L42SRBB.mjs} +6 -6
  202. package/dist/client/{headerSection-4LBP7ULT.mjs → headerSection-OZRZNZ52.mjs} +3 -3
  203. package/dist/client/hooks.mjs +1388 -427
  204. package/dist/client/{locationMap-5M655YSJ.mjs → locationMap-ZBXRPQ7C.mjs} +2 -2
  205. package/dist/client/{newsletterForm-QOUYW44O.mjs → newsletterForm-SNAGFF2I.mjs} +3 -3
  206. package/dist/client/{productDetail-O4DOCWQG.mjs → productDetail-I46BOFGV.mjs} +8 -8
  207. package/dist/client/{productList-A5RO5WIS.mjs → productList-BOYHTYI6.mjs} +8 -8
  208. package/dist/client/rendering/client.mjs +7090 -2645
  209. package/dist/client/rendering/islands.mjs +19 -19
  210. package/dist/client/rendering.mjs +7395 -4767
  211. package/dist/client/{shop-L4MZH4I2.mjs → shop-XTXPZTKR.mjs} +8 -8
  212. package/dist/preview-next/before-render.mjs +8 -0
  213. package/dist/preview-next/client/runtime.mjs +5 -5
  214. package/dist/preview-next/editor-chrome.css +10 -0
  215. package/dist/preview-next/middleware.mjs +8 -0
  216. package/dist/{sdk-runtime-Q6MTR4KL.mjs → sdk-runtime-ZJLKC6DR.mjs} +6 -6
  217. package/dist/server/components.mjs +4175 -2480
  218. package/dist/server/config-validation.mjs +1619 -658
  219. package/dist/server/config.mjs +1619 -658
  220. package/dist/server/data.mjs +1388 -427
  221. package/dist/server/index.mjs +488 -246
  222. package/dist/server/next.mjs +5607 -3354
  223. package/dist/server/page-converter.mjs +912 -259
  224. package/dist/server/prebuild.mjs +1 -1
  225. package/dist/server/rendering/server.mjs +4176 -2481
  226. package/dist/server/rendering.mjs +4194 -2486
  227. package/dist/server/routing.mjs +2078 -639
  228. package/dist/server/server.mjs +1886 -685
  229. package/dist/server/theme-bridge.mjs +4441 -1300
  230. package/dist/server/theme.mjs +89 -12
  231. package/dist/styles/index.css +1576 -1083
  232. package/package.json +2 -1
  233. package/dist/SdkPreviewModeRuntime-5FS5E6BI.mjs +0 -8
  234. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/DiscountCodeSection.d.ts +0 -7
  235. package/dist/_dts/preview-next/src/client/widgets/PreviewMediaField.d.ts +0 -4
  236. package/dist/client/chunk-OJPZEZU2.mjs +0 -31
  237. package/dist/client/chunk-RTZ3JKKX.mjs +0 -178
@@ -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.0";
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
  }),
@@ -9442,25 +9776,81 @@ var blockAppearancePresets = [
9442
9776
  }
9443
9777
  ],
9444
9778
  design: {
9445
- sectionSurface: "hero-image",
9779
+ sectionSurface: "hero-image",
9780
+ contentFrame: plainFrame,
9781
+ itemSurface: "none",
9782
+ transitionAfter: "soft-fade-short",
9783
+ emphasis: "high",
9784
+ sectionHeight: "immersive",
9785
+ heroComposition: "center",
9786
+ heroTypographyScale: "display",
9787
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
9788
+ imageSurfaceMotion: "fixed-frame",
9789
+ eyebrowTreatment: "accent-pill-bounce"
9790
+ }
9791
+ }),
9792
+ defineBlockAppearancePreset({
9793
+ kind: "block-design",
9794
+ id: "hero-brand-depth-expressive",
9795
+ target: "hero",
9796
+ label: "Expressive brand-depth hero",
9797
+ blockKinds: ["block.hero"],
9798
+ constraints: {
9799
+ layoutFamilies: ["centered", "compact"]
9800
+ },
9801
+ design: {
9802
+ sectionSurface: "brand-depth-band",
9803
+ contentFrame: plainFrame,
9804
+ itemSurface: "none",
9805
+ transitionAfter: "soft-fade-short",
9806
+ emphasis: "high",
9807
+ heroComposition: "center",
9808
+ heroTypographyScale: "editorial",
9809
+ eyebrowTreatment: "accent-pill-bounce"
9810
+ }
9811
+ }),
9812
+ defineBlockAppearancePreset({
9813
+ kind: "block-design",
9814
+ id: "hero-contained-intro",
9815
+ target: "hero",
9816
+ label: "Contained intro hero",
9817
+ blockKinds: ["block.hero"],
9818
+ design: {
9819
+ sectionSurface: "muted-band",
9820
+ contentFrame: panelFrame("inset"),
9821
+ itemSurface: "none",
9822
+ transitionAfter: "none",
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",
9446
9839
  contentFrame: plainFrame,
9447
9840
  itemSurface: "none",
9448
9841
  transitionAfter: "soft-fade-short",
9449
9842
  emphasis: "high",
9450
- sectionHeight: "immersive",
9451
- imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
9452
- imageSurfaceMotion: "fixed-frame",
9453
- eyebrowTreatment: "accent-pill-bounce"
9843
+ heroTypographyScale: "editorial"
9454
9844
  }
9455
9845
  }),
9456
9846
  defineBlockAppearancePreset({
9457
9847
  kind: "block-design",
9458
- id: "hero-brand-depth-expressive",
9848
+ id: "hero-split-brand",
9459
9849
  target: "hero",
9460
- label: "Expressive brand-depth hero",
9850
+ label: "Brand split hero",
9461
9851
  blockKinds: ["block.hero"],
9462
9852
  constraints: {
9463
- layoutFamilies: ["centered", "compact"]
9853
+ layoutFamilies: ["split"]
9464
9854
  },
9465
9855
  design: {
9466
9856
  sectionSurface: "brand-depth-band",
@@ -9468,21 +9858,44 @@ var blockAppearancePresets = [
9468
9858
  itemSurface: "none",
9469
9859
  transitionAfter: "soft-fade-short",
9470
9860
  emphasis: "high",
9861
+ heroTypographyScale: "display",
9471
9862
  eyebrowTreatment: "accent-pill-bounce"
9472
9863
  }
9473
9864
  }),
9474
9865
  defineBlockAppearancePreset({
9475
9866
  kind: "block-design",
9476
- id: "hero-contained-intro",
9867
+ id: "hero-split-soft-panel",
9477
9868
  target: "hero",
9478
- label: "Contained intro hero",
9869
+ label: "Soft panel split hero",
9479
9870
  blockKinds: ["block.hero"],
9871
+ constraints: {
9872
+ layoutFamilies: ["split"]
9873
+ },
9480
9874
  design: {
9481
9875
  sectionSurface: "muted-band",
9482
- contentFrame: panelFrame("inset"),
9876
+ contentFrame: panelFrame("raised"),
9483
9877
  itemSurface: "none",
9484
- transitionAfter: "none",
9485
- emphasis: "high"
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 */
@@ -11636,8 +12049,19 @@ var headingTypographyStyleSchema = typographyStyleSchema.extend({
11636
12049
  colorToken: themeColorTokenSchema.nullable().optional()
11637
12050
  });
11638
12051
  var proseLinkUnderlineStyleSchema = z21.enum(["solid", "dotted", "dashed"]);
11639
- var proseLinkUnderlineThicknessSchema = z21.enum(["auto", "fromFont", "thin", "medium", "thick"]);
11640
- var proseLinkUnderlineOffsetSchema = z21.enum(["auto", "tight", "normal", "loose"]);
12052
+ var proseLinkUnderlineThicknessSchema = z21.enum([
12053
+ "auto",
12054
+ "fromFont",
12055
+ "thin",
12056
+ "medium",
12057
+ "thick"
12058
+ ]);
12059
+ var proseLinkUnderlineOffsetSchema = z21.enum([
12060
+ "auto",
12061
+ "tight",
12062
+ "normal",
12063
+ "loose"
12064
+ ]);
11641
12065
  var proseLinkStyleSchema = z21.object({
11642
12066
  colorToken: themeColorTokenSchema.optional(),
11643
12067
  hoverColorToken: themeColorTokenSchema.optional(),
@@ -11648,7 +12072,14 @@ var proseLinkStyleSchema = z21.object({
11648
12072
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
11649
12073
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
11650
12074
  });
11651
- var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
12075
+ var semanticSpacingSchema = z21.enum([
12076
+ "none",
12077
+ "compact",
12078
+ "cozy",
12079
+ "medium",
12080
+ "comfortable",
12081
+ "spacious"
12082
+ ]);
11652
12083
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
11653
12084
  var boxBackgroundOverlaySchema = z21.object({
11654
12085
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -11694,6 +12125,7 @@ var sectionStylesOverrideSchema = z21.object({
11694
12125
  spacing: semanticSpacingSchema.nullable().optional(),
11695
12126
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
11696
12127
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
12128
+ eventListTreatment: z21.enum(eventListTreatmentValues).nullable().optional(),
11697
12129
  eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
11698
12130
  headingDecoration: headingDecorationSchema.nullable().optional(),
11699
12131
  // Author-level override consumed by later block/editor rendering phases.
@@ -11792,9 +12224,17 @@ var inputStyle = z21.object({
11792
12224
  focus: z21.enum(["glow", "ring", "underline"]),
11793
12225
  label: z21.enum(["inside", "above"])
11794
12226
  });
11795
- var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
12227
+ var headerVariant = z21.enum(["classic", "centered", "transparent", "floating"]);
11796
12228
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
11797
- var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
12229
+ var headerNavStyle = z21.enum([
12230
+ "minimal",
12231
+ "underline",
12232
+ "underline-grow",
12233
+ "capsule",
12234
+ "scale",
12235
+ "frosted",
12236
+ "solid"
12237
+ ]);
11798
12238
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
11799
12239
  var headerMaxWidth = z21.enum(["container", "full"]);
11800
12240
  var headerContainerSchema = z21.object({
@@ -11842,8 +12282,22 @@ var dropdownStyleSchema = z21.object({
11842
12282
  textSize: z21.enum(["xs", "sm", "base", "lg"]).optional()
11843
12283
  // optional = no override (browser default)
11844
12284
  }).optional();
11845
- var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
11846
- var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
12285
+ var headerCtaGapSchema = z21.enum([
12286
+ "none",
12287
+ "tight",
12288
+ "compact",
12289
+ "default",
12290
+ "relaxed",
12291
+ "spacious"
12292
+ ]);
12293
+ var headerCtaTreatmentSchema = z21.enum([
12294
+ "default",
12295
+ "primary",
12296
+ "secondary",
12297
+ "inverted",
12298
+ "outline",
12299
+ "ghost"
12300
+ ]);
11847
12301
  var navContainerSchema = z21.object({
11848
12302
  type: z21.enum(["none", "pill", "glass"]).default("none"),
11849
12303
  tint: z21.string().nullable().optional(),
@@ -11898,7 +12352,14 @@ var footerMaxWidth = z21.enum(["container", "full"]);
11898
12352
  var footerMode = z21.enum(["default", "blocks", "default+blocks", "none"]);
11899
12353
  var footerNavLayoutMode = z21.enum(["stack", "inline", "inline-wrap"]);
11900
12354
  var footerNavLayoutAlign = z21.enum(["start", "center", "end", "space-between"]);
11901
- var footerSpacing = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
12355
+ var footerSpacing = z21.enum([
12356
+ "none",
12357
+ "tight",
12358
+ "compact",
12359
+ "default",
12360
+ "relaxed",
12361
+ "spacious"
12362
+ ]);
11902
12363
  var footerLogoPlacement = z21.enum(["left", "right", "above", "below"]);
11903
12364
  var footerLogoSize = z21.enum(["sm", "md", "lg", "xl"]);
11904
12365
  var footerLogoMaxHeight = z21.enum(["sm", "md", "lg", "xl"]);
@@ -11963,7 +12424,12 @@ var footerSchema = z21.object({
11963
12424
  logo: footerLogoSchema.optional(),
11964
12425
  bottomBar: footerBottomBarSchema.optional()
11965
12426
  });
11966
- var containerPaddingPresetSchema = z21.enum(["tight", "compact", "default", "relaxed"]);
12427
+ var containerPaddingPresetSchema = z21.enum([
12428
+ "tight",
12429
+ "compact",
12430
+ "default",
12431
+ "relaxed"
12432
+ ]);
11967
12433
  var layoutSchema = z21.object({
11968
12434
  containerPadding: z21.object({
11969
12435
  mobile: containerPaddingPresetSchema.optional(),
@@ -11971,8 +12437,24 @@ var layoutSchema = z21.object({
11971
12437
  desktop: containerPaddingPresetSchema.optional()
11972
12438
  }).optional()
11973
12439
  }).optional();
11974
- var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
11975
- var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
12440
+ var heroTypographySizeSchema = z21.enum([
12441
+ "sm",
12442
+ "base",
12443
+ "lg",
12444
+ "xl",
12445
+ "2xl",
12446
+ "3xl",
12447
+ "4xl",
12448
+ "5xl",
12449
+ "6xl",
12450
+ "editorial"
12451
+ ]);
12452
+ var heroTypographyLineHeightSchema = z21.enum([
12453
+ "tight",
12454
+ "snug",
12455
+ "normal",
12456
+ "relaxed"
12457
+ ]);
11976
12458
  var heroResponsiveTypographySchema = z21.object({
11977
12459
  headlineSize: heroTypographySizeSchema.optional(),
11978
12460
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
@@ -12477,6 +12959,34 @@ var paletteVariantsById = new Map(
12477
12959
  paletteVariants.map((v) => [v.id, v])
12478
12960
  );
12479
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
+
12480
12990
  // ../theme-core/src/site-styles/headerLooks.ts
12481
12991
  function asHeaderLookId(value) {
12482
12992
  return value;
@@ -12526,23 +13036,13 @@ var headerLayoutCatalog = [
12526
13036
  maxRecommendedNavItems: 5,
12527
13037
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
12528
13038
  },
12529
- {
12530
- id: asHeaderLayoutId("editorial"),
12531
- label: "Editorial",
12532
- description: "A composed, magazine-like stacked header treatment.",
12533
- structure: "editorial-stack",
12534
- variant: "editorial",
12535
- defaultPositioning: "static",
12536
- shrinkOnScroll: false,
12537
- maxRecommendedNavItems: 6
12538
- },
12539
13039
  {
12540
13040
  id: asHeaderLayoutId("floating"),
12541
13041
  label: "Floating",
12542
13042
  description: "Detached header chrome that sits over the opening section.",
12543
13043
  structure: "floating-shell",
12544
13044
  variant: "floating",
12545
- defaultPositioning: "fixed",
13045
+ defaultPositioning: "sticky",
12546
13046
  shrinkOnScroll: true,
12547
13047
  maxRecommendedNavItems: 5,
12548
13048
  allowedLogoShapes: ["none", "text-only", "horizontal"]
@@ -12556,17 +13056,23 @@ var headerStyleCatalog = [
12556
13056
  id: asHeaderStyleId("minimal"),
12557
13057
  label: "Minimal",
12558
13058
  description: "Quiet surface with simple color-change navigation.",
12559
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
13059
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12560
13060
  navInteraction: "color-change",
12561
- surface: "neutral"
13061
+ surface: "neutral",
13062
+ defaultDepth: "none",
13063
+ navTypography: "plain",
13064
+ moods: ["calm", "professional", "editorial"]
12562
13065
  },
12563
13066
  {
12564
13067
  id: asHeaderStyleId("fine-line"),
12565
13068
  label: "Fine Line",
12566
13069
  description: "Light surface with a crisp lower rule and underline hover.",
12567
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
13070
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12568
13071
  navInteraction: "underline-grow",
12569
- surface: "bordered"
13072
+ surface: "bordered",
13073
+ defaultDepth: "line",
13074
+ navTypography: "plain",
13075
+ moods: ["calm", "professional", "editorial"]
12570
13076
  },
12571
13077
  {
12572
13078
  id: asHeaderStyleId("soft-bar"),
@@ -12574,7 +13080,10 @@ var headerStyleCatalog = [
12574
13080
  description: "Soft tinted surface with gentle pill hover states.",
12575
13081
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12576
13082
  navInteraction: "pill-background",
12577
- surface: "soft"
13083
+ surface: "soft",
13084
+ defaultDepth: "line",
13085
+ navTypography: "plain",
13086
+ moods: ["calm", "professional"]
12578
13087
  },
12579
13088
  {
12580
13089
  id: asHeaderStyleId("pill-nav"),
@@ -12582,23 +13091,32 @@ var headerStyleCatalog = [
12582
13091
  description: "A calm pill navigation rail over a neutral header.",
12583
13092
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12584
13093
  navInteraction: "pill-background",
12585
- surface: "soft"
13094
+ surface: "soft",
13095
+ defaultDepth: "none",
13096
+ navTypography: "plain",
13097
+ moods: ["calm"]
12586
13098
  },
12587
13099
  {
12588
13100
  id: asHeaderStyleId("brand-bar"),
12589
13101
  label: "Brand Bar",
12590
13102
  description: "Solid brand surface with high-contrast navigation.",
12591
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
13103
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12592
13104
  navInteraction: "color-change",
12593
- surface: "brand-solid"
13105
+ surface: "brand-solid",
13106
+ defaultDepth: "none",
13107
+ navTypography: "brand-caps",
13108
+ moods: ["professional", "expressive", "utility"]
12594
13109
  },
12595
13110
  {
12596
13111
  id: asHeaderStyleId("brand-underline"),
12597
13112
  label: "Brand Underline",
12598
13113
  description: "Brand surface with underline-grow navigation.",
12599
- supportedLayoutIds: supportedLayouts(["classic", "editorial"]),
13114
+ supportedLayoutIds: supportedLayouts(["classic"]),
12600
13115
  navInteraction: "underline-grow",
12601
- surface: "brand-solid"
13116
+ surface: "brand-solid",
13117
+ defaultDepth: "none",
13118
+ navTypography: "brand-caps",
13119
+ moods: ["expressive"]
12602
13120
  },
12603
13121
  {
12604
13122
  id: asHeaderStyleId("brand-pill"),
@@ -12606,41 +13124,54 @@ var headerStyleCatalog = [
12606
13124
  description: "Solid brand surface with rounded active and hover states.",
12607
13125
  supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
12608
13126
  navInteraction: "pill-background",
12609
- surface: "brand-solid"
13127
+ surface: "brand-solid",
13128
+ defaultDepth: "none",
13129
+ navTypography: "brand-caps",
13130
+ moods: ["expressive"]
12610
13131
  },
12611
13132
  {
12612
- id: asHeaderStyleId("editorial-line"),
12613
- label: "Editorial Line",
13133
+ id: asHeaderStyleId("serif-line"),
13134
+ label: "Serif Line",
12614
13135
  description: "Typographic logo treatment with understated underline navigation.",
12615
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
13136
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12616
13137
  navInteraction: "underline-grow",
12617
- surface: "bordered"
13138
+ surface: "bordered",
13139
+ defaultDepth: "line",
13140
+ navTypography: "heading",
13141
+ moods: ["editorial", "calm"]
12618
13142
  },
12619
13143
  {
12620
13144
  id: asHeaderStyleId("flat-tabs"),
12621
13145
  label: "Flat Tabs",
12622
13146
  description: "Flat block hover and active states with a Swiss utility feel.",
12623
- supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
13147
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12624
13148
  navInteraction: "flat-block",
12625
- surface: "bordered"
13149
+ surface: "bordered",
13150
+ defaultDepth: "shadow",
13151
+ navTypography: "quiet-caps",
13152
+ moods: ["professional", "utility", "expressive"]
12626
13153
  },
12627
13154
  {
12628
13155
  id: asHeaderStyleId("glass"),
12629
13156
  label: "Glass",
12630
- description: "Floating translucent chrome with frosted navigation backing.",
13157
+ description: "Translucent chrome with frosted navigation backing.",
12631
13158
  supportedLayoutIds: supportedLayouts(["floating"]),
12632
13159
  navInteraction: "glass-backed",
12633
13160
  surface: "floating",
12634
- requiresFloatingLayout: true
13161
+ defaultDepth: "shadow",
13162
+ navTypography: "plain",
13163
+ moods: ["expressive", "calm"]
12635
13164
  },
12636
13165
  {
12637
13166
  id: asHeaderStyleId("minimal-surface"),
12638
- label: "Minimal Surface",
12639
- description: "Floating chrome with a restrained translucent surface.",
13167
+ label: "Clear Split",
13168
+ description: "Floating logo with transparent navigation and no shared shell.",
12640
13169
  supportedLayoutIds: supportedLayouts(["floating"]),
12641
13170
  navInteraction: "color-change",
12642
13171
  surface: "floating",
12643
- requiresFloatingLayout: true
13172
+ defaultDepth: "none",
13173
+ navTypography: "plain",
13174
+ moods: ["editorial", "calm"]
12644
13175
  },
12645
13176
  {
12646
13177
  id: asHeaderStyleId("soft-shell"),
@@ -12649,7 +13180,31 @@ var headerStyleCatalog = [
12649
13180
  supportedLayoutIds: supportedLayouts(["floating"]),
12650
13181
  navInteraction: "pill-background",
12651
13182
  surface: "floating",
12652
- requiresFloatingLayout: true
13183
+ defaultDepth: "shadow",
13184
+ navTypography: "plain",
13185
+ moods: ["calm", "professional"]
13186
+ },
13187
+ {
13188
+ id: asHeaderStyleId("split-glass"),
13189
+ label: "Split Glass",
13190
+ description: "Logo floats independently while the navigation sits in a glass rail.",
13191
+ supportedLayoutIds: supportedLayouts(["floating"]),
13192
+ navInteraction: "glass-backed",
13193
+ surface: "floating",
13194
+ defaultDepth: "shadow",
13195
+ navTypography: "quiet-caps",
13196
+ moods: ["expressive"]
13197
+ },
13198
+ {
13199
+ id: asHeaderStyleId("split-pill"),
13200
+ label: "Split Pill",
13201
+ description: "Logo floats independently with a soft pill-backed navigation rail.",
13202
+ supportedLayoutIds: supportedLayouts(["floating"]),
13203
+ navInteraction: "pill-background",
13204
+ surface: "floating",
13205
+ defaultDepth: "shadow",
13206
+ navTypography: "heading",
13207
+ moods: ["calm", "editorial"]
12653
13208
  }
12654
13209
  ];
12655
13210
  var headerLayoutsById = new Map(
@@ -12669,7 +13224,7 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
12669
13224
  "brand-bar",
12670
13225
  "brand-underline",
12671
13226
  "brand-pill",
12672
- "editorial-line",
13227
+ "serif-line",
12673
13228
  "flat-tabs"
12674
13229
  ])
12675
13230
  ],
@@ -12682,19 +13237,7 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
12682
13237
  "pill-nav",
12683
13238
  "brand-bar",
12684
13239
  "brand-pill",
12685
- "editorial-line",
12686
- "flat-tabs"
12687
- ])
12688
- ],
12689
- [
12690
- asHeaderLayoutId("editorial"),
12691
- headerStyleRepairChain([
12692
- "minimal",
12693
- "fine-line",
12694
- "soft-bar",
12695
- "brand-bar",
12696
- "brand-underline",
12697
- "editorial-line",
13240
+ "serif-line",
12698
13241
  "flat-tabs"
12699
13242
  ])
12700
13243
  ],
@@ -12703,6 +13246,8 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
12703
13246
  headerStyleRepairChain([
12704
13247
  "glass",
12705
13248
  "minimal-surface",
13249
+ "split-glass",
13250
+ "split-pill",
12706
13251
  "soft-shell",
12707
13252
  "brand-pill"
12708
13253
  ])
@@ -12711,20 +13256,69 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
12711
13256
  function headerStyleRepairChain(values) {
12712
13257
  return values.map(asHeaderStyleId);
12713
13258
  }
12714
- var headerStyleRepairOrder = /* @__PURE__ */ new Map([
12715
- [asHeaderStyleId("brand-bar"), headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])],
12716
- [asHeaderStyleId("brand-underline"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
12717
- [asHeaderStyleId("brand-pill"), headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])],
12718
- [asHeaderStyleId("pill-nav"), headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])],
12719
- [asHeaderStyleId("flat-tabs"), headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])],
12720
- [asHeaderStyleId("editorial-line"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
12721
- [asHeaderStyleId("glass"), headerStyleRepairChain(["glass", "minimal-surface", "minimal"])],
12722
- [asHeaderStyleId("soft-shell"), headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])],
12723
- [asHeaderStyleId("minimal-surface"), headerStyleRepairChain(["minimal-surface", "minimal"])],
12724
- [asHeaderStyleId("fine-line"), headerStyleRepairChain(["fine-line", "minimal"])],
12725
- [asHeaderStyleId("soft-bar"), headerStyleRepairChain(["soft-bar", "minimal"])],
12726
- [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
12727
- ]);
13259
+ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
13260
+ [
13261
+ [
13262
+ asHeaderStyleId("brand-bar"),
13263
+ headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])
13264
+ ],
13265
+ [
13266
+ asHeaderStyleId("brand-underline"),
13267
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
13268
+ ],
13269
+ [
13270
+ asHeaderStyleId("brand-pill"),
13271
+ headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])
13272
+ ],
13273
+ [
13274
+ asHeaderStyleId("pill-nav"),
13275
+ headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])
13276
+ ],
13277
+ [
13278
+ asHeaderStyleId("flat-tabs"),
13279
+ headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])
13280
+ ],
13281
+ [
13282
+ asHeaderStyleId("serif-line"),
13283
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
13284
+ ],
13285
+ [
13286
+ asHeaderStyleId("glass"),
13287
+ headerStyleRepairChain([
13288
+ "glass",
13289
+ "soft-shell",
13290
+ "fine-line",
13291
+ "minimal-surface",
13292
+ "minimal"
13293
+ ])
13294
+ ],
13295
+ [
13296
+ asHeaderStyleId("soft-shell"),
13297
+ headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])
13298
+ ],
13299
+ [
13300
+ asHeaderStyleId("minimal-surface"),
13301
+ headerStyleRepairChain(["minimal-surface", "minimal"])
13302
+ ],
13303
+ [
13304
+ asHeaderStyleId("split-glass"),
13305
+ headerStyleRepairChain(["split-glass", "glass", "minimal-surface"])
13306
+ ],
13307
+ [
13308
+ asHeaderStyleId("split-pill"),
13309
+ headerStyleRepairChain(["split-pill", "soft-shell", "brand-pill"])
13310
+ ],
13311
+ [
13312
+ asHeaderStyleId("fine-line"),
13313
+ headerStyleRepairChain(["fine-line", "minimal"])
13314
+ ],
13315
+ [
13316
+ asHeaderStyleId("soft-bar"),
13317
+ headerStyleRepairChain(["soft-bar", "minimal"])
13318
+ ],
13319
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
13320
+ ]
13321
+ );
12728
13322
  var legacyHeaderLookAliases = [
12729
13323
  {
12730
13324
  lookId: asHeaderLookId("clean-base"),
@@ -12741,10 +13335,10 @@ var legacyHeaderLookAliases = [
12741
13335
  }
12742
13336
  },
12743
13337
  {
12744
- lookId: asHeaderLookId("editorial-line"),
13338
+ lookId: asHeaderLookId("serif-line"),
12745
13339
  selection: {
12746
- layoutId: asHeaderLayoutId("editorial"),
12747
- styleId: asHeaderStyleId("editorial-line")
13340
+ layoutId: asHeaderLayoutId("centered"),
13341
+ styleId: asHeaderStyleId("serif-line")
12748
13342
  }
12749
13343
  },
12750
13344
  {
@@ -12783,9 +13377,7 @@ var legacyHeaderLookAliases = [
12783
13377
  }
12784
13378
  }
12785
13379
  ];
12786
- var legacyHeaderLookAliasesById = new Map(
12787
- legacyHeaderLookAliases.map((alias) => [alias.lookId, alias])
12788
- );
13380
+ var legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
12789
13381
  function getHeaderStyle(id) {
12790
13382
  return headerStylesById.get(id) ?? null;
12791
13383
  }
@@ -12803,10 +13395,29 @@ function resolveLegacyHeaderLookAlias(lookId) {
12803
13395
  return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
12804
13396
  }
12805
13397
  function getCompatibleHeaderStyleIds(layoutId) {
12806
- return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
12807
- const style = getHeaderStyleOrThrow(styleId);
12808
- return isHeaderStyleCompatibleWithLayout(style, layoutId);
12809
- });
13398
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter(
13399
+ (styleId) => {
13400
+ const style = getHeaderStyleOrThrow(styleId);
13401
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
13402
+ }
13403
+ );
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
+ }
12810
13421
  }
12811
13422
  function solidBrandHeader(theme) {
12812
13423
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
@@ -12837,8 +13448,14 @@ function solidBrandHeader(theme) {
12837
13448
  borderRadius: "none",
12838
13449
  effects: {
12839
13450
  hover: [
12840
- { effectId: "text-color-change", options: { hoverColorToken: "secondary" } },
12841
- { effectId: "nav-underline", options: { style: "grow", colorToken: "secondary" } }
13451
+ {
13452
+ effectId: "text-color-change",
13453
+ options: { hoverColorToken: "secondary" }
13454
+ },
13455
+ {
13456
+ effectId: "nav-underline",
13457
+ options: { style: "grow", colorToken: "secondary" }
13458
+ }
12842
13459
  ]
12843
13460
  }
12844
13461
  },
@@ -12894,10 +13511,10 @@ function cleanBaseHeader(theme) {
12894
13511
  ctaGap: "default"
12895
13512
  };
12896
13513
  }
12897
- function editorialLineHeader(theme) {
13514
+ function serifLineHeader(theme) {
12898
13515
  return {
12899
13516
  ...baseHeader(theme),
12900
- variant: "editorial",
13517
+ variant: "centered",
12901
13518
  positioning: "sticky",
12902
13519
  shrinkOnScroll: false,
12903
13520
  background: {
@@ -12951,9 +13568,7 @@ function practicalUtilityHeader(theme) {
12951
13568
  navColor: "text",
12952
13569
  navStyle: "solid",
12953
13570
  navWeight: "semibold",
12954
- shadow: {
12955
- elevation: "sm"
12956
- },
13571
+ shadow: themedHeaderShadow(theme),
12957
13572
  border: {
12958
13573
  style: "solid",
12959
13574
  width: "thin",
@@ -13022,6 +13637,7 @@ function floatingGlassHeader(theme) {
13022
13637
  return {
13023
13638
  ...transparentOverlayHeader(theme),
13024
13639
  variant: "floating",
13640
+ positioning: "sticky",
13025
13641
  navStyle: "frosted",
13026
13642
  navContainer: {
13027
13643
  type: "glass",
@@ -13066,27 +13682,27 @@ var headerLookCatalog = [
13066
13682
  compile: solidBrandHeader
13067
13683
  },
13068
13684
  {
13069
- id: asHeaderLookId("editorial-line"),
13070
- label: "Editorial line",
13071
- visualTreatment: "light-editorial",
13685
+ id: asHeaderLookId("serif-line"),
13686
+ label: "Serif line",
13687
+ visualTreatment: "light-serif",
13072
13688
  layoutBehavior: "sticky",
13073
13689
  configuration: {
13074
- structure: "editorial-stack",
13075
- treatment: "light-editorial",
13690
+ structure: "centered-stack",
13691
+ treatment: "light-serif",
13076
13692
  behavior: "sticky"
13077
13693
  },
13078
13694
  openingRequirement: "none",
13079
13695
  maxRecommendedNavItems: 6,
13080
- compile: editorialLineHeader
13696
+ compile: serifLineHeader
13081
13697
  },
13082
13698
  {
13083
13699
  id: asHeaderLookId("centered-calm"),
13084
13700
  label: "Centered calm",
13085
- visualTreatment: "light-editorial",
13701
+ visualTreatment: "light-serif",
13086
13702
  layoutBehavior: "normal-flow",
13087
13703
  configuration: {
13088
13704
  structure: "centered-stack",
13089
- treatment: "light-editorial",
13705
+ treatment: "light-serif",
13090
13706
  behavior: "normal-flow"
13091
13707
  },
13092
13708
  openingRequirement: "none",
@@ -13537,7 +14153,7 @@ var typographyPresets = [
13537
14153
  heroTypography: {
13538
14154
  headlineSize: "6xl",
13539
14155
  headlineLineHeight: "tight",
13540
- subheadlineSize: "editorial",
14156
+ subheadlineSize: "2xl",
13541
14157
  subheadlineLineHeight: "normal",
13542
14158
  microHeadlineSize: "6xl",
13543
14159
  microHeadlineLineHeight: "tight",
@@ -13555,6 +14171,8 @@ var typographyPresetsById = new Map(
13555
14171
  );
13556
14172
 
13557
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);
13558
14176
  var curatedSiteStyleIdValues = [
13559
14177
  "site-style:calm-studio",
13560
14178
  "site-style:clear-professional",
@@ -13566,7 +14184,7 @@ var curatedSiteStyleIdValues = [
13566
14184
  "site-style:personal-retreat-journal",
13567
14185
  "site-style:tactile-workshop",
13568
14186
  "site-style:modern-wellness",
13569
- "site-style:soft-earth",
14187
+ SOFT_EARTH_SITE_STYLE_ID_VALUE,
13570
14188
  "site-style:bold-launch",
13571
14189
  "site-style:south-west-twerk-school"
13572
14190
  ];
@@ -13632,22 +14250,31 @@ var expressiveUnderlineInputs = {
13632
14250
  }
13633
14251
  };
13634
14252
  function uniqueContentFrameKinds() {
13635
- const kinds = [...new Set(
13636
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
13637
- )];
14253
+ const kinds = [
14254
+ ...new Set(
14255
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
14256
+ )
14257
+ ];
13638
14258
  const firstKind = kinds[0];
13639
14259
  if (!firstKind) {
13640
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
14260
+ throw new Error(
14261
+ "Expected generated design option catalog to expose at least one content frame kind."
14262
+ );
13641
14263
  }
13642
14264
  return [firstKind, ...kinds.slice(1)];
13643
14265
  }
13644
14266
  var generatedContentFrameKinds = uniqueContentFrameKinds();
13645
14267
  function defineCuratedSiteStyle(input) {
13646
14268
  const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
13647
- const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
14269
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(
14270
+ legacyHeaderLookIds,
14271
+ input.tokenRecipes
14272
+ );
13648
14273
  const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
13649
14274
  const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
13650
- if (!typographyPresetChoices.some((choice) => choice.id === defaultTypographyPresetId)) {
14275
+ if (!typographyPresetChoices.some(
14276
+ (choice) => choice.id === defaultTypographyPresetId
14277
+ )) {
13651
14278
  throw new Error(
13652
14279
  `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
13653
14280
  );
@@ -13658,9 +14285,13 @@ function defineCuratedSiteStyle(input) {
13658
14285
  description: input.description,
13659
14286
  generationBrief: input.generationBrief,
13660
14287
  selectionKeywordRules: input.selectionKeywordRules ?? [],
13661
- siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
14288
+ siteCreatorSelection: input.siteCreatorSelection ?? {
14289
+ kind: "explicit_only"
14290
+ },
13662
14291
  template: {
13663
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
14292
+ id: asDesignSystemTemplateId(
14293
+ `template:${input.id.replace("site-style:", "")}`
14294
+ ),
13664
14295
  name: input.name,
13665
14296
  version: 1,
13666
14297
  tokenRecipes: input.tokenRecipes,
@@ -13671,6 +14302,7 @@ function defineCuratedSiteStyle(input) {
13671
14302
  supportedTransitions: generatedDesignOptionCatalog.transitions
13672
14303
  },
13673
14304
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
14305
+ ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
13674
14306
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
13675
14307
  defaultHeaderSelection: input.defaultHeaderSelection ? {
13676
14308
  layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
@@ -13678,13 +14310,17 @@ function defineCuratedSiteStyle(input) {
13678
14310
  } : inferredHeaderCuration.defaultHeaderSelection,
13679
14311
  recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
13680
14312
  recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
13681
- discouragedHeaderSelections: input.discouragedHeaderSelections?.map((selection) => ({
13682
- layoutId: asHeaderLayoutId(selection.layoutId),
13683
- styleId: asHeaderStyleId(selection.styleId)
13684
- })),
14313
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map(
14314
+ (selection) => ({
14315
+ layoutId: asHeaderLayoutId(selection.layoutId),
14316
+ styleId: asHeaderStyleId(selection.styleId)
14317
+ })
14318
+ ),
13685
14319
  recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
13686
14320
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
13687
- recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
14321
+ recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(
14322
+ asFooterLookId
14323
+ ),
13688
14324
  buttonPersonalityChoices: input.buttonPersonalityChoices,
13689
14325
  paletteVariantChoices: input.paletteVariantChoices,
13690
14326
  typographyPresetChoices,
@@ -13703,7 +14339,7 @@ function headerLayoutChoice(id, note) {
13703
14339
  function headerStyleChoice(id, note) {
13704
14340
  return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
13705
14341
  }
13706
- function headerLayoutRecordKey(id) {
14342
+ function unbrandHeaderLayoutId(id) {
13707
14343
  return id;
13708
14344
  }
13709
14345
  function uniqueHeaderLayoutChoices(choices) {
@@ -13725,8 +14361,72 @@ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
13725
14361
  };
13726
14362
  return [first, ...choices.slice(1)];
13727
14363
  }
13728
- function inferHeaderCurationFromLegacyLooks(lookIds) {
13729
- const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter((selection) => Boolean(selection));
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
+ }
14419
+ }
14420
+ function isExpressiveRecipe(recipes) {
14421
+ return recipes.contrast === "maximum" || recipes.shadow === "layered" || recipes.motion === "expressive";
14422
+ }
14423
+ function isSerifTypographyRecipe(recipes) {
14424
+ return recipes.typography === "serif-editorial" || recipes.typography === "classic-serif";
14425
+ }
14426
+ function inferHeaderCurationFromLegacyLooks(lookIds, recipes) {
14427
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
14428
+ (selection) => Boolean(selection)
14429
+ );
13730
14430
  const defaultHeaderSelection = selections[0] ?? {
13731
14431
  layoutId: asHeaderLayoutId("classic"),
13732
14432
  styleId: asHeaderStyleId("minimal")
@@ -13736,9 +14436,13 @@ function inferHeaderCurationFromLegacyLooks(lookIds) {
13736
14436
  );
13737
14437
  const stylesByLayout = {};
13738
14438
  for (const layoutChoice of layoutChoices) {
13739
- const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
13740
- stylesByLayout[headerLayoutRecordKey(layoutChoice.id)] = nonEmptyHeaderStyleChoices(
13741
- styleChoices,
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],
13742
14446
  layoutChoice.id
13743
14447
  );
13744
14448
  }
@@ -13795,7 +14499,11 @@ var curatedSiteStyles = [
13795
14499
  motion: "subtle"
13796
14500
  },
13797
14501
  compositionBudget: quietBudget,
13798
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
14502
+ recommendedHeaderLookIds: [
14503
+ "centered-calm",
14504
+ "minimal-transparent",
14505
+ "clean-base"
14506
+ ],
13799
14507
  buttonPersonalityChoices: [
13800
14508
  buttonChoice("soft-pill"),
13801
14509
  buttonChoice("pebble"),
@@ -13824,7 +14532,11 @@ var curatedSiteStyles = [
13824
14532
  motion: "subtle"
13825
14533
  },
13826
14534
  compositionBudget: balancedBudget,
13827
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
14535
+ recommendedHeaderLookIds: [
14536
+ "practical-utility",
14537
+ "brand-solid",
14538
+ "clean-base"
14539
+ ],
13828
14540
  buttonPersonalityChoices: [
13829
14541
  buttonChoice("confident-chip"),
13830
14542
  buttonChoice("soft-pill"),
@@ -13851,7 +14563,11 @@ var curatedSiteStyles = [
13851
14563
  motion: "subtle"
13852
14564
  },
13853
14565
  compositionBudget: balancedBudget,
13854
- recommendedHeaderLookIds: ["editorial-line", "minimal-transparent", "centered-calm"],
14566
+ recommendedHeaderLookIds: [
14567
+ "serif-line",
14568
+ "minimal-transparent",
14569
+ "centered-calm"
14570
+ ],
13855
14571
  buttonPersonalityChoices: [
13856
14572
  buttonChoice("editorial-link"),
13857
14573
  buttonChoice("soft-pill"),
@@ -13879,7 +14595,11 @@ var curatedSiteStyles = [
13879
14595
  motion: "expressive"
13880
14596
  },
13881
14597
  compositionBudget: balancedBudget,
13882
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
14598
+ recommendedHeaderLookIds: [
14599
+ "brand-solid",
14600
+ "practical-utility",
14601
+ "clean-base"
14602
+ ],
13883
14603
  buttonPersonalityChoices: [
13884
14604
  buttonChoice("pebble"),
13885
14605
  buttonChoice("brushed-wash"),
@@ -13896,7 +14616,10 @@ var curatedSiteStyles = [
13896
14616
  name: "Quiet Luxury",
13897
14617
  description: "Minimal, confident, and refined for premium experiences and private services.",
13898
14618
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
13899
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
14619
+ siteCreatorSelection: {
14620
+ kind: "site_creator_keyword_heuristic",
14621
+ priority: 20
14622
+ },
13900
14623
  selectionKeywordRules: [
13901
14624
  { kind: "word", value: "luxury" },
13902
14625
  { kind: "word", value: "premium" },
@@ -13914,7 +14637,11 @@ var curatedSiteStyles = [
13914
14637
  motion: "none"
13915
14638
  },
13916
14639
  compositionBudget: quietBudget,
13917
- recommendedHeaderLookIds: ["minimal-transparent", "editorial-line", "clean-base"],
14640
+ recommendedHeaderLookIds: [
14641
+ "minimal-transparent",
14642
+ "serif-line",
14643
+ "clean-base"
14644
+ ],
13918
14645
  buttonPersonalityChoices: [
13919
14646
  buttonChoice("editorial-link"),
13920
14647
  buttonChoice("confident-chip"),
@@ -13950,7 +14677,11 @@ var curatedSiteStyles = [
13950
14677
  motion: "none"
13951
14678
  },
13952
14679
  compositionBudget: quietBudget,
13953
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
14680
+ recommendedHeaderLookIds: [
14681
+ "practical-utility",
14682
+ "brand-solid",
14683
+ "clean-base"
14684
+ ],
13954
14685
  buttonPersonalityChoices: [
13955
14686
  buttonChoice("confident-chip"),
13956
14687
  buttonChoice("pebble"),
@@ -13977,7 +14708,11 @@ var curatedSiteStyles = [
13977
14708
  motion: "subtle"
13978
14709
  },
13979
14710
  compositionBudget: balancedBudget,
13980
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
14711
+ recommendedHeaderLookIds: [
14712
+ "centered-calm",
14713
+ "minimal-transparent",
14714
+ "clean-base"
14715
+ ],
13981
14716
  buttonPersonalityChoices: [
13982
14717
  buttonChoice("soft-pill"),
13983
14718
  buttonChoice("pebble"),
@@ -13994,7 +14729,10 @@ var curatedSiteStyles = [
13994
14729
  name: "Quiet Practice",
13995
14730
  description: "Grounded, calm, and practical for small appointment-first practices.",
13996
14731
  generationBrief: "Make services, practitioner trust, preparation notes, and booking routes easy to scan. Keep the tone warm and specific, with quiet confidence rather than spa cliches or medical claims.",
13997
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
14732
+ siteCreatorSelection: {
14733
+ kind: "site_creator_keyword_heuristic",
14734
+ priority: 30
14735
+ },
13998
14736
  selectionKeywordRules: [
13999
14737
  { kind: "substring", value: "massage" },
14000
14738
  { kind: "word", value: "bodywork" },
@@ -14015,7 +14753,11 @@ var curatedSiteStyles = [
14015
14753
  motion: "subtle"
14016
14754
  },
14017
14755
  compositionBudget: quietBudget,
14018
- recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
14756
+ recommendedHeaderLookIds: [
14757
+ "practical-utility",
14758
+ "clean-base",
14759
+ "centered-calm"
14760
+ ],
14019
14761
  buttonPersonalityChoices: [
14020
14762
  buttonChoice("pebble"),
14021
14763
  buttonChoice("soft-pill"),
@@ -14032,7 +14774,10 @@ var curatedSiteStyles = [
14032
14774
  name: "Personal Retreat Journal",
14033
14775
  description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
14034
14776
  generationBrief: "Center the practitioner as the guide, then make private sessions, classes, retreats, and resources feel like clear pathways. Keep retreat copy grounded and practical, with enough editorial warmth for longer reading.",
14035
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
14777
+ siteCreatorSelection: {
14778
+ kind: "site_creator_keyword_heuristic",
14779
+ priority: 40
14780
+ },
14036
14781
  selectionKeywordRules: [
14037
14782
  { kind: "substring", value: "retreat" },
14038
14783
  { kind: "phrase", value: "solo practitioner" },
@@ -14052,7 +14797,11 @@ var curatedSiteStyles = [
14052
14797
  motion: "subtle"
14053
14798
  },
14054
14799
  compositionBudget: balancedBudget,
14055
- recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
14800
+ recommendedHeaderLookIds: [
14801
+ "serif-line",
14802
+ "centered-calm",
14803
+ "minimal-transparent"
14804
+ ],
14056
14805
  buttonPersonalityChoices: [
14057
14806
  buttonChoice("editorial-link"),
14058
14807
  buttonChoice("soft-pill"),
@@ -14069,7 +14818,10 @@ var curatedSiteStyles = [
14069
14818
  name: "Tactile Workshop",
14070
14819
  description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
14071
14820
  generationBrief: "Lead with objects, materials, studio process, and practical booking detail. Keep the tone warm and direct, with useful mess, clear dates, and enough gallery rhythm to feel like a real creative studio.",
14072
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
14821
+ siteCreatorSelection: {
14822
+ kind: "site_creator_keyword_heuristic",
14823
+ priority: 50
14824
+ },
14073
14825
  selectionKeywordRules: [
14074
14826
  { kind: "substring", value: "ceramic" },
14075
14827
  { kind: "word", value: "pottery" },
@@ -14089,8 +14841,15 @@ var curatedSiteStyles = [
14089
14841
  motion: "subtle"
14090
14842
  },
14091
14843
  compositionBudget: balancedBudget,
14092
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
14093
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
14844
+ recommendedHeaderLookIds: [
14845
+ "brand-solid",
14846
+ "practical-utility",
14847
+ "clean-base"
14848
+ ],
14849
+ recommendedFooterLookIds: [
14850
+ "site-footer-brand-two-band",
14851
+ "footer-muted-grounding"
14852
+ ],
14094
14853
  buttonPersonalityChoices: [
14095
14854
  buttonChoice("pebble"),
14096
14855
  buttonChoice("confident-chip"),
@@ -14105,11 +14864,14 @@ var curatedSiteStyles = [
14105
14864
  ]
14106
14865
  }),
14107
14866
  defineCuratedSiteStyle({
14108
- id: "site-style:soft-earth",
14867
+ id: SOFT_EARTH_SITE_STYLE_ID,
14109
14868
  name: "Soft Earth",
14110
14869
  description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
14111
- 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.",
14112
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 45 },
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.",
14871
+ siteCreatorSelection: {
14872
+ kind: "site_creator_keyword_heuristic",
14873
+ priority: 45
14874
+ },
14113
14875
  selectionKeywordRules: [
14114
14876
  { kind: "word", value: "meditation" },
14115
14877
  { kind: "word", value: "wellbeing" },
@@ -14175,18 +14937,29 @@ var curatedSiteStyles = [
14175
14937
  paragraphSize: "default",
14176
14938
  headingSize: "editorial"
14177
14939
  }
14178
- }
14940
+ },
14941
+ accordions: softEarthAccordionSystem
14942
+ },
14943
+ defaultBlockVariants: {
14944
+ "block.faq": "question-columns"
14179
14945
  },
14180
14946
  recommendedAppearancePresetIds: [
14181
14947
  "hero-brand-scrim",
14182
- "intro-soft-earth-statement",
14183
- "feature-cards-soft-earth-offerings",
14184
- "testimonials-soft-earth-proof-band",
14185
- "faq-soft-earth-two-column",
14948
+ "intro-organic-statement",
14949
+ "feature-cards-raised-rule",
14950
+ "events-lined-panel",
14951
+ "testimonials-brand-background-quotes",
14186
14952
  "contact-form-panel"
14187
14953
  ],
14188
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "editorial-line"],
14189
- recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
14954
+ recommendedHeaderLookIds: [
14955
+ "centered-calm",
14956
+ "minimal-transparent",
14957
+ "serif-line"
14958
+ ],
14959
+ recommendedFooterLookIds: [
14960
+ "footer-muted-grounding",
14961
+ "site-footer-brand-two-band"
14962
+ ],
14190
14963
  buttonPersonalityChoices: [
14191
14964
  buttonChoice("earth-pill"),
14192
14965
  buttonChoice("soft-pill"),
@@ -14205,7 +14978,10 @@ var curatedSiteStyles = [
14205
14978
  name: "Bold Launch",
14206
14979
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
14207
14980
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
14208
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
14981
+ siteCreatorSelection: {
14982
+ kind: "site_creator_keyword_heuristic",
14983
+ priority: 10
14984
+ },
14209
14985
  selectionKeywordRules: [
14210
14986
  { kind: "substring", value: "launch" },
14211
14987
  { kind: "substring", value: "campaign" },
@@ -14224,7 +15000,11 @@ var curatedSiteStyles = [
14224
15000
  motion: "expressive"
14225
15001
  },
14226
15002
  compositionBudget: expressiveBudget,
14227
- recommendedHeaderLookIds: ["transparent-overlay", "floating-glass", "brand-solid"],
15003
+ recommendedHeaderLookIds: [
15004
+ "transparent-overlay",
15005
+ "floating-glass",
15006
+ "brand-solid"
15007
+ ],
14228
15008
  buttonPersonalityChoices: [
14229
15009
  buttonChoice("ink-stamp"),
14230
15010
  buttonChoice("confident-chip"),
@@ -14272,11 +15052,18 @@ var curatedSiteStyles = [
14272
15052
  "hero-brand-scrim-fixed-frame",
14273
15053
  "body-text-editorial-intro",
14274
15054
  "schedule-details-brand-depth",
14275
- "testimonials-accent-quote-proof",
15055
+ "testimonials-accent-quote-cards",
14276
15056
  "contact-form-brand-depth-card"
14277
15057
  ],
14278
- recommendedHeaderLookIds: ["brand-solid", "transparent-overlay", "practical-utility"],
14279
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
15058
+ recommendedHeaderLookIds: [
15059
+ "brand-solid",
15060
+ "transparent-overlay",
15061
+ "practical-utility"
15062
+ ],
15063
+ recommendedFooterLookIds: [
15064
+ "site-footer-brand-two-band",
15065
+ "footer-muted-grounding"
15066
+ ],
14280
15067
  buttonPersonalityChoices: [
14281
15068
  buttonChoice("showtime-pill"),
14282
15069
  buttonChoice("confident-chip"),
@@ -14360,6 +15147,7 @@ var themeV2RuntimeStyleFieldNames = [
14360
15147
  ];
14361
15148
  var themeV2BlockSpecificRawStyleFieldNames = [
14362
15149
  "_contentCardStyles",
15150
+ "_heroLayoutStyles",
14363
15151
  "_textCardStyles"
14364
15152
  ];
14365
15153
  var themeV2NormalEditorRawStyleFieldNames = [
@@ -14369,6 +15157,10 @@ var themeV2NormalEditorRawStyleFieldNames = [
14369
15157
  var themeV2NormalEditorRawStyleFieldNameSet = new Set(
14370
15158
  themeV2NormalEditorRawStyleFieldNames
14371
15159
  );
15160
+ var themeV2CompilerOwnedFieldNames = [
15161
+ ...themeV2RuntimeStyleFieldNames,
15162
+ ...themeV2BlockSpecificRawStyleFieldNames
15163
+ ];
14372
15164
 
14373
15165
  // ../theme-core/src/site-styles/designState.ts
14374
15166
  var themeV2DesignStateSchemaVersion = 1;
@@ -14383,6 +15175,16 @@ var heroLegibilityStrategySchema = z23.enum([
14383
15175
  "scrim-gradient",
14384
15176
  "solid-panel"
14385
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
+ ]);
14386
15188
  var sectionHeightIntentSchema = z23.enum([
14387
15189
  "default",
14388
15190
  "banner",
@@ -14418,6 +15220,7 @@ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
14418
15220
  ]);
14419
15221
  var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
14420
15222
  var tileTreatmentSchema = z23.enum(tileTreatmentValues);
15223
+ var eventListTreatmentSchema = z23.enum(eventListTreatmentValues);
14421
15224
  var eyebrowTreatmentSchema = z23.enum(eyebrowTreatmentValues);
14422
15225
  function uniqueNonEmpty(values) {
14423
15226
  const uniqueValues = [...new Set(values)];
@@ -14459,10 +15262,13 @@ var blockDesignPlanSchema = z23.object({
14459
15262
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
14460
15263
  sectionHeight: sectionHeightIntentSchema.optional(),
14461
15264
  heroLegibility: heroLegibilityStrategySchema.optional(),
15265
+ heroComposition: heroCompositionIntentSchema.optional(),
15266
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
14462
15267
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
14463
15268
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
14464
15269
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
14465
15270
  tileTreatment: tileTreatmentSchema.optional(),
15271
+ eventListTreatment: eventListTreatmentSchema.optional(),
14466
15272
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
14467
15273
  }).strict();
14468
15274
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
@@ -15862,6 +16668,7 @@ function styledSection(config) {
15862
16668
  renderBackgroundImage = true,
15863
16669
  backgroundImageLoading,
15864
16670
  backgroundImageFetchPriority,
16671
+ allowOverflow = false,
15865
16672
  fullWidthPath
15866
16673
  } = config;
15867
16674
  const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
@@ -15896,7 +16703,7 @@ function styledSection(config) {
15896
16703
  // No fallback needed - transform handles all cases via defaultSpacing
15897
16704
  }
15898
16705
  },
15899
- allowOverflow: {
16706
+ allowOverflow: allowOverflow ? true : {
15900
16707
  $bind: {
15901
16708
  from: `${bindFrom}.background`,
15902
16709
  transforms: [{ id: "background.resolveAllowOverflow" }],
@@ -16591,6 +17398,14 @@ var tileTreatmentSet = new Set(tileTreatmentValues);
16591
17398
  function isTileTreatment(value) {
16592
17399
  return typeof value === "string" && tileTreatmentSet.has(value);
16593
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
+ }
16594
17409
  var sectionClassNameTransform = {
16595
17410
  id: "sectionStyles.resolveClassName",
16596
17411
  kind: "string",
@@ -16658,6 +17473,17 @@ var sectionClassNameTransform = {
16658
17473
  `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
16659
17474
  );
16660
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
+ }
16661
17487
  if (hasFixedFrameBackgroundMotion(input)) {
16662
17488
  classes.push(fixedFrameScopeClass);
16663
17489
  }
@@ -17093,6 +17919,35 @@ function sectionState(opts) {
17093
17919
  );
17094
17920
  }
17095
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
+
17096
17951
  // ../blocks/src/system/fragments/types.ts
17097
17952
  import { z as z27 } from "zod";
17098
17953
  var FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
@@ -17871,6 +18726,10 @@ var testimonialsHeadingFragment = defineFragment({
17871
18726
  when("content.heading"),
17872
18727
  bind("content.heading")
17873
18728
  ),
18729
+ headingDecoration({
18730
+ family: "short-center-rule",
18731
+ placement: "under-centered-heading"
18732
+ }),
17874
18733
  text(
17875
18734
  {
17876
18735
  as: "p",
@@ -18542,6 +19401,41 @@ var faqHeadingFragment = defineFragment({
18542
19401
  });
18543
19402
 
18544
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
+ }
18545
19439
  var faqAccordionFragment = defineFragment({
18546
19440
  id: "faqAccordion",
18547
19441
  title: "FAQ Accordion",
@@ -18575,40 +19469,7 @@ var faqAccordionFragment = defineFragment({
18575
19469
  }
18576
19470
  }
18577
19471
  ],
18578
- layout: accordionList({
18579
- collection: "content.items",
18580
- itemName: "faqItem",
18581
- indexName: "faqIndex",
18582
- accordionProps: {
18583
- className: "accordion-root",
18584
- // CSS-first: all styling handled by theme CSS
18585
- type: "single",
18586
- collapsible: true
18587
- },
18588
- itemProps: {
18589
- className: {
18590
- $bind: {
18591
- from: "content._cardStyles",
18592
- transforms: [
18593
- {
18594
- id: "boxStyles.all",
18595
- options: {
18596
- axis: "all",
18597
- includeSpacing: false,
18598
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden rb-border"
18599
- }
18600
- }
18601
- ]
18602
- },
18603
- fallback: "rb-faq-item"
18604
- },
18605
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
18606
- // Legacy theme accordion style
18607
- iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
18608
- },
18609
- triggerFrom: "faqItem.question",
18610
- contentFrom: "faqItem.answer"
18611
- })
19472
+ layout: createFaqAccordionLayout()
18612
19473
  });
18613
19474
 
18614
19475
  // ../blocks/src/system/fragments/library/card.ts
@@ -19661,6 +20522,7 @@ var microLayout = styledSection({
19661
20522
  function splitLayoutWith(children) {
19662
20523
  return styledSection({
19663
20524
  children: styledContainer({
20525
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
19664
20526
  children: {
19665
20527
  type: "grid",
19666
20528
  props: {
@@ -19685,6 +20547,7 @@ function splitLayoutWith(children) {
19685
20547
  // The split variants render the image as a real grid column, so suppress
19686
20548
  // the default absolute background image layer while keeping color/overlay.
19687
20549
  renderBackgroundImage: false,
20550
+ allowOverflow: true,
19688
20551
  baseClass: ""
19689
20552
  });
19690
20553
  }
@@ -19838,6 +20701,21 @@ function introHeading(className) {
19838
20701
  bind("content.title")
19839
20702
  );
19840
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
+ }
19841
20719
  function introBody(className = "rb-prose rb-max-w-none") {
19842
20720
  return richText({ className }, bind("content.body"));
19843
20721
  }
@@ -19856,6 +20734,10 @@ function introCopyStack(options = {}) {
19856
20734
  },
19857
20735
  [
19858
20736
  introHeading(options.headingClassName ?? "rb-intro-title"),
20737
+ headingDecoration({
20738
+ family: "organic-squiggle",
20739
+ placement: "after-heading"
20740
+ }),
19859
20741
  introBody(options.bodyClassName),
19860
20742
  introCtas(options.ctaJustify)
19861
20743
  ]
@@ -19895,7 +20777,7 @@ var statementCopyLayout = styledSection({
19895
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"
19896
20778
  },
19897
20779
  [
19898
- introHeading("rb-intro-title rb-max-w-xl"),
20780
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
19899
20781
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
19900
20782
  introBody(),
19901
20783
  introCtas("start")
@@ -19916,7 +20798,7 @@ var statementMediaLayout = styledSection({
19916
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"
19917
20799
  },
19918
20800
  [
19919
- introHeading("rb-intro-title rb-max-w-xl"),
20801
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
19920
20802
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
19921
20803
  introBody(),
19922
20804
  introCtas("start")
@@ -20918,6 +21800,9 @@ function isNodeDefinitionArray(layout) {
20918
21800
  }
20919
21801
  var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
20920
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
+ });
20921
21806
  var defaultLayout = styledSection({
20922
21807
  children: styledContainer({
20923
21808
  baseClassName: "rb-relative rb-isolate",
@@ -20931,11 +21816,24 @@ var twoColumnLayout = styledSection({
20931
21816
  children: el(
20932
21817
  "div",
20933
21818
  {
20934
- 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"
20935
21820
  },
20936
21821
  [
20937
- el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
20938
- 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
20939
21837
  ]
20940
21838
  )
20941
21839
  }),
@@ -20960,7 +21858,8 @@ var faqManifest = createBlockManifest({
20960
21858
  layout: defaultLayout,
20961
21859
  variants: {
20962
21860
  default: defaultLayout,
20963
- "two-column": twoColumnLayout
21861
+ "two-column": twoColumnLayout,
21862
+ "question-columns": questionColumnsLayout
20964
21863
  },
20965
21864
  defaultVariant: "default",
20966
21865
  variantOptions: {
@@ -20971,6 +21870,10 @@ var faqManifest = createBlockManifest({
20971
21870
  "two-column": {
20972
21871
  label: "Two column",
20973
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."
20974
21877
  }
20975
21878
  },
20976
21879
  description: "Accordion of frequently asked questions and answers.",
@@ -21092,9 +21995,21 @@ var eyebrowTreatmentClassMap = {
21092
21995
  "accent-pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent rb-eyebrow-treatment-pill-bounce"
21093
21996
  };
21094
21997
  var eyebrowTreatmentSet = new Set(eyebrowTreatmentValues);
21998
+ var headingDecorationFamilySet = new Set(visibleHeadingDecorationFamilyValues);
21999
+ var headingDecorationPlacementSet = new Set(visibleHeadingDecorationPlacementValues);
22000
+ var headingDecorationColorTokenSet = new Set(headingDecorationColorTokenValues);
21095
22001
  function isEyebrowTreatment(value) {
21096
22002
  return typeof value === "string" && eyebrowTreatmentSet.has(value);
21097
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
+ }
21098
22013
  var imageGalleryCornerClassMap = {
21099
22014
  none: "",
21100
22015
  sm: "rb-rounded-sm",
@@ -21198,6 +22113,10 @@ var sectionStateToneTransform = {
21198
22113
  summary: "Map semantic section-state kind to feedback tone",
21199
22114
  run: (value) => sectionStateToneFromUnknown(value)
21200
22115
  };
22116
+ var heroTitleLengthThresholds = {
22117
+ medium: { maxCharacters: 42, maxWords: 6 },
22118
+ long: { maxCharacters: 78, maxWords: 11 }
22119
+ };
21201
22120
  function isPlainObject(value) {
21202
22121
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
21203
22122
  }
@@ -21205,6 +22124,14 @@ function readString(obj, key) {
21205
22124
  const v = obj[key];
21206
22125
  return typeof v === "string" ? v : void 0;
21207
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
+ }
21208
22135
  function resolveHeroVariant(content) {
21209
22136
  const variant = readString(content, "variant");
21210
22137
  if (variant && variant.trim()) return variant.trim();
@@ -21213,14 +22140,14 @@ function resolveHeroVariant(content) {
21213
22140
  return null;
21214
22141
  }
21215
22142
  function resolveHeroContentAlignment(content) {
21216
- const raw = readString(content, "contentAlignment");
22143
+ const raw = readHeroLayoutString(content, "contentAlignment");
21217
22144
  if (raw === "left" || raw === "center" || raw === "right") return raw;
21218
22145
  const variant = resolveHeroVariant(content);
21219
22146
  if (variant === "split" || variant === "splitReverse") return "left";
21220
22147
  return "center";
21221
22148
  }
21222
22149
  function resolveHeroVerticalAlignment(content) {
21223
- const raw = readString(content, "verticalAlignment");
22150
+ const raw = readHeroLayoutString(content, "verticalAlignment");
21224
22151
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
21225
22152
  const sectionStyles = asPartialObject(content._sectionStyles);
21226
22153
  const minHeight = sectionStyles?.minHeight;
@@ -21230,11 +22157,29 @@ function resolveHeroVerticalAlignment(content) {
21230
22157
  return "top";
21231
22158
  }
21232
22159
  function resolveHeroContentMaxWidth(content) {
21233
- const raw = readString(content, "contentMaxWidth");
22160
+ const raw = readHeroLayoutString(content, "contentMaxWidth");
21234
22161
  if (raw === "default" || raw === "narrow" || raw === "medium" || raw === "wide")
21235
22162
  return raw;
21236
22163
  return "default";
21237
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
+ }
21238
22183
  var heroContentWrapperClassSchema = z33.object({
21239
22184
  base: z33.string().optional()
21240
22185
  });
@@ -21247,6 +22192,8 @@ var heroContentWrapperClassTransform = {
21247
22192
  const content = isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {};
21248
22193
  const alignment = resolveHeroContentAlignment(content);
21249
22194
  const maxWidth = resolveHeroContentMaxWidth(content);
22195
+ const typographyScale = resolveHeroTypographyScale(content);
22196
+ const titleLength = resolveHeroTitleLength(content);
21250
22197
  const textAlignClass = alignment === "center" ? "rb-text-center" : alignment === "right" ? "rb-text-right" : "rb-text-left";
21251
22198
  const maxWidthClass = maxWidth === "narrow" ? "rb-max-w-2xl" : maxWidth === "medium" ? "rb-max-w-3xl" : maxWidth === "wide" ? "rb-max-w-5xl" : "";
21252
22199
  const positionClass = alignment === "center" ? "rb-mx-auto" : alignment === "right" ? "rb-ml-auto" : "";
@@ -21254,7 +22201,9 @@ var heroContentWrapperClassTransform = {
21254
22201
  options?.base,
21255
22202
  textAlignClass,
21256
22203
  maxWidthClass,
21257
- positionClass
22204
+ positionClass,
22205
+ typographyScale ? `rb-hero-typography-${typographyScale}` : "",
22206
+ `rb-hero-title-${titleLength}`
21258
22207
  ]);
21259
22208
  }
21260
22209
  };
@@ -21554,11 +22503,67 @@ var uiTransforms = [
21554
22503
  const treatment = isEyebrowTreatment(value) ? value : "plain";
21555
22504
  return joinClasses3([baseClass, eyebrowTreatmentClassMap[treatment]]);
21556
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
+ }
21557
22527
  }
21558
22528
  ];
21559
22529
 
21560
22530
  // ../blocks/src/system/transforms/registry/layout.ts
21561
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
21562
22567
  var joinClasses4 = (parts) => parts.filter(
21563
22568
  (part) => typeof part === "string" && part.trim().length > 0
21564
22569
  ).join(" ").replace(/\s+/g, " ").trim();
@@ -21674,32 +22679,35 @@ var headerRootClassTransform = {
21674
22679
  ...options
21675
22680
  };
21676
22681
  const content = asPartialObject(value) ?? {};
21677
- const positioning = typeof content.positioning === "string" ? content.positioning : "static";
22682
+ const positioning = parseHeaderPositioning(content.positioning);
22683
+ const placement = planSiteChromePlacement(positioning);
21678
22684
  const shrinkOnScroll = Boolean(content.shrinkOnScroll);
21679
22685
  const header = asPartialObject(value);
21680
22686
  const visuals = resolveHeaderVisualStyles(header, context.theme);
21681
22687
  const navContainerType = header?.navContainer?.type ?? "none";
21682
22688
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
21683
22689
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
21684
- const classes = [
21685
- config.base,
21686
- backgroundClass
21687
- ];
22690
+ const classes = [config.base, backgroundClass];
21688
22691
  if (!hasContainedNav) {
21689
22692
  if (config.blur) classes.push(config.blur);
21690
22693
  if (config.blurSupport) classes.push(config.blurSupport);
21691
22694
  }
21692
- if (positioning === "sticky") {
22695
+ if (placement.kind === "sticky") {
21693
22696
  classes.push(
21694
22697
  visuals.isTransparent ? config.stickyTransparent : config.sticky
21695
22698
  );
21696
- } else if (positioning === "fixed") {
22699
+ } else if (placement.kind === "fixed") {
21697
22700
  classes.push(config.fixed);
21698
22701
  }
21699
- if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
22702
+ if (shrinkOnScroll && placement.kind !== "static") {
21700
22703
  classes.push(config.shrink);
21701
22704
  }
21702
- const VALID_VARIANTS = ["classic", "centered", "transparent", "floating", "editorial"];
22705
+ const VALID_VARIANTS = [
22706
+ "classic",
22707
+ "centered",
22708
+ "transparent",
22709
+ "floating"
22710
+ ];
21703
22711
  const variant = header?.variant;
21704
22712
  if (variant && VALID_VARIANTS.includes(variant)) {
21705
22713
  classes.push(`header-variant-${variant}`);
@@ -22226,6 +23234,10 @@ function desktopOnlyDisplay(display) {
22226
23234
  return `rb-hidden ${LARGE_DISPLAY_CLASSES[display]}`;
22227
23235
  }
22228
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
+
22229
23241
  // ../blocks/src/system/blocks/site-header.ts
22230
23242
  var logoRow = link(
22231
23243
  {
@@ -22320,15 +23332,21 @@ var mobileCta = ctaButton({
22320
23332
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
22321
23333
  {
22322
23334
  type: "div",
22323
- props: { className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
23335
+ props: {
23336
+ className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
23337
+ }
22324
23338
  },
22325
23339
  {
22326
23340
  type: "div",
22327
- props: { className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
23341
+ props: {
23342
+ className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
23343
+ }
22328
23344
  },
22329
23345
  {
22330
23346
  type: "div",
22331
- props: { className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
23347
+ props: {
23348
+ className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
23349
+ }
22332
23350
  }
22333
23351
  ]);
22334
23352
  var mobileToggleButton = {
@@ -22492,6 +23510,7 @@ var transparentLayout = inline(
22492
23510
  );
22493
23511
  var floatingLayout = inline(
22494
23512
  {
23513
+ [SITE_CHROME_VISIBLE_HEADER_ATTR]: "true",
22495
23514
  className: bindProp("$root.theme.header.maxWidth", {
22496
23515
  transforms: pipe(
22497
23516
  tx("layout.maxWidthClass", {
@@ -22511,28 +23530,6 @@ var floatingLayout = inline(
22511
23530
  ],
22512
23531
  when("$root.theme.header.variant", { equals: "floating" })
22513
23532
  );
22514
- var editorialLayout = stack(
22515
- {
22516
- gap: "md",
22517
- align: "center",
22518
- className: bindProp("$root.theme.header.maxWidth", {
22519
- transforms: pipe(
22520
- tx("layout.maxWidthClass", {
22521
- base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
22522
- })
22523
- ),
22524
- fallback: `rb-container rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
22525
- })
22526
- },
22527
- [
22528
- centeredLogoRow,
22529
- createNavRow(
22530
- `${desktopOnlyDisplay("flex")} rb-flex-wrap rb-justify-center rb-gap-x-8 rb-gap-y-3`,
22531
- "center"
22532
- )
22533
- ],
22534
- when("$root.theme.header.variant", { equals: "editorial" })
22535
- );
22536
23533
  var headerLayout = headerSection(
22537
23534
  {
22538
23535
  background: bindProp("$root.theme.header", {
@@ -22546,10 +23543,7 @@ var headerLayout = headerSection(
22546
23543
  }),
22547
23544
  style: bindProp("$root.theme.header", {
22548
23545
  transforms: pipe(tx("layout.headerRootStyle")),
22549
- fallback: mergeStyles(
22550
- textColorStyle("text"),
22551
- borderColorStyle("border")
22552
- )
23546
+ fallback: mergeStyles(textColorStyle("text"), borderColorStyle("border"))
22553
23547
  })
22554
23548
  },
22555
23549
  [
@@ -22558,7 +23552,6 @@ var headerLayout = headerSection(
22558
23552
  centeredLayout,
22559
23553
  transparentLayout,
22560
23554
  floatingLayout,
22561
- editorialLayout,
22562
23555
  mobileOverlay
22563
23556
  ],
22564
23557
  props({
@@ -23463,6 +24456,10 @@ var sectionHeading = stack(
23463
24456
  when("content.title"),
23464
24457
  bind("content.title")
23465
24458
  ),
24459
+ headingDecoration({
24460
+ family: "short-center-rule",
24461
+ placement: "under-centered-heading"
24462
+ }),
23466
24463
  richText(
23467
24464
  {
23468
24465
  className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
@@ -25886,7 +26883,7 @@ var COLUMN_CLASSES = {
25886
26883
  };
25887
26884
  function getContainerClass(layout, columns) {
25888
26885
  if (layout === "compact") {
25889
- return "event-listing-compact-container rb-flex rb-flex-col rb-gap-2";
26886
+ return "event-listing-compact-container rb-flex rb-flex-col";
25890
26887
  }
25891
26888
  if (layout === "stack") {
25892
26889
  return "rb-flex rb-flex-col rb-gap-6";
@@ -28714,6 +29711,7 @@ import { z as z53 } from "zod";
28714
29711
  var storedProductCartItemSchema = z53.object({
28715
29712
  kind: z53.literal("product"),
28716
29713
  productId: z53.string().min(1),
29714
+ productCategoryId: z53.string().min(1).optional().nullable(),
28717
29715
  variantId: z53.string().min(1).optional().nullable(),
28718
29716
  title: z53.string().min(1),
28719
29717
  variantTitle: z53.string().optional().nullable(),
@@ -31218,6 +32216,10 @@ var scheduleTileTreatments = [
31218
32216
  "quiet",
31219
32217
  "brand-depth"
31220
32218
  ];
32219
+ var eventListTreatments = [
32220
+ "plain",
32221
+ "lined-panel"
32222
+ ];
31221
32223
  function scheduleDetailsCapable() {
31222
32224
  return declareBlockDesignCapability({
31223
32225
  sectionSurfaces: "supported",
@@ -31226,6 +32228,14 @@ function scheduleDetailsCapable() {
31226
32228
  tileTreatments: scheduleTileTreatments
31227
32229
  });
31228
32230
  }
32231
+ function eventListCapable() {
32232
+ return declareBlockDesignCapability({
32233
+ sectionSurfaces: "supported",
32234
+ contentFrames: ["plain"],
32235
+ itemSurfaces: "unsupported",
32236
+ eventListTreatments
32237
+ });
32238
+ }
31229
32239
  function defaultBoundaryBias(visualWeight) {
31230
32240
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
31231
32241
  }
@@ -31445,7 +32455,8 @@ var systemBlockDefinitionsRaw = [
31445
32455
  flow: bodyFlow,
31446
32456
  layoutProfiles: [
31447
32457
  layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
31448
- 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" })
31449
32460
  ]
31450
32461
  })),
31451
32462
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
@@ -31539,11 +32550,11 @@ var systemBlockDefinitionsRaw = [
31539
32550
  flow: offeringsFlow,
31540
32551
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "centered", weight: "featured" })]
31541
32552
  })),
31542
- withDesignCapability("block.event-listing", eventListingBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
32553
+ withDesignCapability("block.event-listing", eventListingBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
31543
32554
  flow: offeringsFlow,
31544
32555
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
31545
32556
  })),
31546
- withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
32557
+ withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
31547
32558
  flow: offeringsFlow,
31548
32559
  layoutProfiles: [
31549
32560
  layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
@@ -32675,6 +33686,15 @@ ${root} {
32675
33686
  `;
32676
33687
  }
32677
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
+
32678
33698
  // ../theme-core/src/blocks/vars/customer-portal.ts
32679
33699
  function generateCustomerPortalVars({
32680
33700
  themeId
@@ -32688,6 +33708,11 @@ ${root} {
32688
33708
  --cp-muted: rgb(var(--tb-mutedText));
32689
33709
  --cp-border: rgb(var(--tb-border));
32690
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));
32691
33716
 
32692
33717
  /* Shared tab bar (underline style) */
32693
33718
  --rb-tab-border-width: 1px;
@@ -32738,7 +33763,7 @@ ${root} {
32738
33763
  --rb-modal-bg: var(--cp-card-bg);
32739
33764
  --rb-modal-border: var(--cp-card-border);
32740
33765
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
32741
- --rb-modal-radius: var(--radius-card);
33766
+ --rb-modal-radius: var(--cp-card-radius);
32742
33767
  --rb-modal-max-width: 560px;
32743
33768
 
32744
33769
  /* Header */
@@ -34119,6 +35144,9 @@ import { jsx as jsx5 } from "react/jsx-runtime";
34119
35144
  import * as React from "react";
34120
35145
  import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
34121
35146
 
35147
+ // ../theme-core/src/fonts/uploadFormat.ts
35148
+ var MAX_FONT_UPLOAD_BYTES = 5 * 1024 * 1024;
35149
+
34122
35150
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
34123
35151
  import { z as z61 } from "zod";
34124
35152
  var themeBridgeConfigSchema = z61.object({
@@ -34892,6 +35920,7 @@ var COURSE_ENROLLMENT_REFUND_FAILED_CODES = [
34892
35920
  ];
34893
35921
 
34894
35922
  // ../api/src/bookingVerticals.ts
35923
+ import { z as z64 } from "zod";
34895
35924
  var VERTICAL_IDS = [
34896
35925
  "yoga_wellness",
34897
35926
  "fitness_pt",
@@ -34970,6 +35999,132 @@ var VERTICAL_ID_SET = new Set(VERTICAL_IDS);
34970
35999
  var VERTICAL_PRESET_ID_SET = new Set(
34971
36000
  VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id)
34972
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
+ };
34973
36128
  function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
34974
36129
  return {
34975
36130
  id,
@@ -34989,51 +36144,51 @@ function isRecord3(value) {
34989
36144
  }
34990
36145
 
34991
36146
  // ../api/src/appointmentSetup.ts
34992
- import { z as z64 } from "zod";
36147
+ import { z as z65 } from "zod";
34993
36148
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
34994
- var appointmentSetupRefSchema = z64.discriminatedUnion("kind", [
34995
- z64.object({ kind: z64.literal("existing"), id: z64.string().min(1) }),
34996
- 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) })
34997
36152
  ]);
34998
- var appointmentSetupVenueChoiceSchema = z64.discriminatedUnion("kind", [
34999
- z64.object({ kind: z64.literal("none") }),
35000
- z64.object({ kind: z64.literal("existing"), venueId: z64.string().min(1) }),
35001
- z64.object({
35002
- kind: z64.literal("create"),
35003
- draftId: z64.string().min(1),
35004
- title: z64.string().trim().min(1),
35005
- description: z64.string().nullable(),
35006
- timezone: z64.string().trim().min(1).nullable(),
35007
- addressJson: z64.record(z64.string(), z64.unknown()),
35008
- 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()
35009
36164
  })
35010
36165
  ]);
35011
- var appointmentSetupPaymentDraftSchema = z64.object({
35012
- priceType: z64.union([z64.literal("free"), z64.literal("paid")])
35013
- });
35014
- var appointmentSetupServiceAssignmentDraftSchema = z64.discriminatedUnion("kind", [
35015
- z64.object({ kind: z64.literal("all_practitioners") }),
35016
- z64.object({
35017
- kind: z64.literal("selected_practitioners"),
35018
- 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)
35019
36174
  })
35020
36175
  ]);
35021
- var appointmentSetupServiceDraftSchema = z64.object({
36176
+ var appointmentSetupServiceDraftSchema = z65.object({
35022
36177
  ref: appointmentSetupRefSchema,
35023
- title: z64.string().trim().min(1),
35024
- description: z64.string().nullable(),
35025
- durationMinutes: z64.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
35026
- prepMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
35027
- cleanupMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
35028
- priceAmount: z64.number().int().nonnegative().nullable(),
35029
- isActive: z64.boolean(),
35030
- locationType: z64.union([
35031
- z64.literal("virtual"),
35032
- z64.literal("in_person"),
35033
- 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")
35034
36189
  ]),
35035
36190
  venue: appointmentSetupVenueChoiceSchema,
35036
- timezone: z64.string().trim().min(1).nullable(),
36191
+ timezone: z65.string().trim().min(1).nullable(),
35037
36192
  payment: appointmentSetupPaymentDraftSchema,
35038
36193
  assignment: appointmentSetupServiceAssignmentDraftSchema
35039
36194
  }).superRefine((service, ctx) => {
@@ -35052,49 +36207,49 @@ var appointmentSetupServiceDraftSchema = z64.object({
35052
36207
  });
35053
36208
  }
35054
36209
  });
35055
- var appointmentSetupPractitionerDraftSchema = z64.object({
36210
+ var appointmentSetupPractitionerDraftSchema = z65.object({
35056
36211
  ref: appointmentSetupRefSchema,
35057
- displayName: z64.string().trim().min(1),
35058
- bio: z64.string().nullable(),
35059
- timezone: z64.string().trim().min(1),
35060
- colorHex: z64.string().nullable()
35061
- });
35062
- var appointmentSetupWeeklyWindowDraftSchema = z64.object({
35063
- weekday: z64.number().int().min(0).max(6),
35064
- startTime: z64.string(),
35065
- endTime: z64.string()
35066
- });
35067
- var appointmentSetupStartTimePolicyDraftSchema = z64.discriminatedUnion("kind", [
35068
- z64.object({ kind: z64.literal("automatic_spacing") }),
35069
- z64.object({
35070
- kind: z64.literal("regular_interval"),
35071
- intervalMinutes: z64.union([
35072
- z64.literal(10),
35073
- z64.literal(15),
35074
- z64.literal(20),
35075
- z64.literal(30),
35076
- z64.literal(45),
35077
- 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)
35078
36233
  ])
35079
36234
  })
35080
36235
  ]);
35081
- var appointmentSetupAvailabilityDraftSchema = z64.object({
35082
- kind: z64.literal("weekly_windows"),
36236
+ var appointmentSetupAvailabilityDraftSchema = z65.object({
36237
+ kind: z65.literal("weekly_windows"),
35083
36238
  resourceRef: appointmentSetupRefSchema,
35084
36239
  serviceRef: appointmentSetupRefSchema.nullable(),
35085
- windows: z64.array(appointmentSetupWeeklyWindowDraftSchema),
36240
+ windows: z65.array(appointmentSetupWeeklyWindowDraftSchema),
35086
36241
  startTimePolicy: appointmentSetupStartTimePolicyDraftSchema.optional()
35087
36242
  });
35088
36243
  var APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX = 28 * 24 * 60;
35089
36244
  var APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX = 10 * 365 * 24 * 60;
35090
- var appointmentSetupBookingNoticeSchema = z64.object({
35091
- minLeadMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
35092
- maxBookingNoticeMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
35093
- });
35094
- var applyAppointmentSetupRequestSchema = z64.object({
35095
- services: z64.array(appointmentSetupServiceDraftSchema),
35096
- practitioners: z64.array(appointmentSetupPractitionerDraftSchema),
35097
- 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),
35098
36253
  bookingNotice: appointmentSetupBookingNoticeSchema
35099
36254
  });
35100
36255
 
@@ -35127,24 +36282,24 @@ var STAFF_CANCELLATION_CONTEXT_CATEGORIES = [
35127
36282
  ];
35128
36283
 
35129
36284
  // ../api/src/siteBanner.ts
35130
- import { z as z65 } from "zod";
36285
+ import { z as z66 } from "zod";
35131
36286
  var SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
35132
36287
  var SITE_BANNER_TONE_VALUES = ["announcement", "promotion", "notice", "warning"];
35133
36288
  var SITE_BANNER_MAX_TEXT_LENGTH = 320;
35134
36289
  var SITE_BANNER_MAX_PARAGRAPHS = 2;
35135
- var siteBannerScopeSchema = z65.enum(SITE_BANNER_SCOPE_VALUES);
35136
- var siteBannerToneSchema = z65.enum(SITE_BANNER_TONE_VALUES);
35137
- var siteBannerBodySchema = z65.unknown().transform(unwrapRichTextValue);
35138
- var siteBannerCtaSchema = z65.object({
35139
- 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),
35140
36295
  link: linkPayloadSchema
35141
36296
  });
35142
- var siteBannerSettingsSchema = z65.discriminatedUnion("enabled", [
35143
- z65.object({
35144
- enabled: z65.literal(false)
36297
+ var siteBannerSettingsSchema = z66.discriminatedUnion("enabled", [
36298
+ z66.object({
36299
+ enabled: z66.literal(false)
35145
36300
  }),
35146
- z65.object({
35147
- enabled: z65.literal(true),
36301
+ z66.object({
36302
+ enabled: z66.literal(true),
35148
36303
  scope: siteBannerScopeSchema,
35149
36304
  tone: siteBannerToneSchema,
35150
36305
  body: siteBannerBodySchema,
@@ -35158,7 +36313,7 @@ var siteBannerSettingsInputSchema = siteBannerSettingsSchema.superRefine((value,
35158
36313
  const analysis = analyzeSiteBannerBody(value.body);
35159
36314
  for (const issue of analysis.issues) {
35160
36315
  ctx.addIssue({
35161
- code: z65.ZodIssueCode.custom,
36316
+ code: z66.ZodIssueCode.custom,
35162
36317
  path: ["body"],
35163
36318
  message: siteBannerBodyIssueMessage(issue)
35164
36319
  });
@@ -35346,72 +36501,105 @@ function collectText(node) {
35346
36501
  return (node.content ?? []).map(collectText).join("");
35347
36502
  }
35348
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
+
35349
36537
  // ../api/src/aiPlayground.ts
35350
- import { z as z66 } from "zod";
35351
- var Rfc6902PatchOp = z66.discriminatedUnion("op", [
36538
+ import { z as z67 } from "zod";
36539
+ var Rfc6902PatchOp = z67.discriminatedUnion("op", [
35352
36540
  // Standard RFC-6902 operations
35353
- z66.object({
35354
- op: z66.literal("add"),
35355
- path: z66.string(),
35356
- value: z66.unknown()
36541
+ z67.object({
36542
+ op: z67.literal("add"),
36543
+ path: z67.string(),
36544
+ value: z67.unknown()
35357
36545
  }),
35358
- z66.object({
35359
- op: z66.literal("remove"),
35360
- path: z66.string()
36546
+ z67.object({
36547
+ op: z67.literal("remove"),
36548
+ path: z67.string()
35361
36549
  }),
35362
- z66.object({
35363
- op: z66.literal("replace"),
35364
- path: z66.string(),
35365
- value: z66.unknown()
36550
+ z67.object({
36551
+ op: z67.literal("replace"),
36552
+ path: z67.string(),
36553
+ value: z67.unknown()
35366
36554
  }),
35367
- z66.object({
35368
- op: z66.literal("move"),
35369
- from: z66.string(),
35370
- path: z66.string()
36555
+ z67.object({
36556
+ op: z67.literal("move"),
36557
+ from: z67.string(),
36558
+ path: z67.string()
35371
36559
  }),
35372
- z66.object({
35373
- op: z66.literal("copy"),
35374
- from: z66.string(),
35375
- path: z66.string()
36560
+ z67.object({
36561
+ op: z67.literal("copy"),
36562
+ from: z67.string(),
36563
+ path: z67.string()
35376
36564
  }),
35377
36565
  // Block-level operations (Phase 2)
35378
- z66.object({
35379
- op: z66.literal("add_block"),
35380
- blockKind: z66.string(),
35381
- afterBlockId: z66.string().nullable(),
35382
- content: z66.record(z66.string(), z66.unknown()),
35383
- 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()
35384
36572
  }),
35385
- z66.object({
35386
- op: z66.literal("delete_block"),
35387
- blockId: z66.string(),
35388
- rationale: z66.string()
36573
+ z67.object({
36574
+ op: z67.literal("delete_block"),
36575
+ blockId: z67.string(),
36576
+ rationale: z67.string()
35389
36577
  }),
35390
- z66.object({
35391
- op: z66.literal("reorder_block"),
35392
- blockId: z66.string(),
35393
- afterBlockId: z66.string().nullable(),
35394
- 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()
35395
36583
  })
35396
36584
  ]);
35397
- var PlaygroundProposeRequest = z66.object({
35398
- request: z66.string().min(1).max(2e3)
36585
+ var PlaygroundProposeRequest = z67.object({
36586
+ request: z67.string().min(1).max(2e3)
35399
36587
  });
35400
- var MultiPagePatchEnvelope = z66.object({
35401
- pageId: z66.string(),
35402
- blockId: z66.string().optional(),
36588
+ var MultiPagePatchEnvelope = z67.object({
36589
+ pageId: z67.string(),
36590
+ blockId: z67.string().optional(),
35403
36591
  // Not present for page-level ops
35404
- blockKind: z66.string().optional(),
35405
- blockPurpose: z66.string().optional().nullable(),
35406
- ops: z66.array(Rfc6902PatchOp),
35407
- rationale: z66.string(),
35408
- 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()
35409
36597
  });
35410
- var MultiPageUpdateResponse = z66.object({
35411
- patches: z66.array(MultiPagePatchEnvelope),
35412
- assistantMessage: z66.string(),
35413
- pagesModified: z66.number(),
35414
- 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()
35415
36603
  });
35416
36604
 
35417
36605
  // src/data/prefetchBlockData.ts
@@ -36040,12 +37228,25 @@ function isPageContent(result) {
36040
37228
  function isEntryContent(result) {
36041
37229
  return result.type === "entry";
36042
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
+ }
36043
37237
  async function loadContent(params) {
36044
37238
  const { client, siteId, path, preview = false, forceSite } = params;
36045
- const [site, contentResponse] = await Promise.all([
37239
+ const [siteResult, contentResult] = await Promise.allSettled([
36046
37240
  client.getSite({ id: siteId, ...forceSite ? { force: true } : {} }),
36047
37241
  client.getPage({ siteId, path, preview })
36048
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;
36049
37250
  const customBlocks = resolveSiteCustomBlocks(site);
36050
37251
  const mediaAssets = Array.isArray(contentResponse.mediaAssets) && contentResponse.mediaAssets.length > 0 ? contentResponse.mediaAssets : void 0;
36051
37252
  if (isEntryResponse(contentResponse)) {