@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
@@ -3291,6 +3291,46 @@ var ENDPOINT_DEFINITIONS = {
3291
3291
  auth: "user",
3292
3292
  responseKind: "json"
3293
3293
  },
3294
+ listEntrySlotBlocks: {
3295
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3296
+ method: "GET",
3297
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3298
+ auth: "user",
3299
+ responseKind: "json",
3300
+ errors: ["resource:not_found"]
3301
+ },
3302
+ listEntryPageContentSlots: {
3303
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots",
3304
+ method: "GET",
3305
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slots", "blocks"],
3306
+ auth: "user",
3307
+ responseKind: "json",
3308
+ errors: ["resource:not_found"]
3309
+ },
3310
+ createEntrySlotBlock: {
3311
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3312
+ method: "POST",
3313
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3314
+ auth: "user",
3315
+ responseKind: "json",
3316
+ errors: ["validation:invalid_input", "resource:not_found"]
3317
+ },
3318
+ reorderEntrySlotBlocks: {
3319
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/reorder",
3320
+ method: "POST",
3321
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3322
+ auth: "user",
3323
+ responseKind: "json",
3324
+ errors: ["validation:invalid_input", "resource:not_found"]
3325
+ },
3326
+ deleteEntrySlotBlock: {
3327
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/{blockId}",
3328
+ method: "DELETE",
3329
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3330
+ auth: "user",
3331
+ responseKind: "json",
3332
+ errors: ["resource:not_found"]
3333
+ },
3294
3334
  createBlock: {
3295
3335
  path: "/sites/{siteId}/pages/{pageId}/blocks",
3296
3336
  method: "POST",
@@ -6383,6 +6423,171 @@ var ENDPOINT_DEFINITIONS = {
6383
6423
  }
6384
6424
  };
6385
6425
 
6426
+ // ../core/src/result.ts
6427
+ function ok(value) {
6428
+ return { ok: true, value };
6429
+ }
6430
+ function err(error) {
6431
+ return { ok: false, error };
6432
+ }
6433
+
6434
+ // ../core/src/event-pricing.ts
6435
+ function publicEventPricingType(pricing) {
6436
+ switch (pricing.kind) {
6437
+ case "drop_in":
6438
+ case "free_registration":
6439
+ return "free";
6440
+ case "single_paid":
6441
+ case "ticket_types":
6442
+ case "course":
6443
+ return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
6444
+ }
6445
+ }
6446
+ function isFreePublicEventPriceDisplay(display) {
6447
+ switch (display.kind) {
6448
+ case "free":
6449
+ return true;
6450
+ case "course":
6451
+ return display.display.kind === "free";
6452
+ case "exact":
6453
+ case "from":
6454
+ case "mixed":
6455
+ case "unavailable":
6456
+ return false;
6457
+ }
6458
+ }
6459
+
6460
+ // ../core/src/booking-date-time.ts
6461
+ var DEFAULT_LOCALE = "en-US";
6462
+ var FALLBACK_TIMEZONE = "UTC";
6463
+ function isValidTimeZone(timeZone) {
6464
+ try {
6465
+ new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
6466
+ return true;
6467
+ } catch {
6468
+ return false;
6469
+ }
6470
+ }
6471
+ function getSafeTimeZone(timeZone) {
6472
+ const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
6473
+ return normalized && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
6474
+ }
6475
+ function parseStrictBookingTimeZone(timeZone) {
6476
+ const normalized = timeZone.trim();
6477
+ if (!normalized || !isValidTimeZone(normalized)) {
6478
+ return null;
6479
+ }
6480
+ return normalized;
6481
+ }
6482
+ function formatParseError(error) {
6483
+ switch (error.reason) {
6484
+ case "invalid_starts_at":
6485
+ return `Expected a valid UTC/offset-aware ISO datetime in startsAt, received "${error.value}"`;
6486
+ case "invalid_ends_at":
6487
+ return `Expected a valid UTC/offset-aware ISO datetime in endsAt, received "${error.value ?? ""}"`;
6488
+ case "invalid_time_zone":
6489
+ return `Expected a valid IANA timezone in timeZone, received "${error.value}"`;
6490
+ }
6491
+ }
6492
+ function formatToPartsLookup(date, locale, timeZone, format) {
6493
+ return new Map(
6494
+ new Intl.DateTimeFormat(locale, {
6495
+ ...format,
6496
+ timeZone
6497
+ }).formatToParts(date).map((part) => [part.type, part.value])
6498
+ );
6499
+ }
6500
+ function getZonedDateTimeParts(date, timeZone) {
6501
+ const parts = formatToPartsLookup(date, "en-GB", timeZone, {
6502
+ year: "numeric",
6503
+ month: "2-digit",
6504
+ day: "2-digit",
6505
+ hour: "2-digit",
6506
+ minute: "2-digit",
6507
+ second: "2-digit",
6508
+ hour12: false
6509
+ });
6510
+ const read = (type) => Number(parts.get(type) ?? "");
6511
+ return {
6512
+ year: read("year"),
6513
+ month: read("month"),
6514
+ day: read("day"),
6515
+ hour: read("hour"),
6516
+ minute: read("minute"),
6517
+ second: read("second")
6518
+ };
6519
+ }
6520
+ function formatDateKey(date) {
6521
+ const year = String(date.year).padStart(4, "0");
6522
+ const month = String(date.month).padStart(2, "0");
6523
+ const day = String(date.day).padStart(2, "0");
6524
+ return `${year}-${month}-${day}`;
6525
+ }
6526
+ function parseUtcIsoDateTimeString(value) {
6527
+ const normalized = value.trim();
6528
+ const hasUtcSuffix = normalized.endsWith("Z");
6529
+ const hasExplicitOffset = /[+-]\d{2}:\d{2}$/u.test(normalized);
6530
+ if (!hasUtcSuffix && !hasExplicitOffset) {
6531
+ return err("missing-timezone-offset");
6532
+ }
6533
+ const date = new Date(normalized);
6534
+ if (Number.isNaN(date.getTime())) {
6535
+ return err("invalid-date-time");
6536
+ }
6537
+ return ok(date.toISOString());
6538
+ }
6539
+ function toUtcIsoDateTimeString(value) {
6540
+ const parsed = parseUtcIsoDateTimeString(value);
6541
+ if (!parsed.ok) {
6542
+ const message = parsed.error === "missing-timezone-offset" ? `Expected an offset-aware ISO datetime, received "${value}"` : `Expected a valid ISO datetime, received "${value}"`;
6543
+ throw new Error(message);
6544
+ }
6545
+ return parsed.value;
6546
+ }
6547
+ function parseScheduledBookingDateTime(input) {
6548
+ try {
6549
+ const startsAt = toUtcIsoDateTimeString(input.startsAt);
6550
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
6551
+ if (!timeZone) {
6552
+ return {
6553
+ ok: false,
6554
+ field: "timeZone",
6555
+ reason: "invalid_time_zone",
6556
+ value: input.timeZone
6557
+ };
6558
+ }
6559
+ return {
6560
+ ok: true,
6561
+ value: {
6562
+ startsAt,
6563
+ timeZone,
6564
+ locale: input.locale
6565
+ }
6566
+ };
6567
+ } catch {
6568
+ return {
6569
+ ok: false,
6570
+ field: "startsAt",
6571
+ reason: "invalid_starts_at",
6572
+ value: input.startsAt
6573
+ };
6574
+ }
6575
+ }
6576
+ function toScheduledBookingDateTime(input) {
6577
+ const result = parseScheduledBookingDateTime(input);
6578
+ if (result.ok) {
6579
+ return result.value;
6580
+ }
6581
+ throw new Error(formatParseError(result));
6582
+ }
6583
+ function getBookingLocalDateKey(input) {
6584
+ return formatDateKey(getLocalScheduleDate(new Date(input.startsAt), input.timeZone));
6585
+ }
6586
+ function getLocalScheduleDate(date, timeZone) {
6587
+ const parts = getZonedDateTimeParts(date, getSafeTimeZone(timeZone));
6588
+ return { year: parts.year, month: parts.month, day: parts.day };
6589
+ }
6590
+
6386
6591
  // ../core/src/location.ts
