@riverbankcms/sdk 0.82.0 → 0.84.1

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 (206) hide show
  1. package/README.md +16 -0
  2. package/dist/{PreviewEditorSidebar-LHGK6RIO.mjs → PreviewEditorSidebar-X7RLMEI6.mjs} +330 -11
  3. package/dist/{PreviewEditorUI-AXZG2SDC.mjs → PreviewEditorUI-CT67N4O3.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-EIMQ3S2V.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +200 -0
  6. package/dist/_dts/api/src/blocks.d.ts +36 -0
  7. package/dist/_dts/api/src/contentRuntime.d.ts +46 -0
  8. package/dist/_dts/api/src/endpoints.d.ts +40 -0
  9. package/dist/_dts/api/src/index.d.ts +2 -2
  10. package/dist/_dts/api/src/sdk-event-pricing.d.ts +61 -0
  11. package/dist/_dts/api/src/sdk-event-schedule.d.ts +52 -0
  12. package/dist/_dts/api/src/sdk-event-upsert.d.ts +50 -0
  13. package/dist/_dts/api/src/sdkContracts.d.ts +67 -33
  14. package/dist/_dts/api/src/shared-contracts.d.ts +13 -0
  15. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +22 -36
  16. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +46 -1
  17. package/dist/_dts/block-form/src/backend/useBackendWatch.d.ts +6 -1
  18. package/dist/_dts/block-form/src/utils/evaluateVisibility.d.ts +3 -2
  19. package/dist/_dts/block-form/src/utils/visibleWhen.d.ts +7 -0
  20. package/dist/_dts/blocks/src/PageRenderer.d.ts +11 -0
  21. package/dist/_dts/blocks/src/bindings/index.d.ts +1 -1
  22. package/dist/_dts/blocks/src/client/site-chrome.d.ts +1 -1
  23. package/dist/_dts/blocks/src/client.d.ts +4 -0
  24. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +16 -4
  25. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -2016
  26. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -2016
  27. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -2016
  28. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -2016
  29. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -2016
  30. package/dist/_dts/blocks/src/system/blocks/contact-newsletter.d.ts +171 -0
  31. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +288 -2016
  32. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -2016
  33. package/dist/_dts/blocks/src/system/blocks/hero.d.ts +3 -2
  34. package/dist/_dts/blocks/src/system/blocks/index.d.ts +1 -0
  35. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -7
  36. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +2534 -151
  37. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -2016
  38. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -2016
  39. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -2016
  40. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +36 -3
  41. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +2 -2
  42. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  43. package/dist/_dts/blocks/src/system/fields/aspectRatio.d.ts +4 -1
  44. package/dist/_dts/blocks/src/system/fields/imageShape.d.ts +30 -0
  45. package/dist/_dts/blocks/src/system/fragments/library/heroLayoutControls.d.ts +25 -0
  46. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +35 -161
  47. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +24 -6
  48. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +12 -3
  49. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +33 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizard.d.ts +0 -2
  51. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/constants.d.ts +1 -0
  52. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +275 -0
  53. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.override.d.ts +10 -0
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.planning.d.ts +22 -0
  55. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.state.d.ts +3 -0
  56. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +20 -1
  57. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +13 -4
  58. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +1 -1
  59. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +28 -6
  60. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/pricing.d.ts +14 -0
  61. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +1 -1
  62. package/dist/_dts/content-editor/src/controller/buildBlockPublishedBaselines.d.ts +1 -1
  63. package/dist/_dts/content-editor/src/controller/seedDraftBaselinesFromBlocks.d.ts +1 -1
  64. package/dist/_dts/content-editor/src/controller/useBlocksList.d.ts +1 -1
  65. package/dist/_dts/content-editor/src/controller/useInvalidBlockRecovery.d.ts +1 -1
  66. package/dist/_dts/content-editor/src/primitives/PreviewRichTextEditor.d.ts +2 -1
  67. package/dist/_dts/content-editor/src/primitives/PreviewTextEditor.d.ts +1 -0
  68. package/dist/_dts/content-model/src/entry-slots/index.d.ts +1 -0
  69. package/dist/_dts/content-model/src/entry-slots/types.d.ts +356 -0
  70. package/dist/_dts/content-model/src/index.d.ts +1 -0
  71. package/dist/_dts/content-model/src/templates/defaults.d.ts +7 -0
  72. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +100 -5
  73. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +6 -1
  74. package/dist/_dts/editor-blocks/src/BlockForm.d.ts +7 -5
  75. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockCreation.d.ts +3 -2
  76. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockDuplication.d.ts +3 -2
  77. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockReorder.d.ts +3 -2
  78. package/dist/_dts/editor-blocks/src/block-editor/owner.d.ts +27 -0
  79. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  80. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +8 -0
  81. package/dist/_dts/media-core/src/mediaUsageProjection.d.ts +37 -3
  82. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +4 -2
  83. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  84. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +3 -1
  85. package/dist/_dts/preview-next/src/client/preview/EntrySlotBlockEditorPanel.d.ts +19 -0
  86. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +8 -0
  87. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -1
  88. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +1 -1
  89. package/dist/_dts/preview-next/src/client/preview/linkedEntryEditEvents.d.ts +9 -0
  90. package/dist/_dts/preview-next/src/client/preview/previewCustomizeControls.d.ts +9 -8
  91. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +10 -1
  92. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +5 -1
  93. package/dist/_dts/sdk/src/bookings/index.d.ts +5 -4
  94. package/dist/_dts/sdk/src/bookings/types.d.ts +2 -2
  95. package/dist/_dts/sdk/src/cli/content/reader.d.ts +9 -8
  96. package/dist/_dts/sdk/src/cli/content/writer.d.ts +6 -1
  97. package/dist/_dts/sdk/src/cli/helpers.d.ts +10 -5
  98. package/dist/_dts/sdk/src/cli/merge-remote/entryLocal.d.ts +2 -2
  99. package/dist/_dts/sdk/src/cli/merge-remote/entryMerge.d.ts +2 -1
  100. package/dist/_dts/sdk/src/cli/merge-remote/entrySnapshots.d.ts +2 -2
  101. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -1
  102. package/dist/_dts/sdk/src/client/management/types.d.ts +40 -10
  103. package/dist/_dts/sdk/src/config/field-definitions.d.ts +13 -7
  104. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +26 -3
  105. package/dist/_dts/sdk/src/public-api/contracts.d.ts +13 -0
  106. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +1 -0
  107. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +6 -1
  108. package/dist/_dts/sdk/src/rendering/overrides.d.ts +6 -1
  109. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  110. package/dist/_dts/sdk/src/version.d.ts +1 -1
  111. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  112. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  113. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  114. package/dist/_dts/theme-core/src/buttons/personalities/ornate-ritual.d.ts +16 -0
  115. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +1 -1
  116. package/dist/_dts/theme-core/src/buttons/types.d.ts +3 -3
  117. package/dist/_dts/theme-core/src/cards/types.d.ts +15 -15
  118. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  119. package/dist/_dts/theme-core/src/inputs/types.d.ts +1 -1
  120. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +33 -33
  121. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  122. package/dist/_dts/theme-core/src/palette/variants/warm-dark.d.ts +16 -0
  123. package/dist/_dts/theme-core/src/schema.d.ts +30 -25
  124. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  125. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +141 -1
  126. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -0
  127. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +110 -5
  128. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  129. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  130. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +5 -1
  131. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +1 -1
  132. package/dist/_dts/theme-core/src/site-styles/types.d.ts +1 -1
  133. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +16 -1
  134. package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +1 -0
  135. package/dist/_dts/theme-core/src/utils/colorStyles.d.ts +6 -6
  136. package/dist/{chunk-2BUMISSH.mjs → chunk-3LXFQS7T.mjs} +1 -1
  137. package/dist/{chunk-FIREV57T.mjs → chunk-LBBPD2IW.mjs} +40 -0
  138. package/dist/{chunk-XQR6THQJ.mjs → chunk-O62NDCTI.mjs} +3390 -1331
  139. package/dist/{chunk-6FWNF3DJ.mjs → chunk-QRKJDWT7.mjs} +158 -20
  140. package/dist/{chunk-HKB6XVIP.mjs → chunk-RCTJAZSK.mjs} +2 -2
  141. package/dist/{chunk-G35HOQEN.mjs → chunk-X5ZCSU6F.mjs} +132 -46
  142. package/dist/cli/index.mjs +2925 -577
  143. package/dist/cli/init-docs/content/agents-section.md +5 -0
  144. package/dist/cli/init-docs/content/cli-reference.md +13 -0
  145. package/dist/cli/init-docs/content/content-management.md +31 -0
  146. package/dist/cli/init-docs/content/getting-started.md +14 -0
  147. package/dist/cli/init-docs/content/workflow-add-block.md +3 -1
  148. package/dist/cli/init-docs/content/workflow-agent-safe-sync.md +81 -0
  149. package/dist/cli/init-docs/content/workflow-create-page.md +13 -3
  150. package/dist/cli/init-docs/content/workflow-custom-block.md +9 -0
  151. package/dist/cli/init-docs/content/workflow-templates.md +107 -2
  152. package/dist/client/{accordion-G34C45TW.mjs → accordion-2UZPBMYM.mjs} +2 -2
  153. package/dist/client/{bookingForm-BLBVKSAQ.mjs → bookingForm-DYXT6YB6.mjs} +5 -5
  154. package/dist/client/bookings.mjs +3477 -186
  155. package/dist/client/{carousel-7ZVTBRMD.mjs → carousel-QH77HR6X.mjs} +3 -3
  156. package/dist/client/{cart-Q6S6LZUO.mjs → cart-X4YK4FTW.mjs} +6 -6
  157. package/dist/client/{checkout-5QJLDE4I.mjs → checkout-OM2BEPWD.mjs} +6 -6
  158. package/dist/client/{chunk-ZF4XEWDM.mjs → chunk-3DTWLTXM.mjs} +1 -1
  159. package/dist/client/{chunk-5PQH4Y75.mjs → chunk-4OXKTA3D.mjs} +2 -2
  160. package/dist/client/{chunk-WJFHDTYF.mjs → chunk-52CGCQ7B.mjs} +5 -5
  161. package/dist/client/{chunk-CHAB5ACD.mjs → chunk-7UCLJ5SP.mjs} +2 -2
  162. package/dist/client/{chunk-U2EW7RSR.mjs → chunk-F5VRX5Y6.mjs} +1 -1
  163. package/dist/client/{chunk-SBBSMFFG.mjs → chunk-SYIJ5JO2.mjs} +1 -1
  164. package/dist/client/{chunk-EQKYMX4N.mjs → chunk-UHDWIXVR.mjs} +180 -157
  165. package/dist/client/{chunk-RJHTCTCZ.mjs → chunk-VGDBVNOO.mjs} +429 -15
  166. package/dist/client/{chunk-S3MKFGOG.mjs → chunk-ZE5G642V.mjs} +1 -1
  167. package/dist/client/{chunk-CSZGLBYR.mjs → chunk-ZKUO52W3.mjs} +1 -1
  168. package/dist/client/client.mjs +2685 -847
  169. package/dist/client/{courseRegistration-VUG2JJDB.mjs → courseRegistration-YBOGURTA.mjs} +5 -5
  170. package/dist/client/{eventCalendar-E7D2LD4N.mjs → eventCalendar-K4QJVCMD.mjs} +7 -7
  171. package/dist/client/{eventCombined-FUZ2Z3CS.mjs → eventCombined-MTXGMTCZ.mjs} +7 -7
  172. package/dist/client/{eventDetails-QRITJAOW.mjs → eventDetails-3PC4NL3U.mjs} +7 -7
  173. package/dist/client/{eventListing-INMQMJZ5.mjs → eventListing-TFJET6DN.mjs} +7 -7
  174. package/dist/client/{eventRegistration-TOOJD4WU.mjs → eventRegistration-QGPBGJTW.mjs} +7 -7
  175. package/dist/client/{form-BOWN7ZNQ.mjs → form-MDKR4FNB.mjs} +2 -2
  176. package/dist/client/{headerSection-HFQNZOUU.mjs → headerSection-Y5TMR3TW.mjs} +3 -3
  177. package/dist/client/hooks.mjs +2077 -546
  178. package/dist/client/{locationMap-VUZGC7Y5.mjs → locationMap-RH2LG7FZ.mjs} +2 -2
  179. package/dist/client/{newsletterForm-X2XQTPCB.mjs → newsletterForm-ZR5UDGBT.mjs} +2 -2
  180. package/dist/client/{productDetail-TA7D2G2B.mjs → productDetail-OIGDR4YE.mjs} +6 -6
  181. package/dist/client/{productList-AZOLOZKM.mjs → productList-4MA5S2CX.mjs} +6 -6
  182. package/dist/client/rendering/client.mjs +2560 -1205
  183. package/dist/client/rendering/islands.mjs +19 -19
  184. package/dist/client/rendering.mjs +2932 -1021
  185. package/dist/client/{shop-ZDLO7IIG.mjs → shop-WXSYV5QO.mjs} +6 -6
  186. package/dist/preview-next/before-render.mjs +40 -0
  187. package/dist/preview-next/client/runtime.mjs +5 -5
  188. package/dist/preview-next/middleware.mjs +40 -0
  189. package/dist/{sdk-runtime-CTWKNBDQ.mjs → sdk-runtime-7HJYPRWQ.mjs} +6 -6
  190. package/dist/server/components.mjs +2232 -534
  191. package/dist/server/config-validation.mjs +2068 -536
  192. package/dist/server/config.mjs +2068 -536
  193. package/dist/server/data.mjs +2077 -546
  194. package/dist/server/index.mjs +42 -1
  195. package/dist/server/next.mjs +2345 -574
  196. package/dist/server/page-converter.mjs +2684 -1220
  197. package/dist/server/prebuild.mjs +1 -1
  198. package/dist/server/rendering/server.mjs +2244 -546
  199. package/dist/server/rendering.mjs +2323 -552
  200. package/dist/server/routing.mjs +2012 -420
  201. package/dist/server/server.mjs +2153 -549
  202. package/dist/server/theme-bridge.mjs +1180 -101
  203. package/dist/server/theme.mjs +92 -1
  204. package/dist/styles/index.css +292 -36
  205. package/package.json +1 -1
  206. package/dist/SdkPreviewModeRuntime-RNVRHFFR.mjs +0 -8
@@ -3246,6 +3246,46 @@ var ENDPOINT_DEFINITIONS = {
3246
3246
  auth: "user",
3247
3247
  responseKind: "json"
3248
3248
  },
3249
+ listEntrySlotBlocks: {
3250
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3251
+ method: "GET",
3252
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3253
+ auth: "user",
3254
+ responseKind: "json",
3255
+ errors: ["resource:not_found"]
3256
+ },
3257
+ listEntryPageContentSlots: {
3258
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots",
3259
+ method: "GET",
3260
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slots", "blocks"],
3261
+ auth: "user",
3262
+ responseKind: "json",
3263
+ errors: ["resource:not_found"]
3264
+ },
3265
+ createEntrySlotBlock: {
3266
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3267
+ method: "POST",
3268
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3269
+ auth: "user",
3270
+ responseKind: "json",
3271
+ errors: ["validation:invalid_input", "resource:not_found"]
3272
+ },
3273
+ reorderEntrySlotBlocks: {
3274
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/reorder",
3275
+ method: "POST",
3276
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3277
+ auth: "user",
3278
+ responseKind: "json",
3279
+ errors: ["validation:invalid_input", "resource:not_found"]
3280
+ },
3281
+ deleteEntrySlotBlock: {
3282
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/{blockId}",
3283
+ method: "DELETE",
3284
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3285
+ auth: "user",
3286
+ responseKind: "json",
3287
+ errors: ["resource:not_found"]
3288
+ },
3249
3289
  createBlock: {
3250
3290
  path: "/sites/{siteId}/pages/{pageId}/blocks",
3251
3291
  method: "POST",
@@ -6338,6 +6378,171 @@ var ENDPOINT_DEFINITIONS = {
6338
6378
  }
6339
6379
  };
6340
6380
 
6381
+ // ../core/src/result.ts
6382
+ function ok(value) {
6383
+ return { ok: true, value };
6384
+ }
6385
+ function err(error) {
6386
+ return { ok: false, error };
6387
+ }
6388
+
6389
+ // ../core/src/event-pricing.ts
6390
+ function publicEventPricingType(pricing) {
6391
+ switch (pricing.kind) {
6392
+ case "drop_in":
6393
+ case "free_registration":
6394
+ return "free";
6395
+ case "single_paid":
6396
+ case "ticket_types":
6397
+ case "course":
6398
+ return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
6399
+ }
6400
+ }
6401
+ function isFreePublicEventPriceDisplay(display) {
6402
+ switch (display.kind) {
6403
+ case "free":
6404
+ return true;
6405
+ case "course":
6406
+ return display.display.kind === "free";
6407
+ case "exact":
6408
+ case "from":
6409
+ case "mixed":
6410
+ case "unavailable":
6411
+ return false;
6412
+ }
6413
+ }
6414
+
6415
+ // ../core/src/booking-date-time.ts
6416
+ var DEFAULT_LOCALE = "en-US";
6417
+ var FALLBACK_TIMEZONE = "UTC";
6418
+ function isValidTimeZone(timeZone) {
6419
+ try {
6420
+ new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
6421
+ return true;
6422
+ } catch {
6423
+ return false;
6424
+ }
6425
+ }
6426
+ function getSafeTimeZone(timeZone) {
6427
+ const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
6428
+ return normalized && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
6429
+ }
6430
+ function parseStrictBookingTimeZone(timeZone) {
6431
+ const normalized = timeZone.trim();
6432
+ if (!normalized || !isValidTimeZone(normalized)) {
6433
+ return null;
6434
+ }
6435
+ return normalized;
6436
+ }
6437
+ function formatParseError(error) {
6438
+ switch (error.reason) {
6439
+ case "invalid_starts_at":
6440
+ return `Expected a valid UTC/offset-aware ISO datetime in startsAt, received "${error.value}"`;
6441
+ case "invalid_ends_at":
6442
+ return `Expected a valid UTC/offset-aware ISO datetime in endsAt, received "${error.value ?? ""}"`;
6443
+ case "invalid_time_zone":
6444
+ return `Expected a valid IANA timezone in timeZone, received "${error.value}"`;
6445
+ }
6446
+ }
6447
+ function formatToPartsLookup(date, locale, timeZone, format) {
6448
+ return new Map(
6449
+ new Intl.DateTimeFormat(locale, {
6450
+ ...format,
6451
+ timeZone
6452
+ }).formatToParts(date).map((part) => [part.type, part.value])
6453
+ );
6454
+ }
6455
+ function getZonedDateTimeParts(date, timeZone) {
6456
+ const parts = formatToPartsLookup(date, "en-GB", timeZone, {
6457
+ year: "numeric",
6458
+ month: "2-digit",
6459
+ day: "2-digit",
6460
+ hour: "2-digit",
6461
+ minute: "2-digit",
6462
+ second: "2-digit",
6463
+ hour12: false
6464
+ });
6465
+ const read = (type) => Number(parts.get(type) ?? "");
6466
+ return {
6467
+ year: read("year"),
6468
+ month: read("month"),
6469
+ day: read("day"),
6470
+ hour: read("hour"),
6471
+ minute: read("minute"),
6472
+ second: read("second")
6473
+ };
6474
+ }
6475
+ function formatDateKey(date) {
6476
+ const year = String(date.year).padStart(4, "0");
6477
+ const month = String(date.month).padStart(2, "0");
6478
+ const day = String(date.day).padStart(2, "0");
6479
+ return `${year}-${month}-${day}`;
6480
+ }
6481
+ function parseUtcIsoDateTimeString(value) {
6482
+ const normalized = value.trim();
6483
+ const hasUtcSuffix = normalized.endsWith("Z");
6484
+ const hasExplicitOffset = /[+-]\d{2}:\d{2}$/u.test(normalized);
6485
+ if (!hasUtcSuffix && !hasExplicitOffset) {
6486
+ return err("missing-timezone-offset");
6487
+ }
6488
+ const date = new Date(normalized);
6489
+ if (Number.isNaN(date.getTime())) {
6490
+ return err("invalid-date-time");
6491
+ }
6492
+ return ok(date.toISOString());
6493
+ }
6494
+ function toUtcIsoDateTimeString(value) {
6495
+ const parsed = parseUtcIsoDateTimeString(value);
6496
+ if (!parsed.ok) {
6497
+ const message = parsed.error === "missing-timezone-offset" ? `Expected an offset-aware ISO datetime, received "${value}"` : `Expected a valid ISO datetime, received "${value}"`;
6498
+ throw new Error(message);
6499
+ }
6500
+ return parsed.value;
6501
+ }
6502
+ function parseScheduledBookingDateTime(input) {
6503
+ try {
6504
+ const startsAt = toUtcIsoDateTimeString(input.startsAt);
6505
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
6506
+ if (!timeZone) {
6507
+ return {
6508
+ ok: false,
6509
+ field: "timeZone",
6510
+ reason: "invalid_time_zone",
6511
+ value: input.timeZone
6512
+ };
6513
+ }
6514
+ return {
6515
+ ok: true,
6516
+ value: {
6517
+ startsAt,
6518
+ timeZone,
6519
+ locale: input.locale
6520
+ }
6521
+ };
6522
+ } catch {
6523
+ return {
6524
+ ok: false,
6525
+ field: "startsAt",
6526
+ reason: "invalid_starts_at",
6527
+ value: input.startsAt
6528
+ };
6529
+ }
6530
+ }
6531
+ function toScheduledBookingDateTime(input) {
6532
+ const result = parseScheduledBookingDateTime(input);
6533
+ if (result.ok) {
6534
+ return result.value;
6535
+ }
6536
+ throw new Error(formatParseError(result));
6537
+ }
6538
+ function getBookingLocalDateKey(input) {
6539
+ return formatDateKey(getLocalScheduleDate(new Date(input.startsAt), input.timeZone));
6540
+ }
6541
+ function getLocalScheduleDate(date, timeZone) {
6542
+ const parts = getZonedDateTimeParts(date, getSafeTimeZone(timeZone));
6543
+ return { year: parts.year, month: parts.month, day: parts.day };
6544
+ }
6545
+
6341
6546
  // ../core/src/location.ts
6342
6547
  function normalizeLocationAddressText(value) {
6343
6548
  if (typeof value !== "string") {
@@ -6882,6 +7087,21 @@ var selectSourceSchema = z4.discriminatedUnion("kind", [
6882
7087
  function assertNeverSelectSource(value) {
6883
7088
  throw new Error(`Unhandled select source: ${JSON.stringify(value)}`);
6884
7089
  }
7090
+ var visibleWhenPredicateSchema = z4.object({
7091
+ field: z4.string().min(1),
7092
+ equals: z4.any().optional(),
7093
+ notEquals: z4.any().optional(),
7094
+ oneOf: z4.array(z4.any()).optional(),
7095
+ notIn: z4.array(z4.any()).optional(),
7096
+ minItems: z4.number().int().nonnegative().optional(),
7097
+ maxItems: z4.number().int().nonnegative().optional()
7098
+ });
7099
+ var visibleWhenSchema = z4.union([
7100
+ visibleWhenPredicateSchema,
7101
+ z4.object({
7102
+ allOf: z4.array(visibleWhenPredicateSchema).min(1)
7103
+ })
7104
+ ]);
6885
7105
  var uiSchema = z4.object({
6886
7106
  widget: z4.string().optional(),
6887
7107
  // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)
@@ -6914,13 +7134,7 @@ var uiSchema = z4.object({
6914
7134
  showValue: z4.boolean().optional(),
6915
7135
  pattern: z4.string().optional(),
6916
7136
  placeholder: z4.string().optional(),
6917
- visibleWhen: z4.object({
6918
- field: z4.string().min(1),
6919
- equals: z4.any().optional(),
6920
- notEquals: z4.any().optional(),
6921
- oneOf: z4.array(z4.any()).optional(),
6922
- notIn: z4.array(z4.any()).optional()
6923
- }).optional(),
7137
+ visibleWhen: visibleWhenSchema.optional(),
6924
7138
  // Modal configuration for modal and group fields
6925
7139
  modalConfig: z4.object({
6926
7140
  buttonLabel: z4.string().optional(),
@@ -7687,6 +7901,7 @@ var eventListTreatmentValues = [
7687
7901
  ];
7688
7902
  var eyebrowTreatmentValues = [
7689
7903
  "plain",
7904
+ "accent",
7690
7905
  "pill",
7691
7906
  "accent-pill",
7692
7907
  "pill-bounce",
@@ -9278,9 +9493,9 @@ var _Vibrant = class _Vibrant2 {
9278
9493
  }
9279
9494
  image.remove();
9280
9495
  return res;
9281
- } catch (err) {
9496
+ } catch (err2) {
9282
9497
  image.remove();
9283
- return Promise.reject(err);
9498
+ return Promise.reject(err2);
9284
9499
  }
9285
9500
  }
9286
9501
  async getPalettes() {
@@ -9294,9 +9509,9 @@ var _Vibrant = class _Vibrant2 {
9294
9509
  const res = result1.palettes;
9295
9510
  image.remove();
9296
9511
  return res;
9297
- } catch (err) {
9512
+ } catch (err2) {
9298
9513
  image.remove();
9299
- return Promise.reject(err);
9514
+ return Promise.reject(err2);
9300
9515
  }
9301
9516
  }
9302
9517
  };
@@ -10701,27 +10916,28 @@ var joyStamp = defineButtonPersonality({
10701
10916
  }
10702
10917
  });
10703
10918
 
10704
- // ../theme-core/src/buttons/personalities/pebble.ts
10705
- var pebble = defineButtonPersonality({
10706
- id: "pebble",
10707
- name: "Pebble",
10708
- description: "Generous pill buttons with a quiet colour-softening hover.",
10709
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
10919
+ // ../theme-core/src/buttons/personalities/ornate-ritual.ts
10920
+ var ornateRitual = defineButtonPersonality({
10921
+ id: "ornate-ritual",
10922
+ name: "Ornate Ritual",
10923
+ description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
10924
+ tags: { tone: "classic", energy: "vibrant", motion: "subtle", era: "organic" },
10710
10925
  buttonSystem: {
10711
10926
  global: {
10712
- cornerStyle: "pill",
10927
+ cornerStyle: "rounded",
10713
10928
  shadow: "none",
10714
- textTransform: "none",
10715
- fontWeight: 500,
10716
- borderWidth: 2,
10929
+ textTransform: "uppercase",
10930
+ fontWeight: 600,
10931
+ borderWidth: 1,
10717
10932
  hoverTransform: "none",
10718
- hoverColor: "none"
10933
+ hoverColor: "none",
10934
+ letterSpacing: "loose"
10719
10935
  },
10720
10936
  sizes: {
10721
- sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
10722
- md: { padding: "0.875rem 2.25rem" },
10723
- lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
10724
- xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
10937
+ sm: { padding: "0.5625rem 1.25rem", fontSize: "text-xs" },
10938
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-xs" },
10939
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-sm" },
10940
+ xl: { padding: "1rem 2.75rem", fontSize: "text-base" }
10725
10941
  },
10726
10942
  variants: [
10727
10943
  {
@@ -10731,97 +10947,12 @@ var pebble = defineButtonPersonality({
10731
10947
  priority: 1,
10732
10948
  background: { type: "solid", colorToken: "primary" },
10733
10949
  textColorToken: "primaryForeground",
10734
- borderRadius: "rounded-full",
10735
- effects: {
10736
- hover: [
10737
- { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 88 } }
10738
- ]
10739
- }
10740
- },
10741
- {
10742
- id: "secondary",
10743
- name: "Secondary",
10744
- enabled: true,
10745
- priority: 2,
10746
- background: { type: "transparent" },
10747
- textColorToken: "primary",
10748
- borderRadius: "rounded-full",
10749
- border: { widthClass: "border-2", colorToken: "accent" },
10750
- effects: {
10751
- hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
10752
- }
10753
- },
10754
- {
10755
- id: "outline",
10756
- name: "Outline",
10757
- enabled: true,
10758
- priority: 3,
10759
- background: { type: "transparent" },
10760
- textColorToken: "text",
10761
- borderRadius: "rounded-full",
10762
- border: { widthClass: "border", colorToken: "border" },
10763
- effects: {
10764
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10765
- }
10766
- },
10767
- {
10768
- id: "ghost",
10769
- name: "Ghost",
10770
- enabled: true,
10771
- priority: 3,
10772
- background: { type: "transparent" },
10773
- textColorToken: "primary",
10774
- borderRadius: "rounded-full",
10775
- sizes: {
10776
- sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
10777
- md: { padding: "0.5rem 1rem" },
10778
- lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
10779
- xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
10780
- },
10781
- effects: {
10782
- hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
10783
- }
10784
- }
10785
- ]
10786
- }
10787
- });
10788
-
10789
- // ../theme-core/src/buttons/personalities/showtime-pill.ts
10790
- var showtimePill = defineButtonPersonality({
10791
- id: "showtime-pill",
10792
- name: "Showtime Pill",
10793
- description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
10794
- tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
10795
- buttonSystem: {
10796
- global: {
10797
- cornerStyle: "pill",
10798
- shadow: "low",
10799
- textTransform: "uppercase",
10800
- fontWeight: 700,
10801
- borderWidth: 2,
10802
- hoverTransform: "lift",
10803
- hoverColor: "darken",
10804
- typography: "body",
10805
- paddingPreset: "spacious",
10806
- italic: false
10807
- },
10808
- sizes: {
10809
- sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
10810
- md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
10811
- lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
10812
- xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
10813
- },
10814
- variants: [
10815
- {
10816
- id: "primary",
10817
- name: "Primary",
10818
- enabled: true,
10819
- priority: 1,
10820
- background: { type: "solid", colorToken: "primary" },
10821
- textColorToken: "background",
10822
- borderRadius: "rounded-full",
10950
+ borderRadius: "rounded-md",
10951
+ border: { widthClass: "border", colorToken: "primary" },
10952
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10823
10953
  effects: {
10824
- hover: [{ effectId: "pop" }]
10954
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "primary-100" } }],
10955
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
10825
10956
  }
10826
10957
  },
10827
10958
  {
@@ -10829,35 +10960,11 @@ var showtimePill = defineButtonPersonality({
10829
10960
  name: "Secondary",
10830
10961
  enabled: true,
10831
10962
  priority: 2,
10832
- background: { type: "transparent" },
10833
- textColorToken: "primary",
10834
- borderRadius: "rounded-full",
10835
- border: { widthClass: "border-2", colorToken: "primary" },
10836
- effects: {
10837
- hover: [{ effectId: "pop" }]
10838
- }
10839
- },
10840
- {
10841
- id: "hero",
10842
- name: "Hero",
10843
- enabled: true,
10844
- priority: 1,
10845
10963
  background: { type: "solid", colorToken: "secondary" },
10846
- textColorToken: "primary",
10847
- borderRadius: "rounded-full",
10848
- effects: {
10849
- hover: [{ effectId: "pop" }]
10850
- }
10851
- },
10852
- {
10853
- id: "header",
10854
- name: "Header",
10855
- enabled: true,
10856
- priority: 2,
10857
- background: { type: "solid", colorToken: "background" },
10858
- textColorToken: "primary",
10859
- borderRadius: "rounded-full",
10860
- border: { widthClass: "border-2", colorToken: "primary" },
10964
+ textColorToken: "primaryForeground",
10965
+ borderRadius: "rounded-md",
10966
+ border: { widthClass: "border", colorToken: "primary" },
10967
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10861
10968
  effects: {
10862
10969
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10863
10970
  }
@@ -10869,10 +10976,11 @@ var showtimePill = defineButtonPersonality({
10869
10976
  priority: 3,
10870
10977
  background: { type: "transparent" },
10871
10978
  textColorToken: "primary",
10872
- borderRadius: "rounded-full",
10873
- border: { widthClass: "border-2", colorToken: "primary" },
10979
+ borderRadius: "rounded-md",
10980
+ border: { widthClass: "border", colorToken: "primary" },
10981
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10874
10982
  effects: {
10875
- hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
10983
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
10876
10984
  }
10877
10985
  },
10878
10986
  {
@@ -10881,32 +10989,44 @@ var showtimePill = defineButtonPersonality({
10881
10989
  enabled: true,
10882
10990
  priority: 3,
10883
10991
  background: { type: "transparent" },
10884
- textColorToken: "primary",
10885
- borderRadius: "rounded-full",
10992
+ textColorToken: "accent",
10993
+ borderRadius: "rounded-none",
10994
+ sizes: {
10995
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
10996
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
10997
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
10998
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
10999
+ },
10886
11000
  effects: {
10887
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11001
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
10888
11002
  }
10889
11003
  }
10890
11004
  ]
10891
11005
  }
10892
11006
  });
10893
11007
 
10894
- // ../theme-core/src/buttons/personalities/soft-pill.ts
10895
- var softPill = defineButtonPersonality({
10896
- id: "soft-pill",
10897
- name: "Soft Pill",
10898
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
10899
- tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
11008
+ // ../theme-core/src/buttons/personalities/pebble.ts
11009
+ var pebble = defineButtonPersonality({
11010
+ id: "pebble",
11011
+ name: "Pebble",
11012
+ description: "Generous pill buttons with a quiet colour-softening hover.",
11013
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
10900
11014
  buttonSystem: {
10901
11015
  global: {
10902
11016
  cornerStyle: "pill",
10903
- shadow: "low",
11017
+ shadow: "none",
10904
11018
  textTransform: "none",
10905
11019
  fontWeight: 500,
10906
11020
  borderWidth: 2,
10907
- hoverTransform: "lift",
11021
+ hoverTransform: "none",
10908
11022
  hoverColor: "none"
10909
11023
  },
11024
+ sizes: {
11025
+ sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
11026
+ md: { padding: "0.875rem 2.25rem" },
11027
+ lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
11028
+ xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
11029
+ },
10910
11030
  variants: [
10911
11031
  {
10912
11032
  id: "primary",
@@ -10916,10 +11036,10 @@ var softPill = defineButtonPersonality({
10916
11036
  background: { type: "solid", colorToken: "primary" },
10917
11037
  textColorToken: "primaryForeground",
10918
11038
  borderRadius: "rounded-full",
10919
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
10920
11039
  effects: {
10921
- hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
10922
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
11040
+ hover: [
11041
+ { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 88 } }
11042
+ ]
10923
11043
  }
10924
11044
  },
10925
11045
  {
@@ -10930,9 +11050,193 @@ var softPill = defineButtonPersonality({
10930
11050
  background: { type: "transparent" },
10931
11051
  textColorToken: "primary",
10932
11052
  borderRadius: "rounded-full",
10933
- border: { widthClass: "border-2", colorToken: "primary" },
11053
+ border: { widthClass: "border-2", colorToken: "accent" },
10934
11054
  effects: {
10935
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11055
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
11056
+ }
11057
+ },
11058
+ {
11059
+ id: "outline",
11060
+ name: "Outline",
11061
+ enabled: true,
11062
+ priority: 3,
11063
+ background: { type: "transparent" },
11064
+ textColorToken: "text",
11065
+ borderRadius: "rounded-full",
11066
+ border: { widthClass: "border", colorToken: "border" },
11067
+ effects: {
11068
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11069
+ }
11070
+ },
11071
+ {
11072
+ id: "ghost",
11073
+ name: "Ghost",
11074
+ enabled: true,
11075
+ priority: 3,
11076
+ background: { type: "transparent" },
11077
+ textColorToken: "primary",
11078
+ borderRadius: "rounded-full",
11079
+ sizes: {
11080
+ sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
11081
+ md: { padding: "0.5rem 1rem" },
11082
+ lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
11083
+ xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
11084
+ },
11085
+ effects: {
11086
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
11087
+ }
11088
+ }
11089
+ ]
11090
+ }
11091
+ });
11092
+
11093
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
11094
+ var showtimePill = defineButtonPersonality({
11095
+ id: "showtime-pill",
11096
+ name: "Showtime Pill",
11097
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
11098
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
11099
+ buttonSystem: {
11100
+ global: {
11101
+ cornerStyle: "pill",
11102
+ shadow: "low",
11103
+ textTransform: "uppercase",
11104
+ fontWeight: 700,
11105
+ borderWidth: 2,
11106
+ hoverTransform: "lift",
11107
+ hoverColor: "darken",
11108
+ typography: "body",
11109
+ paddingPreset: "spacious",
11110
+ italic: false
11111
+ },
11112
+ sizes: {
11113
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
11114
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
11115
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
11116
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
11117
+ },
11118
+ variants: [
11119
+ {
11120
+ id: "primary",
11121
+ name: "Primary",
11122
+ enabled: true,
11123
+ priority: 1,
11124
+ background: { type: "solid", colorToken: "primary" },
11125
+ textColorToken: "background",
11126
+ borderRadius: "rounded-full",
11127
+ effects: {
11128
+ hover: [{ effectId: "pop" }]
11129
+ }
11130
+ },
11131
+ {
11132
+ id: "secondary",
11133
+ name: "Secondary",
11134
+ enabled: true,
11135
+ priority: 2,
11136
+ background: { type: "transparent" },
11137
+ textColorToken: "primary",
11138
+ borderRadius: "rounded-full",
11139
+ border: { widthClass: "border-2", colorToken: "primary" },
11140
+ effects: {
11141
+ hover: [{ effectId: "pop" }]
11142
+ }
11143
+ },
11144
+ {
11145
+ id: "hero",
11146
+ name: "Hero",
11147
+ enabled: true,
11148
+ priority: 1,
11149
+ background: { type: "solid", colorToken: "secondary" },
11150
+ textColorToken: "primary",
11151
+ borderRadius: "rounded-full",
11152
+ effects: {
11153
+ hover: [{ effectId: "pop" }]
11154
+ }
11155
+ },
11156
+ {
11157
+ id: "header",
11158
+ name: "Header",
11159
+ enabled: true,
11160
+ priority: 2,
11161
+ background: { type: "solid", colorToken: "background" },
11162
+ textColorToken: "primary",
11163
+ borderRadius: "rounded-full",
11164
+ border: { widthClass: "border-2", colorToken: "primary" },
11165
+ effects: {
11166
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11167
+ }
11168
+ },
11169
+ {
11170
+ id: "outline",
11171
+ name: "Outline",
11172
+ enabled: true,
11173
+ priority: 3,
11174
+ background: { type: "transparent" },
11175
+ textColorToken: "primary",
11176
+ borderRadius: "rounded-full",
11177
+ border: { widthClass: "border-2", colorToken: "primary" },
11178
+ effects: {
11179
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
11180
+ }
11181
+ },
11182
+ {
11183
+ id: "ghost",
11184
+ name: "Ghost",
11185
+ enabled: true,
11186
+ priority: 3,
11187
+ background: { type: "transparent" },
11188
+ textColorToken: "primary",
11189
+ borderRadius: "rounded-full",
11190
+ effects: {
11191
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11192
+ }
11193
+ }
11194
+ ]
11195
+ }
11196
+ });
11197
+
11198
+ // ../theme-core/src/buttons/personalities/soft-pill.ts
11199
+ var softPill = defineButtonPersonality({
11200
+ id: "soft-pill",
11201
+ name: "Soft Pill",
11202
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
11203
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
11204
+ buttonSystem: {
11205
+ global: {
11206
+ cornerStyle: "pill",
11207
+ shadow: "low",
11208
+ textTransform: "none",
11209
+ fontWeight: 500,
11210
+ borderWidth: 2,
11211
+ hoverTransform: "lift",
11212
+ hoverColor: "none"
11213
+ },
11214
+ variants: [
11215
+ {
11216
+ id: "primary",
11217
+ name: "Primary",
11218
+ enabled: true,
11219
+ priority: 1,
11220
+ background: { type: "solid", colorToken: "primary" },
11221
+ textColorToken: "primaryForeground",
11222
+ borderRadius: "rounded-full",
11223
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
11224
+ effects: {
11225
+ hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
11226
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
11227
+ }
11228
+ },
11229
+ {
11230
+ id: "secondary",
11231
+ name: "Secondary",
11232
+ enabled: true,
11233
+ priority: 2,
11234
+ background: { type: "transparent" },
11235
+ textColorToken: "primary",
11236
+ borderRadius: "rounded-full",
11237
+ border: { widthClass: "border-2", colorToken: "primary" },
11238
+ effects: {
11239
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10936
11240
  }
10937
11241
  },
10938
11242
  {
@@ -10974,7 +11278,8 @@ var buttonPersonalities = [
10974
11278
  inkStamp,
10975
11279
  brushedWash,
10976
11280
  showtimePill,
10977
- joyStamp
11281
+ joyStamp,
11282
+ ornateRitual
10978
11283
  ];
10979
11284
  var personalitiesById = new Map(
10980
11285
  buttonPersonalities.map((p) => [p.id, p])
@@ -11604,7 +11909,7 @@ function rgbColorValue(token) {
11604
11909
  if (alpha === void 0) {
11605
11910
  return `rgb(var(${cssVar}))`;
11606
11911
  }
11607
- return `rgba(var(${cssVar}), ${alpha})`;
11912
+ return `rgb(var(${cssVar}) / ${alpha})`;
11608
11913
  }
11609
11914
  function backgroundColorStyle(token) {
11610
11915
  return { backgroundColor: rgbColorValue(token) };
@@ -12709,6 +13014,28 @@ var warmDarkEmber = definePaletteVariant({
12709
13014
  { name: "border", hex: "#894e31" }
12710
13015
  ]
12711
13016
  });
13017
+ var warmDarkKirtanGold = definePaletteVariant({
13018
+ id: "warm-dark-kirtan-gold",
13019
+ name: "Warm Dark \u2014 Kirtan Gold",
13020
+ description: "Deep plum ground with pale gold primary, rose accent, and soft devotional text.",
13021
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
13022
+ mode: "dark",
13023
+ colors: [
13024
+ { name: "primary", hex: "#ffcdb2" },
13025
+ { name: "secondary", hex: "#b5838d" },
13026
+ { name: "accent", hex: "#e5989b" },
13027
+ { name: "success", hex: "#8fbf8f" },
13028
+ { name: "warning", hex: "#f2b86b" },
13029
+ { name: "destructive", hex: "#d96b6b" },
13030
+ { name: "background", hex: "#403944" },
13031
+ { name: "surface", hex: "#403944" },
13032
+ { name: "surfaceAlt", hex: "#372f3b" },
13033
+ { name: "muted", hex: "#4d4550" },
13034
+ { name: "text", hex: "#e6d2d5" },
13035
+ { name: "primaryForeground", hex: "#403944" },
13036
+ { name: "border", hex: "#8d747a" }
13037
+ ]
13038
+ });
12712
13039
 
12713
13040
  // ../theme-core/src/palette/variants/index.ts
12714
13041
  var paletteVariants = [
@@ -12732,7 +13059,8 @@ var paletteVariants = [
12732
13059
  softNaturalWatercolor,
12733
13060
  softNaturalLilac,
12734
13061
  // Warm-dark family (dark mode)
12735
- warmDarkEmber
13062
+ warmDarkEmber,
13063
+ warmDarkKirtanGold
12736
13064
  ];
12737
13065
  var paletteVariantsById = new Map(
12738
13066
  paletteVariants.map((v) => [v.id, v])
@@ -14231,9 +14559,125 @@ function headerConfigurationKey(configuration) {
14231
14559
  function asFooterLookId(value) {
14232
14560
  return value;
14233
14561
  }
14234
- var guaranteedFallbackFooterLookId = asFooterLookId("footer-muted-grounding");
14562
+ function asFooterLayoutId(value) {
14563
+ return value;
14564
+ }
14565
+ function asFooterStyleId(value) {
14566
+ return value;
14567
+ }
14568
+ var guaranteedFallbackFooterLookId = asFooterLookId("footer-identity-quiet");
14569
+ var footerLayoutCatalog = defineExactCatalog()([
14570
+ {
14571
+ id: asFooterLayoutId("identity"),
14572
+ label: "Identity",
14573
+ description: "Logo, site text, address, and legal copy without relying on footer navigation."
14574
+ },
14575
+ {
14576
+ id: asFooterLayoutId("centered"),
14577
+ label: "Centered",
14578
+ description: "A calm centered stack for identity, short copy, and optional compact navigation.",
14579
+ maxRecommendedNavDensity: "sparse"
14580
+ },
14581
+ {
14582
+ id: asFooterLayoutId("split"),
14583
+ label: "Split",
14584
+ description: "Navigation and brand signoff separated into a wider split footer.",
14585
+ requiresFooterNav: true,
14586
+ maxRecommendedNavDensity: "balanced"
14587
+ },
14588
+ {
14589
+ id: asFooterLayoutId("columns"),
14590
+ label: "Columns",
14591
+ description: "Grouped footer navigation columns with a supporting bottom line.",
14592
+ requiresFooterNav: true,
14593
+ requiresFooterNavGroups: true
14594
+ }
14595
+ ]);
14596
+ var footerStyleCatalog = defineExactCatalog()([
14597
+ {
14598
+ id: asFooterStyleId("quiet"),
14599
+ label: "Quiet",
14600
+ description: "Lightweight, practical footer treatment."
14601
+ },
14602
+ {
14603
+ id: asFooterStyleId("calm"),
14604
+ label: "Calm",
14605
+ description: "Soft centered treatment with restrained dividers."
14606
+ },
14607
+ {
14608
+ id: asFooterStyleId("editorial"),
14609
+ label: "Editorial",
14610
+ description: "Text-forward treatment with fine-line structure."
14611
+ },
14612
+ {
14613
+ id: asFooterStyleId("brand-band"),
14614
+ label: "Brand band",
14615
+ description: "High-contrast brand treatment with a stronger bottom bar."
14616
+ }
14617
+ ]);
14618
+ var footerLayoutsById = new Map(
14619
+ footerLayoutCatalog.map((layout) => [layout.id, layout])
14620
+ );
14621
+ var footerStylesById = new Map(
14622
+ footerStyleCatalog.map((style) => [style.id, style])
14623
+ );
14624
+ function identityQuietFooter(theme) {
14625
+ return {
14626
+ ...theme.footer,
14627
+ variant: "simple",
14628
+ maxWidth: "container",
14629
+ background: {
14630
+ type: "color",
14631
+ color: "surface"
14632
+ },
14633
+ navStyle: "minimal",
14634
+ navWeight: "regular",
14635
+ navColor: "text",
14636
+ navLinkStyle: {
14637
+ typography: "body",
14638
+ fontWeight: "regular",
14639
+ textTransform: "none",
14640
+ italic: false,
14641
+ colorToken: "text",
14642
+ hoverColorToken: "primary",
14643
+ padding: "none",
14644
+ borderRadius: "none"
14645
+ },
14646
+ navLayout: {
14647
+ layout: "inline-wrap",
14648
+ align: "start",
14649
+ gapX: "default",
14650
+ gapY: "tight"
14651
+ },
14652
+ logo: {
14653
+ showLogo: true,
14654
+ showLogoText: true,
14655
+ placement: "left",
14656
+ size: "sm",
14657
+ align: "start"
14658
+ },
14659
+ bottomBar: {
14660
+ enabled: false,
14661
+ fullBleed: false,
14662
+ textAlign: "left",
14663
+ paddingX: "default",
14664
+ paddingY: "compact",
14665
+ borderTop: {
14666
+ width: "none"
14667
+ }
14668
+ }
14669
+ };
14670
+ }
14235
14671
  function mutedGroundingFooter(theme) {
14236
- return theme.footer;
14672
+ return {
14673
+ ...identityQuietFooter(theme),
14674
+ background: theme.footer.background,
14675
+ navStyle: theme.footer.navStyle,
14676
+ navColor: theme.footer.navColor,
14677
+ navWeight: theme.footer.navWeight,
14678
+ navLinkStyle: theme.footer.navLinkStyle,
14679
+ bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
14680
+ };
14237
14681
  }
14238
14682
  function brandTwoBandFooter(theme) {
14239
14683
  return {
@@ -14338,6 +14782,53 @@ function centeredCalmFooter(theme) {
14338
14782
  }
14339
14783
  };
14340
14784
  }
14785
+ function splitEditorialFooter(theme) {
14786
+ return {
14787
+ ...theme.footer,
14788
+ variant: "split",
14789
+ maxWidth: "container",
14790
+ background: {
14791
+ type: "color",
14792
+ color: "surface"
14793
+ },
14794
+ navStyle: "minimal",
14795
+ navWeight: "regular",
14796
+ navColor: "text",
14797
+ navLinkStyle: {
14798
+ typography: "body",
14799
+ fontWeight: "regular",
14800
+ textTransform: "none",
14801
+ italic: false,
14802
+ colorToken: "text",
14803
+ hoverColorToken: "primary",
14804
+ padding: "none",
14805
+ borderRadius: "none"
14806
+ },
14807
+ navLayout: {
14808
+ layout: "inline-wrap",
14809
+ align: "start",
14810
+ gapX: "relaxed",
14811
+ gapY: "tight"
14812
+ },
14813
+ logo: {
14814
+ showLogo: true,
14815
+ showLogoText: true,
14816
+ placement: "right",
14817
+ size: "sm",
14818
+ align: "end"
14819
+ },
14820
+ bottomBar: {
14821
+ enabled: true,
14822
+ fullBleed: false,
14823
+ textAlign: "left",
14824
+ paddingX: "default",
14825
+ paddingY: "compact",
14826
+ borderTop: {
14827
+ width: "thin"
14828
+ }
14829
+ }
14830
+ };
14831
+ }
14341
14832
  function editorialColumnsFooter(theme) {
14342
14833
  return {
14343
14834
  ...theme.footer,
@@ -14380,25 +14871,47 @@ function editorialColumnsFooter(theme) {
14380
14871
  };
14381
14872
  }
14382
14873
  var footerLookCatalog = defineExactCatalog()([
14874
+ {
14875
+ id: asFooterLookId("footer-identity-quiet"),
14876
+ label: "Identity footer",
14877
+ layoutId: asFooterLayoutId("identity"),
14878
+ styleId: asFooterStyleId("quiet"),
14879
+ compile: identityQuietFooter
14880
+ },
14383
14881
  {
14384
14882
  id: asFooterLookId("footer-muted-grounding"),
14385
14883
  label: "Muted grounding footer",
14884
+ layoutId: asFooterLayoutId("identity"),
14885
+ styleId: asFooterStyleId("quiet"),
14886
+ hiddenFromLayoutStyleControls: true,
14386
14887
  compile: mutedGroundingFooter
14387
14888
  },
14388
14889
  {
14389
14890
  id: asFooterLookId("footer-centered-calm"),
14390
14891
  label: "Centered calm footer",
14892
+ layoutId: asFooterLayoutId("centered"),
14893
+ styleId: asFooterStyleId("calm"),
14391
14894
  compile: centeredCalmFooter
14392
14895
  },
14896
+ {
14897
+ id: asFooterLookId("footer-split-editorial"),
14898
+ label: "Split editorial footer",
14899
+ layoutId: asFooterLayoutId("split"),
14900
+ styleId: asFooterStyleId("editorial"),
14901
+ compile: splitEditorialFooter
14902
+ },
14393
14903
  {
14394
14904
  id: asFooterLookId("footer-editorial-columns"),
14395
14905
  label: "Editorial columns footer",
14906
+ layoutId: asFooterLayoutId("columns"),
14907
+ styleId: asFooterStyleId("editorial"),
14396
14908
  compile: editorialColumnsFooter
14397
14909
  },
14398
14910
  {
14399
14911
  id: asFooterLookId("site-footer-brand-two-band"),
14400
14912
  label: "Two-band brand footer",
14401
- maxRecommendedNavDensity: "balanced",
14913
+ layoutId: asFooterLayoutId("split"),
14914
+ styleId: asFooterStyleId("brand-band"),
14402
14915
  allowedContentPresence: ["default-footer", "default-and-blocks"],
14403
14916
  compile: brandTwoBandFooter
14404
14917
  }
@@ -14601,6 +15114,30 @@ var luxeContrastTypography = {
14601
15114
  },
14602
15115
  scale: "spacious"
14603
15116
  };
15117
+ var kirtanOrnateTypography = {
15118
+ body: {
15119
+ family: "Jost, system-ui, sans-serif",
15120
+ size: "md",
15121
+ weight: "regular",
15122
+ lineHeight: "relaxed",
15123
+ letterSpacing: "normal"
15124
+ },
15125
+ headings: {
15126
+ default: {
15127
+ family: "Marcellus, Georgia, serif",
15128
+ weight: "regular",
15129
+ lineHeight: "normal",
15130
+ letterSpacing: "normal",
15131
+ colorToken: "primary",
15132
+ italic: null,
15133
+ case: null
15134
+ },
15135
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15136
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15137
+ h3: { size: "md", weight: "regular", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
15138
+ },
15139
+ scale: "spacious"
15140
+ };
14604
15141
  var boldDisplayTypography = {
14605
15142
  body: {
14606
15143
  family: "Manrope, system-ui, sans-serif",
@@ -14635,16 +15172,16 @@ var originalJoyTypography = {
14635
15172
  },
14636
15173
  headings: {
14637
15174
  default: {
14638
- family: "Bricolage Grotesque, system-ui, sans-serif",
14639
- weight: "bold",
15175
+ family: "Lobster, cursive",
15176
+ weight: "regular",
14640
15177
  lineHeight: "normal",
14641
- letterSpacing: "tight",
15178
+ letterSpacing: "normal",
14642
15179
  italic: null,
14643
15180
  case: null
14644
15181
  },
14645
- h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
14646
- h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
14647
- h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
15182
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15183
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15184
+ h3: { size: "lg", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null }
14648
15185
  },
14649
15186
  scale: "balanced"
14650
15187
  };
@@ -14709,6 +15246,32 @@ var typographyPresets = [
14709
15246
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
14710
15247
  typography: luxeContrastTypography
14711
15248
  }),
15249
+ defineTypographyPreset({
15250
+ id: "typography-preset:kirtan-ornate",
15251
+ name: "Kirtan Ornate",
15252
+ description: "Marcellus devotional headings over a refined Jost body, matching dark ceremonial layouts.",
15253
+ defaultFonts: { body: "Jost, system-ui, sans-serif", heading: "Marcellus, Georgia, serif" },
15254
+ recommendedFonts: {
15255
+ body: ["Jost", "Manrope", "Inter"],
15256
+ heading: ["Marcellus", "Cormorant Garamond", "Playfair Display"]
15257
+ },
15258
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
15259
+ typography: kirtanOrnateTypography,
15260
+ heroTypography: {
15261
+ headlineSize: "6xl",
15262
+ headlineLineHeight: "normal",
15263
+ subheadlineSize: "xl",
15264
+ subheadlineLineHeight: "relaxed",
15265
+ microHeadlineSize: "5xl",
15266
+ microHeadlineLineHeight: "normal",
15267
+ microSubheadlineSize: "lg",
15268
+ microSubheadlineLineHeight: "relaxed",
15269
+ responsive: {
15270
+ tablet: { headlineSize: "5xl" },
15271
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
15272
+ }
15273
+ }
15274
+ }),
14712
15275
  defineTypographyPreset({
14713
15276
  id: "typography-preset:bold-display",
14714
15277
  name: "Bold Display",
@@ -14738,11 +15301,11 @@ var typographyPresets = [
14738
15301
  defineTypographyPreset({
14739
15302
  id: "typography-preset:original-joy",
14740
15303
  name: "Original Joy",
14741
- description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
14742
- defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
15304
+ description: "Lobster display headings over a clean DM Sans body, expressive and warm.",
15305
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Lobster, cursive" },
14743
15306
  recommendedFonts: {
14744
15307
  body: ["DM Sans", "Inter", "Manrope"],
14745
- heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
15308
+ heading: ["Lobster", "Bricolage Grotesque", "Space Grotesk"]
14746
15309
  },
14747
15310
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
14748
15311
  typography: originalJoyTypography,
@@ -14766,6 +15329,319 @@ var typographyPresetsById = new Map(
14766
15329
  typographyPresets.map((preset2) => [preset2.id, preset2])
14767
15330
  );
14768
15331
 
15332
+ // ../theme-core/src/site-styles/designState.ts
15333
+ import { z as z24 } from "zod";
15334
+ var themeV2DesignStateSchemaVersion = 1;
15335
+ var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
15336
+ var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
15337
+ var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
15338
+ fields3[0],
15339
+ ...fields3.slice(1)
15340
+ ]);
15341
+ var heroLegibilityStrategySchema = z24.enum([
15342
+ "none",
15343
+ "scrim-gradient",
15344
+ "solid-panel"
15345
+ ]);
15346
+ var heroCompositionIntentSchema = z24.enum([
15347
+ "center",
15348
+ "bottom-left"
15349
+ ]);
15350
+ var heroTypographyScaleIntentSchema = z24.enum([
15351
+ "quiet",
15352
+ "editorial",
15353
+ "display",
15354
+ "poster"
15355
+ ]);
15356
+ var sectionHeightIntentSchema = z24.enum([
15357
+ "default",
15358
+ "banner",
15359
+ "hero",
15360
+ "immersive"
15361
+ ]);
15362
+ var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
15363
+ var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
15364
+ var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
15365
+ z24.object({ kind: z24.literal("none") }).strict(),
15366
+ z24.object({
15367
+ kind: z24.literal("brand-scrim"),
15368
+ token: z24.enum(["primary", "secondary", "accent"]),
15369
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15370
+ }).strict(),
15371
+ z24.object({
15372
+ kind: z24.literal("brand-wash"),
15373
+ token: z24.enum(["primary", "secondary", "accent"]),
15374
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15375
+ }).strict(),
15376
+ z24.object({
15377
+ kind: z24.literal("neutral-scrim"),
15378
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15379
+ }).strict(),
15380
+ z24.object({
15381
+ kind: z24.literal("neutral-wash"),
15382
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15383
+ }).strict(),
15384
+ z24.object({
15385
+ kind: z24.literal("solid-panel"),
15386
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15387
+ }).strict()
15388
+ ]);
15389
+ var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
15390
+ var tileTreatmentSchema = z24.enum(tileTreatmentValues);
15391
+ var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
15392
+ var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
15393
+ function uniqueNonEmpty(values) {
15394
+ const uniqueValues = [...new Set(values)];
15395
+ const firstValue = uniqueValues[0];
15396
+ if (!firstValue) {
15397
+ throw new Error("Expected at least one Theme V2 design state option.");
15398
+ }
15399
+ return [firstValue, ...uniqueValues.slice(1)];
15400
+ }
15401
+ var userPanelTreatments = uniqueNonEmpty(
15402
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
15403
+ );
15404
+ var userFlushTreatments = uniqueNonEmpty(
15405
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
15406
+ );
15407
+ var userFlushBleeds = uniqueNonEmpty(
15408
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
15409
+ );
15410
+ var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
15411
+ z24.object({ kind: z24.literal("plain") }).strict(),
15412
+ z24.object({
15413
+ kind: z24.literal("panel"),
15414
+ treatment: z24.enum(userPanelTreatments)
15415
+ }).strict(),
15416
+ z24.object({
15417
+ kind: z24.literal("flush-panel"),
15418
+ treatment: z24.enum(userFlushTreatments),
15419
+ bleed: z24.enum(userFlushBleeds)
15420
+ }).strict()
15421
+ ]);
15422
+ var blockDesignPlanSchema = z24.object({
15423
+ blockId: z24.string().min(1).transform(asDesignBlockId),
15424
+ blockKind: z24.string().min(1),
15425
+ purpose: z24.string().min(1),
15426
+ sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
15427
+ contentFrame: contentFrameIntentSchema,
15428
+ itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
15429
+ transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
15430
+ emphasis: z24.enum(userDesignOptionCatalog.emphases),
15431
+ sectionHeight: sectionHeightIntentSchema.optional(),
15432
+ heroLegibility: heroLegibilityStrategySchema.optional(),
15433
+ heroComposition: heroCompositionIntentSchema.optional(),
15434
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
15435
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
15436
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
15437
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
15438
+ tileTreatment: tileTreatmentSchema.optional(),
15439
+ eventListTreatment: eventListTreatmentSchema.optional(),
15440
+ eyebrowTreatment: eyebrowTreatmentSchema.optional()
15441
+ }).strict();
15442
+ var styleAuthoritySchema = z24.discriminatedUnion("kind", [
15443
+ z24.object({
15444
+ kind: z24.literal("theme-v2"),
15445
+ source: designResolutionPolicySchema,
15446
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
15447
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
15448
+ templateVersion: z24.number().int().nonnegative(),
15449
+ resolverVersion: z24.number().int().nonnegative()
15450
+ }).strict(),
15451
+ z24.object({
15452
+ kind: z24.literal("legacy-raw"),
15453
+ reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
15454
+ }).strict(),
15455
+ z24.object({
15456
+ kind: z24.literal("advanced-detached"),
15457
+ reason: z24.literal("detached-custom-runtime-fields")
15458
+ }).strict()
15459
+ ]);
15460
+ var blockRuntimeStyleAuthoritySchema = z24.object({
15461
+ unit: z24.literal("block-runtime-fields"),
15462
+ blockId: z24.string().min(1).transform(asDesignBlockId),
15463
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
15464
+ authority: styleAuthoritySchema
15465
+ }).strict();
15466
+ var persistedPageDesignStateV1Schema = z24.object({
15467
+ schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
15468
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
15469
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
15470
+ templateVersion: z24.number().int().nonnegative(),
15471
+ resolverVersion: z24.number().int().nonnegative(),
15472
+ rhythmPresetId: z24.string().min(1),
15473
+ blocks: z24.array(blockDesignPlanSchema),
15474
+ styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
15475
+ }).strict();
15476
+
15477
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
15478
+ function defineDesignRuntimeRules(rules) {
15479
+ return rules;
15480
+ }
15481
+ function defineComponentRuntimeRules(rules) {
15482
+ return rules;
15483
+ }
15484
+ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
15485
+ sectionSurfaces: {
15486
+ base: {},
15487
+ "muted-band": {
15488
+ background: {
15489
+ type: "color",
15490
+ color: "muted"
15491
+ }
15492
+ },
15493
+ "accent-band": {
15494
+ background: {
15495
+ type: "color",
15496
+ color: "primary"
15497
+ }
15498
+ },
15499
+ "brand-depth-band": {
15500
+ background: {
15501
+ type: "color",
15502
+ color: "primary-800"
15503
+ }
15504
+ },
15505
+ "hero-image": {
15506
+ background: {
15507
+ type: "image",
15508
+ opacity: 1,
15509
+ position: "center center",
15510
+ ...uniformSectionForeground("text")
15511
+ }
15512
+ }
15513
+ },
15514
+ heroLegibility: {
15515
+ "scrim-gradient": {
15516
+ type: "gradient",
15517
+ gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
15518
+ opacity: 1
15519
+ },
15520
+ "solid-panel": {
15521
+ type: "color",
15522
+ color: "surface",
15523
+ opacity: 0.88
15524
+ }
15525
+ },
15526
+ transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
15527
+ });
15528
+ var defaultComponentRuntimeRules = defineComponentRuntimeRules({
15529
+ panelFrames: {
15530
+ inset: {
15531
+ spacing: "comfortable",
15532
+ rounded: "xl",
15533
+ raised: false,
15534
+ background: {
15535
+ type: "color",
15536
+ color: "surfaceAlt",
15537
+ textColor: "text"
15538
+ }
15539
+ },
15540
+ raised: {
15541
+ spacing: "comfortable",
15542
+ rounded: "xl",
15543
+ raised: true,
15544
+ background: {
15545
+ type: "color",
15546
+ color: "surfaceAlt",
15547
+ textColor: "text"
15548
+ }
15549
+ },
15550
+ editorial: {
15551
+ spacing: "medium",
15552
+ rounded: "xl",
15553
+ raised: false,
15554
+ background: {
15555
+ type: "color",
15556
+ color: "surface",
15557
+ textColor: "text"
15558
+ }
15559
+ }
15560
+ },
15561
+ flushFrames: {
15562
+ "media-panel": {
15563
+ fullWidth: true,
15564
+ spacing: "none",
15565
+ rounded: "none",
15566
+ raised: false
15567
+ }
15568
+ },
15569
+ itemSurfaces: {
15570
+ none: null,
15571
+ default: {
15572
+ spacing: "medium",
15573
+ rounded: "lg",
15574
+ raised: false
15575
+ },
15576
+ flat: {
15577
+ spacing: "medium",
15578
+ rounded: "lg",
15579
+ raised: false
15580
+ },
15581
+ outlined: {
15582
+ spacing: "medium",
15583
+ rounded: "lg",
15584
+ raised: false,
15585
+ border: {
15586
+ enabled: true,
15587
+ width: "1",
15588
+ colorToken: "border"
15589
+ }
15590
+ },
15591
+ raised: {
15592
+ spacing: "medium",
15593
+ rounded: "xl",
15594
+ raised: true
15595
+ },
15596
+ inset: {
15597
+ treatment: "soft-panel",
15598
+ spacing: "comfortable",
15599
+ rounded: "xl",
15600
+ raised: false,
15601
+ border: {
15602
+ enabled: false
15603
+ },
15604
+ background: {
15605
+ type: "color",
15606
+ color: "surfaceAlt",
15607
+ textColor: "text"
15608
+ }
15609
+ },
15610
+ editorial: {
15611
+ // Boxless open column with a short rule on top; the visual treatment
15612
+ // lives in blocks-static/card-treatments.css.
15613
+ treatment: "editorial-rule",
15614
+ spacing: "none",
15615
+ rounded: "none",
15616
+ raised: false,
15617
+ border: {
15618
+ enabled: false
15619
+ }
15620
+ },
15621
+ "color-blocked": {
15622
+ // Bold, flat colour-blocked cards. The per-card background colour cycle
15623
+ // (by position) and staggered offset live in
15624
+ // blocks-static/card-treatments.css; here we set the shared shape:
15625
+ // generous padding, large radius, no border, flat (no shadow).
15626
+ treatment: "color-blocked",
15627
+ spacing: "spacious",
15628
+ rounded: "2xl",
15629
+ raised: false,
15630
+ border: {
15631
+ enabled: false
15632
+ }
15633
+ }
15634
+ }
15635
+ });
15636
+ function uniformSectionForeground(token) {
15637
+ return {
15638
+ textColor: token,
15639
+ headingColor: token,
15640
+ linkColor: token,
15641
+ supportingColor: token
15642
+ };
15643
+ }
15644
+
14769
15645
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
14770
15646
  var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
14771
15647
  var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
@@ -14784,6 +15660,7 @@ var curatedSiteStyleIdValues = [
14784
15660
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
14785
15661
  "site-style:bold-launch",
14786
15662
  "site-style:south-west-twerk-school",
15663
+ "site-style:kirtan-ornate",
14787
15664
  "site-style:original-joy"
14788
15665
  ];
14789
15666
  var quietBudget = {
@@ -14810,6 +15687,50 @@ var expressiveBudget = {
14810
15687
  mediaDensity: "high",
14811
15688
  decorativeRepetition: "medium"
14812
15689
  };
15690
+ var kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
15691
+ ...defaultDesignRuntimeRules,
15692
+ defaultEyebrowTreatment: "accent",
15693
+ sectionSurfaces: {
15694
+ ...defaultDesignRuntimeRules.sectionSurfaces,
15695
+ "muted-band": {
15696
+ background: {
15697
+ type: "color",
15698
+ color: "muted"
15699
+ },
15700
+ foreground: {
15701
+ textColor: "text",
15702
+ headingColor: "primary",
15703
+ linkColor: "primary",
15704
+ supportingColor: "text"
15705
+ }
15706
+ },
15707
+ "brand-depth-band": {
15708
+ background: {
15709
+ type: "color",
15710
+ color: "primary-800"
15711
+ },
15712
+ foreground: {
15713
+ textColor: "text",
15714
+ headingColor: "primary",
15715
+ linkColor: "primary",
15716
+ supportingColor: "text"
15717
+ }
15718
+ },
15719
+ "hero-image": {
15720
+ background: {
15721
+ type: "image",
15722
+ opacity: 1,
15723
+ position: "center center"
15724
+ },
15725
+ foreground: {
15726
+ textColor: "text",
15727
+ headingColor: "primary",
15728
+ linkColor: "primary",
15729
+ supportingColor: "text"
15730
+ }
15731
+ }
15732
+ }
15733
+ });
14813
15734
  var expressiveUnderlineInputs = {
14814
15735
  base: {
14815
15736
  background: { type: "transparent" },
@@ -14847,6 +15768,43 @@ var expressiveUnderlineInputs = {
14847
15768
  opacity: 0.6
14848
15769
  }
14849
15770
  };
15771
+ var ornateDarkInputs = {
15772
+ base: {
15773
+ background: { type: "solid", colorToken: "surfaceAlt" },
15774
+ textColorToken: "text",
15775
+ border: {
15776
+ widthClass: "border",
15777
+ colorToken: "primary/45",
15778
+ style: "all"
15779
+ },
15780
+ corners: "square",
15781
+ shadow: null,
15782
+ spacing: "medium",
15783
+ fontSize: "base"
15784
+ },
15785
+ label: {
15786
+ textColorToken: "primary",
15787
+ fontWeight: "semibold",
15788
+ fontSize: "xs",
15789
+ textTransform: "uppercase",
15790
+ letterSpacing: "wider",
15791
+ opacity: 1
15792
+ },
15793
+ focus: {
15794
+ ringColorToken: "primary/18",
15795
+ ringWidth: "2",
15796
+ borderColorToken: "primary/70"
15797
+ },
15798
+ error: {
15799
+ borderColorToken: "destructive",
15800
+ textColorToken: "destructive"
15801
+ },
15802
+ disabled: {
15803
+ backgroundColorToken: "muted",
15804
+ textColorToken: "mutedText",
15805
+ opacity: 0.6
15806
+ }
15807
+ };
14850
15808
  function uniqueContentFrameKinds() {
14851
15809
  const kinds = [
14852
15810
  ...new Set(
@@ -14904,6 +15862,7 @@ function defineCuratedSiteStyle(input) {
14904
15862
  // clean/minimal styles default to none.
14905
15863
  headingDecoration: input.headingDecoration ?? noHeadingDecoration,
14906
15864
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
15865
+ ...input.designRuntimeRules ? { designRuntimeRules: input.designRuntimeRules } : {},
14907
15866
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
14908
15867
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
14909
15868
  defaultHeaderSelection: input.defaultHeaderSelection ? {
@@ -15854,6 +16813,80 @@ var curatedSiteStyles = [
15854
16813
  paletteChoice("high-contrast-ink")
15855
16814
  ]
15856
16815
  }),
16816
+ defineCuratedSiteStyle({
16817
+ id: "site-style:kirtan-ornate",
16818
+ name: "Kirtan Ornate",
16819
+ headingDecoration: { family: "short-center-rule", colorToken: "accent" },
16820
+ description: "Ceremonial, jewel-toned, and devotional: ornate frames, warm contrast, and composed rhythm for intimate music gatherings.",
16821
+ generationBrief: "Use a deep plum ground with pale gold as the main brand color, rose accent details, cream text, spacious split hero sections, devotional editorial headings, compact event lists, and framed conversion sections. The mood should feel soulful and ceremonial, not gothic or theatrical.",
16822
+ selectionKeywordRules: [
16823
+ { kind: "word", value: "kirtan" },
16824
+ { kind: "word", value: "chanting" },
16825
+ { kind: "word", value: "ceremony" },
16826
+ { kind: "word", value: "devotional" }
16827
+ ],
16828
+ tokenRecipes: {
16829
+ palette: "brand-led",
16830
+ contrast: "strong",
16831
+ radius: "soft",
16832
+ shadow: "subtle",
16833
+ typography: "serif-editorial",
16834
+ spacing: "airy",
16835
+ motion: "subtle"
16836
+ },
16837
+ compositionBudget: expressiveBudget,
16838
+ typographyPresetChoices: [
16839
+ typographyChoice("typography-preset:kirtan-ornate"),
16840
+ typographyChoice("typography-preset:luxe-contrast"),
16841
+ typographyChoice("typography-preset:editorial-serif")
16842
+ ],
16843
+ defaultTypographyPresetId: "typography-preset:kirtan-ornate",
16844
+ themeOverrides: {
16845
+ accordions: warmInsetAccordionSystem,
16846
+ cards: originalJoyCardSystem,
16847
+ testimonialQuote: serifDisplayQuote,
16848
+ bodyText: {
16849
+ intro: {
16850
+ paragraphSize: "editorial",
16851
+ headingSize: "editorial"
16852
+ }
16853
+ },
16854
+ inputs: ornateDarkInputs
16855
+ },
16856
+ designRuntimeRules: kirtanOrnateDesignRuntimeRules,
16857
+ recommendedAppearancePresetIds: [
16858
+ "hero-brand-scrim-fixed-frame",
16859
+ "media-text-quiet-story",
16860
+ "events-lined-panel",
16861
+ "schedule-details-brand-depth",
16862
+ "testimonials-statement-cards",
16863
+ "contact-form-panel"
16864
+ ],
16865
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
16866
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
16867
+ recommendedHeaderStyleChoicesByLayout: {
16868
+ floating: [
16869
+ headerStyleChoice("minimal-surface"),
16870
+ headerStyleChoice("split-glass"),
16871
+ headerStyleChoice("glass")
16872
+ ]
16873
+ },
16874
+ recommendedHeaderLookIds: ["minimal-transparent"],
16875
+ recommendedFooterLookIds: [
16876
+ "site-footer-brand-two-band",
16877
+ "footer-muted-grounding"
16878
+ ],
16879
+ buttonPersonalityChoices: [
16880
+ buttonChoice("ornate-ritual"),
16881
+ buttonChoice("joy-stamp"),
16882
+ buttonChoice("ink-stamp")
16883
+ ],
16884
+ paletteVariantChoices: [
16885
+ paletteChoice("warm-dark-kirtan-gold"),
16886
+ paletteChoice("warm-dark-ember"),
16887
+ paletteChoice("brand-led-burgundy-gold")
16888
+ ]
16889
+ }),
15857
16890
  defineCuratedSiteStyle({
15858
16891
  id: "site-style:original-joy",
15859
16892
  name: "Original Joy",
@@ -15957,319 +16990,6 @@ var pageFlowPresets = [
15957
16990
  }
15958
16991
  ];
15959
16992
 
15960
- // ../theme-core/src/site-styles/designState.ts
15961
- import { z as z24 } from "zod";
15962
- var themeV2DesignStateSchemaVersion = 1;
15963
- var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
15964
- var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
15965
- var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
15966
- fields3[0],
15967
- ...fields3.slice(1)
15968
- ]);
15969
- var heroLegibilityStrategySchema = z24.enum([
15970
- "none",
15971
- "scrim-gradient",
15972
- "solid-panel"
15973
- ]);
15974
- var heroCompositionIntentSchema = z24.enum([
15975
- "center",
15976
- "bottom-left"
15977
- ]);
15978
- var heroTypographyScaleIntentSchema = z24.enum([
15979
- "quiet",
15980
- "editorial",
15981
- "display",
15982
- "poster"
15983
- ]);
15984
- var sectionHeightIntentSchema = z24.enum([
15985
- "default",
15986
- "banner",
15987
- "hero",
15988
- "immersive"
15989
- ]);
15990
- var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
15991
- var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
15992
- var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
15993
- z24.object({ kind: z24.literal("none") }).strict(),
15994
- z24.object({
15995
- kind: z24.literal("brand-scrim"),
15996
- token: z24.enum(["primary", "secondary", "accent"]),
15997
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
15998
- }).strict(),
15999
- z24.object({
16000
- kind: z24.literal("brand-wash"),
16001
- token: z24.enum(["primary", "secondary", "accent"]),
16002
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
16003
- }).strict(),
16004
- z24.object({
16005
- kind: z24.literal("neutral-scrim"),
16006
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
16007
- }).strict(),
16008
- z24.object({
16009
- kind: z24.literal("neutral-wash"),
16010
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
16011
- }).strict(),
16012
- z24.object({
16013
- kind: z24.literal("solid-panel"),
16014
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
16015
- }).strict()
16016
- ]);
16017
- var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
16018
- var tileTreatmentSchema = z24.enum(tileTreatmentValues);
16019
- var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
16020
- var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
16021
- function uniqueNonEmpty(values) {
16022
- const uniqueValues = [...new Set(values)];
16023
- const firstValue = uniqueValues[0];
16024
- if (!firstValue) {
16025
- throw new Error("Expected at least one Theme V2 design state option.");
16026
- }
16027
- return [firstValue, ...uniqueValues.slice(1)];
16028
- }
16029
- var userPanelTreatments = uniqueNonEmpty(
16030
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
16031
- );
16032
- var userFlushTreatments = uniqueNonEmpty(
16033
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
16034
- );
16035
- var userFlushBleeds = uniqueNonEmpty(
16036
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
16037
- );
16038
- var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
16039
- z24.object({ kind: z24.literal("plain") }).strict(),
16040
- z24.object({
16041
- kind: z24.literal("panel"),
16042
- treatment: z24.enum(userPanelTreatments)
16043
- }).strict(),
16044
- z24.object({
16045
- kind: z24.literal("flush-panel"),
16046
- treatment: z24.enum(userFlushTreatments),
16047
- bleed: z24.enum(userFlushBleeds)
16048
- }).strict()
16049
- ]);
16050
- var blockDesignPlanSchema = z24.object({
16051
- blockId: z24.string().min(1).transform(asDesignBlockId),
16052
- blockKind: z24.string().min(1),
16053
- purpose: z24.string().min(1),
16054
- sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
16055
- contentFrame: contentFrameIntentSchema,
16056
- itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
16057
- transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
16058
- emphasis: z24.enum(userDesignOptionCatalog.emphases),
16059
- sectionHeight: sectionHeightIntentSchema.optional(),
16060
- heroLegibility: heroLegibilityStrategySchema.optional(),
16061
- heroComposition: heroCompositionIntentSchema.optional(),
16062
- heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
16063
- imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
16064
- imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
16065
- testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
16066
- tileTreatment: tileTreatmentSchema.optional(),
16067
- eventListTreatment: eventListTreatmentSchema.optional(),
16068
- eyebrowTreatment: eyebrowTreatmentSchema.optional()
16069
- }).strict();
16070
- var styleAuthoritySchema = z24.discriminatedUnion("kind", [
16071
- z24.object({
16072
- kind: z24.literal("theme-v2"),
16073
- source: designResolutionPolicySchema,
16074
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
16075
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
16076
- templateVersion: z24.number().int().nonnegative(),
16077
- resolverVersion: z24.number().int().nonnegative()
16078
- }).strict(),
16079
- z24.object({
16080
- kind: z24.literal("legacy-raw"),
16081
- reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
16082
- }).strict(),
16083
- z24.object({
16084
- kind: z24.literal("advanced-detached"),
16085
- reason: z24.literal("detached-custom-runtime-fields")
16086
- }).strict()
16087
- ]);
16088
- var blockRuntimeStyleAuthoritySchema = z24.object({
16089
- unit: z24.literal("block-runtime-fields"),
16090
- blockId: z24.string().min(1).transform(asDesignBlockId),
16091
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
16092
- authority: styleAuthoritySchema
16093
- }).strict();
16094
- var persistedPageDesignStateV1Schema = z24.object({
16095
- schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
16096
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
16097
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
16098
- templateVersion: z24.number().int().nonnegative(),
16099
- resolverVersion: z24.number().int().nonnegative(),
16100
- rhythmPresetId: z24.string().min(1),
16101
- blocks: z24.array(blockDesignPlanSchema),
16102
- styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
16103
- }).strict();
16104
-
16105
- // ../theme-core/src/site-styles/runtimeCompiler.ts
16106
- function defineDesignRuntimeRules(rules) {
16107
- return rules;
16108
- }
16109
- function defineComponentRuntimeRules(rules) {
16110
- return rules;
16111
- }
16112
- var defaultDesignRuntimeRules = defineDesignRuntimeRules({
16113
- sectionSurfaces: {
16114
- base: {},
16115
- "muted-band": {
16116
- background: {
16117
- type: "color",
16118
- color: "muted"
16119
- }
16120
- },
16121
- "accent-band": {
16122
- background: {
16123
- type: "color",
16124
- color: "primary"
16125
- }
16126
- },
16127
- "brand-depth-band": {
16128
- background: {
16129
- type: "color",
16130
- color: "primary-800"
16131
- }
16132
- },
16133
- "hero-image": {
16134
- background: {
16135
- type: "image",
16136
- opacity: 1,
16137
- position: "center center",
16138
- ...uniformSectionForeground("text")
16139
- }
16140
- }
16141
- },
16142
- heroLegibility: {
16143
- "scrim-gradient": {
16144
- type: "gradient",
16145
- gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
16146
- opacity: 1
16147
- },
16148
- "solid-panel": {
16149
- type: "color",
16150
- color: "surface",
16151
- opacity: 0.88
16152
- }
16153
- },
16154
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
16155
- });
16156
- var defaultComponentRuntimeRules = defineComponentRuntimeRules({
16157
- panelFrames: {
16158
- inset: {
16159
- spacing: "comfortable",
16160
- rounded: "xl",
16161
- raised: false,
16162
- background: {
16163
- type: "color",
16164
- color: "surfaceAlt",
16165
- textColor: "text"
16166
- }
16167
- },
16168
- raised: {
16169
- spacing: "comfortable",
16170
- rounded: "xl",
16171
- raised: true,
16172
- background: {
16173
- type: "color",
16174
- color: "surfaceAlt",
16175
- textColor: "text"
16176
- }
16177
- },
16178
- editorial: {
16179
- spacing: "medium",
16180
- rounded: "xl",
16181
- raised: false,
16182
- background: {
16183
- type: "color",
16184
- color: "surface",
16185
- textColor: "text"
16186
- }
16187
- }
16188
- },
16189
- flushFrames: {
16190
- "media-panel": {
16191
- fullWidth: true,
16192
- spacing: "none",
16193
- rounded: "none",
16194
- raised: false
16195
- }
16196
- },
16197
- itemSurfaces: {
16198
- none: null,
16199
- default: {
16200
- spacing: "medium",
16201
- rounded: "lg",
16202
- raised: false
16203
- },
16204
- flat: {
16205
- spacing: "medium",
16206
- rounded: "lg",
16207
- raised: false
16208
- },
16209
- outlined: {
16210
- spacing: "medium",
16211
- rounded: "lg",
16212
- raised: false,
16213
- border: {
16214
- enabled: true,
16215
- width: "1",
16216
- colorToken: "border"
16217
- }
16218
- },
16219
- raised: {
16220
- spacing: "medium",
16221
- rounded: "xl",
16222
- raised: true
16223
- },
16224
- inset: {
16225
- treatment: "soft-panel",
16226
- spacing: "comfortable",
16227
- rounded: "xl",
16228
- raised: false,
16229
- border: {
16230
- enabled: false
16231
- },
16232
- background: {
16233
- type: "color",
16234
- color: "surfaceAlt",
16235
- textColor: "text"
16236
- }
16237
- },
16238
- editorial: {
16239
- // Boxless open column with a short rule on top; the visual treatment
16240
- // lives in blocks-static/card-treatments.css.
16241
- treatment: "editorial-rule",
16242
- spacing: "none",
16243
- rounded: "none",
16244
- raised: false,
16245
- border: {
16246
- enabled: false
16247
- }
16248
- },
16249
- "color-blocked": {
16250
- // Bold, flat colour-blocked cards. The per-card background colour cycle
16251
- // (by position) and staggered offset live in
16252
- // blocks-static/card-treatments.css; here we set the shared shape:
16253
- // generous padding, large radius, no border, flat (no shadow).
16254
- treatment: "color-blocked",
16255
- spacing: "spacious",
16256
- rounded: "2xl",
16257
- raised: false,
16258
- border: {
16259
- enabled: false
16260
- }
16261
- }
16262
- }
16263
- });
16264
- function uniformSectionForeground(token) {
16265
- return {
16266
- textColor: token,
16267
- headingColor: token,
16268
- linkColor: token,
16269
- supportingColor: token
16270
- };
16271
- }
16272
-
16273
16993
  // ../theme-core/src/site-styles/generatedSchemas.ts
16274
16994
  import { z as z25 } from "zod";
16275
16995
  function uniqueNonEmpty2(values) {
@@ -17081,6 +17801,31 @@ function cardStylesField(options = {}) {
17081
17801
  return createBoxStylesFieldWithDepth("card", options);
17082
17802
  }
17083
17803
 
17804
+ // ../blocks/src/system/fields/imageShape.ts
17805
+ var standardImageShapeOptions = [
17806
+ { value: "default", label: "Default" },
17807
+ { value: "square", label: "Square corners" },
17808
+ { value: "rounded", label: "Rounded corners" },
17809
+ { value: "circle", label: "Circle" },
17810
+ { value: "arch", label: "Arch" }
17811
+ ];
17812
+ function createImageShapeField(options = {}) {
17813
+ return {
17814
+ id: options.id ?? "imageShape",
17815
+ type: "select",
17816
+ label: options.label ?? "Image shape",
17817
+ ...options.description ? { description: options.description } : {},
17818
+ required: false,
17819
+ defaultValue: options.defaultValue ?? "default",
17820
+ multiple: false,
17821
+ options: [...standardImageShapeOptions],
17822
+ ui: {
17823
+ intent: options.uiIntent ?? "display",
17824
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
17825
+ }
17826
+ };
17827
+ }
17828
+
17084
17829
  // ../blocks/src/utils/env.ts
17085
17830
  function isDevEnvironment() {
17086
17831
  try {
@@ -17895,7 +18640,7 @@ function buildFooterNavAll(common) {
17895
18640
  return stack(
17896
18641
  { className: common.className, gap: common.gap, align: "stretch" },
17897
18642
  [item],
17898
- when(collectionPath)
18643
+ whenCollectionHasItems(collectionPath)
17899
18644
  );
17900
18645
  }
17901
18646
  function buildFooterNavLinksOnly(common) {
@@ -17928,7 +18673,7 @@ function buildFooterNavLinksOnly(common) {
17928
18673
  return stack(
17929
18674
  { className: common.className, gap: common.gap, align: "stretch" },
17930
18675
  [item],
17931
- when(collectionPath)
18676
+ whenCollectionHasItems(collectionPath)
17932
18677
  );
17933
18678
  }
17934
18679
  function buildFooterNavFlatten(common) {
@@ -17977,9 +18722,20 @@ function buildFooterNavFlatten(common) {
17977
18722
  return stack(
17978
18723
  { className: common.className, gap: common.gap, align: "stretch" },
17979
18724
  [item],
17980
- when(collectionPath)
18725
+ whenCollectionHasItems(collectionPath)
17981
18726
  );
17982
18727
  }
18728
+ var whenCollectionHasItems = (collectionPath) => (node) => ({
18729
+ ...node,
18730
+ $when: {
18731
+ when: {
18732
+ from: collectionPath,
18733
+ transforms: [{ id: "array.length" }]
18734
+ },
18735
+ equals: 0,
18736
+ not: true
18737
+ }
18738
+ });
17983
18739
  function footerNav(opts) {
17984
18740
  const mode = opts?.mode ?? "all";
17985
18741
  const collectionPath = opts?.collectionPath ?? "footerMenu.items";
@@ -20551,8 +21307,23 @@ function fragmentsToRepeaterField(id, label, fragments, options = {}) {
20551
21307
  var heroLayoutControlsFragment = defineFragment({
20552
21308
  id: "heroLayoutControls",
20553
21309
  title: "Hero Layout",
20554
- description: "Alignment and content width controls for hero layouts.",
21310
+ description: "Title scale, alignment, and content width controls for hero layouts.",
20555
21311
  fields: [
21312
+ {
21313
+ id: "titleSize",
21314
+ type: "select",
21315
+ label: "Title size",
21316
+ description: "Adjust the visual scale of the hero title.",
21317
+ required: false,
21318
+ ui: { intent: "display" },
21319
+ options: [
21320
+ { value: "auto", label: "Auto" },
21321
+ { value: "quiet", label: "Normal" },
21322
+ { value: "editorial", label: "Large" },
21323
+ { value: "display", label: "Huge" },
21324
+ { value: "poster", label: "Poster" }
21325
+ ]
21326
+ },
20556
21327
  {
20557
21328
  id: "contentAlignment",
20558
21329
  type: "select",
@@ -21347,7 +22118,18 @@ function heroSplitImagePane() {
21347
22118
  return stack(
21348
22119
  {
21349
22120
  gap: "none",
21350
- className: "rb-relative rb-overflow-hidden rb-rounded-3xl",
22121
+ className: {
22122
+ $bind: {
22123
+ from: "content.imageShape",
22124
+ transforms: [
22125
+ {
22126
+ id: "ui.imageShapeClassName",
22127
+ options: { baseClass: "rb-relative rb-overflow-hidden rb-rounded-3xl" }
22128
+ }
22129
+ ],
22130
+ fallback: "rb-relative rb-overflow-hidden rb-rounded-3xl"
22131
+ }
22132
+ },
21351
22133
  style: {
21352
22134
  minHeight: "clamp(18rem, 36vw, 34rem)"
21353
22135
  }
@@ -21465,6 +22247,12 @@ var heroConfig = {
21465
22247
  label: "Content card",
21466
22248
  renderInHeader: true,
21467
22249
  intent: "style"
22250
+ }),
22251
+ createImageShapeField({
22252
+ id: "imageShape",
22253
+ label: "Image shape",
22254
+ defaultValue: "default",
22255
+ uiIntent: "display"
21468
22256
  })
21469
22257
  ],
21470
22258
  layout: classicLayout,
@@ -21479,6 +22267,15 @@ var heroConfig = {
21479
22267
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
21480
22268
  tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
21481
22269
  icon: "Sparkles",
22270
+ previewCustomize: {
22271
+ quickFieldPriority: [
22272
+ "titleSize",
22273
+ "contentAlignment",
22274
+ "contentMaxWidth",
22275
+ "verticalAlignment",
22276
+ "imageShape"
22277
+ ]
22278
+ },
21482
22279
  styleTokens: {
21483
22280
  typography: "display",
21484
22281
  spacing: "xl"
@@ -21495,7 +22292,8 @@ var standardAspectRatioOptions = [
21495
22292
  { value: "16/9", label: "16:9 (Landscape)" },
21496
22293
  { value: "4/3", label: "4:3 (Standard)" },
21497
22294
  { value: "1/1", label: "1:1 (Square)" },
21498
- { value: "3/4", label: "3:4 (Portrait)" }
22295
+ { value: "3/4", label: "3:4 (Portrait)" },
22296
+ { value: "9/16", label: "9:16 (Tall portrait)" }
21499
22297
  ];
21500
22298
  function createAspectRatioField(options = {}) {
21501
22299
  return {
@@ -22715,6 +23513,258 @@ var formBlockDefinition = {
22715
23513
  runtime: formBlockRuntime
22716
23514
  };
22717
23515
 
23516
+ // ../blocks/src/system/blocks/contact-newsletter.ts
23517
+ var contactNewsletterLayout = styledSection({
23518
+ children: sectionContainer([
23519
+ el(
23520
+ "div",
23521
+ { className: "contact-newsletter-grid" },
23522
+ [
23523
+ el(
23524
+ "div",
23525
+ { className: "contact-newsletter-column contact-newsletter-contact" },
23526
+ [
23527
+ el(
23528
+ "div",
23529
+ { className: "contact-newsletter-copy" },
23530
+ [
23531
+ text(
23532
+ {
23533
+ as: "h2",
23534
+ className: "form-copy-title"
23535
+ },
23536
+ when("contactTitle"),
23537
+ bind("contactTitle")
23538
+ ),
23539
+ richText(
23540
+ {
23541
+ className: "form-copy-intro rb-prose rb-max-w-none"
23542
+ },
23543
+ when("contactIntro"),
23544
+ bind("contactIntro")
23545
+ )
23546
+ ]
23547
+ ),
23548
+ el(
23549
+ "form",
23550
+ withApiBindings({
23551
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
23552
+ submitLabel: { $bind: { from: "contactSubmitLabel" } },
23553
+ successMessage: { $bind: { from: "contactSuccessMessage" } }
23554
+ }),
23555
+ [],
23556
+ bind("data.form")
23557
+ )
23558
+ ]
23559
+ ),
23560
+ el(
23561
+ "div",
23562
+ { className: "contact-newsletter-column contact-newsletter-info contact-newsletter-newsletter" },
23563
+ [
23564
+ el(
23565
+ "div",
23566
+ { className: "contact-newsletter-copy" },
23567
+ [
23568
+ text(
23569
+ {
23570
+ as: "h2",
23571
+ className: "newsletter-copy-title"
23572
+ },
23573
+ when("newsletterTitle"),
23574
+ bind("newsletterTitle")
23575
+ ),
23576
+ richText(
23577
+ {
23578
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none"
23579
+ },
23580
+ when("newsletterSubtitle"),
23581
+ bind("newsletterSubtitle")
23582
+ )
23583
+ ]
23584
+ ),
23585
+ el(
23586
+ "newsletter-form",
23587
+ withApiBindings({
23588
+ listId: { $bind: { from: "listId" } },
23589
+ preset: { $bind: { from: "preset" } },
23590
+ includePhone: { $bind: { from: "includePhone" } },
23591
+ buttonLabel: { $bind: { from: "newsletterButtonLabel" } },
23592
+ successMessage: { $bind: { from: "newsletterSuccessMessage" } },
23593
+ privacyNote: { $bind: { from: "newsletterPrivacyNote" } },
23594
+ tags: { $bind: { from: "newsletterTags" } },
23595
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } }
23596
+ }),
23597
+ []
23598
+ )
23599
+ ]
23600
+ )
23601
+ ]
23602
+ )
23603
+ ], {
23604
+ className: "contact-newsletter-container"
23605
+ }),
23606
+ baseClass: "",
23607
+ spacing: "medium",
23608
+ background: "surface"
23609
+ });
23610
+ var contactNewsletterManifest = createBlockManifest({
23611
+ id: "block.contact-newsletter",
23612
+ title: "Contact + Newsletter",
23613
+ titleSource: "contactTitle",
23614
+ description: "Two-column newsletter signup and contact form section.",
23615
+ category: "interactive",
23616
+ layout: contactNewsletterLayout,
23617
+ defaultVariant: "default",
23618
+ variants: {
23619
+ default: contactNewsletterLayout
23620
+ },
23621
+ variantOptions: {
23622
+ default: {
23623
+ label: "Two column",
23624
+ description: "Newsletter and contact form side by side.",
23625
+ icon: "Columns2"
23626
+ }
23627
+ },
23628
+ additionalFields: [
23629
+ {
23630
+ id: "newsletterTitle",
23631
+ type: "text",
23632
+ label: "Newsletter title",
23633
+ defaultValue: "Stay connected"
23634
+ },
23635
+ {
23636
+ id: "newsletterSubtitle",
23637
+ type: "richText",
23638
+ label: "Newsletter intro"
23639
+ },
23640
+ {
23641
+ id: "listId",
23642
+ type: "reference",
23643
+ label: "Newsletter list",
23644
+ description: "Select the list new subscribers should be added to.",
23645
+ required: true,
23646
+ referenceKind: "newsletterList",
23647
+ allowManualEntry: false,
23648
+ ui: { intent: "behavior" }
23649
+ },
23650
+ {
23651
+ id: "preset",
23652
+ type: "select",
23653
+ label: "Newsletter fields",
23654
+ defaultValue: "emailOnly",
23655
+ ui: { intent: "display" },
23656
+ options: [
23657
+ { value: "emailOnly", label: "Email only" },
23658
+ { value: "emailName", label: "Email + Name" },
23659
+ { value: "emailFirstLast", label: "Email + First/Last Name" },
23660
+ { value: "emailNameCompany", label: "Email + Name + Company (B2B)" }
23661
+ ]
23662
+ },
23663
+ {
23664
+ id: "includePhone",
23665
+ type: "boolean",
23666
+ label: "Include phone field",
23667
+ defaultValue: false,
23668
+ ui: { intent: "display" }
23669
+ },
23670
+ {
23671
+ id: "newsletterButtonLabel",
23672
+ type: "text",
23673
+ label: "Newsletter button label",
23674
+ defaultValue: "Subscribe",
23675
+ ui: { intent: "display" }
23676
+ },
23677
+ {
23678
+ id: "newsletterSuccessMessage",
23679
+ type: "text",
23680
+ label: "Newsletter success message",
23681
+ defaultValue: "Thanks for subscribing!",
23682
+ ui: { intent: "behavior" }
23683
+ },
23684
+ {
23685
+ id: "newsletterPrivacyNote",
23686
+ type: "text",
23687
+ label: "Privacy note",
23688
+ ui: { intent: "display" }
23689
+ },
23690
+ {
23691
+ id: "newsletterTags",
23692
+ type: "text",
23693
+ label: "Newsletter tags",
23694
+ description: "Optional tags to apply on subscribe, separated by comma or semicolon.",
23695
+ ui: { intent: "behavior" }
23696
+ },
23697
+ {
23698
+ id: "contactTitle",
23699
+ type: "text",
23700
+ label: "Contact title",
23701
+ defaultValue: "Get in touch"
23702
+ },
23703
+ {
23704
+ id: "contactIntro",
23705
+ type: "richText",
23706
+ label: "Contact intro"
23707
+ },
23708
+ {
23709
+ id: "formSlug",
23710
+ type: "reference",
23711
+ label: "Contact form",
23712
+ description: "Pick a saved form to render.",
23713
+ required: true,
23714
+ referenceKind: "form",
23715
+ allowManualEntry: false,
23716
+ ui: { intent: "behavior" }
23717
+ },
23718
+ {
23719
+ id: "contactSubmitLabel",
23720
+ type: "text",
23721
+ label: "Contact button label",
23722
+ defaultValue: "Send message",
23723
+ ui: { intent: "display" }
23724
+ },
23725
+ {
23726
+ id: "contactSuccessMessage",
23727
+ type: "text",
23728
+ label: "Contact success message",
23729
+ defaultValue: "Thanks - we received your message.",
23730
+ ui: { intent: "behavior" }
23731
+ }
23732
+ ],
23733
+ styleTokens: {
23734
+ background: "surface",
23735
+ typography: "body",
23736
+ spacing: "md"
23737
+ },
23738
+ behaviours: {
23739
+ supportsThemeSwitching: true,
23740
+ inlineEditing: true,
23741
+ animation: false,
23742
+ paletteHidden: false
23743
+ },
23744
+ tags: [
23745
+ "contact",
23746
+ "newsletter",
23747
+ "signup",
23748
+ "email",
23749
+ "form",
23750
+ "lead-capture"
23751
+ ],
23752
+ icon: "MailPlus"
23753
+ });
23754
+ var contactNewsletterBlockDefinition = {
23755
+ manifest: contactNewsletterManifest,
23756
+ dataSchemas: { form: formDataSchema.optional() },
23757
+ dataLoaders: {
23758
+ form: {
23759
+ endpoint: "getPublicFormById",
23760
+ params: {
23761
+ formSlug: { $bind: { from: "formSlug" } }
23762
+ },
23763
+ mode: "server"
23764
+ }
23765
+ }
23766
+ };
23767
+
22718
23768
  // ../blocks/src/system/blocks/faq.ts
22719
23769
  function fragmentLayoutNode2(layout) {
22720
23770
  return isNodeDefinitionArray2(layout) ? el("div", {}, [...layout]) : layout;
@@ -22943,6 +23993,7 @@ var joinClasses3 = (parts) => parts.filter(
22943
23993
  ).join(" ").replace(/\s+/g, " ").trim();
22944
23994
  var eyebrowTreatmentClassMap = {
22945
23995
  plain: "",
23996
+ accent: "rb-eyebrow-treatment-accent",
22946
23997
  pill: "rb-eyebrow-treatment-pill",
22947
23998
  "accent-pill": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent",
22948
23999
  "pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-pill-bounce",
@@ -22969,6 +24020,13 @@ var imageGalleryCornerClassMap = {
22969
24020
  "2xl": "rb-rounded-2xl",
22970
24021
  "3xl": "rb-rounded-3xl"
22971
24022
  };
24023
+ var imageShapeClassMap = {
24024
+ default: "",
24025
+ square: "rb-media-shape-square",
24026
+ rounded: "rb-media-shape-rounded",
24027
+ circle: "rb-media-shape-circle",
24028
+ arch: "rb-media-shape-arch"
24029
+ };
22972
24030
  var parseRatio = (raw) => {
22973
24031
  if (typeof raw !== "string") return null;
22974
24032
  const value = raw.trim();
@@ -23113,6 +24171,10 @@ function resolveHeroContentMaxWidth(content) {
23113
24171
  return "default";
23114
24172
  }
23115
24173
  function resolveHeroTypographyScale(content) {
24174
+ const titleSize = readString(content, "titleSize");
24175
+ if (titleSize === "quiet" || titleSize === "editorial" || titleSize === "display" || titleSize === "poster") {
24176
+ return titleSize;
24177
+ }
23116
24178
  const raw = readHeroLayoutString(
23117
24179
  content,
23118
24180
  "typographyScale",
@@ -23354,6 +24416,16 @@ var uiTransforms = [
23354
24416
  heroGridClassFromVerticalAlignmentTransform,
23355
24417
  imageFragmentClassTransform,
23356
24418
  imageFragmentSizeTransform,
24419
+ {
24420
+ id: "ui.imageShapeClassName",
24421
+ kind: "string",
24422
+ summary: "Apply a constrained media shape class",
24423
+ run: (value, options) => {
24424
+ const baseClass = typeof options?.baseClass === "string" ? options.baseClass : "";
24425
+ const shape = typeof value === "string" ? value.trim() : "default";
24426
+ return joinClasses3([baseClass, imageShapeClassMap[shape] ?? ""]);
24427
+ }
24428
+ },
23357
24429
  conditionalClassTransform,
23358
24430
  twoColumnContainerClassTransform,
23359
24431
  twoColumnFlexBasisTransform,
@@ -24697,6 +25769,21 @@ var siteHeaderManifest = createBlockManifest({
24697
25769
  id: "block.site-header",
24698
25770
  title: "Site Header",
24699
25771
  category: "layout",
25772
+ additionalFields: [
25773
+ {
25774
+ id: "mode",
25775
+ type: "select",
25776
+ label: "Header display",
25777
+ required: false,
25778
+ multiple: false,
25779
+ defaultValue: "default",
25780
+ options: [
25781
+ { value: "default", label: "Show header" },
25782
+ { value: "hidden", label: "Hide header" }
25783
+ ],
25784
+ ui: { intent: "display" }
25785
+ }
25786
+ ],
24700
25787
  // Skip section styles - this block uses theme-based styling
24701
25788
  skipSectionStyles: true,
24702
25789
  // Block manages its own wrapper - enables sticky positioning
@@ -26099,6 +27186,9 @@ var mediaTextManifest = createBlockManifest({
26099
27186
  category: "layout",
26100
27187
  includeContainerStyles: true,
26101
27188
  titleSource: "title",
27189
+ previewCustomize: {
27190
+ quickFieldPriority: ["imagePosition", "ratio", "imageShape", "titleAlignment", "aspectRatio"]
27191
+ },
26102
27192
  additionalFields: [
26103
27193
  {
26104
27194
  id: "images",
@@ -26137,7 +27227,7 @@ var mediaTextManifest = createBlockManifest({
26137
27227
  {
26138
27228
  id: "titleAlignment",
26139
27229
  type: "select",
26140
- label: "Title alignment",
27230
+ label: "Content alignment",
26141
27231
  required: false,
26142
27232
  defaultValue: "left",
26143
27233
  multiple: false,
@@ -26195,7 +27285,18 @@ var mediaTextManifest = createBlockManifest({
26195
27285
  transition: "slide"
26196
27286
  },
26197
27287
  ui: { intent: "behavior" }
26198
- }),
27288
+ }).map((field) => ({
27289
+ ...field,
27290
+ ui: {
27291
+ ...field.ui ?? {},
27292
+ visibleWhen: field.id === "carouselAutoplayDelay" ? {
27293
+ allOf: [
27294
+ { field: "images", minItems: 2 },
27295
+ { field: "carouselAutoplay", equals: true }
27296
+ ]
27297
+ } : { field: "images", minItems: 2 }
27298
+ }
27299
+ })),
26199
27300
  createAspectRatioField({
26200
27301
  id: "aspectRatio",
26201
27302
  label: "Media aspect ratio",
@@ -26203,6 +27304,12 @@ var mediaTextManifest = createBlockManifest({
26203
27304
  defaultValue: "auto",
26204
27305
  visibleWhen: { field: "images", notEquals: null }
26205
27306
  }),
27307
+ createImageShapeField({
27308
+ id: "imageShape",
27309
+ label: "Media shape",
27310
+ defaultValue: "default",
27311
+ visibleWhen: { field: "images", notEquals: null }
27312
+ }),
26206
27313
  {
26207
27314
  id: "text",
26208
27315
  type: "richText",
@@ -26236,6 +27343,30 @@ var mediaTextManifest = createBlockManifest({
26236
27343
  ...options?.not ? { not: true } : {}
26237
27344
  }
26238
27345
  });
27346
+ const bodyClassNameFromAlignment = {
27347
+ $bind: {
27348
+ from: "content.titleAlignment",
27349
+ transforms: [
27350
+ {
27351
+ id: "ui.bodyClassFromAlignment",
27352
+ options: { base: "rb-prose rb-max-w-none" }
27353
+ }
27354
+ ],
27355
+ fallback: "rb-prose rb-max-w-none"
27356
+ }
27357
+ };
27358
+ const titleClassNameFromAlignment = {
27359
+ $bind: {
27360
+ from: "content.titleAlignment",
27361
+ transforms: [
27362
+ {
27363
+ id: "ui.headingClassFromAlignment",
27364
+ options: { base: "" }
27365
+ }
27366
+ ],
27367
+ fallback: ""
27368
+ }
27369
+ };
26239
27370
  const defaultTextColumn = el("div", {}, [
26240
27371
  styledCard(
26241
27372
  [
@@ -26260,8 +27391,55 @@ var mediaTextManifest = createBlockManifest({
26260
27391
  bind("content.text")
26261
27392
  )
26262
27393
  ]);
27394
+ const bioTextColumn = el(
27395
+ "div",
27396
+ { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" },
27397
+ [
27398
+ text(
27399
+ {
27400
+ as: "h2",
27401
+ className: titleClassNameFromAlignment
27402
+ },
27403
+ when("content.title"),
27404
+ bind("content.title")
27405
+ ),
27406
+ styledCard(
27407
+ [
27408
+ richText(
27409
+ {
27410
+ className: bodyClassNameFromAlignment
27411
+ },
27412
+ bind("content.text")
27413
+ )
27414
+ ],
27415
+ {
27416
+ stylesFrom: "content._textCardStyles",
27417
+ backgroundFrom: "content._textCardStyles.background"
27418
+ },
27419
+ when("content.wrapTextInCard")
27420
+ ),
27421
+ richText(
27422
+ {
27423
+ className: bodyClassNameFromAlignment
27424
+ },
27425
+ when("content.wrapTextInCard", { not: true }),
27426
+ bind("content.text")
27427
+ )
27428
+ ]
27429
+ );
26263
27430
  const defaultImageCommonProps = {
26264
- className: "rb-w-full rb-h-auto rb-object-cover",
27431
+ className: {
27432
+ $bind: {
27433
+ from: "content.imageShape",
27434
+ transforms: [
27435
+ {
27436
+ id: "ui.imageShapeClassName",
27437
+ options: { baseClass: "rb-w-full rb-h-auto rb-object-cover" }
27438
+ }
27439
+ ],
27440
+ fallback: "rb-w-full rb-h-auto rb-object-cover"
27441
+ }
27442
+ },
26265
27443
  style: {
26266
27444
  aspectRatio: { $bind: { from: "content.aspectRatio" } }
26267
27445
  }
@@ -26302,6 +27480,27 @@ var mediaTextManifest = createBlockManifest({
26302
27480
  ],
26303
27481
  whenImagesLength(0, { not: true })
26304
27482
  );
27483
+ const bioImagesLayout = el(
27484
+ "div",
27485
+ {},
27486
+ [
27487
+ responsiveTwoColumn({
27488
+ image: el("div", {}, [
27489
+ el("div", {}, [defaultSingleImage], whenImagesLength(1)),
27490
+ el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))
27491
+ ]),
27492
+ text: bioTextColumn,
27493
+ ratioFrom: "content.ratio",
27494
+ imagePositionFrom: "content.imagePosition",
27495
+ containerClassName: "rb-flex rb-flex-col rb-md-flex-row rb-md-items-center",
27496
+ gapFrom: "content.gap",
27497
+ gapFallback: "comfortable",
27498
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
27499
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
27500
+ })
27501
+ ],
27502
+ whenImagesLength(0, { not: true })
27503
+ );
26305
27504
  const defaultTextOnlyLayout = el(
26306
27505
  "div",
26307
27506
  {},
@@ -26331,7 +27530,45 @@ var mediaTextManifest = createBlockManifest({
26331
27530
  ],
26332
27531
  whenImagesLength(0)
26333
27532
  );
27533
+ const bioTextOnlyLayout = el(
27534
+ "div",
27535
+ { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" },
27536
+ [
27537
+ text(
27538
+ {
27539
+ as: "h2",
27540
+ className: titleClassNameFromAlignment
27541
+ },
27542
+ when("content.title"),
27543
+ bind("content.title")
27544
+ ),
27545
+ styledCard(
27546
+ [
27547
+ richText(
27548
+ {
27549
+ className: bodyClassNameFromAlignment
27550
+ },
27551
+ bind("content.text")
27552
+ )
27553
+ ],
27554
+ {
27555
+ stylesFrom: "content._textCardStyles",
27556
+ backgroundFrom: "content._textCardStyles.background"
27557
+ },
27558
+ when("content.wrapTextInCard")
27559
+ ),
27560
+ richText(
27561
+ {
27562
+ className: bodyClassNameFromAlignment
27563
+ },
27564
+ when("content.wrapTextInCard", { not: true }),
27565
+ bind("content.text")
27566
+ )
27567
+ ],
27568
+ whenImagesLength(0)
27569
+ );
26334
27570
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
27571
+ const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
26335
27572
  const defaultLayout2 = styledSection({
26336
27573
  children: styledContainer({
26337
27574
  rootType: "stack",
@@ -26340,18 +27577,7 @@ var mediaTextManifest = createBlockManifest({
26340
27577
  text(
26341
27578
  {
26342
27579
  as: "h2",
26343
- className: {
26344
- $bind: {
26345
- from: "content.titleAlignment",
26346
- transforms: [
26347
- {
26348
- id: "ui.headingClassFromAlignment",
26349
- options: { base: "" }
26350
- }
26351
- ],
26352
- fallback: ""
26353
- }
26354
- }
27580
+ className: titleClassNameFromAlignment
26355
27581
  },
26356
27582
  when("content.title"),
26357
27583
  bind("content.title")
@@ -26363,14 +27589,28 @@ var mediaTextManifest = createBlockManifest({
26363
27589
  baseClass: "",
26364
27590
  spacing: "medium"
26365
27591
  });
27592
+ const bioLayout = styledSection({
27593
+ children: styledContainer({
27594
+ rootType: "stack",
27595
+ rootProps: { gap: "lg" },
27596
+ children: [bioInner]
27597
+ }),
27598
+ baseClass: "",
27599
+ spacing: "medium"
27600
+ });
26366
27601
  return {
26367
27602
  layout: defaultLayout2,
26368
27603
  variants: {
26369
- default: defaultLayout2
27604
+ default: defaultLayout2,
27605
+ bio: bioLayout
26370
27606
  },
26371
27607
  defaultVariant: "default",
26372
27608
  variantOptions: {
26373
- default: { label: "Default" }
27609
+ default: { label: "Default" },
27610
+ bio: {
27611
+ label: "Bio",
27612
+ description: "Vertically centered title and copy beside media."
27613
+ }
26374
27614
  }
26375
27615
  };
26376
27616
  })(),
@@ -27076,10 +28316,8 @@ var occurrenceContextSchema = z43.object({
27076
28316
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
27077
28317
  import { z as z45 } from "zod";
27078
28318
 
27079
- // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
27080
- import { z as z44 } from "zod";
27081
-
27082
28319
  // ../blocks/src/system/constants/events.ts
28320
+ var EVENT_CONTENT_TYPE_SLUGS = ["event", "events"];
27083
28321
  var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
27084
28322
  var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
27085
28323
  var eventCalendarListLayoutOptions = [
@@ -27093,8 +28331,133 @@ function isEventCalendarDisplayMode(value) {
27093
28331
  function isEventCalendarListLayout(value) {
27094
28332
  return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
27095
28333
  }
28334
+ function isEventContentType(slug) {
28335
+ if (!slug) return false;
28336
+ return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
28337
+ }
28338
+
28339
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
28340
+ var DEFAULT_EVENT_CURRENCY = "USD";
28341
+ function resolveRuntimeEventPricing(event) {
28342
+ if (isPublicEventPricing(event.pricing)) {
28343
+ return event.pricing;
28344
+ }
28345
+ const legacy = event;
28346
+ const currency = readCurrency(legacy.currency);
28347
+ if (event.requiresRegistration === false) {
28348
+ return {
28349
+ kind: "drop_in",
28350
+ currency,
28351
+ display: { kind: "free", currency }
28352
+ };
28353
+ }
28354
+ if (legacy.pricingMode === "ticket_types") {
28355
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
28356
+ return {
28357
+ kind: "ticket_types",
28358
+ currency,
28359
+ ticketTypes,
28360
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
28361
+ };
28362
+ }
28363
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
28364
+ if (legacy.pricingType === "paid" && amount > 0) {
28365
+ return {
28366
+ kind: "single_paid",
28367
+ amount,
28368
+ currency,
28369
+ display: { kind: "exact", amount, currency }
28370
+ };
28371
+ }
28372
+ return {
28373
+ kind: "free_registration",
28374
+ currency,
28375
+ display: { kind: "free", currency }
28376
+ };
28377
+ }
28378
+ function readCurrency(value) {
28379
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
28380
+ }
28381
+ function isRecord3(value) {
28382
+ return typeof value === "object" && value !== null && !Array.isArray(value);
28383
+ }
28384
+ function isPublicEventPricing(value) {
28385
+ if (!isRecord3(value) || typeof value.kind !== "string") return false;
28386
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
28387
+ }
28388
+ function isPublicEventTicketType(value) {
28389
+ return isRecord3(value) && typeof value.id === "string";
28390
+ }
28391
+ function readTicketTypePriceDisplay(value, currency) {
28392
+ const display = readLegacyPriceDisplay(value, currency);
28393
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
28394
+ }
28395
+ function readLegacyPriceDisplay(value, currency) {
28396
+ if (!isRecord3(value) || typeof value.kind !== "string") {
28397
+ return { kind: "unavailable", currency };
28398
+ }
28399
+ const displayCurrency = readCurrency(value.currency);
28400
+ switch (value.kind) {
28401
+ case "free":
28402
+ return { kind: "free", currency: displayCurrency };
28403
+ case "exact":
28404
+ return readAmount(value.amount) !== null ? {
28405
+ kind: "exact",
28406
+ amount: readAmount(value.amount) ?? 0,
28407
+ currency: displayCurrency
28408
+ } : { kind: "unavailable", currency };
28409
+ case "from":
28410
+ return readAmount(value.amount) !== null ? {
28411
+ kind: "from",
28412
+ amount: readAmount(value.amount) ?? 0,
28413
+ currency: displayCurrency
28414
+ } : { kind: "unavailable", currency };
28415
+ case "mixed":
28416
+ return readAmount(value.paidFromAmount) !== null ? {
28417
+ kind: "mixed",
28418
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
28419
+ currency: displayCurrency
28420
+ } : { kind: "unavailable", currency };
28421
+ case "unavailable":
28422
+ return { kind: "unavailable", currency: displayCurrency };
28423
+ case "course":
28424
+ return isRecord3(value.display) ? {
28425
+ kind: "course",
28426
+ display: readCoursePriceDisplay(value.display, displayCurrency)
28427
+ } : {
28428
+ kind: "course",
28429
+ display: { kind: "unavailable", currency: displayCurrency }
28430
+ };
28431
+ default:
28432
+ return { kind: "unavailable", currency };
28433
+ }
28434
+ }
28435
+ function readCoursePriceDisplay(value, currency) {
28436
+ switch (value.kind) {
28437
+ case "free":
28438
+ return { kind: "free", currency: readCurrency(value.currency) };
28439
+ case "exact":
28440
+ return readAmount(value.amount) !== null ? {
28441
+ kind: "exact",
28442
+ amount: readAmount(value.amount) ?? 0,
28443
+ currency: readCurrency(value.currency)
28444
+ } : { kind: "unavailable", currency };
28445
+ case "from":
28446
+ return readAmount(value.amount) !== null ? {
28447
+ kind: "from",
28448
+ amount: readAmount(value.amount) ?? 0,
28449
+ currency: readCurrency(value.currency)
28450
+ } : { kind: "unavailable", currency };
28451
+ default:
28452
+ return { kind: "unavailable", currency };
28453
+ }
28454
+ }
28455
+ function readAmount(value) {
28456
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
28457
+ }
27096
28458
 
27097
28459
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
28460
+ import { z as z44 } from "zod";
27098
28461
  var previewStageSchema = z44.enum(["preview", "published"]);
27099
28462
  var registrationButtonVariantSchema = z44.enum(["primary", "secondary", "outline"]);
27100
28463
  var eventButtonVariantSchema = z44.enum(["primary", "secondary", "outline", "link"]);
@@ -27105,12 +28468,73 @@ var weekStartSchema = z44.enum(["sunday", "monday"]);
27105
28468
  var filterAutoShowSchema = z44.enum(["auto", "always", "never"]);
27106
28469
  var calendarTabViewsSchema = z44.enum(["both", "month", "week"]);
27107
28470
 
28471
+ // ../blocks/src/system/runtime/nodes/event-registration/wizardSteps.ts
28472
+ function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep) {
28473
+ const baseSteps = hasPreSelectedContext ? ["select-tickets", "enter-details"] : ["select-event", "select-tickets", "enter-details"];
28474
+ if (!needsPaymentStep) {
28475
+ return baseSteps;
28476
+ }
28477
+ return [...baseSteps, "select-payment"];
28478
+ }
28479
+
28480
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationDerivations.ts
28481
+ function eventMatchesOccurrenceId(event, occurrenceId) {
28482
+ return event.registrationOccurrenceId === occurrenceId || event.publicEventId === occurrenceId;
28483
+ }
28484
+ function findPreSelectedEvent(input) {
28485
+ const occurrenceContext = input.occurrenceContext;
28486
+ if (!occurrenceContext) {
28487
+ return null;
28488
+ }
28489
+ const contextDate = getBookingLocalDateKey(toScheduledBookingDateTime({
28490
+ startsAt: occurrenceContext.startsAt,
28491
+ timeZone: occurrenceContext.timeZone
28492
+ }));
28493
+ return input.scopedEvents.find(
28494
+ (event) => eventMatchesOccurrenceId(event, occurrenceContext.id) || getBookingLocalDateKey(toScheduledBookingDateTime({
28495
+ startsAt: event.startsAt,
28496
+ timeZone: event.timeZone
28497
+ })) === contextDate
28498
+ ) ?? null;
28499
+ }
28500
+ function resolveEventRequiresPayment(input) {
28501
+ if (input.eligibility) {
28502
+ return input.eligibility.requiresPayment;
28503
+ }
28504
+ if (input.selectedTicketType) {
28505
+ return input.selectedTicketType.priceAmount > 0;
28506
+ }
28507
+ if (!input.event) {
28508
+ return false;
28509
+ }
28510
+ return publicEventPricingType(resolveRuntimeEventPricing(input.event)) !== "free";
28511
+ }
28512
+
28513
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.ts
28514
+ function toRegistrationEvent(event) {
28515
+ return {
28516
+ ...event,
28517
+ pricing: resolveRuntimeEventPricing(event),
28518
+ publicEventId: event.id,
28519
+ registrationOccurrenceId: event.occurrenceId
28520
+ };
28521
+ }
28522
+ function toRegistrationEvents(events) {
28523
+ return events.map(toRegistrationEvent);
28524
+ }
28525
+
27108
28526
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
28527
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
28528
+ var EVENT_REGISTRATION_SHELL_STEP_LABELS = ["Event", "Date", "Tickets", "Details", "Payment"];
27109
28529
  var contentEntrySchema = z45.object({
27110
28530
  id: z45.string(),
27111
28531
  slug: z45.string(),
27112
28532
  contentTypeSlug: z45.string()
27113
28533
  });
28534
+ var eventRegistrationPublicEventSchema = z45.preprocess(
28535
+ normalizeEventRegistrationEventInput,
28536
+ publicEventSchema
28537
+ );
27114
28538
  var eventRegistrationSourceSchema = z45.object({
27115
28539
  siteId: z45.string().optional(),
27116
28540
  apiBaseUrl: z45.string().optional(),
@@ -27118,7 +28542,7 @@ var eventRegistrationSourceSchema = z45.object({
27118
28542
  previewToken: z45.string().nullable().optional(),
27119
28543
  occurrenceContext: occurrenceContextSchema.optional(),
27120
28544
  contentEntry: contentEntrySchema.nullable().optional(),
27121
- events: z45.array(publicEventSchema).nullable().optional(),
28545
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
27122
28546
  className: z45.string().nullable().optional(),
27123
28547
  buttonText: z45.string().nullable().optional(),
27124
28548
  maxTickets: z45.string().nullable().optional(),
@@ -27133,14 +28557,17 @@ var eventRegistrationSourceSchema = z45.object({
27133
28557
  });
27134
28558
  var eventRegistrationDisplaySchema = z45.object({
27135
28559
  kind: z45.literal("event-registration"),
27136
- state: z45.literal("shell"),
28560
+ state: z45.literal("generic-shell"),
27137
28561
  className: z45.string().nullable(),
28562
+ titleText: z45.string(),
28563
+ bodyText: z45.string(),
28564
+ stepLabels: z45.array(z45.enum(EVENT_REGISTRATION_SHELL_STEP_LABELS)).min(1),
27138
28565
  summaryButtonText: z45.string()
27139
28566
  });
27140
28567
  var eventRegistrationHydrationSchema = z45.object({
27141
28568
  occurrenceContext: occurrenceContextSchema.optional(),
27142
28569
  contentEntry: contentEntrySchema.nullable().optional(),
27143
- events: z45.array(publicEventSchema).nullable().optional(),
28570
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
27144
28571
  maxTickets: z45.string().optional(),
27145
28572
  showVenue: z45.boolean().optional(),
27146
28573
  showCapacity: z45.boolean().optional(),
@@ -27169,13 +28596,81 @@ var eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys(
27169
28596
  "stage"
27170
28597
  );
27171
28598
  function buildEventRegistrationDisplay(source) {
28599
+ const stepLabels = buildEventRegistrationShellStepLabels(source);
27172
28600
  return {
27173
28601
  kind: "event-registration",
27174
- state: "shell",
28602
+ state: "generic-shell",
27175
28603
  className: source.className ?? null,
28604
+ titleText: "Event registration",
28605
+ bodyText: buildEventRegistrationShellBodyText(stepLabels),
28606
+ stepLabels,
27176
28607
  summaryButtonText: source.buttonText?.trim() || "Register"
27177
28608
  };
27178
28609
  }
28610
+ function buildEventRegistrationShellStepLabels(source) {
28611
+ const scopedEvents = scopeEventRegistrationEvents(source);
28612
+ if (scopedEvents.length === 0) {
28613
+ return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
28614
+ }
28615
+ const preSelectedEvent = findPreSelectedEvent({
28616
+ scopedEvents,
28617
+ occurrenceContext: source.occurrenceContext
28618
+ });
28619
+ const hasPreSelectedContext = Boolean(source.occurrenceContext || preSelectedEvent);
28620
+ const needsPaymentStep = hasPreSelectedContext && preSelectedEvent ? resolveEventRequiresPayment({
28621
+ eligibility: null,
28622
+ selectedTicketType: null,
28623
+ event: preSelectedEvent
28624
+ }) : false;
28625
+ return getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
28626
+ }
28627
+ function scopeEventRegistrationEvents(source) {
28628
+ const events = toRegistrationEvents(source.events ?? []);
28629
+ if (source.occurrenceContext?.seriesId) {
28630
+ return events.filter((event) => event.seriesId === source.occurrenceContext?.seriesId);
28631
+ }
28632
+ const entrySlug = source.contentEntry?.slug;
28633
+ const entryContentType = source.contentEntry?.contentTypeSlug;
28634
+ if (entrySlug && entryContentType && isEventContentType(entryContentType)) {
28635
+ return events.filter((event) => event.slug === entrySlug);
28636
+ }
28637
+ return events;
28638
+ }
28639
+ function shellLabelForRegistrationStep(step, events) {
28640
+ switch (step) {
28641
+ case "select-event":
28642
+ return isDateSelection(events) ? "Date" : "Event";
28643
+ case "select-tickets":
28644
+ return "Tickets";
28645
+ case "enter-details":
28646
+ return "Details";
28647
+ case "select-payment":
28648
+ return "Payment";
28649
+ case "error":
28650
+ case "success":
28651
+ case "submitting":
28652
+ case "redirecting":
28653
+ case "verifying-payment":
28654
+ case "verifying-timeout":
28655
+ case "payment-failed":
28656
+ return "Details";
28657
+ }
28658
+ }
28659
+ function isDateSelection(events) {
28660
+ const firstSeriesId = events[0]?.seriesId;
28661
+ return Boolean(
28662
+ events.length > 1 && firstSeriesId && events.every((event) => event.seriesId === firstSeriesId)
28663
+ );
28664
+ }
28665
+ function buildEventRegistrationShellBodyText(stepLabels) {
28666
+ if (stepLabels.includes("Payment")) {
28667
+ return "Preparing tickets, details, and payment options.";
28668
+ }
28669
+ if (stepLabels[0] === "Tickets") {
28670
+ return "Preparing tickets and booking details.";
28671
+ }
28672
+ return "Preparing dates, tickets, and booking details.";
28673
+ }
27179
28674
  var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
27180
28675
  kind: "client-owned",
27181
28676
  contracts: {
@@ -27199,6 +28694,18 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
27199
28694
  }
27200
28695
  })
27201
28696
  });
28697
+ function normalizeEventRegistrationEventInput(value) {
28698
+ if (!isRecord4(value)) {
28699
+ return value;
28700
+ }
28701
+ return {
28702
+ ...value,
28703
+ pricing: resolveRuntimeEventPricing(value)
28704
+ };
28705
+ }
28706
+ function isRecord4(value) {
28707
+ return typeof value === "object" && value !== null && !Array.isArray(value);
28708
+ }
27202
28709
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
27203
28710
  runtime: eventRegistrationBlockRuntime,
27204
28711
  mode: "event-registration",
@@ -29697,7 +31204,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
29697
31204
  return keys.length >= 2 ? keys : [];
29698
31205
  }
29699
31206
  function normalizeOfferingsPreviewContentForWrite(value) {
29700
- if (!isRecord3(value)) return null;
31207
+ if (!isRecord5(value)) return null;
29701
31208
  const groupOrderValue = value.groupOrder;
29702
31209
  if (Array.isArray(groupOrderValue)) {
29703
31210
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -29710,7 +31217,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
29710
31217
  return { ...value, groupOrder: [] };
29711
31218
  }
29712
31219
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
29713
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord3) : []
31220
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord5) : []
29714
31221
  );
29715
31222
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
29716
31223
  }
@@ -29724,7 +31231,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
29724
31231
  }
29725
31232
  return keys;
29726
31233
  }
29727
- function isRecord3(value) {
31234
+ function isRecord5(value) {
29728
31235
  return typeof value === "object" && value !== null && !Array.isArray(value);
29729
31236
  }
29730
31237
 
@@ -30091,7 +31598,7 @@ function isOfferingsPreviewItemLimit(value) {
30091
31598
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
30092
31599
  }
30093
31600
  function normalizeOfferingsPreviewGroupOverride(value) {
30094
- if (!isRecord4(value)) return [];
31601
+ if (!isRecord6(value)) return [];
30095
31602
  const override = {};
30096
31603
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
30097
31604
  override.sourceKey = value.sourceKey;
@@ -30123,12 +31630,12 @@ function isButtonVariant(value) {
30123
31630
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
30124
31631
  }
30125
31632
  function normalizeCardStylesContent(value) {
30126
- return isRecord4(value) || value === null ? value : void 0;
31633
+ return isRecord6(value) || value === null ? value : void 0;
30127
31634
  }
30128
31635
  function normalizeSectionStylesContent(value) {
30129
- return isRecord4(value) || value === null ? value : void 0;
31636
+ return isRecord6(value) || value === null ? value : void 0;
30130
31637
  }
30131
- function isRecord4(value) {
31638
+ function isRecord6(value) {
30132
31639
  return typeof value === "object" && value !== null && !Array.isArray(value);
30133
31640
  }
30134
31641
 
@@ -34088,11 +35595,13 @@ var heroImageSurfaceMotions = [
34088
35595
  ];
34089
35596
  var standardEyebrowTreatments = [
34090
35597
  "plain",
35598
+ "accent",
34091
35599
  "pill",
34092
35600
  "accent-pill"
34093
35601
  ];
34094
35602
  var animatedEyebrowTreatments = [
34095
35603
  "plain",
35604
+ "accent",
34096
35605
  "pill",
34097
35606
  "accent-pill",
34098
35607
  "pill-bounce",
@@ -34393,6 +35902,17 @@ var systemBlockDefinitionsRaw = [
34393
35902
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
34394
35903
  ]
34395
35904
  })),
35905
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
35906
+ flow: conversionFlow,
35907
+ layoutProfiles: [
35908
+ layoutProfile({
35909
+ variantKey: "default",
35910
+ family: "split",
35911
+ weight: "featured",
35912
+ bias: "soft"
35913
+ })
35914
+ ]
35915
+ })),
34396
35916
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
34397
35917
  sectionSurfaces: "supported",
34398
35918
  contentFrames: ["plain", "panel"],
@@ -34484,6 +36004,12 @@ var systemBlockDefinitionsRaw = [
34484
36004
  family: "media-text",
34485
36005
  weight: "featured",
34486
36006
  bias: "soft"
36007
+ }),
36008
+ layoutProfile({
36009
+ variantKey: "bio",
36010
+ family: "media-text",
36011
+ weight: "featured",
36012
+ bias: "soft"
34487
36013
  })
34488
36014
  ]
34489
36015
  })),
@@ -35516,6 +37042,11 @@ ${root} {
35516
37042
  --er-event-card-bg: rgb(var(--tb-surface));
35517
37043
  --er-event-card-border-width: var(--rb-border-width, 1px);
35518
37044
  --er-event-card-hover-opacity: 1;
37045
+ --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
37046
+ --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
37047
+ --er-radius: var(--rb-block-radius);
37048
+ --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
37049
+ --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
35519
37050
 
35520
37051
  /* Step indicator */
35521
37052
  --er-step-active: rgb(var(--tb-primary));
@@ -36747,7 +38278,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
36747
38278
  }
36748
38279
 
36749
38280
  // ../api/src/utils/isRecord.ts
36750
- function isRecord5(value) {
38281
+ function isRecord7(value) {
36751
38282
  return typeof value === "object" && value !== null && !Array.isArray(value);
36752
38283
  }
36753
38284
 
@@ -37054,7 +38585,7 @@ function sanitizeMarks(marks) {
37054
38585
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
37055
38586
  return [{ type: mark.type }];
37056
38587
  }
37057
- if (mark.type === "link" && isRecord5(mark.attrs) && typeof mark.attrs.href === "string") {
38588
+ if (mark.type === "link" && isRecord7(mark.attrs) && typeof mark.attrs.href === "string") {
37058
38589
  const attrs = { href: mark.attrs.href };
37059
38590
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
37060
38591
  attrs.target = mark.attrs.target;
@@ -37069,10 +38600,10 @@ function sanitizeMarks(marks) {
37069
38600
  return sanitized.length > 0 ? sanitized : void 0;
37070
38601
  }
37071
38602
  function unwrapRichTextValue(value) {
37072
- if (isRecord5(value) && isRecord5(value.doc)) {
38603
+ if (isRecord7(value) && isRecord7(value.doc)) {
37073
38604
  return unwrapRichTextValue(value.doc);
37074
38605
  }
37075
- if (isRecord5(value) && value.type === "doc") {
38606
+ if (isRecord7(value) && value.type === "doc") {
37076
38607
  return {
37077
38608
  type: "doc",
37078
38609
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -37081,7 +38612,7 @@ function unwrapRichTextValue(value) {
37081
38612
  return EMPTY_SITE_BANNER_BODY;
37082
38613
  }
37083
38614
  function isTipTapNodeLike(value) {
37084
- return isRecord5(value) && typeof value.type === "string";
38615
+ return isRecord7(value) && typeof value.type === "string";
37085
38616
  }
37086
38617
  function coerceTipTapNode(value) {
37087
38618
  return {
@@ -37089,9 +38620,9 @@ function coerceTipTapNode(value) {
37089
38620
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
37090
38621
  ...typeof value.text === "string" ? { text: value.text } : {},
37091
38622
  ...Array.isArray(value.marks) ? {
37092
- marks: value.marks.filter((mark) => isRecord5(mark) && typeof mark.type === "string").map((mark) => ({
38623
+ marks: value.marks.filter((mark) => isRecord7(mark) && typeof mark.type === "string").map((mark) => ({
37093
38624
  type: mark.type,
37094
- ...isRecord5(mark.attrs) ? { attrs: mark.attrs } : {}
38625
+ ...isRecord7(mark.attrs) ? { attrs: mark.attrs } : {}
37095
38626
  }))
37096
38627
  } : {}
37097
38628
  };
@@ -37185,7 +38716,7 @@ function collectCartLinkStats(items, depth = 0) {
37185
38716
  return result;
37186
38717
  }
37187
38718
  function isNavigationMenuValidationItem(value) {
37188
- if (!isRecord5(value)) return false;
38719
+ if (!isRecord7(value)) return false;
37189
38720
  return typeof value.label === "string";
37190
38721
  }
37191
38722
 
@@ -37324,6 +38855,7 @@ var SYSTEM_BLOCK_KINDS = [
37324
38855
  "block.site-footer",
37325
38856
  // Form/booking blocks
37326
38857
  "block.form",
38858
+ "block.contact-newsletter",
37327
38859
  "block.appointment-booking",
37328
38860
  "block.event-registration",
37329
38861
  "block.event-details",