6387
6592
  function normalizeLocationAddressText(value) {
6388
6593
  if (typeof value !== "string") {
@@ -6927,6 +7132,21 @@ var selectSourceSchema = z4.discriminatedUnion("kind", [
6927
7132
  function assertNeverSelectSource(value) {
6928
7133
  throw new Error(`Unhandled select source: ${JSON.stringify(value)}`);
6929
7134
  }
7135
+ var visibleWhenPredicateSchema = z4.object({
7136
+ field: z4.string().min(1),
7137
+ equals: z4.any().optional(),
7138
+ notEquals: z4.any().optional(),
7139
+ oneOf: z4.array(z4.any()).optional(),
7140
+ notIn: z4.array(z4.any()).optional(),
7141
+ minItems: z4.number().int().nonnegative().optional(),
7142
+ maxItems: z4.number().int().nonnegative().optional()
7143
+ });
7144
+ var visibleWhenSchema = z4.union([
7145
+ visibleWhenPredicateSchema,
7146
+ z4.object({
7147
+ allOf: z4.array(visibleWhenPredicateSchema).min(1)
7148
+ })
7149
+ ]);
6930
7150
  var uiSchema = z4.object({
6931
7151
  widget: z4.string().optional(),
6932
7152
  // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)
@@ -6959,13 +7179,7 @@ var uiSchema = z4.object({
6959
7179
  showValue: z4.boolean().optional(),
6960
7180
  pattern: z4.string().optional(),
6961
7181
  placeholder: z4.string().optional(),
6962
- visibleWhen: z4.object({
6963
- field: z4.string().min(1),
6964
- equals: z4.any().optional(),
6965
- notEquals: z4.any().optional(),
6966
- oneOf: z4.array(z4.any()).optional(),
6967
- notIn: z4.array(z4.any()).optional()
6968
- }).optional(),
7182
+ visibleWhen: visibleWhenSchema.optional(),
6969
7183
  // Modal configuration for modal and group fields
6970
7184
  modalConfig: z4.object({
6971
7185
  buttonLabel: z4.string().optional(),
@@ -7732,6 +7946,7 @@ var eventListTreatmentValues = [
7732
7946
  ];
7733
7947
  var eyebrowTreatmentValues = [
7734
7948
  "plain",
7949
+ "accent",
7735
7950
  "pill",
7736
7951
  "accent-pill",
7737
7952
  "pill-bounce",
@@ -9323,9 +9538,9 @@ var _Vibrant = class _Vibrant2 {
9323
9538
  }
9324
9539
  image.remove();
9325
9540
  return res;
9326
- } catch (err) {
9541
+ } catch (err2) {
9327
9542
  image.remove();
9328
- return Promise.reject(err);
9543
+ return Promise.reject(err2);
9329
9544
  }
9330
9545
  }
9331
9546
  async getPalettes() {
@@ -9339,9 +9554,9 @@ var _Vibrant = class _Vibrant2 {
9339
9554
  const res = result1.palettes;
9340
9555
  image.remove();
9341
9556
  return res;
9342
- } catch (err) {
9557
+ } catch (err2) {
9343
9558
  image.remove();
9344
- return Promise.reject(err);
9559
+ return Promise.reject(err2);
9345
9560
  }
9346
9561
  }
9347
9562
  };
@@ -10746,27 +10961,28 @@ var joyStamp = defineButtonPersonality({
10746
10961
  }
10747
10962
  });
10748
10963
 
10749
- // ../theme-core/src/buttons/personalities/pebble.ts
10750
- var pebble = defineButtonPersonality({
10751
- id: "pebble",
10752
- name: "Pebble",
10753
- description: "Generous pill buttons with a quiet colour-softening hover.",
10754
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
10964
+ // ../theme-core/src/buttons/personalities/ornate-ritual.ts
10965
+ var ornateRitual = defineButtonPersonality({
10966
+ id: "ornate-ritual",
10967
+ name: "Ornate Ritual",
10968
+ description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
10969
+ tags: { tone: "classic", energy: "vibrant", motion: "subtle", era: "organic" },
10755
10970
  buttonSystem: {
10756
10971
  global: {
10757
- cornerStyle: "pill",
10972
+ cornerStyle: "rounded",
10758
10973
  shadow: "none",
10759
- textTransform: "none",
10760
- fontWeight: 500,
10761
- borderWidth: 2,
10974
+ textTransform: "uppercase",
10975
+ fontWeight: 600,
10976
+ borderWidth: 1,
10762
10977
  hoverTransform: "none",
10763
- hoverColor: "none"
10978
+ hoverColor: "none",
10979
+ letterSpacing: "loose"
10764
10980
  },
10765
10981
  sizes: {
10766
- sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
10767
- md: { padding: "0.875rem 2.25rem" },
10768
- lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
10769
- xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
10982
+ sm: { padding: "0.5625rem 1.25rem", fontSize: "text-xs" },
10983
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-xs" },
10984
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-sm" },
10985
+ xl: { padding: "1rem 2.75rem", fontSize: "text-base" }
10770
10986
  },
10771
10987
  variants: [
10772
10988
  {
@@ -10776,97 +10992,12 @@ var pebble = defineButtonPersonality({
10776
10992
  priority: 1,
10777
10993
  background: { type: "solid", colorToken: "primary" },
10778
10994
  textColorToken: "primaryForeground",
10779
- borderRadius: "rounded-full",
10780
- effects: {
10781
- hover: [
10782
- { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 88 } }
10783
- ]
10784
- }
10785
- },
10786
- {
10787
- id: "secondary",
10788
- name: "Secondary",
10789
- enabled: true,
10790
- priority: 2,
10791
- background: { type: "transparent" },
10792
- textColorToken: "primary",
10793
- borderRadius: "rounded-full",
10794
- border: { widthClass: "border-2", colorToken: "accent" },
10795
- effects: {
10796
- hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
10797
- }
10798
- },
10799
- {
10800
- id: "outline",
10801
- name: "Outline",
10802
- enabled: true,
10803
- priority: 3,
10804
- background: { type: "transparent" },
10805
- textColorToken: "text",
10806
- borderRadius: "rounded-full",
10807
- border: { widthClass: "border", colorToken: "border" },
10808
- effects: {
10809
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10810
- }
10811
- },
10812
- {
10813
- id: "ghost",
10814
- name: "Ghost",
10815
- enabled: true,
10816
- priority: 3,
10817
- background: { type: "transparent" },
10818
- textColorToken: "primary",
10819
- borderRadius: "rounded-full",
10820
- sizes: {
10821
- sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
10822
- md: { padding: "0.5rem 1rem" },
10823
- lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
10824
- xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
10825
- },
10826
- effects: {
10827
- hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
10828
- }
10829
- }
10830
- ]
10831
- }
10832
- });
10833
-
10834
- // ../theme-core/src/buttons/personalities/showtime-pill.ts
10835
- var showtimePill = defineButtonPersonality({
10836
- id: "showtime-pill",
10837
- name: "Showtime Pill",
10838
- description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
10839
- tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
10840
- buttonSystem: {
10841
- global: {
10842
- cornerStyle: "pill",
10843
- shadow: "low",
10844
- textTransform: "uppercase",
10845
- fontWeight: 700,
10846
- borderWidth: 2,
10847
- hoverTransform: "lift",
10848
- hoverColor: "darken",
10849
- typography: "body",
10850
- paddingPreset: "spacious",
10851
- italic: false
10852
- },
10853
- sizes: {
10854
- sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
10855
- md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
10856
- lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
10857
- xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
10858
- },
10859
- variants: [
10860
- {
10861
- id: "primary",
10862
- name: "Primary",
10863
- enabled: true,
10864
- priority: 1,
10865
- background: { type: "solid", colorToken: "primary" },
10866
- textColorToken: "background",
10867
- borderRadius: "rounded-full",
10995
+ borderRadius: "rounded-md",
10996
+ border: { widthClass: "border", colorToken: "primary" },
10997
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10868
10998
  effects: {
10869
- hover: [{ effectId: "pop" }]
10999
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "primary-100" } }],
11000
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
10870
11001
  }
10871
11002
  },
10872
11003
  {
@@ -10874,35 +11005,11 @@ var showtimePill = defineButtonPersonality({
10874
11005
  name: "Secondary",
10875
11006
  enabled: true,
10876
11007
  priority: 2,
10877
- background: { type: "transparent" },
10878
- textColorToken: "primary",
10879
- borderRadius: "rounded-full",
10880
- border: { widthClass: "border-2", colorToken: "primary" },
10881
- effects: {
10882
- hover: [{ effectId: "pop" }]
10883
- }
10884
- },
10885
- {
10886
- id: "hero",
10887
- name: "Hero",
10888
- enabled: true,
10889
- priority: 1,
10890
11008
  background: { type: "solid", colorToken: "secondary" },
10891
- textColorToken: "primary",
10892
- borderRadius: "rounded-full",
10893
- effects: {
10894
- hover: [{ effectId: "pop" }]
10895
- }
10896
- },
10897
- {
10898
- id: "header",
10899
- name: "Header",
10900
- enabled: true,
10901
- priority: 2,
10902
- background: { type: "solid", colorToken: "background" },
10903
- textColorToken: "primary",
10904
- borderRadius: "rounded-full",
10905
- border: { widthClass: "border-2", colorToken: "primary" },
11009
+ textColorToken: "primaryForeground",
11010
+ borderRadius: "rounded-md",
11011
+ border: { widthClass: "border", colorToken: "primary" },
11012
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10906
11013
  effects: {
10907
11014
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10908
11015
  }
@@ -10914,10 +11021,11 @@ var showtimePill = defineButtonPersonality({
10914
11021
  priority: 3,
10915
11022
  background: { type: "transparent" },
10916
11023
  textColorToken: "primary",
10917
- borderRadius: "rounded-full",
10918
- border: { widthClass: "border-2", colorToken: "primary" },
11024
+ borderRadius: "rounded-md",
11025
+ border: { widthClass: "border", colorToken: "primary" },
11026
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10919
11027
  effects: {
10920
- hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
11028
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
10921
11029
  }
10922
11030
  },
10923
11031
  {
@@ -10926,32 +11034,44 @@ var showtimePill = defineButtonPersonality({
10926
11034
  enabled: true,
10927
11035
  priority: 3,
10928
11036
  background: { type: "transparent" },
10929
- textColorToken: "primary",
10930
- borderRadius: "rounded-full",
11037
+ textColorToken: "accent",
11038
+ borderRadius: "rounded-none",
11039
+ sizes: {
11040
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
11041
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
11042
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
11043
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
11044
+ },
10931
11045
  effects: {
10932
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11046
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
10933
11047
  }
10934
11048
  }
10935
11049
  ]
10936
11050
  }
10937
11051
  });
10938
11052
 
10939
- // ../theme-core/src/buttons/personalities/soft-pill.ts
10940
- var softPill = defineButtonPersonality({
10941
- id: "soft-pill",
10942
- name: "Soft Pill",
10943
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
10944
- tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
11053
+ // ../theme-core/src/buttons/personalities/pebble.ts
11054
+ var pebble = defineButtonPersonality({
11055
+ id: "pebble",
11056
+ name: "Pebble",
11057
+ description: "Generous pill buttons with a quiet colour-softening hover.",
11058
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
10945
11059
  buttonSystem: {
10946
11060
  global: {
10947
11061
  cornerStyle: "pill",
10948
- shadow: "low",
11062
+ shadow: "none",
10949
11063
  textTransform: "none",
10950
11064
  fontWeight: 500,
10951
11065
  borderWidth: 2,
10952
- hoverTransform: "lift",
11066
+ hoverTransform: "none",
10953
11067
  hoverColor: "none"
10954
11068
  },
11069
+ sizes: {
11070
+ sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
11071
+ md: { padding: "0.875rem 2.25rem" },
11072
+ lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
11073
+ xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
11074
+ },
10955
11075
  variants: [
10956
11076
  {
10957
11077
  id: "primary",
@@ -10961,10 +11081,10 @@ var softPill = defineButtonPersonality({
10961
11081
  background: { type: "solid", colorToken: "primary" },
10962
11082
  textColorToken: "primaryForeground",
10963
11083
  borderRadius: "rounded-full",
10964
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
10965
11084
  effects: {
10966
- hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
10967
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
11085
+ hover: [
11086
+ { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 88 } }
11087
+ ]
10968
11088
  }
10969
11089
  },
10970
11090
  {
@@ -10975,9 +11095,193 @@ var softPill = defineButtonPersonality({
10975
11095
  background: { type: "transparent" },
10976
11096
  textColorToken: "primary",
10977
11097
  borderRadius: "rounded-full",
10978
- border: { widthClass: "border-2", colorToken: "primary" },
11098
+ border: { widthClass: "border-2", colorToken: "accent" },
10979
11099
  effects: {
10980
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11100
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
11101
+ }
11102
+ },
11103
+ {
11104
+ id: "outline",
11105
+ name: "Outline",
11106
+ enabled: true,
11107
+ priority: 3,
11108
+ background: { type: "transparent" },
11109
+ textColorToken: "text",
11110
+ borderRadius: "rounded-full",
11111
+ border: { widthClass: "border", colorToken: "border" },
11112
+ effects: {
11113
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11114
+ }
11115
+ },
11116
+ {
11117
+ id: "ghost",
11118
+ name: "Ghost",
11119
+ enabled: true,
11120
+ priority: 3,
11121
+ background: { type: "transparent" },
11122
+ textColorToken: "primary",
11123
+ borderRadius: "rounded-full",
11124
+ sizes: {
11125
+ sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
11126
+ md: { padding: "0.5rem 1rem" },
11127
+ lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
11128
+ xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
11129
+ },
11130
+ effects: {
11131
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
11132
+ }
11133
+ }
11134
+ ]
11135
+ }
11136
+ });
11137
+
11138
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
11139
+ var showtimePill = defineButtonPersonality({
11140
+ id: "showtime-pill",
11141
+ name: "Showtime Pill",
11142
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
11143
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
11144
+ buttonSystem: {
11145
+ global: {
11146
+ cornerStyle: "pill",
11147
+ shadow: "low",
11148
+ textTransform: "uppercase",
11149
+ fontWeight: 700,
11150
+ borderWidth: 2,
11151
+ hoverTransform: "lift",
11152
+ hoverColor: "darken",
11153
+ typography: "body",
11154
+ paddingPreset: "spacious",
11155
+ italic: false
11156
+ },
11157
+ sizes: {
11158
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
11159
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
11160
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
11161
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
11162
+ },
11163
+ variants: [
11164
+ {
11165
+ id: "primary",
11166
+ name: "Primary",
11167
+ enabled: true,
11168
+ priority: 1,
11169
+ background: { type: "solid", colorToken: "primary" },
11170
+ textColorToken: "background",
11171
+ borderRadius: "rounded-full",
11172
+ effects: {
11173
+ hover: [{ effectId: "pop" }]
11174
+ }
11175
+ },
11176
+ {
11177
+ id: "secondary",
11178
+ name: "Secondary",
11179
+ enabled: true,
11180
+ priority: 2,
11181
+ background: { type: "transparent" },
11182
+ textColorToken: "primary",
11183
+ borderRadius: "rounded-full",
11184
+ border: { widthClass: "border-2", colorToken: "primary" },
11185
+ effects: {
11186
+ hover: [{ effectId: "pop" }]
11187
+ }
11188
+ },
11189
+ {
11190
+ id: "hero",
11191
+ name: "Hero",
11192
+ enabled: true,
11193
+ priority: 1,
11194
+ background: { type: "solid", colorToken: "secondary" },
11195
+ textColorToken: "primary",
11196
+ borderRadius: "rounded-full",
11197
+ effects: {
11198
+ hover: [{ effectId: "pop" }]
11199
+ }
11200
+ },
11201
+ {
11202
+ id: "header",
11203
+ name: "Header",
11204
+ enabled: true,
11205
+ priority: 2,
11206
+ background: { type: "solid", colorToken: "background" },
11207
+ textColorToken: "primary",
11208
+ borderRadius: "rounded-full",
11209
+ border: { widthClass: "border-2", colorToken: "primary" },
11210
+ effects: {
11211
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11212
+ }
11213
+ },
11214
+ {
11215
+ id: "outline",
11216
+ name: "Outline",
11217
+ enabled: true,
11218
+ priority: 3,
11219
+ background: { type: "transparent" },
11220
+ textColorToken: "primary",
11221
+ borderRadius: "rounded-full",
11222
+ border: { widthClass: "border-2", colorToken: "primary" },
11223
+ effects: {
11224
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
11225
+ }
11226
+ },
11227
+ {
11228
+ id: "ghost",
11229
+ name: "Ghost",
11230
+ enabled: true,
11231
+ priority: 3,
11232
+ background: { type: "transparent" },
11233
+ textColorToken: "primary",
11234
+ borderRadius: "rounded-full",
11235
+ effects: {
11236
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11237
+ }
11238
+ }
11239
+ ]
11240
+ }
11241
+ });
11242
+
11243
+ // ../theme-core/src/buttons/personalities/soft-pill.ts
11244
+ var softPill = defineButtonPersonality({
11245
+ id: "soft-pill",
11246
+ name: "Soft Pill",
11247
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
11248
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
11249
+ buttonSystem: {
11250
+ global: {
11251
+ cornerStyle: "pill",
11252
+ shadow: "low",
11253
+ textTransform: "none",
11254
+ fontWeight: 500,
11255
+ borderWidth: 2,
11256
+ hoverTransform: "lift",
11257
+ hoverColor: "none"
11258
+ },
11259
+ variants: [
11260
+ {
11261
+ id: "primary",
11262
+ name: "Primary",
11263
+ enabled: true,
11264
+ priority: 1,
11265
+ background: { type: "solid", colorToken: "primary" },
11266
+ textColorToken: "primaryForeground",
11267
+ borderRadius: "rounded-full",
11268
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
11269
+ effects: {
11270
+ hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
11271
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
11272
+ }
11273
+ },
11274
+ {
11275
+ id: "secondary",
11276
+ name: "Secondary",
11277
+ enabled: true,
11278
+ priority: 2,
11279
+ background: { type: "transparent" },
11280
+ textColorToken: "primary",
11281
+ borderRadius: "rounded-full",
11282
+ border: { widthClass: "border-2", colorToken: "primary" },
11283
+ effects: {
11284
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10981
11285
  }
10982
11286
  },
10983
11287
  {
@@ -11019,7 +11323,8 @@ var buttonPersonalities = [
11019
11323
  inkStamp,
11020
11324
  brushedWash,
11021
11325
  showtimePill,
11022
- joyStamp
11326
+ joyStamp,
11327
+ ornateRitual
11023
11328
  ];
11024
11329
  var personalitiesById = new Map(
11025
11330
  buttonPersonalities.map((p) => [p.id, p])
@@ -11649,7 +11954,7 @@ function rgbColorValue(token) {
11649
11954
  if (alpha === void 0) {
11650
11955
  return `rgb(var(${cssVar}))`;
11651
11956
  }
11652
- return `rgba(var(${cssVar}), ${alpha})`;
11957
+ return `rgb(var(${cssVar}) / ${alpha})`;
11653
11958
  }
11654
11959
  function backgroundColorStyle(token) {
11655
11960
  return { backgroundColor: rgbColorValue(token) };
@@ -12754,6 +13059,28 @@ var warmDarkEmber = definePaletteVariant({
12754
13059
  { name: "border", hex: "#894e31" }
12755
13060
  ]
12756
13061
  });
13062
+ var warmDarkKirtanGold = definePaletteVariant({
13063
+ id: "warm-dark-kirtan-gold",
13064
+ name: "Warm Dark \u2014 Kirtan Gold",
13065
+ description: "Deep plum ground with pale gold primary, rose accent, and soft devotional text.",
13066
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
13067
+ mode: "dark",
13068
+ colors: [
13069
+ { name: "primary", hex: "#ffcdb2" },
13070
+ { name: "secondary", hex: "#b5838d" },
13071
+ { name: "accent", hex: "#e5989b" },
13072
+ { name: "success", hex: "#8fbf8f" },
13073
+ { name: "warning", hex: "#f2b86b" },
13074
+ { name: "destructive", hex: "#d96b6b" },
13075
+ { name: "background", hex: "#403944" },
13076
+ { name: "surface", hex: "#403944" },
13077
+ { name: "surfaceAlt", hex: "#372f3b" },
13078
+ { name: "muted", hex: "#4d4550" },
13079
+ { name: "text", hex: "#e6d2d5" },
13080
+ { name: "primaryForeground", hex: "#403944" },
13081
+ { name: "border", hex: "#8d747a" }
13082
+ ]
13083
+ });
12757
13084
 
12758
13085
  // ../theme-core/src/palette/variants/index.ts
12759
13086
  var paletteVariants = [
@@ -12777,7 +13104,8 @@ var paletteVariants = [
12777
13104
  softNaturalWatercolor,
12778
13105
  softNaturalLilac,
12779
13106
  // Warm-dark family (dark mode)
12780
- warmDarkEmber
13107
+ warmDarkEmber,
13108
+ warmDarkKirtanGold
12781
13109
  ];
12782
13110
  var paletteVariantsById = new Map(
12783
13111
  paletteVariants.map((v) => [v.id, v])
@@ -14276,9 +14604,125 @@ function headerConfigurationKey(configuration) {
14276
14604
  function asFooterLookId(value) {
14277
14605
  return value;
14278
14606
  }
14279
- var guaranteedFallbackFooterLookId = asFooterLookId("footer-muted-grounding");
14607
+ function asFooterLayoutId(value) {
14608
+ return value;
14609
+ }
14610
+ function asFooterStyleId(value) {
14611
+ return value;
14612
+ }
14613
+ var guaranteedFallbackFooterLookId = asFooterLookId("footer-identity-quiet");
14614
+ var footerLayoutCatalog = defineExactCatalog()([
14615
+ {
14616
+ id: asFooterLayoutId("identity"),
14617
+ label: "Identity",
14618
+ description: "Logo, site text, address, and legal copy without relying on footer navigation."
14619
+ },
14620
+ {
14621
+ id: asFooterLayoutId("centered"),
14622
+ label: "Centered",
14623
+ description: "A calm centered stack for identity, short copy, and optional compact navigation.",
14624
+ maxRecommendedNavDensity: "sparse"
14625
+ },
14626
+ {
14627
+ id: asFooterLayoutId("split"),
14628
+ label: "Split",
14629
+ description: "Navigation and brand signoff separated into a wider split footer.",
14630
+ requiresFooterNav: true,
14631
+ maxRecommendedNavDensity: "balanced"
14632
+ },
14633
+ {
14634
+ id: asFooterLayoutId("columns"),
14635
+ label: "Columns",
14636
+ description: "Grouped footer navigation columns with a supporting bottom line.",
14637
+ requiresFooterNav: true,
14638
+ requiresFooterNavGroups: true
14639
+ }
14640
+ ]);
14641
+ var footerStyleCatalog = defineExactCatalog()([
14642
+ {
14643
+ id: asFooterStyleId("quiet"),
14644
+ label: "Quiet",
14645
+ description: "Lightweight, practical footer treatment."
14646
+ },
14647
+ {
14648
+ id: asFooterStyleId("calm"),
14649
+ label: "Calm",
14650
+ description: "Soft centered treatment with restrained dividers."
14651
+ },
14652
+ {
14653
+ id: asFooterStyleId("editorial"),
14654
+ label: "Editorial",
14655
+ description: "Text-forward treatment with fine-line structure."
14656
+ },
14657
+ {
14658
+ id: asFooterStyleId("brand-band"),
14659
+ label: "Brand band",
14660
+ description: "High-contrast brand treatment with a stronger bottom bar."
14661
+ }
14662
+ ]);
14663
+ var footerLayoutsById = new Map(
14664
+ footerLayoutCatalog.map((layout) => [layout.id, layout])
14665
+ );
14666
+ var footerStylesById = new Map(
14667
+ footerStyleCatalog.map((style) => [style.id, style])
14668
+ );
14669
+ function identityQuietFooter(theme) {
14670
+ return {
14671
+ ...theme.footer,
14672
+ variant: "simple",
14673
+ maxWidth: "container",
14674
+ background: {
14675
+ type: "color",
14676
+ color: "surface"
14677
+ },
14678
+ navStyle: "minimal",
14679
+ navWeight: "regular",
14680
+ navColor: "text",
14681
+ navLinkStyle: {
14682
+ typography: "body",
14683
+ fontWeight: "regular",
14684
+ textTransform: "none",
14685
+ italic: false,
14686
+ colorToken: "text",
14687
+ hoverColorToken: "primary",
14688
+ padding: "none",
14689
+ borderRadius: "none"
14690
+ },
14691
+ navLayout: {
14692
+ layout: "inline-wrap",
14693
+ align: "start",
14694
+ gapX: "default",
14695
+ gapY: "tight"
14696
+ },
14697
+ logo: {
14698
+ showLogo: true,
14699
+ showLogoText: true,
14700
+ placement: "left",
14701
+ size: "sm",
14702
+ align: "start"
14703
+ },
14704
+ bottomBar: {
14705
+ enabled: false,
14706
+ fullBleed: false,
14707
+ textAlign: "left",
14708
+ paddingX: "default",
14709
+ paddingY: "compact",
14710
+ borderTop: {
14711
+ width: "none"
14712
+ }
14713
+ }
14714
+ };
14715
+ }
14280
14716
  function mutedGroundingFooter(theme) {
14281
- return theme.footer;
14717
+ return {
14718
+ ...identityQuietFooter(theme),
14719
+ background: theme.footer.background,
14720
+ navStyle: theme.footer.navStyle,
14721
+ navColor: theme.footer.navColor,
14722
+ navWeight: theme.footer.navWeight,
14723
+ navLinkStyle: theme.footer.navLinkStyle,
14724
+ bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
14725
+ };
14282
14726
  }
14283
14727
  function brandTwoBandFooter(theme) {
14284
14728
  return {
@@ -14383,6 +14827,53 @@ function centeredCalmFooter(theme) {
14383
14827
  }
14384
14828
  };
14385
14829
  }
14830
+ function splitEditorialFooter(theme) {
14831
+ return {
14832
+ ...theme.footer,
14833
+ variant: "split",
14834
+ maxWidth: "container",
14835
+ background: {
14836
+ type: "color",
14837
+ color: "surface"
14838
+ },
14839
+ navStyle: "minimal",
14840
+ navWeight: "regular",
14841
+ navColor: "text",
14842
+ navLinkStyle: {
14843
+ typography: "body",
14844
+ fontWeight: "regular",
14845
+ textTransform: "none",
14846
+ italic: false,
14847
+ colorToken: "text",
14848
+ hoverColorToken: "primary",
14849
+ padding: "none",
14850
+ borderRadius: "none"
14851
+ },
14852
+ navLayout: {
14853
+ layout: "inline-wrap",
14854
+ align: "start",
14855
+ gapX: "relaxed",
14856
+ gapY: "tight"
14857
+ },
14858
+ logo: {
14859
+ showLogo: true,
14860
+ showLogoText: true,
14861
+ placement: "right",
14862
+ size: "sm",
14863
+ align: "end"
14864
+ },
14865
+ bottomBar: {
14866
+ enabled: true,
14867
+ fullBleed: false,
14868
+ textAlign: "left",
14869
+ paddingX: "default",
14870
+ paddingY: "compact",
14871
+ borderTop: {
14872
+ width: "thin"
14873
+ }
14874
+ }
14875
+ };
14876
+ }
14386
14877
  function editorialColumnsFooter(theme) {
14387
14878
  return {
14388
14879
  ...theme.footer,
@@ -14425,25 +14916,47 @@ function editorialColumnsFooter(theme) {
14425
14916
  };
14426
14917
  }
14427
14918
  var footerLookCatalog = defineExactCatalog()([
14919
+ {
14920
+ id: asFooterLookId("footer-identity-quiet"),
14921
+ label: "Identity footer",
14922
+ layoutId: asFooterLayoutId("identity"),
14923
+ styleId: asFooterStyleId("quiet"),
14924
+ compile: identityQuietFooter
14925
+ },
14428
14926
  {
14429
14927
  id: asFooterLookId("footer-muted-grounding"),
14430
14928
  label: "Muted grounding footer",
14929
+ layoutId: asFooterLayoutId("identity"),
14930
+ styleId: asFooterStyleId("quiet"),
14931
+ hiddenFromLayoutStyleControls: true,
14431
14932
  compile: mutedGroundingFooter
14432
14933
  },
14433
14934
  {
14434
14935
  id: asFooterLookId("footer-centered-calm"),
14435
14936
  label: "Centered calm footer",
14937
+ layoutId: asFooterLayoutId("centered"),
14938
+ styleId: asFooterStyleId("calm"),
14436
14939
  compile: centeredCalmFooter
14437
14940
  },
14941
+ {
14942
+ id: asFooterLookId("footer-split-editorial"),
14943
+ label: "Split editorial footer",
14944
+ layoutId: asFooterLayoutId("split"),
14945
+ styleId: asFooterStyleId("editorial"),
14946
+ compile: splitEditorialFooter
14947
+ },
14438
14948
  {
14439
14949
  id: asFooterLookId("footer-editorial-columns"),
14440
14950
  label: "Editorial columns footer",
14951
+ layoutId: asFooterLayoutId("columns"),
14952
+ styleId: asFooterStyleId("editorial"),
14441
14953
  compile: editorialColumnsFooter
14442
14954
  },
14443
14955
  {
14444
14956
  id: asFooterLookId("site-footer-brand-two-band"),
14445
14957
  label: "Two-band brand footer",
14446
- maxRecommendedNavDensity: "balanced",
14958
+ layoutId: asFooterLayoutId("split"),
14959
+ styleId: asFooterStyleId("brand-band"),
14447
14960
  allowedContentPresence: ["default-footer", "default-and-blocks"],
14448
14961
  compile: brandTwoBandFooter
14449
14962
  }
@@ -14646,6 +15159,30 @@ var luxeContrastTypography = {
14646
15159
  },
14647
15160
  scale: "spacious"
14648
15161
  };
15162
+ var kirtanOrnateTypography = {
15163
+ body: {
15164
+ family: "Jost, system-ui, sans-serif",
15165
+ size: "md",
15166
+ weight: "regular",
15167
+ lineHeight: "relaxed",
15168
+ letterSpacing: "normal"
15169
+ },
15170
+ headings: {
15171
+ default: {
15172
+ family: "Marcellus, Georgia, serif",
15173
+ weight: "regular",
15174
+ lineHeight: "normal",
15175
+ letterSpacing: "normal",
15176
+ colorToken: "primary",
15177
+ italic: null,
15178
+ case: null
15179
+ },
15180
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15181
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15182
+ h3: { size: "md", weight: "regular", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
15183
+ },
15184
+ scale: "spacious"
15185
+ };
14649
15186
  var boldDisplayTypography = {
14650
15187
  body: {
14651
15188
  family: "Manrope, system-ui, sans-serif",
@@ -14680,16 +15217,16 @@ var originalJoyTypography = {
14680
15217
  },
14681
15218
  headings: {
14682
15219
  default: {
14683
- family: "Bricolage Grotesque, system-ui, sans-serif",
14684
- weight: "bold",
15220
+ family: "Lobster, cursive",
15221
+ weight: "regular",
14685
15222
  lineHeight: "normal",
14686
- letterSpacing: "tight",
15223
+ letterSpacing: "normal",
14687
15224
  italic: null,
14688
15225
  case: null
14689
15226
  },
14690
- h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
14691
- h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
14692
- h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
15227
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15228
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15229
+ h3: { size: "lg", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null }
14693
15230
  },
14694
15231
  scale: "balanced"
14695
15232
  };
@@ -14754,6 +15291,32 @@ var typographyPresets = [
14754
15291
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
14755
15292
  typography: luxeContrastTypography
14756
15293
  }),
15294
+ defineTypographyPreset({
15295
+ id: "typography-preset:kirtan-ornate",
15296
+ name: "Kirtan Ornate",
15297
+ description: "Marcellus devotional headings over a refined Jost body, matching dark ceremonial layouts.",
15298
+ defaultFonts: { body: "Jost, system-ui, sans-serif", heading: "Marcellus, Georgia, serif" },
15299
+ recommendedFonts: {
15300
+ body: ["Jost", "Manrope", "Inter"],
15301
+ heading: ["Marcellus", "Cormorant Garamond", "Playfair Display"]
15302
+ },
15303
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
15304
+ typography: kirtanOrnateTypography,
15305
+ heroTypography: {
15306
+ headlineSize: "6xl",
15307
+ headlineLineHeight: "normal",
15308
+ subheadlineSize: "xl",
15309
+ subheadlineLineHeight: "relaxed",
15310
+ microHeadlineSize: "5xl",
15311
+ microHeadlineLineHeight: "normal",
15312
+ microSubheadlineSize: "lg",
15313
+ microSubheadlineLineHeight: "relaxed",
15314
+ responsive: {
15315
+ tablet: { headlineSize: "5xl" },
15316
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
15317
+ }
15318
+ }
15319
+ }),
14757
15320
  defineTypographyPreset({
14758
15321
  id: "typography-preset:bold-display",
14759
15322
  name: "Bold Display",
@@ -14783,11 +15346,11 @@ var typographyPresets = [
14783
15346
  defineTypographyPreset({
14784
15347
  id: "typography-preset:original-joy",
14785
15348
  name: "Original Joy",
14786
- description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
14787
- defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
15349
+ description: "Lobster display headings over a clean DM Sans body, expressive and warm.",
15350
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Lobster, cursive" },
14788
15351
  recommendedFonts: {
14789
15352
  body: ["DM Sans", "Inter", "Manrope"],
14790
- heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
15353
+ heading: ["Lobster", "Bricolage Grotesque", "Space Grotesk"]
14791
15354
  },
14792
15355
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
14793
15356
  typography: originalJoyTypography,
@@ -14811,6 +15374,319 @@ var typographyPresetsById = new Map(
14811
15374
  typographyPresets.map((preset2) => [preset2.id, preset2])
14812
15375
  );
14813
15376
 
15377
+ // ../theme-core/src/site-styles/designState.ts
15378
+ import { z as z24 } from "zod";
15379
+ var themeV2DesignStateSchemaVersion = 1;
15380
+ var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
15381
+ var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
15382
+ var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
15383
+ fields3[0],
15384
+ ...fields3.slice(1)
15385
+ ]);
15386
+ var heroLegibilityStrategySchema = z24.enum([
15387
+ "none",
15388
+ "scrim-gradient",
15389
+ "solid-panel"
15390
+ ]);
15391
+ var heroCompositionIntentSchema = z24.enum([
15392
+ "center",
15393
+ "bottom-left"
15394
+ ]);
15395
+ var heroTypographyScaleIntentSchema = z24.enum([
15396
+ "quiet",
15397
+ "editorial",
15398
+ "display",
15399
+ "poster"
15400
+ ]);
15401
+ var sectionHeightIntentSchema = z24.enum([
15402
+ "default",
15403
+ "banner",
15404
+ "hero",
15405
+ "immersive"
15406
+ ]);
15407
+ var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
15408
+ var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
15409
+ var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
15410
+ z24.object({ kind: z24.literal("none") }).strict(),
15411
+ z24.object({
15412
+ kind: z24.literal("brand-scrim"),
15413
+ token: z24.enum(["primary", "secondary", "accent"]),
15414
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15415
+ }).strict(),
15416
+ z24.object({
15417
+ kind: z24.literal("brand-wash"),
15418
+ token: z24.enum(["primary", "secondary", "accent"]),
15419
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15420
+ }).strict(),
15421
+ z24.object({
15422
+ kind: z24.literal("neutral-scrim"),
15423
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15424
+ }).strict(),
15425
+ z24.object({
15426
+ kind: z24.literal("neutral-wash"),
15427
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15428
+ }).strict(),
15429
+ z24.object({
15430
+ kind: z24.literal("solid-panel"),
15431
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15432
+ }).strict()
15433
+ ]);
15434
+ var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
15435
+ var tileTreatmentSchema = z24.enum(tileTreatmentValues);
15436
+ var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
15437
+ var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
15438
+ function uniqueNonEmpty(values) {
15439
+ const uniqueValues = [...new Set(values)];
15440
+ const firstValue = uniqueValues[0];
15441
+ if (!firstValue) {
15442
+ throw new Error("Expected at least one Theme V2 design state option.");
15443
+ }
15444
+ return [firstValue, ...uniqueValues.slice(1)];
15445
+ }
15446
+ var userPanelTreatments = uniqueNonEmpty(
15447
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
15448
+ );
15449
+ var userFlushTreatments = uniqueNonEmpty(
15450
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
15451
+ );
15452
+ var userFlushBleeds = uniqueNonEmpty(
15453
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
15454
+ );
15455
+ var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
15456
+ z24.object({ kind: z24.literal("plain") }).strict(),
15457
+ z24.object({
15458
+ kind: z24.literal("panel"),
15459
+ treatment: z24.enum(userPanelTreatments)
15460
+ }).strict(),
15461
+ z24.object({
15462
+ kind: z24.literal("flush-panel"),
15463
+ treatment: z24.enum(userFlushTreatments),
15464
+ bleed: z24.enum(userFlushBleeds)
15465
+ }).strict()
15466
+ ]);
15467
+ var blockDesignPlanSchema = z24.object({
15468
+ blockId: z24.string().min(1).transform(asDesignBlockId),
15469
+ blockKind: z24.string().min(1),
15470
+ purpose: z24.string().min(1),
15471
+ sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
15472
+ contentFrame: contentFrameIntentSchema,
15473
+ itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
15474
+ transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
15475
+ emphasis: z24.enum(userDesignOptionCatalog.emphases),
15476
+ sectionHeight: sectionHeightIntentSchema.optional(),
15477
+ heroLegibility: heroLegibilityStrategySchema.optional(),
15478
+ heroComposition: heroCompositionIntentSchema.optional(),
15479
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
15480
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
15481
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
15482
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
15483
+ tileTreatment: tileTreatmentSchema.optional(),
15484
+ eventListTreatment: eventListTreatmentSchema.optional(),
15485
+ eyebrowTreatment: eyebrowTreatmentSchema.optional()
15486
+ }).strict();
15487
+ var styleAuthoritySchema = z24.discriminatedUnion("kind", [
15488
+ z24.object({
15489
+ kind: z24.literal("theme-v2"),
15490
+ source: designResolutionPolicySchema,
15491
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
15492
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
15493
+ templateVersion: z24.number().int().nonnegative(),
15494
+ resolverVersion: z24.number().int().nonnegative()
15495
+ }).strict(),
15496
+ z24.object({
15497
+ kind: z24.literal("legacy-raw"),
15498
+ reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
15499
+ }).strict(),
15500
+ z24.object({
15501
+ kind: z24.literal("advanced-detached"),
15502
+ reason: z24.literal("detached-custom-runtime-fields")
15503
+ }).strict()
15504
+ ]);
15505
+ var blockRuntimeStyleAuthoritySchema = z24.object({
15506
+ unit: z24.literal("block-runtime-fields"),
15507
+ blockId: z24.string().min(1).transform(asDesignBlockId),
15508
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
15509
+ authority: styleAuthoritySchema
15510
+ }).strict();
15511
+ var persistedPageDesignStateV1Schema = z24.object({
15512
+ schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
15513
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
15514
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
15515
+ templateVersion: z24.number().int().nonnegative(),
15516
+ resolverVersion: z24.number().int().nonnegative(),
15517
+ rhythmPresetId: z24.string().min(1),
15518
+ blocks: z24.array(blockDesignPlanSchema),
15519
+ styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
15520
+ }).strict();
15521
+
15522
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
15523
+ function defineDesignRuntimeRules(rules) {
15524
+ return rules;
15525
+ }
15526
+ function defineComponentRuntimeRules(rules) {
15527
+ return rules;
15528
+ }
15529
+ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
15530
+ sectionSurfaces: {
15531
+ base: {},
15532
+ "muted-band": {
15533
+ background: {
15534
+ type: "color",
15535
+ color: "muted"
15536
+ }
15537
+ },
15538
+ "accent-band": {
15539
+ background: {
15540
+ type: "color",
15541
+ color: "primary"
15542
+ }
15543
+ },
15544
+ "brand-depth-band": {
15545
+ background: {
15546
+ type: "color",
15547
+ color: "primary-800"
15548
+ }
15549
+ },
15550
+ "hero-image": {
15551
+ background: {
15552
+ type: "image",
15553
+ opacity: 1,
15554
+ position: "center center",
15555
+ ...uniformSectionForeground("text")
15556
+ }
15557
+ }
15558
+ },
15559
+ heroLegibility: {
15560
+ "scrim-gradient": {
15561
+ type: "gradient",
15562
+ gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
15563
+ opacity: 1
15564
+ },
15565
+ "solid-panel": {
15566
+ type: "color",
15567
+ color: "surface",
15568
+ opacity: 0.88
15569
+ }
15570
+ },
15571
+ transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
15572
+ });
15573
+ var defaultComponentRuntimeRules = defineComponentRuntimeRules({
15574
+ panelFrames: {
15575
+ inset: {
15576
+ spacing: "comfortable",
15577
+ rounded: "xl",
15578
+ raised: false,
15579
+ background: {
15580
+ type: "color",
15581
+ color: "surfaceAlt",
15582
+ textColor: "text"
15583
+ }
15584
+ },
15585
+ raised: {
15586
+ spacing: "comfortable",
15587
+ rounded: "xl",
15588
+ raised: true,
15589
+ background: {
15590
+ type: "color",
15591
+ color: "surfaceAlt",
15592
+ textColor: "text"
15593
+ }
15594
+ },
15595
+ editorial: {
15596
+ spacing: "medium",
15597
+ rounded: "xl",
15598
+ raised: false,
15599
+ background: {
15600
+ type: "color",
15601
+ color: "surface",
15602
+ textColor: "text"
15603
+ }
15604
+ }
15605
+ },
15606
+ flushFrames: {
15607
+ "media-panel": {
15608
+ fullWidth: true,
15609
+ spacing: "none",
15610
+ rounded: "none",
15611
+ raised: false
15612
+ }
15613
+ },
15614
+ itemSurfaces: {
15615
+ none: null,
15616
+ default: {
15617
+ spacing: "medium",
15618
+ rounded: "lg",
15619
+ raised: false
15620
+ },
15621
+ flat: {
15622
+ spacing: "medium",
15623
+ rounded: "lg",
15624
+ raised: false
15625
+ },
15626
+ outlined: {
15627
+ spacing: "medium",
15628
+ rounded: "lg",
15629
+ raised: false,
15630
+ border: {
15631
+ enabled: true,
15632
+ width: "1",
15633
+ colorToken: "border"
15634
+ }
15635
+ },
15636
+ raised: {
15637
+ spacing: "medium",
15638
+ rounded: "xl",
15639
+ raised: true
15640
+ },
15641
+ inset: {
15642
+ treatment: "soft-panel",
15643
+ spacing: "comfortable",
15644
+ rounded: "xl",
15645
+ raised: false,
15646
+ border: {
15647
+ enabled: false
15648
+ },
15649
+ background: {
15650
+ type: "color",
15651
+ color: "surfaceAlt",
15652
+ textColor: "text"
15653
+ }
15654
+ },
15655
+ editorial: {
15656
+ // Boxless open column with a short rule on top; the visual treatment
15657
+ // lives in blocks-static/card-treatments.css.
15658
+ treatment: "editorial-rule",
15659
+ spacing: "none",
15660
+ rounded: "none",
15661
+ raised: false,
15662
+ border: {
15663
+ enabled: false
15664
+ }
15665
+ },
15666
+ "color-blocked": {
15667
+ // Bold, flat colour-blocked cards. The per-card background colour cycle
15668
+ // (by position) and staggered offset live in
15669
+ // blocks-static/card-treatments.css; here we set the shared shape:
15670
+ // generous padding, large radius, no border, flat (no shadow).
15671
+ treatment: "color-blocked",
15672
+ spacing: "spacious",
15673
+ rounded: "2xl",
15674
+ raised: false,
15675
+ border: {
15676
+ enabled: false
15677
+ }
15678
+ }
15679
+ }
15680
+ });
15681
+ function uniformSectionForeground(token) {
15682
+ return {
15683
+ textColor: token,
15684
+ headingColor: token,
15685
+ linkColor: token,
15686
+ supportingColor: token
15687
+ };
15688
+ }
15689
+
14814
15690
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
14815
15691
  var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
14816
15692
  var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
@@ -14829,6 +15705,7 @@ var curatedSiteStyleIdValues = [
14829
15705
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
14830
15706
  "site-style:bold-launch",
14831
15707
  "site-style:south-west-twerk-school",
15708
+ "site-style:kirtan-ornate",
14832
15709
  "site-style:original-joy"
14833
15710
  ];
14834
15711
  var quietBudget = {
@@ -14855,6 +15732,50 @@ var expressiveBudget = {
14855
15732
  mediaDensity: "high",
14856
15733
  decorativeRepetition: "medium"
14857
15734
  };
15735
+ var kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
15736
+ ...defaultDesignRuntimeRules,
15737
+ defaultEyebrowTreatment: "accent",
15738
+ sectionSurfaces: {
15739
+ ...defaultDesignRuntimeRules.sectionSurfaces,
15740
+ "muted-band": {
15741
+ background: {
15742
+ type: "color",
15743
+ color: "muted"
15744
+ },
15745
+ foreground: {
15746
+ textColor: "text",
15747
+ headingColor: "primary",
15748
+ linkColor: "primary",
15749
+ supportingColor: "text"
15750
+ }
15751
+ },
15752
+ "brand-depth-band": {
15753
+ background: {
15754
+ type: "color",
15755
+ color: "primary-800"
15756
+ },
15757
+ foreground: {
15758
+ textColor: "text",
15759
+ headingColor: "primary",
15760
+ linkColor: "primary",
15761
+ supportingColor: "text"
15762
+ }
15763
+ },
15764
+ "hero-image": {
15765
+ background: {
15766
+ type: "image",
15767
+ opacity: 1,
15768
+ position: "center center"
15769
+ },
15770
+ foreground: {
15771
+ textColor: "text",
15772
+ headingColor: "primary",
15773
+ linkColor: "primary",
15774
+ supportingColor: "text"
15775
+ }
15776
+ }
15777
+ }
15778
+ });
14858
15779
  var expressiveUnderlineInputs = {
14859
15780
  base: {
14860
15781
  background: { type: "transparent" },
@@ -14892,6 +15813,43 @@ var expressiveUnderlineInputs = {
14892
15813
  opacity: 0.6
14893
15814
  }
14894
15815
  };
15816
+ var ornateDarkInputs = {
15817
+ base: {
15818
+ background: { type: "solid", colorToken: "surfaceAlt" },
15819
+ textColorToken: "text",
15820
+ border: {
15821
+ widthClass: "border",
15822
+ colorToken: "primary/45",
15823
+ style: "all"
15824
+ },
15825
+ corners: "square",
15826
+ shadow: null,
15827
+ spacing: "medium",
15828
+ fontSize: "base"
15829
+ },
15830
+ label: {
15831
+ textColorToken: "primary",
15832
+ fontWeight: "semibold",
15833
+ fontSize: "xs",
15834
+ textTransform: "uppercase",
15835
+ letterSpacing: "wider",
15836
+ opacity: 1
15837
+ },
15838
+ focus: {
15839
+ ringColorToken: "primary/18",
15840
+ ringWidth: "2",
15841
+ borderColorToken: "primary/70"
15842
+ },
15843
+ error: {
15844
+ borderColorToken: "destructive",
15845
+ textColorToken: "destructive"
15846
+ },
15847
+ disabled: {
15848
+ backgroundColorToken: "muted",
15849
+ textColorToken: "mutedText",
15850
+ opacity: 0.6
15851
+ }
15852
+ };
14895
15853
  function uniqueContentFrameKinds() {
14896
15854
  const kinds = [
14897
15855
  ...new Set(
@@ -14949,6 +15907,7 @@ function defineCuratedSiteStyle(input) {
14949
15907
  // clean/minimal styles default to none.
14950
15908
  headingDecoration: input.headingDecoration ?? noHeadingDecoration,
14951
15909
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
15910
+ ...input.designRuntimeRules ? { designRuntimeRules: input.designRuntimeRules } : {},
14952
15911
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
14953
15912
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
14954
15913
  defaultHeaderSelection: input.defaultHeaderSelection ? {
@@ -15899,6 +16858,80 @@ var curatedSiteStyles = [
15899
16858
  paletteChoice("high-contrast-ink")
15900
16859
  ]
15901
16860
  }),
16861
+ defineCuratedSiteStyle({
16862
+ id: "site-style:kirtan-ornate",
16863
+ name: "Kirtan Ornate",
16864
+ headingDecoration: { family: "short-center-rule", colorToken: "accent" },
16865
+ description: "Ceremonial, jewel-toned, and devotional: ornate frames, warm contrast, and composed rhythm for intimate music gatherings.",
16866
+ 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.",
16867
+ selectionKeywordRules: [
16868
+ { kind: "word", value: "kirtan" },
16869
+ { kind: "word", value: "chanting" },
16870
+ { kind: "word", value: "ceremony" },
16871
+ { kind: "word", value: "devotional" }
16872
+ ],
16873
+ tokenRecipes: {
16874
+ palette: "brand-led",
16875
+ contrast: "strong",
16876
+ radius: "soft",
16877
+ shadow: "subtle",
16878
+ typography: "serif-editorial",
16879
+ spacing: "airy",
16880
+ motion: "subtle"
16881
+ },
16882
+ compositionBudget: expressiveBudget,
16883
+ typographyPresetChoices: [
16884
+ typographyChoice("typography-preset:kirtan-ornate"),
16885
+ typographyChoice("typography-preset:luxe-contrast"),
16886
+ typographyChoice("typography-preset:editorial-serif")
16887
+ ],
16888
+ defaultTypographyPresetId: "typography-preset:kirtan-ornate",
16889
+ themeOverrides: {
16890
+ accordions: warmInsetAccordionSystem,
16891
+ cards: originalJoyCardSystem,
16892
+ testimonialQuote: serifDisplayQuote,
16893
+ bodyText: {
16894
+ intro: {
16895
+ paragraphSize: "editorial",
16896
+ headingSize: "editorial"
16897
+ }
16898
+ },
16899
+ inputs: ornateDarkInputs
16900
+ },
16901
+ designRuntimeRules: kirtanOrnateDesignRuntimeRules,
16902
+ recommendedAppearancePresetIds: [
16903
+ "hero-brand-scrim-fixed-frame",
16904
+ "media-text-quiet-story",
16905
+ "events-lined-panel",
16906
+ "schedule-details-brand-depth",
16907
+ "testimonials-statement-cards",
16908
+ "contact-form-panel"
16909
+ ],
16910
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
16911
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
16912
+ recommendedHeaderStyleChoicesByLayout: {
16913
+ floating: [
16914
+ headerStyleChoice("minimal-surface"),
16915
+ headerStyleChoice("split-glass"),
16916
+ headerStyleChoice("glass")
16917
+ ]
16918
+ },
16919
+ recommendedHeaderLookIds: ["minimal-transparent"],
16920
+ recommendedFooterLookIds: [
16921
+ "site-footer-brand-two-band",
16922
+ "footer-muted-grounding"
16923
+ ],
16924
+ buttonPersonalityChoices: [
16925
+ buttonChoice("ornate-ritual"),
16926
+ buttonChoice("joy-stamp"),
16927
+ buttonChoice("ink-stamp")
16928
+ ],
16929
+ paletteVariantChoices: [
16930
+ paletteChoice("warm-dark-kirtan-gold"),
16931
+ paletteChoice("warm-dark-ember"),
16932
+ paletteChoice("brand-led-burgundy-gold")
16933
+ ]
16934
+ }),
15902
16935
  defineCuratedSiteStyle({
15903
16936
  id: "site-style:original-joy",
15904
16937
  name: "Original Joy",
@@ -16002,319 +17035,6 @@ var pageFlowPresets = [
16002
17035
  }
16003
17036
  ];
16004
17037
 
16005
- // ../theme-core/src/site-styles/designState.ts
16006
- import { z as z24 } from "zod";
16007
- var themeV2DesignStateSchemaVersion = 1;
16008
- var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
16009
- var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
16010
- var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
16011
- fields3[0],
16012
- ...fields3.slice(1)
16013
- ]);
16014
- var heroLegibilityStrategySchema = z24.enum([
16015
- "none",
16016
- "scrim-gradient",
16017
- "solid-panel"
16018
- ]);
16019
- var heroCompositionIntentSchema = z24.enum([
16020
- "center",
16021
- "bottom-left"
16022
- ]);
16023
- var heroTypographyScaleIntentSchema = z24.enum([
16024
- "quiet",
16025
- "editorial",
16026
- "display",
16027
- "poster"
16028
- ]);
16029
- var sectionHeightIntentSchema = z24.enum([
16030
- "default",
16031
- "banner",
16032
- "hero",
16033
- "immersive"
16034
- ]);
16035
- var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
16036
- var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
16037
- var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
16038
- z24.object({ kind: z24.literal("none") }).strict(),
16039
- z24.object({
16040
- kind: z24.literal("brand-scrim"),
16041
- token: z24.enum(["primary", "secondary", "accent"]),
16042
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
16043
- }).strict(),
16044
- z24.object({
16045
- kind: z24.literal("brand-wash"),
16046
- token: z24.enum(["primary", "secondary", "accent"]),
16047
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
16048
- }).strict(),
16049
- z24.object({
16050
- kind: z24.literal("neutral-scrim"),
16051
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
16052
- }).strict(),
16053
- z24.object({
16054
- kind: z24.literal("neutral-wash"),
16055
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
16056
- }).strict(),
16057
- z24.object({
16058
- kind: z24.literal("solid-panel"),
16059
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
16060
- }).strict()
16061
- ]);
16062
- var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
16063
- var tileTreatmentSchema = z24.enum(tileTreatmentValues);
16064
- var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
16065
- var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
16066
- function uniqueNonEmpty(values) {
16067
- const uniqueValues = [...new Set(values)];
16068
- const firstValue = uniqueValues[0];
16069
- if (!firstValue) {
16070
- throw new Error("Expected at least one Theme V2 design state option.");
16071
- }
16072
- return [firstValue, ...uniqueValues.slice(1)];
16073
- }
16074
- var userPanelTreatments = uniqueNonEmpty(
16075
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
16076
- );
16077
- var userFlushTreatments = uniqueNonEmpty(
16078
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
16079
- );
16080
- var userFlushBleeds = uniqueNonEmpty(
16081
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
16082
- );
16083
- var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
16084
- z24.object({ kind: z24.literal("plain") }).strict(),
16085
- z24.object({
16086
- kind: z24.literal("panel"),
16087
- treatment: z24.enum(userPanelTreatments)
16088
- }).strict(),
16089
- z24.object({
16090
- kind: z24.literal("flush-panel"),
16091
- treatment: z24.enum(userFlushTreatments),
16092
- bleed: z24.enum(userFlushBleeds)
16093
- }).strict()
16094
- ]);
16095
- var blockDesignPlanSchema = z24.object({
16096
- blockId: z24.string().min(1).transform(asDesignBlockId),
16097
- blockKind: z24.string().min(1),
16098
- purpose: z24.string().min(1),
16099
- sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
16100
- contentFrame: contentFrameIntentSchema,
16101
- itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
16102
- transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
16103
- emphasis: z24.enum(userDesignOptionCatalog.emphases),
16104
- sectionHeight: sectionHeightIntentSchema.optional(),
16105
- heroLegibility: heroLegibilityStrategySchema.optional(),
16106
- heroComposition: heroCompositionIntentSchema.optional(),
16107
- heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
16108
- imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
16109
- imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
16110
- testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
16111
- tileTreatment: tileTreatmentSchema.optional(),
16112
- eventListTreatment: eventListTreatmentSchema.optional(),
16113
- eyebrowTreatment: eyebrowTreatmentSchema.optional()
16114
- }).strict();
16115
- var styleAuthoritySchema = z24.discriminatedUnion("kind", [
16116
- z24.object({
16117
- kind: z24.literal("theme-v2"),
16118
- source: designResolutionPolicySchema,
16119
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
16120
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
16121
- templateVersion: z24.number().int().nonnegative(),
16122
- resolverVersion: z24.number().int().nonnegative()
16123
- }).strict(),
16124
- z24.object({
16125
- kind: z24.literal("legacy-raw"),
16126
- reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
16127
- }).strict(),
16128
- z24.object({
16129
- kind: z24.literal("advanced-detached"),
16130
- reason: z24.literal("detached-custom-runtime-fields")
16131
- }).strict()
16132
- ]);
16133
- var blockRuntimeStyleAuthoritySchema = z24.object({
16134
- unit: z24.literal("block-runtime-fields"),
16135
- blockId: z24.string().min(1).transform(asDesignBlockId),
16136
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
16137
- authority: styleAuthoritySchema
16138
- }).strict();
16139
- var persistedPageDesignStateV1Schema = z24.object({
16140
- schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
16141
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
16142
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
16143
- templateVersion: z24.number().int().nonnegative(),
16144
- resolverVersion: z24.number().int().nonnegative(),
16145
- rhythmPresetId: z24.string().min(1),
16146
- blocks: z24.array(blockDesignPlanSchema),
16147
- styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
16148
- }).strict();
16149
-
16150
- // ../theme-core/src/site-styles/runtimeCompiler.ts
16151
- function defineDesignRuntimeRules(rules) {
16152
- return rules;
16153
- }
16154
- function defineComponentRuntimeRules(rules) {
16155
- return rules;
16156
- }
16157
- var defaultDesignRuntimeRules = defineDesignRuntimeRules({
16158
- sectionSurfaces: {
16159
- base: {},
16160
- "muted-band": {
16161
- background: {
16162
- type: "color",
16163
- color: "muted"
16164
- }
16165
- },
16166
- "accent-band": {
16167
- background: {
16168
- type: "color",
16169
- color: "primary"
16170
- }
16171
- },
16172
- "brand-depth-band": {
16173
- background: {
16174
- type: "color",
16175
- color: "primary-800"
16176
- }
16177
- },
16178
- "hero-image": {
16179
- background: {
16180
- type: "image",
16181
- opacity: 1,
16182
- position: "center center",
16183
- ...uniformSectionForeground("text")
16184
- }
16185
- }
16186
- },
16187
- heroLegibility: {
16188
- "scrim-gradient": {
16189
- type: "gradient",
16190
- gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
16191
- opacity: 1
16192
- },
16193
- "solid-panel": {
16194
- type: "color",
16195
- color: "surface",
16196
- opacity: 0.88
16197
- }
16198
- },
16199
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
16200
- });
16201
- var defaultComponentRuntimeRules = defineComponentRuntimeRules({
16202
- panelFrames: {
16203
- inset: {
16204
- spacing: "comfortable",
16205
- rounded: "xl",
16206
- raised: false,
16207
- background: {
16208
- type: "color",
16209
- color: "surfaceAlt",
16210
- textColor: "text"
16211
- }
16212
- },
16213
- raised: {
16214
- spacing: "comfortable",
16215
- rounded: "xl",
16216
- raised: true,
16217
- background: {
16218
- type: "color",
16219
- color: "surfaceAlt",
16220
- textColor: "text"
16221
- }
16222
- },
16223
- editorial: {
16224
- spacing: "medium",
16225
- rounded: "xl",
16226
- raised: false,
16227
- background: {
16228
- type: "color",
16229
- color: "surface",
16230
- textColor: "text"
16231
- }
16232
- }
16233
- },
16234
- flushFrames: {
16235
- "media-panel": {
16236
- fullWidth: true,
16237
- spacing: "none",
16238
- rounded: "none",
16239
- raised: false
16240
- }
16241
- },
16242
- itemSurfaces: {
16243
- none: null,
16244
- default: {
16245
- spacing: "medium",
16246
- rounded: "lg",
16247
- raised: false
16248
- },
16249
- flat: {
16250
- spacing: "medium",
16251
- rounded: "lg",
16252
- raised: false
16253
- },
16254
- outlined: {
16255
- spacing: "medium",
16256
- rounded: "lg",
16257
- raised: false,
16258
- border: {
16259
- enabled: true,
16260
- width: "1",
16261
- colorToken: "border"
16262
- }
16263
- },
16264
- raised: {
16265
- spacing: "medium",
16266
- rounded: "xl",
16267
- raised: true
16268
- },
16269
- inset: {
16270
- treatment: "soft-panel",
16271
- spacing: "comfortable",
16272
- rounded: "xl",
16273
- raised: false,
16274
- border: {
16275
- enabled: false
16276
- },
16277
- background: {
16278
- type: "color",
16279
- color: "surfaceAlt",
16280
- textColor: "text"
16281
- }
16282
- },
16283
- editorial: {
16284
- // Boxless open column with a short rule on top; the visual treatment
16285
- // lives in blocks-static/card-treatments.css.
16286
- treatment: "editorial-rule",
16287
- spacing: "none",
16288
- rounded: "none",
16289
- raised: false,
16290
- border: {
16291
- enabled: false
16292
- }
16293
- },
16294
- "color-blocked": {
16295
- // Bold, flat colour-blocked cards. The per-card background colour cycle
16296
- // (by position) and staggered offset live in
16297
- // blocks-static/card-treatments.css; here we set the shared shape:
16298
- // generous padding, large radius, no border, flat (no shadow).
16299
- treatment: "color-blocked",
16300
- spacing: "spacious",
16301
- rounded: "2xl",
16302
- raised: false,
16303
- border: {
16304
- enabled: false
16305
- }
16306
- }
16307
- }
16308
- });
16309
- function uniformSectionForeground(token) {
16310
- return {
16311
- textColor: token,
16312
- headingColor: token,
16313
- linkColor: token,
16314
- supportingColor: token
16315
- };
16316
- }
16317
-
16318
17038
  // ../theme-core/src/site-styles/generatedSchemas.ts
16319
17039
  import { z as z25 } from "zod";
16320
17040
  function uniqueNonEmpty2(values) {
@@ -17126,6 +17846,31 @@ function cardStylesField(options = {}) {
17126
17846
  return createBoxStylesFieldWithDepth("card", options);
17127
17847
  }
17128
17848
 
17849
+ // ../blocks/src/system/fields/imageShape.ts
17850
+ var standardImageShapeOptions = [
17851
+ { value: "default", label: "Default" },
17852
+ { value: "square", label: "Square corners" },
17853
+ { value: "rounded", label: "Rounded corners" },
17854
+ { value: "circle", label: "Circle" },
17855
+ { value: "arch", label: "Arch" }
17856
+ ];
17857
+ function createImageShapeField(options = {}) {
17858
+ return {
17859
+ id: options.id ?? "imageShape",
17860
+ type: "select",
17861
+ label: options.label ?? "Image shape",
17862
+ ...options.description ? { description: options.description } : {},
17863
+ required: false,
17864
+ defaultValue: options.defaultValue ?? "default",
17865
+ multiple: false,
17866
+ options: [...standardImageShapeOptions],
17867
+ ui: {
17868
+ intent: options.uiIntent ?? "display",
17869
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
17870
+ }
17871
+ };
17872
+ }
17873
+
17129
17874
  // ../blocks/src/utils/env.ts
17130
17875
  function isDevEnvironment() {
17131
17876
  try {
@@ -17940,7 +18685,7 @@ function buildFooterNavAll(common) {
17940
18685
  return stack(
17941
18686
  { className: common.className, gap: common.gap, align: "stretch" },
17942
18687
  [item],
17943
- when(collectionPath)
18688
+ whenCollectionHasItems(collectionPath)
17944
18689
  );
17945
18690
  }
17946
18691
  function buildFooterNavLinksOnly(common) {
@@ -17973,7 +18718,7 @@ function buildFooterNavLinksOnly(common) {
17973
18718
  return stack(
17974
18719
  { className: common.className, gap: common.gap, align: "stretch" },
17975
18720
  [item],
17976
- when(collectionPath)
18721
+ whenCollectionHasItems(collectionPath)
17977
18722
  );
17978
18723
  }
17979
18724
  function buildFooterNavFlatten(common) {
@@ -18022,9 +18767,20 @@ function buildFooterNavFlatten(common) {
18022
18767
  return stack(
18023
18768
  { className: common.className, gap: common.gap, align: "stretch" },
18024
18769
  [item],
18025
- when(collectionPath)
18770
+ whenCollectionHasItems(collectionPath)
18026
18771
  );
18027
18772
  }
18773
+ var whenCollectionHasItems = (collectionPath) => (node) => ({
18774
+ ...node,
18775
+ $when: {
18776
+ when: {
18777
+ from: collectionPath,
18778
+ transforms: [{ id: "array.length" }]
18779
+ },
18780
+ equals: 0,
18781
+ not: true
18782
+ }
18783
+ });
18028
18784
  function footerNav(opts) {
18029
18785
  const mode = opts?.mode ?? "all";
18030
18786
  const collectionPath = opts?.collectionPath ?? "footerMenu.items";
@@ -20596,8 +21352,23 @@ function fragmentsToRepeaterField(id, label, fragments, options = {}) {
20596
21352
  var heroLayoutControlsFragment = defineFragment({
20597
21353
  id: "heroLayoutControls",
20598
21354
  title: "Hero Layout",
20599
- description: "Alignment and content width controls for hero layouts.",
21355
+ description: "Title scale, alignment, and content width controls for hero layouts.",
20600
21356
  fields: [
21357
+ {
21358
+ id: "titleSize",
21359
+ type: "select",
21360
+ label: "Title size",
21361
+ description: "Adjust the visual scale of the hero title.",
21362
+ required: false,
21363
+ ui: { intent: "display" },
21364
+ options: [
21365
+ { value: "auto", label: "Auto" },
21366
+ { value: "quiet", label: "Normal" },
21367
+ { value: "editorial", label: "Large" },
21368
+ { value: "display", label: "Huge" },
21369
+ { value: "poster", label: "Poster" }
21370
+ ]
21371
+ },
20601
21372
  {
20602
21373
  id: "contentAlignment",
20603
21374
  type: "select",
@@ -21392,7 +22163,18 @@ function heroSplitImagePane() {
21392
22163
  return stack(
21393
22164
  {
21394
22165
  gap: "none",
21395
- className: "rb-relative rb-overflow-hidden rb-rounded-3xl",
22166
+ className: {
22167
+ $bind: {
22168
+ from: "content.imageShape",
22169
+ transforms: [
22170
+ {
22171
+ id: "ui.imageShapeClassName",
22172
+ options: { baseClass: "rb-relative rb-overflow-hidden rb-rounded-3xl" }
22173
+ }
22174
+ ],
22175
+ fallback: "rb-relative rb-overflow-hidden rb-rounded-3xl"
22176
+ }
22177
+ },
21396
22178
  style: {
21397
22179
  minHeight: "clamp(18rem, 36vw, 34rem)"
21398
22180
  }
@@ -21510,6 +22292,12 @@ var heroConfig = {
21510
22292
  label: "Content card",
21511
22293
  renderInHeader: true,
21512
22294
  intent: "style"
22295
+ }),
22296
+ createImageShapeField({
22297
+ id: "imageShape",
22298
+ label: "Image shape",
22299
+ defaultValue: "default",
22300
+ uiIntent: "display"
21513
22301
  })
21514
22302
  ],
21515
22303
  layout: classicLayout,
@@ -21524,6 +22312,15 @@ var heroConfig = {
21524
22312
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
21525
22313
  tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
21526
22314
  icon: "Sparkles",
22315
+ previewCustomize: {
22316
+ quickFieldPriority: [
22317
+ "titleSize",
22318
+ "contentAlignment",
22319
+ "contentMaxWidth",
22320
+ "verticalAlignment",
22321
+ "imageShape"
22322
+ ]
22323
+ },
21527
22324
  styleTokens: {
21528
22325
  typography: "display",
21529
22326
  spacing: "xl"
@@ -21540,7 +22337,8 @@ var standardAspectRatioOptions = [
21540
22337
  { value: "16/9", label: "16:9 (Landscape)" },
21541
22338
  { value: "4/3", label: "4:3 (Standard)" },
21542
22339
  { value: "1/1", label: "1:1 (Square)" },
21543
- { value: "3/4", label: "3:4 (Portrait)" }
22340
+ { value: "3/4", label: "3:4 (Portrait)" },
22341
+ { value: "9/16", label: "9:16 (Tall portrait)" }
21544
22342
  ];
21545
22343
  function createAspectRatioField(options = {}) {
21546
22344
  return {
@@ -22760,6 +23558,258 @@ var formBlockDefinition = {
22760
23558
  runtime: formBlockRuntime
22761
23559
  };
22762
23560
 
23561
+ // ../blocks/src/system/blocks/contact-newsletter.ts
23562
+ var contactNewsletterLayout = styledSection({
23563
+ children: sectionContainer([
23564
+ el(
23565
+ "div",
23566
+ { className: "contact-newsletter-grid" },
23567
+ [
23568
+ el(
23569
+ "div",
23570
+ { className: "contact-newsletter-column contact-newsletter-contact" },
23571
+ [
23572
+ el(
23573
+ "div",
23574
+ { className: "contact-newsletter-copy" },
23575
+ [
23576
+ text(
23577
+ {
23578
+ as: "h2",
23579
+ className: "form-copy-title"
23580
+ },
23581
+ when("contactTitle"),
23582
+ bind("contactTitle")
23583
+ ),
23584
+ richText(
23585
+ {
23586
+ className: "form-copy-intro rb-prose rb-max-w-none"
23587
+ },
23588
+ when("contactIntro"),
23589
+ bind("contactIntro")
23590
+ )
23591
+ ]
23592
+ ),
23593
+ el(
23594
+ "form",
23595
+ withApiBindings({
23596
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
23597
+ submitLabel: { $bind: { from: "contactSubmitLabel" } },
23598
+ successMessage: { $bind: { from: "contactSuccessMessage" } }
23599
+ }),
23600
+ [],
23601
+ bind("data.form")
23602
+ )
23603
+ ]
23604
+ ),
23605
+ el(
23606
+ "div",
23607
+ { className: "contact-newsletter-column contact-newsletter-info contact-newsletter-newsletter" },
23608
+ [
23609
+ el(
23610
+ "div",
23611
+ { className: "contact-newsletter-copy" },
23612
+ [
23613
+ text(
23614
+ {
23615
+ as: "h2",
23616
+ className: "newsletter-copy-title"
23617
+ },
23618
+ when("newsletterTitle"),
23619
+ bind("newsletterTitle")
23620
+ ),
23621
+ richText(
23622
+ {
23623
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none"
23624
+ },
23625
+ when("newsletterSubtitle"),
23626
+ bind("newsletterSubtitle")
23627
+ )
23628
+ ]
23629
+ ),
23630
+ el(
23631
+ "newsletter-form",
23632
+ withApiBindings({
23633
+ listId: { $bind: { from: "listId" } },
23634
+ preset: { $bind: { from: "preset" } },
23635
+ includePhone: { $bind: { from: "includePhone" } },
23636
+ buttonLabel: { $bind: { from: "newsletterButtonLabel" } },
23637
+ successMessage: { $bind: { from: "newsletterSuccessMessage" } },
23638
+ privacyNote: { $bind: { from: "newsletterPrivacyNote" } },
23639
+ tags: { $bind: { from: "newsletterTags" } },
23640
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } }
23641
+ }),
23642
+ []
23643
+ )
23644
+ ]
23645
+ )
23646
+ ]
23647
+ )
23648
+ ], {
23649
+ className: "contact-newsletter-container"
23650
+ }),
23651
+ baseClass: "",
23652
+ spacing: "medium",
23653
+ background: "surface"
23654
+ });
23655
+ var contactNewsletterManifest = createBlockManifest({
23656
+ id: "block.contact-newsletter",
23657
+ title: "Contact + Newsletter",
23658
+ titleSource: "contactTitle",
23659
+ description: "Two-column newsletter signup and contact form section.",
23660
+ category: "interactive",
23661
+ layout: contactNewsletterLayout,
23662
+ defaultVariant: "default",
23663
+ variants: {
23664
+ default: contactNewsletterLayout
23665
+ },
23666
+ variantOptions: {
23667
+ default: {
23668
+ label: "Two column",
23669
+ description: "Newsletter and contact form side by side.",
23670
+ icon: "Columns2"
23671
+ }
23672
+ },
23673
+ additionalFields: [
23674
+ {
23675
+ id: "newsletterTitle",
23676
+ type: "text",
23677
+ label: "Newsletter title",
23678
+ defaultValue: "Stay connected"
23679
+ },
23680
+ {
23681
+ id: "newsletterSubtitle",
23682
+ type: "richText",
23683
+ label: "Newsletter intro"
23684
+ },
23685
+ {
23686
+ id: "listId",
23687
+ type: "reference",
23688
+ label: "Newsletter list",
23689
+ description: "Select the list new subscribers should be added to.",
23690
+ required: true,
23691
+ referenceKind: "newsletterList",
23692
+ allowManualEntry: false,
23693
+ ui: { intent: "behavior" }
23694
+ },
23695
+ {
23696
+ id: "preset",
23697
+ type: "select",
23698
+ label: "Newsletter fields",
23699
+ defaultValue: "emailOnly",
23700
+ ui: { intent: "display" },
23701
+ options: [
23702
+ { value: "emailOnly", label: "Email only" },
23703
+ { value: "emailName", label: "Email + Name" },
23704
+ { value: "emailFirstLast", label: "Email + First/Last Name" },
23705
+ { value: "emailNameCompany", label: "Email + Name + Company (B2B)" }
23706
+ ]
23707
+ },
23708
+ {
23709
+ id: "includePhone",
23710
+ type: "boolean",
23711
+ label: "Include phone field",
23712
+ defaultValue: false,
23713
+ ui: { intent: "display" }
23714
+ },
23715
+ {
23716
+ id: "newsletterButtonLabel",
23717
+ type: "text",
23718
+ label: "Newsletter button label",
23719
+ defaultValue: "Subscribe",
23720
+ ui: { intent: "display" }
23721
+ },
23722
+ {
23723
+ id: "newsletterSuccessMessage",
23724
+ type: "text",
23725
+ label: "Newsletter success message",
23726
+ defaultValue: "Thanks for subscribing!",
23727
+ ui: { intent: "behavior" }
23728
+ },
23729
+ {
23730
+ id: "newsletterPrivacyNote",
23731
+ type: "text",
23732
+ label: "Privacy note",
23733
+ ui: { intent: "display" }
23734
+ },
23735
+ {
23736
+ id: "newsletterTags",
23737
+ type: "text",
23738
+ label: "Newsletter tags",
23739
+ description: "Optional tags to apply on subscribe, separated by comma or semicolon.",
23740
+ ui: { intent: "behavior" }
23741
+ },
23742
+ {
23743
+ id: "contactTitle",
23744
+ type: "text",
23745
+ label: "Contact title",
23746
+ defaultValue: "Get in touch"
23747
+ },
23748
+ {
23749
+ id: "contactIntro",
23750
+ type: "richText",
23751
+ label: "Contact intro"
23752
+ },
23753
+ {
23754
+ id: "formSlug",
23755
+ type: "reference",
23756
+ label: "Contact form",
23757
+ description: "Pick a saved form to render.",
23758
+ required: true,
23759
+ referenceKind: "form",
23760
+ allowManualEntry: false,
23761
+ ui: { intent: "behavior" }
23762
+ },
23763
+ {
23764
+ id: "contactSubmitLabel",
23765
+ type: "text",
23766
+ label: "Contact button label",
23767
+ defaultValue: "Send message",
23768
+ ui: { intent: "display" }
23769
+ },
23770
+ {
23771
+ id: "contactSuccessMessage",
23772
+ type: "text",
23773
+ label: "Contact success message",
23774
+ defaultValue: "Thanks - we received your message.",
23775
+ ui: { intent: "behavior" }
23776
+ }
23777
+ ],
23778
+ styleTokens: {
23779
+ background: "surface",
23780
+ typography: "body",
23781
+ spacing: "md"
23782
+ },
23783
+ behaviours: {
23784
+ supportsThemeSwitching: true,
23785
+ inlineEditing: true,
23786
+ animation: false,
23787
+ paletteHidden: false
23788
+ },
23789
+ tags: [
23790
+ "contact",
23791
+ "newsletter",
23792
+ "signup",
23793
+ "email",
23794
+ "form",
23795
+ "lead-capture"
23796
+ ],
23797
+ icon: "MailPlus"
23798
+ });
23799
+ var contactNewsletterBlockDefinition = {
23800
+ manifest: contactNewsletterManifest,
23801
+ dataSchemas: { form: formDataSchema.optional() },
23802
+ dataLoaders: {
23803
+ form: {
23804
+ endpoint: "getPublicFormById",
23805
+ params: {
23806
+ formSlug: { $bind: { from: "formSlug" } }
23807
+ },
23808
+ mode: "server"
23809
+ }
23810
+ }
23811
+ };
23812
+
22763
23813
  // ../blocks/src/system/blocks/faq.ts
22764
23814
  function fragmentLayoutNode2(layout) {
22765
23815
  return isNodeDefinitionArray2(layout) ? el("div", {}, [...layout]) : layout;
@@ -22988,6 +24038,7 @@ var joinClasses3 = (parts) => parts.filter(
22988
24038
  ).join(" ").replace(/\s+/g, " ").trim();
22989
24039
  var eyebrowTreatmentClassMap = {
22990
24040
  plain: "",
24041
+ accent: "rb-eyebrow-treatment-accent",
22991
24042
  pill: "rb-eyebrow-treatment-pill",
22992
24043
  "accent-pill": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent",
22993
24044
  "pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-pill-bounce",
@@ -23014,6 +24065,13 @@ var imageGalleryCornerClassMap = {
23014
24065
  "2xl": "rb-rounded-2xl",
23015
24066
  "3xl": "rb-rounded-3xl"
23016
24067
  };
24068
+ var imageShapeClassMap = {
24069
+ default: "",
24070
+ square: "rb-media-shape-square",
24071
+ rounded: "rb-media-shape-rounded",
24072
+ circle: "rb-media-shape-circle",
24073
+ arch: "rb-media-shape-arch"
24074
+ };
23017
24075
  var parseRatio = (raw) => {
23018
24076
  if (typeof raw !== "string") return null;
23019
24077
  const value = raw.trim();
@@ -23158,6 +24216,10 @@ function resolveHeroContentMaxWidth(content) {
23158
24216
  return "default";
23159
24217
  }
23160
24218
  function resolveHeroTypographyScale(content) {
24219
+ const titleSize = readString(content, "titleSize");
24220
+ if (titleSize === "quiet" || titleSize === "editorial" || titleSize === "display" || titleSize === "poster") {
24221
+ return titleSize;
24222
+ }
23161
24223
  const raw = readHeroLayoutString(
23162
24224
  content,
23163
24225
  "typographyScale",
@@ -23399,6 +24461,16 @@ var uiTransforms = [
23399
24461
  heroGridClassFromVerticalAlignmentTransform,
23400
24462
  imageFragmentClassTransform,
23401
24463
  imageFragmentSizeTransform,
24464
+ {
24465
+ id: "ui.imageShapeClassName",
24466
+ kind: "string",
24467
+ summary: "Apply a constrained media shape class",
24468
+ run: (value, options) => {
24469
+ const baseClass = typeof options?.baseClass === "string" ? options.baseClass : "";
24470
+ const shape = typeof value === "string" ? value.trim() : "default";
24471
+ return joinClasses3([baseClass, imageShapeClassMap[shape] ?? ""]);
24472
+ }
24473
+ },
23402
24474
  conditionalClassTransform,
23403
24475
  twoColumnContainerClassTransform,
23404
24476
  twoColumnFlexBasisTransform,
@@ -24742,6 +25814,21 @@ var siteHeaderManifest = createBlockManifest({
24742
25814
  id: "block.site-header",
24743
25815
  title: "Site Header",
24744
25816
  category: "layout",
25817
+ additionalFields: [
25818
+ {
25819
+ id: "mode",
25820
+ type: "select",
25821
+ label: "Header display",
25822
+ required: false,
25823
+ multiple: false,
25824
+ defaultValue: "default",
25825
+ options: [
25826
+ { value: "default", label: "Show header" },
25827
+ { value: "hidden", label: "Hide header" }
25828
+ ],
25829
+ ui: { intent: "display" }
25830
+ }
25831
+ ],
24745
25832
  // Skip section styles - this block uses theme-based styling
24746
25833
  skipSectionStyles: true,
24747
25834
  // Block manages its own wrapper - enables sticky positioning
@@ -26144,6 +27231,9 @@ var mediaTextManifest = createBlockManifest({
26144
27231
  category: "layout",
26145
27232
  includeContainerStyles: true,
26146
27233
  titleSource: "title",
27234
+ previewCustomize: {
27235
+ quickFieldPriority: ["imagePosition", "ratio", "imageShape", "titleAlignment", "aspectRatio"]
27236
+ },
26147
27237
  additionalFields: [
26148
27238
  {
26149
27239
  id: "images",
@@ -26182,7 +27272,7 @@ var mediaTextManifest = createBlockManifest({
26182
27272
  {
26183
27273
  id: "titleAlignment",
26184
27274
  type: "select",
26185
- label: "Title alignment",
27275
+ label: "Content alignment",
26186
27276
  required: false,
26187
27277
  defaultValue: "left",
26188
27278
  multiple: false,
@@ -26240,7 +27330,18 @@ var mediaTextManifest = createBlockManifest({
26240
27330
  transition: "slide"
26241
27331
  },
26242
27332
  ui: { intent: "behavior" }
26243
- }),
27333
+ }).map((field) => ({
27334
+ ...field,
27335
+ ui: {
27336
+ ...field.ui ?? {},
27337
+ visibleWhen: field.id === "carouselAutoplayDelay" ? {
27338
+ allOf: [
27339
+ { field: "images", minItems: 2 },
27340
+ { field: "carouselAutoplay", equals: true }
27341
+ ]
27342
+ } : { field: "images", minItems: 2 }
27343
+ }
27344
+ })),
26244
27345
  createAspectRatioField({
26245
27346
  id: "aspectRatio",
26246
27347
  label: "Media aspect ratio",
@@ -26248,6 +27349,12 @@ var mediaTextManifest = createBlockManifest({
26248
27349
  defaultValue: "auto",
26249
27350
  visibleWhen: { field: "images", notEquals: null }
26250
27351
  }),
27352
+ createImageShapeField({
27353
+ id: "imageShape",
27354
+ label: "Media shape",
27355
+ defaultValue: "default",
27356
+ visibleWhen: { field: "images", notEquals: null }
27357
+ }),
26251
27358
  {
26252
27359
  id: "text",
26253
27360
  type: "richText",
@@ -26281,6 +27388,30 @@ var mediaTextManifest = createBlockManifest({
26281
27388
  ...options?.not ? { not: true } : {}
26282
27389
  }
26283
27390
  });
27391
+ const bodyClassNameFromAlignment = {
27392
+ $bind: {
27393
+ from: "content.titleAlignment",
27394
+ transforms: [
27395
+ {
27396
+ id: "ui.bodyClassFromAlignment",
27397
+ options: { base: "rb-prose rb-max-w-none" }
27398
+ }
27399
+ ],
27400
+ fallback: "rb-prose rb-max-w-none"
27401
+ }
27402
+ };
27403
+ const titleClassNameFromAlignment = {
27404
+ $bind: {
27405
+ from: "content.titleAlignment",
27406
+ transforms: [
27407
+ {
27408
+ id: "ui.headingClassFromAlignment",
27409
+ options: { base: "" }
27410
+ }
27411
+ ],
27412
+ fallback: ""
27413
+ }
27414
+ };
26284
27415
  const defaultTextColumn = el("div", {}, [
26285
27416
  styledCard(
26286
27417
  [
@@ -26305,8 +27436,55 @@ var mediaTextManifest = createBlockManifest({
26305
27436
  bind("content.text")
26306
27437
  )
26307
27438
  ]);
27439
+ const bioTextColumn = el(
27440
+ "div",
27441
+ { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" },
27442
+ [
27443
+ text(
27444
+ {
27445
+ as: "h2",
27446
+ className: titleClassNameFromAlignment
27447
+ },
27448
+ when("content.title"),
27449
+ bind("content.title")
27450
+ ),
27451
+ styledCard(
27452
+ [
27453
+ richText(
27454
+ {
27455
+ className: bodyClassNameFromAlignment
27456
+ },
27457
+ bind("content.text")
27458
+ )
27459
+ ],
27460
+ {
27461
+ stylesFrom: "content._textCardStyles",
27462
+ backgroundFrom: "content._textCardStyles.background"
27463
+ },
27464
+ when("content.wrapTextInCard")
27465
+ ),
27466
+ richText(
27467
+ {
27468
+ className: bodyClassNameFromAlignment
27469
+ },
27470
+ when("content.wrapTextInCard", { not: true }),
27471
+ bind("content.text")
27472
+ )
27473
+ ]
27474
+ );
26308
27475
  const defaultImageCommonProps = {
26309
- className: "rb-w-full rb-h-auto rb-object-cover",
27476
+ className: {
27477
+ $bind: {
27478
+ from: "content.imageShape",
27479
+ transforms: [
27480
+ {
27481
+ id: "ui.imageShapeClassName",
27482
+ options: { baseClass: "rb-w-full rb-h-auto rb-object-cover" }
27483
+ }
27484
+ ],
27485
+ fallback: "rb-w-full rb-h-auto rb-object-cover"
27486
+ }
27487
+ },
26310
27488
  style: {
26311
27489
  aspectRatio: { $bind: { from: "content.aspectRatio" } }
26312
27490
  }
@@ -26347,6 +27525,27 @@ var mediaTextManifest = createBlockManifest({
26347
27525
  ],
26348
27526
  whenImagesLength(0, { not: true })
26349
27527
  );
27528
+ const bioImagesLayout = el(
27529
+ "div",
27530
+ {},
27531
+ [
27532
+ responsiveTwoColumn({
27533
+ image: el("div", {}, [
27534
+ el("div", {}, [defaultSingleImage], whenImagesLength(1)),
27535
+ el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))
27536
+ ]),
27537
+ text: bioTextColumn,
27538
+ ratioFrom: "content.ratio",
27539
+ imagePositionFrom: "content.imagePosition",
27540
+ containerClassName: "rb-flex rb-flex-col rb-md-flex-row rb-md-items-center",
27541
+ gapFrom: "content.gap",
27542
+ gapFallback: "comfortable",
27543
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
27544
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
27545
+ })
27546
+ ],
27547
+ whenImagesLength(0, { not: true })
27548
+ );
26350
27549
  const defaultTextOnlyLayout = el(
26351
27550
  "div",
26352
27551
  {},
@@ -26376,7 +27575,45 @@ var mediaTextManifest = createBlockManifest({
26376
27575
  ],
26377
27576
  whenImagesLength(0)
26378
27577
  );
27578
+ const bioTextOnlyLayout = el(
27579
+ "div",
27580
+ { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" },
27581
+ [
27582
+ text(
27583
+ {
27584
+ as: "h2",
27585
+ className: titleClassNameFromAlignment
27586
+ },
27587
+ when("content.title"),
27588
+ bind("content.title")
27589
+ ),
27590
+ styledCard(
27591
+ [
27592
+ richText(
27593
+ {
27594
+ className: bodyClassNameFromAlignment
27595
+ },
27596
+ bind("content.text")
27597
+ )
27598
+ ],
27599
+ {
27600
+ stylesFrom: "content._textCardStyles",
27601
+ backgroundFrom: "content._textCardStyles.background"
27602
+ },
27603
+ when("content.wrapTextInCard")
27604
+ ),
27605
+ richText(
27606
+ {
27607
+ className: bodyClassNameFromAlignment
27608
+ },
27609
+ when("content.wrapTextInCard", { not: true }),
27610
+ bind("content.text")
27611
+ )
27612
+ ],
27613
+ whenImagesLength(0)
27614
+ );
26379
27615
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
27616
+ const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
26380
27617
  const defaultLayout2 = styledSection({
26381
27618
  children: styledContainer({
26382
27619
  rootType: "stack",
@@ -26385,18 +27622,7 @@ var mediaTextManifest = createBlockManifest({
26385
27622
  text(
26386
27623
  {
26387
27624
  as: "h2",
26388
- className: {
26389
- $bind: {
26390
- from: "content.titleAlignment",
26391
- transforms: [
26392
- {
26393
- id: "ui.headingClassFromAlignment",
26394
- options: { base: "" }
26395
- }
26396
- ],
26397
- fallback: ""
26398
- }
26399
- }
27625
+ className: titleClassNameFromAlignment
26400
27626
  },
26401
27627
  when("content.title"),
26402
27628
  bind("content.title")
@@ -26408,14 +27634,28 @@ var mediaTextManifest = createBlockManifest({
26408
27634
  baseClass: "",
26409
27635
  spacing: "medium"
26410
27636
  });
27637
+ const bioLayout = styledSection({
27638
+ children: styledContainer({
27639
+ rootType: "stack",
27640
+ rootProps: { gap: "lg" },
27641
+ children: [bioInner]
27642
+ }),
27643
+ baseClass: "",
27644
+ spacing: "medium"
27645
+ });
26411
27646
  return {
26412
27647
  layout: defaultLayout2,
26413
27648
  variants: {
26414
- default: defaultLayout2
27649
+ default: defaultLayout2,
27650
+ bio: bioLayout
26415
27651
  },
26416
27652
  defaultVariant: "default",
26417
27653
  variantOptions: {
26418
- default: { label: "Default" }
27654
+ default: { label: "Default" },
27655
+ bio: {
27656
+ label: "Bio",
27657
+ description: "Vertically centered title and copy beside media."
27658
+ }
26419
27659
  }
26420
27660
  };
26421
27661
  })(),
@@ -27121,10 +28361,8 @@ var occurrenceContextSchema = z43.object({
27121
28361
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
27122
28362
  import { z as z45 } from "zod";
27123
28363
 
27124
- // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
27125
- import { z as z44 } from "zod";
27126
-
27127
28364
  // ../blocks/src/system/constants/events.ts
28365
+ var EVENT_CONTENT_TYPE_SLUGS = ["event", "events"];
27128
28366
  var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
27129
28367
  var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
27130
28368
  var eventCalendarListLayoutOptions = [
@@ -27138,8 +28376,133 @@ function isEventCalendarDisplayMode(value) {
27138
28376
  function isEventCalendarListLayout(value) {
27139
28377
  return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
27140
28378
  }
28379
+ function isEventContentType(slug) {
28380
+ if (!slug) return false;
28381
+ return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
28382
+ }
28383
+
28384
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
28385
+ var DEFAULT_EVENT_CURRENCY = "USD";
28386
+ function resolveRuntimeEventPricing(event) {
28387
+ if (isPublicEventPricing(event.pricing)) {
28388
+ return event.pricing;
28389
+ }
28390
+ const legacy = event;
28391
+ const currency = readCurrency(legacy.currency);
28392
+ if (event.requiresRegistration === false) {
28393
+ return {
28394
+ kind: "drop_in",
28395
+ currency,
28396
+ display: { kind: "free", currency }
28397
+ };
28398
+ }
28399
+ if (legacy.pricingMode === "ticket_types") {
28400
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
28401
+ return {
28402
+ kind: "ticket_types",
28403
+ currency,
28404
+ ticketTypes,
28405
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
28406
+ };
28407
+ }
28408
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
28409
+ if (legacy.pricingType === "paid" && amount > 0) {
28410
+ return {
28411
+ kind: "single_paid",
28412
+ amount,
28413
+ currency,
28414
+ display: { kind: "exact", amount, currency }
28415
+ };
28416
+ }
28417
+ return {
28418
+ kind: "free_registration",
28419
+ currency,
28420
+ display: { kind: "free", currency }
28421
+ };
28422
+ }
28423
+ function readCurrency(value) {
28424
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
28425
+ }
28426
+ function isRecord3(value) {
28427
+ return typeof value === "object" && value !== null && !Array.isArray(value);
28428
+ }
28429
+ function isPublicEventPricing(value) {
28430
+ if (!isRecord3(value) || typeof value.kind !== "string") return false;
28431
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
28432
+ }
28433
+ function isPublicEventTicketType(value) {
28434
+ return isRecord3(value) && typeof value.id === "string";
28435
+ }
28436
+ function readTicketTypePriceDisplay(value, currency) {
28437
+ const display = readLegacyPriceDisplay(value, currency);
28438
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
28439
+ }
28440
+ function readLegacyPriceDisplay(value, currency) {
28441
+ if (!isRecord3(value) || typeof value.kind !== "string") {
28442
+ return { kind: "unavailable", currency };
28443
+ }
28444
+ const displayCurrency = readCurrency(value.currency);
28445
+ switch (value.kind) {
28446
+ case "free":
28447
+ return { kind: "free", currency: displayCurrency };
28448
+ case "exact":
28449
+ return readAmount(value.amount) !== null ? {
28450
+ kind: "exact",
28451
+ amount: readAmount(value.amount) ?? 0,
28452
+ currency: displayCurrency
28453
+ } : { kind: "unavailable", currency };
28454
+ case "from":
28455
+ return readAmount(value.amount) !== null ? {
28456
+ kind: "from",
28457
+ amount: readAmount(value.amount) ?? 0,
28458
+ currency: displayCurrency
28459
+ } : { kind: "unavailable", currency };
28460
+ case "mixed":
28461
+ return readAmount(value.paidFromAmount) !== null ? {
28462
+ kind: "mixed",
28463
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
28464
+ currency: displayCurrency
28465
+ } : { kind: "unavailable", currency };
28466
+ case "unavailable":
28467
+ return { kind: "unavailable", currency: displayCurrency };
28468
+ case "course":
28469
+ return isRecord3(value.display) ? {
28470
+ kind: "course",
28471
+ display: readCoursePriceDisplay(value.display, displayCurrency)
28472
+ } : {
28473
+ kind: "course",
28474
+ display: { kind: "unavailable", currency: displayCurrency }
28475
+ };
28476
+ default:
28477
+ return { kind: "unavailable", currency };
28478
+ }
28479
+ }
28480
+ function readCoursePriceDisplay(value, currency) {
28481
+ switch (value.kind) {
28482
+ case "free":
28483
+ return { kind: "free", currency: readCurrency(value.currency) };
28484
+ case "exact":
28485
+ return readAmount(value.amount) !== null ? {
28486
+ kind: "exact",
28487
+ amount: readAmount(value.amount) ?? 0,
28488
+ currency: readCurrency(value.currency)
28489
+ } : { kind: "unavailable", currency };
28490
+ case "from":
28491
+ return readAmount(value.amount) !== null ? {
28492
+ kind: "from",
28493
+ amount: readAmount(value.amount) ?? 0,
28494
+ currency: readCurrency(value.currency)
28495
+ } : { kind: "unavailable", currency };
28496
+ default:
28497
+ return { kind: "unavailable", currency };
28498
+ }
28499
+ }
28500
+ function readAmount(value) {
28501
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
28502
+ }
27141
28503
 
27142
28504
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
28505
+ import { z as z44 } from "zod";
27143
28506
  var previewStageSchema = z44.enum(["preview", "published"]);
27144
28507
  var registrationButtonVariantSchema = z44.enum(["primary", "secondary", "outline"]);
27145
28508
  var eventButtonVariantSchema = z44.enum(["primary", "secondary", "outline", "link"]);
@@ -27150,12 +28513,73 @@ var weekStartSchema = z44.enum(["sunday", "monday"]);
27150
28513
  var filterAutoShowSchema = z44.enum(["auto", "always", "never"]);
27151
28514
  var calendarTabViewsSchema = z44.enum(["both", "month", "week"]);
27152
28515
 
28516
+ // ../blocks/src/system/runtime/nodes/event-registration/wizardSteps.ts
28517
+ function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep) {
28518
+ const baseSteps = hasPreSelectedContext ? ["select-tickets", "enter-details"] : ["select-event", "select-tickets", "enter-details"];
28519
+ if (!needsPaymentStep) {
28520
+ return baseSteps;
28521
+ }
28522
+ return [...baseSteps, "select-payment"];
28523
+ }
28524
+
28525
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationDerivations.ts
28526
+ function eventMatchesOccurrenceId(event, occurrenceId) {
28527
+ return event.registrationOccurrenceId === occurrenceId || event.publicEventId === occurrenceId;
28528
+ }
28529
+ function findPreSelectedEvent(input) {
28530
+ const occurrenceContext = input.occurrenceContext;
28531
+ if (!occurrenceContext) {
28532
+ return null;
28533
+ }
28534
+ const contextDate = getBookingLocalDateKey(toScheduledBookingDateTime({
28535
+ startsAt: occurrenceContext.startsAt,
28536
+ timeZone: occurrenceContext.timeZone
28537
+ }));
28538
+ return input.scopedEvents.find(
28539
+ (event) => eventMatchesOccurrenceId(event, occurrenceContext.id) || getBookingLocalDateKey(toScheduledBookingDateTime({
28540
+ startsAt: event.startsAt,
28541
+ timeZone: event.timeZone
28542
+ })) === contextDate
28543
+ ) ?? null;
28544
+ }
28545
+ function resolveEventRequiresPayment(input) {
28546
+ if (input.eligibility) {
28547
+ return input.eligibility.requiresPayment;
28548
+ }
28549
+ if (input.selectedTicketType) {
28550
+ return input.selectedTicketType.priceAmount > 0;
28551
+ }
28552
+ if (!input.event) {
28553
+ return false;
28554
+ }
28555
+ return publicEventPricingType(resolveRuntimeEventPricing(input.event)) !== "free";
28556
+ }
28557
+
28558
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.ts
28559
+ function toRegistrationEvent(event) {
28560
+ return {
28561
+ ...event,
28562
+ pricing: resolveRuntimeEventPricing(event),
28563
+ publicEventId: event.id,
28564
+ registrationOccurrenceId: event.occurrenceId
28565
+ };
28566
+ }
28567
+ function toRegistrationEvents(events) {
28568
+ return events.map(toRegistrationEvent);
28569
+ }
28570
+
27153
28571
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
28572
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
28573
+ var EVENT_REGISTRATION_SHELL_STEP_LABELS = ["Event", "Date", "Tickets", "Details", "Payment"];
27154
28574
  var contentEntrySchema = z45.object({
27155
28575
  id: z45.string(),
27156
28576
  slug: z45.string(),
27157
28577
  contentTypeSlug: z45.string()
27158
28578
  });
28579
+ var eventRegistrationPublicEventSchema = z45.preprocess(
28580
+ normalizeEventRegistrationEventInput,
28581
+ publicEventSchema
28582
+ );
27159
28583
  var eventRegistrationSourceSchema = z45.object({
27160
28584
  siteId: z45.string().optional(),
27161
28585
  apiBaseUrl: z45.string().optional(),
@@ -27163,7 +28587,7 @@ var eventRegistrationSourceSchema = z45.object({
27163
28587
  previewToken: z45.string().nullable().optional(),
27164
28588
  occurrenceContext: occurrenceContextSchema.optional(),
27165
28589
  contentEntry: contentEntrySchema.nullable().optional(),
27166
- events: z45.array(publicEventSchema).nullable().optional(),
28590
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
27167
28591
  className: z45.string().nullable().optional(),
27168
28592
  buttonText: z45.string().nullable().optional(),
27169
28593
  maxTickets: z45.string().nullable().optional(),
@@ -27178,14 +28602,17 @@ var eventRegistrationSourceSchema = z45.object({
27178
28602
  });
27179
28603
  var eventRegistrationDisplaySchema = z45.object({
27180
28604
  kind: z45.literal("event-registration"),
27181
- state: z45.literal("shell"),
28605
+ state: z45.literal("generic-shell"),
27182
28606
  className: z45.string().nullable(),
28607
+ titleText: z45.string(),
28608
+ bodyText: z45.string(),
28609
+ stepLabels: z45.array(z45.enum(EVENT_REGISTRATION_SHELL_STEP_LABELS)).min(1),
27183
28610
  summaryButtonText: z45.string()
27184
28611
  });
27185
28612
  var eventRegistrationHydrationSchema = z45.object({
27186
28613
  occurrenceContext: occurrenceContextSchema.optional(),
27187
28614
  contentEntry: contentEntrySchema.nullable().optional(),
27188
- events: z45.array(publicEventSchema).nullable().optional(),
28615
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
27189
28616
  maxTickets: z45.string().optional(),
27190
28617
  showVenue: z45.boolean().optional(),
27191
28618
  showCapacity: z45.boolean().optional(),
@@ -27214,13 +28641,81 @@ var eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys(
27214
28641
  "stage"
27215
28642
  );
27216
28643
  function buildEventRegistrationDisplay(source) {
28644
+ const stepLabels = buildEventRegistrationShellStepLabels(source);
27217
28645
  return {
27218
28646
  kind: "event-registration",
27219
- state: "shell",
28647
+ state: "generic-shell",
27220
28648
  className: source.className ?? null,
28649
+ titleText: "Event registration",
28650
+ bodyText: buildEventRegistrationShellBodyText(stepLabels),
28651
+ stepLabels,
27221
28652
  summaryButtonText: source.buttonText?.trim() || "Register"
27222
28653
  };
27223
28654
  }
28655
+ function buildEventRegistrationShellStepLabels(source) {
28656
+ const scopedEvents = scopeEventRegistrationEvents(source);
28657
+ if (scopedEvents.length === 0) {
28658
+ return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
28659
+ }
28660
+ const preSelectedEvent = findPreSelectedEvent({
28661
+ scopedEvents,
28662
+ occurrenceContext: source.occurrenceContext
28663
+ });
28664
+ const hasPreSelectedContext = Boolean(source.occurrenceContext || preSelectedEvent);
28665
+ const needsPaymentStep = hasPreSelectedContext && preSelectedEvent ? resolveEventRequiresPayment({
28666
+ eligibility: null,
28667
+ selectedTicketType: null,
28668
+ event: preSelectedEvent
28669
+ }) : false;
28670
+ return getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
28671
+ }
28672
+ function scopeEventRegistrationEvents(source) {
28673
+ const events = toRegistrationEvents(source.events ?? []);
28674
+ if (source.occurrenceContext?.seriesId) {
28675
+ return events.filter((event) => event.seriesId === source.occurrenceContext?.seriesId);
28676
+ }
28677
+ const entrySlug = source.contentEntry?.slug;
28678
+ const entryContentType = source.contentEntry?.contentTypeSlug;
28679
+ if (entrySlug && entryContentType && isEventContentType(entryContentType)) {
28680
+ return events.filter((event) => event.slug === entrySlug);
28681
+ }
28682
+ return events;
28683
+ }
28684
+ function shellLabelForRegistrationStep(step, events) {
28685
+ switch (step) {
28686
+ case "select-event":
28687
+ return isDateSelection(events) ? "Date" : "Event";
28688
+ case "select-tickets":
28689
+ return "Tickets";
28690
+ case "enter-details":
28691
+ return "Details";
28692
+ case "select-payment":
28693
+ return "Payment";
28694
+ case "error":
28695
+ case "success":
28696
+ case "submitting":
28697
+ case "redirecting":
28698
+ case "verifying-payment":
28699
+ case "verifying-timeout":
28700
+ case "payment-failed":
28701
+ return "Details";
28702
+ }
28703
+ }
28704
+ function isDateSelection(events) {
28705
+ const firstSeriesId = events[0]?.seriesId;
28706
+ return Boolean(
28707
+ events.length > 1 && firstSeriesId && events.every((event) => event.seriesId === firstSeriesId)
28708
+ );
28709
+ }
28710
+ function buildEventRegistrationShellBodyText(stepLabels) {
28711
+ if (stepLabels.includes("Payment")) {
28712
+ return "Preparing tickets, details, and payment options.";
28713
+ }
28714
+ if (stepLabels[0] === "Tickets") {
28715
+ return "Preparing tickets and booking details.";
28716
+ }
28717
+ return "Preparing dates, tickets, and booking details.";
28718
+ }
27224
28719
  var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
27225
28720
  kind: "client-owned",
27226
28721
  contracts: {
@@ -27244,6 +28739,18 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
27244
28739
  }
27245
28740
  })
27246
28741
  });
28742
+ function normalizeEventRegistrationEventInput(value) {
28743
+ if (!isRecord4(value)) {
28744
+ return value;
28745
+ }
28746
+ return {
28747
+ ...value,
28748
+ pricing: resolveRuntimeEventPricing(value)
28749
+ };
28750
+ }
28751
+ function isRecord4(value) {
28752
+ return typeof value === "object" && value !== null && !Array.isArray(value);
28753
+ }
27247
28754
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
27248
28755
  runtime: eventRegistrationBlockRuntime,
27249
28756
  mode: "event-registration",
@@ -29742,7 +31249,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
29742
31249
  return keys.length >= 2 ? keys : [];
29743
31250
  }
29744
31251
  function normalizeOfferingsPreviewContentForWrite(value) {
29745
- if (!isRecord3(value)) return null;
31252
+ if (!isRecord5(value)) return null;
29746
31253
  const groupOrderValue = value.groupOrder;
29747
31254
  if (Array.isArray(groupOrderValue)) {
29748
31255
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -29755,7 +31262,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
29755
31262
  return { ...value, groupOrder: [] };
29756
31263
  }
29757
31264
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
29758
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord3) : []
31265
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord5) : []
29759
31266
  );
29760
31267
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
29761
31268
  }
@@ -29769,7 +31276,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
29769
31276
  }
29770
31277
  return keys;
29771
31278
  }
29772
- function isRecord3(value) {
31279
+ function isRecord5(value) {
29773
31280
  return typeof value === "object" && value !== null && !Array.isArray(value);
29774
31281
  }
29775
31282
 
@@ -30136,7 +31643,7 @@ function isOfferingsPreviewItemLimit(value) {
30136
31643
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
30137
31644
  }
30138
31645
  function normalizeOfferingsPreviewGroupOverride(value) {
30139
- if (!isRecord4(value)) return [];
31646
+ if (!isRecord6(value)) return [];
30140
31647
  const override = {};
30141
31648
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
30142
31649
  override.sourceKey = value.sourceKey;
@@ -30168,12 +31675,12 @@ function isButtonVariant(value) {
30168
31675
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
30169
31676
  }
30170
31677
  function normalizeCardStylesContent(value) {
30171
- return isRecord4(value) || value === null ? value : void 0;
31678
+ return isRecord6(value) || value === null ? value : void 0;
30172
31679
  }
30173
31680
  function normalizeSectionStylesContent(value) {
30174
- return isRecord4(value) || value === null ? value : void 0;
31681
+ return isRecord6(value) || value === null ? value : void 0;
30175
31682
  }
30176
- function isRecord4(value) {
31683
+ function isRecord6(value) {
30177
31684
  return typeof value === "object" && value !== null && !Array.isArray(value);
30178
31685
  }
30179
31686
 
@@ -34133,11 +35640,13 @@ var heroImageSurfaceMotions = [
34133
35640
  ];
34134
35641
  var standardEyebrowTreatments = [
34135
35642
  "plain",
35643
+ "accent",
34136
35644
  "pill",
34137
35645
  "accent-pill"
34138
35646
  ];
34139
35647
  var animatedEyebrowTreatments = [
34140
35648
  "plain",
35649
+ "accent",
34141
35650
  "pill",
34142
35651
  "accent-pill",
34143
35652
  "pill-bounce",
@@ -34438,6 +35947,17 @@ var systemBlockDefinitionsRaw = [
34438
35947
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
34439
35948
  ]
34440
35949
  })),
35950
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
35951
+ flow: conversionFlow,
35952
+ layoutProfiles: [
35953
+ layoutProfile({
35954
+ variantKey: "default",
35955
+ family: "split",
35956
+ weight: "featured",
35957
+ bias: "soft"
35958
+ })
35959
+ ]
35960
+ })),
34441
35961
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
34442
35962
  sectionSurfaces: "supported",
34443
35963
  contentFrames: ["plain", "panel"],
@@ -34529,6 +36049,12 @@ var systemBlockDefinitionsRaw = [
34529
36049
  family: "media-text",
34530
36050
  weight: "featured",
34531
36051
  bias: "soft"
36052
+ }),
36053
+ layoutProfile({
36054
+ variantKey: "bio",
36055
+ family: "media-text",
36056
+ weight: "featured",
36057
+ bias: "soft"
34532
36058
  })
34533
36059
  ]
34534
36060
  })),
@@ -35561,6 +37087,11 @@ ${root} {
35561
37087
  --er-event-card-bg: rgb(var(--tb-surface));
35562
37088
  --er-event-card-border-width: var(--rb-border-width, 1px);
35563
37089
  --er-event-card-hover-opacity: 1;
37090
+ --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
37091
+ --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
37092
+ --er-radius: var(--rb-block-radius);
37093
+ --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
37094
+ --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
35564
37095
 
35565
37096
  /* Step indicator */
35566
37097
  --er-step-active: rgb(var(--tb-primary));
@@ -36792,7 +38323,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
36792
38323
  }
36793
38324
 
36794
38325
  // ../api/src/utils/isRecord.ts
36795
- function isRecord5(value) {
38326
+ function isRecord7(value) {
36796
38327
  return typeof value === "object" && value !== null && !Array.isArray(value);
36797
38328
  }
36798
38329
 
@@ -37099,7 +38630,7 @@ function sanitizeMarks(marks) {
37099
38630
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
37100
38631
  return [{ type: mark.type }];
37101
38632
  }
37102
- if (mark.type === "link" && isRecord5(mark.attrs) && typeof mark.attrs.href === "string") {
38633
+ if (mark.type === "link" && isRecord7(mark.attrs) && typeof mark.attrs.href === "string") {
37103
38634
  const attrs = { href: mark.attrs.href };
37104
38635
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
37105
38636
  attrs.target = mark.attrs.target;
@@ -37114,10 +38645,10 @@ function sanitizeMarks(marks) {
37114
38645
  return sanitized.length > 0 ? sanitized : void 0;
37115
38646
  }
37116
38647
  function unwrapRichTextValue(value) {
37117
- if (isRecord5(value) && isRecord5(value.doc)) {
38648
+ if (isRecord7(value) && isRecord7(value.doc)) {
37118
38649
  return unwrapRichTextValue(value.doc);
37119
38650
  }
37120
- if (isRecord5(value) && value.type === "doc") {
38651
+ if (isRecord7(value) && value.type === "doc") {
37121
38652
  return {
37122
38653
  type: "doc",
37123
38654
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -37126,7 +38657,7 @@ function unwrapRichTextValue(value) {
37126
38657
  return EMPTY_SITE_BANNER_BODY;
37127
38658
  }
37128
38659
  function isTipTapNodeLike(value) {
37129
- return isRecord5(value) && typeof value.type === "string";
38660
+ return isRecord7(value) && typeof value.type === "string";
37130
38661
  }
37131
38662
  function coerceTipTapNode(value) {
37132
38663
  return {
@@ -37134,9 +38665,9 @@ function coerceTipTapNode(value) {
37134
38665
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
37135
38666
  ...typeof value.text === "string" ? { text: value.text } : {},
37136
38667
  ...Array.isArray(value.marks) ? {
37137
- marks: value.marks.filter((mark) => isRecord5(mark) && typeof mark.type === "string").map((mark) => ({
38668
+ marks: value.marks.filter((mark) => isRecord7(mark) && typeof mark.type === "string").map((mark) => ({
37138
38669
  type: mark.type,
37139
- ...isRecord5(mark.attrs) ? { attrs: mark.attrs } : {}
38670
+ ...isRecord7(mark.attrs) ? { attrs: mark.attrs } : {}
37140
38671
  }))
37141
38672
  } : {}
37142
38673
  };
@@ -37230,7 +38761,7 @@ function collectCartLinkStats(items, depth = 0) {
37230
38761
  return result;
37231
38762
  }
37232
38763
  function isNavigationMenuValidationItem(value) {
37233
- if (!isRecord5(value)) return false;
38764
+ if (!isRecord7(value)) return false;
37234
38765
  return typeof value.label === "string";
37235
38766
  }
37236
38767
 
@@ -37369,6 +38900,7 @@ var SYSTEM_BLOCK_KINDS = [
37369
38900
  "block.site-footer",
37370
38901
  // Form/booking blocks
37371
38902
  "block.form",
38903
+ "block.contact-newsletter",
37372
38904
  "block.appointment-booking",
37373
38905
  "block.event-registration",
37374
38906
  "block.event-details",