@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
@@ -3298,6 +3298,46 @@ var ENDPOINT_DEFINITIONS = {
3298
3298
  auth: "user",
3299
3299
  responseKind: "json"
3300
3300
  },
3301
+ listEntrySlotBlocks: {
3302
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3303
+ method: "GET",
3304
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3305
+ auth: "user",
3306
+ responseKind: "json",
3307
+ errors: ["resource:not_found"]
3308
+ },
3309
+ listEntryPageContentSlots: {
3310
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots",
3311
+ method: "GET",
3312
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slots", "blocks"],
3313
+ auth: "user",
3314
+ responseKind: "json",
3315
+ errors: ["resource:not_found"]
3316
+ },
3317
+ createEntrySlotBlock: {
3318
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3319
+ method: "POST",
3320
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3321
+ auth: "user",
3322
+ responseKind: "json",
3323
+ errors: ["validation:invalid_input", "resource:not_found"]
3324
+ },
3325
+ reorderEntrySlotBlocks: {
3326
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/reorder",
3327
+ method: "POST",
3328
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3329
+ auth: "user",
3330
+ responseKind: "json",
3331
+ errors: ["validation:invalid_input", "resource:not_found"]
3332
+ },
3333
+ deleteEntrySlotBlock: {
3334
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/{blockId}",
3335
+ method: "DELETE",
3336
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3337
+ auth: "user",
3338
+ responseKind: "json",
3339
+ errors: ["resource:not_found"]
3340
+ },
3301
3341
  createBlock: {
3302
3342
  path: "/sites/{siteId}/pages/{pageId}/blocks",
3303
3343
  method: "POST",
@@ -6959,7 +6999,7 @@ var SimpleCache = class {
6959
6999
  };
6960
7000
 
6961
7001
  // src/version.ts
6962
- var SDK_VERSION = "0.82.0";
7002
+ var SDK_VERSION = "0.84.1";
6963
7003
 
6964
7004
  // src/client/error.ts
6965
7005
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -8435,6 +8475,171 @@ function createRiverbankClient(config) {
8435
8475
  };
8436
8476
  }
8437
8477
 
8478
+ // ../core/src/result.ts
8479
+ function ok(value) {
8480
+ return { ok: true, value };
8481
+ }
8482
+ function err(error) {
8483
+ return { ok: false, error };
8484
+ }
8485
+
8486
+ // ../core/src/event-pricing.ts
8487
+ function publicEventPricingType(pricing) {
8488
+ switch (pricing.kind) {
8489
+ case "drop_in":
8490
+ case "free_registration":
8491
+ return "free";
8492
+ case "single_paid":
8493
+ case "ticket_types":
8494
+ case "course":
8495
+ return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
8496
+ }
8497
+ }
8498
+ function isFreePublicEventPriceDisplay(display) {
8499
+ switch (display.kind) {
8500
+ case "free":
8501
+ return true;
8502
+ case "course":
8503
+ return display.display.kind === "free";
8504
+ case "exact":
8505
+ case "from":
8506
+ case "mixed":
8507
+ case "unavailable":
8508
+ return false;
8509
+ }
8510
+ }
8511
+
8512
+ // ../core/src/booking-date-time.ts
8513
+ var DEFAULT_LOCALE = "en-US";
8514
+ var FALLBACK_TIMEZONE = "UTC";
8515
+ function isValidTimeZone(timeZone) {
8516
+ try {
8517
+ new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
8518
+ return true;
8519
+ } catch {
8520
+ return false;
8521
+ }
8522
+ }
8523
+ function getSafeTimeZone(timeZone) {
8524
+ const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
8525
+ return normalized && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
8526
+ }
8527
+ function parseStrictBookingTimeZone(timeZone) {
8528
+ const normalized = timeZone.trim();
8529
+ if (!normalized || !isValidTimeZone(normalized)) {
8530
+ return null;
8531
+ }
8532
+ return normalized;
8533
+ }
8534
+ function formatParseError(error) {
8535
+ switch (error.reason) {
8536
+ case "invalid_starts_at":
8537
+ return `Expected a valid UTC/offset-aware ISO datetime in startsAt, received "${error.value}"`;
8538
+ case "invalid_ends_at":
8539
+ return `Expected a valid UTC/offset-aware ISO datetime in endsAt, received "${error.value ?? ""}"`;
8540
+ case "invalid_time_zone":
8541
+ return `Expected a valid IANA timezone in timeZone, received "${error.value}"`;
8542
+ }
8543
+ }
8544
+ function formatToPartsLookup(date, locale, timeZone, format) {
8545
+ return new Map(
8546
+ new Intl.DateTimeFormat(locale, {
8547
+ ...format,
8548
+ timeZone
8549
+ }).formatToParts(date).map((part) => [part.type, part.value])
8550
+ );
8551
+ }
8552
+ function getZonedDateTimeParts(date, timeZone) {
8553
+ const parts = formatToPartsLookup(date, "en-GB", timeZone, {
8554
+ year: "numeric",
8555
+ month: "2-digit",
8556
+ day: "2-digit",
8557
+ hour: "2-digit",
8558
+ minute: "2-digit",
8559
+ second: "2-digit",
8560
+ hour12: false
8561
+ });
8562
+ const read = (type) => Number(parts.get(type) ?? "");
8563
+ return {
8564
+ year: read("year"),
8565
+ month: read("month"),
8566
+ day: read("day"),
8567
+ hour: read("hour"),
8568
+ minute: read("minute"),
8569
+ second: read("second")
8570
+ };
8571
+ }
8572
+ function formatDateKey(date) {
8573
+ const year = String(date.year).padStart(4, "0");
8574
+ const month = String(date.month).padStart(2, "0");
8575
+ const day = String(date.day).padStart(2, "0");
8576
+ return `${year}-${month}-${day}`;
8577
+ }
8578
+ function parseUtcIsoDateTimeString(value) {
8579
+ const normalized = value.trim();
8580
+ const hasUtcSuffix = normalized.endsWith("Z");
8581
+ const hasExplicitOffset = /[+-]\d{2}:\d{2}$/u.test(normalized);
8582
+ if (!hasUtcSuffix && !hasExplicitOffset) {
8583
+ return err("missing-timezone-offset");
8584
+ }
8585
+ const date = new Date(normalized);
8586
+ if (Number.isNaN(date.getTime())) {
8587
+ return err("invalid-date-time");
8588
+ }
8589
+ return ok(date.toISOString());
8590
+ }
8591
+ function toUtcIsoDateTimeString(value) {
8592
+ const parsed = parseUtcIsoDateTimeString(value);
8593
+ if (!parsed.ok) {
8594
+ const message = parsed.error === "missing-timezone-offset" ? `Expected an offset-aware ISO datetime, received "${value}"` : `Expected a valid ISO datetime, received "${value}"`;
8595
+ throw new Error(message);
8596
+ }
8597
+ return parsed.value;
8598
+ }
8599
+ function parseScheduledBookingDateTime(input) {
8600
+ try {
8601
+ const startsAt = toUtcIsoDateTimeString(input.startsAt);
8602
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
8603
+ if (!timeZone) {
8604
+ return {
8605
+ ok: false,
8606
+ field: "timeZone",
8607
+ reason: "invalid_time_zone",
8608
+ value: input.timeZone
8609
+ };
8610
+ }
8611
+ return {
8612
+ ok: true,
8613
+ value: {
8614
+ startsAt,
8615
+ timeZone,
8616
+ locale: input.locale
8617
+ }
8618
+ };
8619
+ } catch {
8620
+ return {
8621
+ ok: false,
8622
+ field: "startsAt",
8623
+ reason: "invalid_starts_at",
8624
+ value: input.startsAt
8625
+ };
8626
+ }
8627
+ }
8628
+ function toScheduledBookingDateTime(input) {
8629
+ const result = parseScheduledBookingDateTime(input);
8630
+ if (result.ok) {
8631
+ return result.value;
8632
+ }
8633
+ throw new Error(formatParseError(result));
8634
+ }
8635
+ function getBookingLocalDateKey(input) {
8636
+ return formatDateKey(getLocalScheduleDate(new Date(input.startsAt), input.timeZone));
8637
+ }
8638
+ function getLocalScheduleDate(date, timeZone) {
8639
+ const parts = getZonedDateTimeParts(date, getSafeTimeZone(timeZone));
8640
+ return { year: parts.year, month: parts.month, day: parts.day };
8641
+ }
8642
+
8438
8643
  // ../core/src/location.ts
8439
8644
  function normalizeLocationAddressText(value) {
8440
8645
  if (typeof value !== "string") {
@@ -8882,6 +9087,21 @@ var selectSourceSchema = z4.discriminatedUnion("kind", [
8882
9087
  function assertNeverSelectSource(value) {
8883
9088
  throw new Error(`Unhandled select source: ${JSON.stringify(value)}`);
8884
9089
  }
9090
+ var visibleWhenPredicateSchema = z4.object({
9091
+ field: z4.string().min(1),
9092
+ equals: z4.any().optional(),
9093
+ notEquals: z4.any().optional(),
9094
+ oneOf: z4.array(z4.any()).optional(),
9095
+ notIn: z4.array(z4.any()).optional(),
9096
+ minItems: z4.number().int().nonnegative().optional(),
9097
+ maxItems: z4.number().int().nonnegative().optional()
9098
+ });
9099
+ var visibleWhenSchema = z4.union([
9100
+ visibleWhenPredicateSchema,
9101
+ z4.object({
9102
+ allOf: z4.array(visibleWhenPredicateSchema).min(1)
9103
+ })
9104
+ ]);
8885
9105
  var uiSchema = z4.object({
8886
9106
  widget: z4.string().optional(),
8887
9107
  // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)
@@ -8914,13 +9134,7 @@ var uiSchema = z4.object({
8914
9134
  showValue: z4.boolean().optional(),
8915
9135
  pattern: z4.string().optional(),
8916
9136
  placeholder: z4.string().optional(),
8917
- visibleWhen: z4.object({
8918
- field: z4.string().min(1),
8919
- equals: z4.any().optional(),
8920
- notEquals: z4.any().optional(),
8921
- oneOf: z4.array(z4.any()).optional(),
8922
- notIn: z4.array(z4.any()).optional()
8923
- }).optional(),
9137
+ visibleWhen: visibleWhenSchema.optional(),
8924
9138
  // Modal configuration for modal and group fields
8925
9139
  modalConfig: z4.object({
8926
9140
  buttonLabel: z4.string().optional(),
@@ -9687,6 +9901,7 @@ var eventListTreatmentValues = [
9687
9901
  ];
9688
9902
  var eyebrowTreatmentValues = [
9689
9903
  "plain",
9904
+ "accent",
9690
9905
  "pill",
9691
9906
  "accent-pill",
9692
9907
  "pill-bounce",
@@ -11278,9 +11493,9 @@ var _Vibrant = class _Vibrant2 {
11278
11493
  }
11279
11494
  image.remove();
11280
11495
  return res;
11281
- } catch (err) {
11496
+ } catch (err3) {
11282
11497
  image.remove();
11283
- return Promise.reject(err);
11498
+ return Promise.reject(err3);
11284
11499
  }
11285
11500
  }
11286
11501
  async getPalettes() {
@@ -11294,9 +11509,9 @@ var _Vibrant = class _Vibrant2 {
11294
11509
  const res = result1.palettes;
11295
11510
  image.remove();
11296
11511
  return res;
11297
- } catch (err) {
11512
+ } catch (err3) {
11298
11513
  image.remove();
11299
- return Promise.reject(err);
11514
+ return Promise.reject(err3);
11300
11515
  }
11301
11516
  }
11302
11517
  };
@@ -12701,27 +12916,28 @@ var joyStamp = defineButtonPersonality({
12701
12916
  }
12702
12917
  });
12703
12918
 
12704
- // ../theme-core/src/buttons/personalities/pebble.ts
12705
- var pebble = defineButtonPersonality({
12706
- id: "pebble",
12707
- name: "Pebble",
12708
- description: "Generous pill buttons with a quiet colour-softening hover.",
12709
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
12919
+ // ../theme-core/src/buttons/personalities/ornate-ritual.ts
12920
+ var ornateRitual = defineButtonPersonality({
12921
+ id: "ornate-ritual",
12922
+ name: "Ornate Ritual",
12923
+ description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
12924
+ tags: { tone: "classic", energy: "vibrant", motion: "subtle", era: "organic" },
12710
12925
  buttonSystem: {
12711
12926
  global: {
12712
- cornerStyle: "pill",
12927
+ cornerStyle: "rounded",
12713
12928
  shadow: "none",
12714
- textTransform: "none",
12715
- fontWeight: 500,
12716
- borderWidth: 2,
12929
+ textTransform: "uppercase",
12930
+ fontWeight: 600,
12931
+ borderWidth: 1,
12717
12932
  hoverTransform: "none",
12718
- hoverColor: "none"
12933
+ hoverColor: "none",
12934
+ letterSpacing: "loose"
12719
12935
  },
12720
12936
  sizes: {
12721
- sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
12722
- md: { padding: "0.875rem 2.25rem" },
12723
- lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
12724
- xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
12937
+ sm: { padding: "0.5625rem 1.25rem", fontSize: "text-xs" },
12938
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-xs" },
12939
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-sm" },
12940
+ xl: { padding: "1rem 2.75rem", fontSize: "text-base" }
12725
12941
  },
12726
12942
  variants: [
12727
12943
  {
@@ -12731,97 +12947,12 @@ var pebble = defineButtonPersonality({
12731
12947
  priority: 1,
12732
12948
  background: { type: "solid", colorToken: "primary" },
12733
12949
  textColorToken: "primaryForeground",
12734
- borderRadius: "rounded-full",
12735
- effects: {
12736
- hover: [
12737
- { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 88 } }
12738
- ]
12739
- }
12740
- },
12741
- {
12742
- id: "secondary",
12743
- name: "Secondary",
12744
- enabled: true,
12745
- priority: 2,
12746
- background: { type: "transparent" },
12747
- textColorToken: "primary",
12748
- borderRadius: "rounded-full",
12749
- border: { widthClass: "border-2", colorToken: "accent" },
12750
- effects: {
12751
- hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
12752
- }
12753
- },
12754
- {
12755
- id: "outline",
12756
- name: "Outline",
12757
- enabled: true,
12758
- priority: 3,
12759
- background: { type: "transparent" },
12760
- textColorToken: "text",
12761
- borderRadius: "rounded-full",
12762
- border: { widthClass: "border", colorToken: "border" },
12763
- effects: {
12764
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
12765
- }
12766
- },
12767
- {
12768
- id: "ghost",
12769
- name: "Ghost",
12770
- enabled: true,
12771
- priority: 3,
12772
- background: { type: "transparent" },
12773
- textColorToken: "primary",
12774
- borderRadius: "rounded-full",
12775
- sizes: {
12776
- sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
12777
- md: { padding: "0.5rem 1rem" },
12778
- lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
12779
- xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
12780
- },
12781
- effects: {
12782
- hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
12783
- }
12784
- }
12785
- ]
12786
- }
12787
- });
12788
-
12789
- // ../theme-core/src/buttons/personalities/showtime-pill.ts
12790
- var showtimePill = defineButtonPersonality({
12791
- id: "showtime-pill",
12792
- name: "Showtime Pill",
12793
- description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
12794
- tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
12795
- buttonSystem: {
12796
- global: {
12797
- cornerStyle: "pill",
12798
- shadow: "low",
12799
- textTransform: "uppercase",
12800
- fontWeight: 700,
12801
- borderWidth: 2,
12802
- hoverTransform: "lift",
12803
- hoverColor: "darken",
12804
- typography: "body",
12805
- paddingPreset: "spacious",
12806
- italic: false
12807
- },
12808
- sizes: {
12809
- sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
12810
- md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
12811
- lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
12812
- xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
12813
- },
12814
- variants: [
12815
- {
12816
- id: "primary",
12817
- name: "Primary",
12818
- enabled: true,
12819
- priority: 1,
12820
- background: { type: "solid", colorToken: "primary" },
12821
- textColorToken: "background",
12822
- borderRadius: "rounded-full",
12950
+ borderRadius: "rounded-md",
12951
+ border: { widthClass: "border", colorToken: "primary" },
12952
+ shadow: { elevation: "none", softness: null, position: "bottom" },
12823
12953
  effects: {
12824
- hover: [{ effectId: "pop" }]
12954
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "primary-100" } }],
12955
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
12825
12956
  }
12826
12957
  },
12827
12958
  {
@@ -12829,35 +12960,11 @@ var showtimePill = defineButtonPersonality({
12829
12960
  name: "Secondary",
12830
12961
  enabled: true,
12831
12962
  priority: 2,
12832
- background: { type: "transparent" },
12833
- textColorToken: "primary",
12834
- borderRadius: "rounded-full",
12835
- border: { widthClass: "border-2", colorToken: "primary" },
12836
- effects: {
12837
- hover: [{ effectId: "pop" }]
12838
- }
12839
- },
12840
- {
12841
- id: "hero",
12842
- name: "Hero",
12843
- enabled: true,
12844
- priority: 1,
12845
12963
  background: { type: "solid", colorToken: "secondary" },
12846
- textColorToken: "primary",
12847
- borderRadius: "rounded-full",
12848
- effects: {
12849
- hover: [{ effectId: "pop" }]
12850
- }
12851
- },
12852
- {
12853
- id: "header",
12854
- name: "Header",
12855
- enabled: true,
12856
- priority: 2,
12857
- background: { type: "solid", colorToken: "background" },
12858
- textColorToken: "primary",
12859
- borderRadius: "rounded-full",
12860
- border: { widthClass: "border-2", colorToken: "primary" },
12964
+ textColorToken: "primaryForeground",
12965
+ borderRadius: "rounded-md",
12966
+ border: { widthClass: "border", colorToken: "primary" },
12967
+ shadow: { elevation: "none", softness: null, position: "bottom" },
12861
12968
  effects: {
12862
12969
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
12863
12970
  }
@@ -12869,10 +12976,11 @@ var showtimePill = defineButtonPersonality({
12869
12976
  priority: 3,
12870
12977
  background: { type: "transparent" },
12871
12978
  textColorToken: "primary",
12872
- borderRadius: "rounded-full",
12873
- border: { widthClass: "border-2", colorToken: "primary" },
12979
+ borderRadius: "rounded-md",
12980
+ border: { widthClass: "border", colorToken: "primary" },
12981
+ shadow: { elevation: "none", softness: null, position: "bottom" },
12874
12982
  effects: {
12875
- hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
12983
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
12876
12984
  }
12877
12985
  },
12878
12986
  {
@@ -12881,32 +12989,44 @@ var showtimePill = defineButtonPersonality({
12881
12989
  enabled: true,
12882
12990
  priority: 3,
12883
12991
  background: { type: "transparent" },
12884
- textColorToken: "primary",
12885
- borderRadius: "rounded-full",
12992
+ textColorToken: "accent",
12993
+ borderRadius: "rounded-none",
12994
+ sizes: {
12995
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
12996
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
12997
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
12998
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
12999
+ },
12886
13000
  effects: {
12887
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
13001
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
12888
13002
  }
12889
13003
  }
12890
13004
  ]
12891
13005
  }
12892
13006
  });
12893
13007
 
12894
- // ../theme-core/src/buttons/personalities/soft-pill.ts
12895
- var softPill = defineButtonPersonality({
12896
- id: "soft-pill",
12897
- name: "Soft Pill",
12898
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
12899
- tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
13008
+ // ../theme-core/src/buttons/personalities/pebble.ts
13009
+ var pebble = defineButtonPersonality({
13010
+ id: "pebble",
13011
+ name: "Pebble",
13012
+ description: "Generous pill buttons with a quiet colour-softening hover.",
13013
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
12900
13014
  buttonSystem: {
12901
13015
  global: {
12902
13016
  cornerStyle: "pill",
12903
- shadow: "low",
13017
+ shadow: "none",
12904
13018
  textTransform: "none",
12905
13019
  fontWeight: 500,
12906
13020
  borderWidth: 2,
12907
- hoverTransform: "lift",
13021
+ hoverTransform: "none",
12908
13022
  hoverColor: "none"
12909
13023
  },
13024
+ sizes: {
13025
+ sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
13026
+ md: { padding: "0.875rem 2.25rem" },
13027
+ lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
13028
+ xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
13029
+ },
12910
13030
  variants: [
12911
13031
  {
12912
13032
  id: "primary",
@@ -12916,10 +13036,10 @@ var softPill = defineButtonPersonality({
12916
13036
  background: { type: "solid", colorToken: "primary" },
12917
13037
  textColorToken: "primaryForeground",
12918
13038
  borderRadius: "rounded-full",
12919
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
12920
13039
  effects: {
12921
- hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
12922
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
13040
+ hover: [
13041
+ { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 88 } }
13042
+ ]
12923
13043
  }
12924
13044
  },
12925
13045
  {
@@ -12930,9 +13050,193 @@ var softPill = defineButtonPersonality({
12930
13050
  background: { type: "transparent" },
12931
13051
  textColorToken: "primary",
12932
13052
  borderRadius: "rounded-full",
12933
- border: { widthClass: "border-2", colorToken: "primary" },
13053
+ border: { widthClass: "border-2", colorToken: "accent" },
12934
13054
  effects: {
12935
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
13055
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
13056
+ }
13057
+ },
13058
+ {
13059
+ id: "outline",
13060
+ name: "Outline",
13061
+ enabled: true,
13062
+ priority: 3,
13063
+ background: { type: "transparent" },
13064
+ textColorToken: "text",
13065
+ borderRadius: "rounded-full",
13066
+ border: { widthClass: "border", colorToken: "border" },
13067
+ effects: {
13068
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
13069
+ }
13070
+ },
13071
+ {
13072
+ id: "ghost",
13073
+ name: "Ghost",
13074
+ enabled: true,
13075
+ priority: 3,
13076
+ background: { type: "transparent" },
13077
+ textColorToken: "primary",
13078
+ borderRadius: "rounded-full",
13079
+ sizes: {
13080
+ sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
13081
+ md: { padding: "0.5rem 1rem" },
13082
+ lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
13083
+ xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
13084
+ },
13085
+ effects: {
13086
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
13087
+ }
13088
+ }
13089
+ ]
13090
+ }
13091
+ });
13092
+
13093
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
13094
+ var showtimePill = defineButtonPersonality({
13095
+ id: "showtime-pill",
13096
+ name: "Showtime Pill",
13097
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
13098
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
13099
+ buttonSystem: {
13100
+ global: {
13101
+ cornerStyle: "pill",
13102
+ shadow: "low",
13103
+ textTransform: "uppercase",
13104
+ fontWeight: 700,
13105
+ borderWidth: 2,
13106
+ hoverTransform: "lift",
13107
+ hoverColor: "darken",
13108
+ typography: "body",
13109
+ paddingPreset: "spacious",
13110
+ italic: false
13111
+ },
13112
+ sizes: {
13113
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
13114
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
13115
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
13116
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
13117
+ },
13118
+ variants: [
13119
+ {
13120
+ id: "primary",
13121
+ name: "Primary",
13122
+ enabled: true,
13123
+ priority: 1,
13124
+ background: { type: "solid", colorToken: "primary" },
13125
+ textColorToken: "background",
13126
+ borderRadius: "rounded-full",
13127
+ effects: {
13128
+ hover: [{ effectId: "pop" }]
13129
+ }
13130
+ },
13131
+ {
13132
+ id: "secondary",
13133
+ name: "Secondary",
13134
+ enabled: true,
13135
+ priority: 2,
13136
+ background: { type: "transparent" },
13137
+ textColorToken: "primary",
13138
+ borderRadius: "rounded-full",
13139
+ border: { widthClass: "border-2", colorToken: "primary" },
13140
+ effects: {
13141
+ hover: [{ effectId: "pop" }]
13142
+ }
13143
+ },
13144
+ {
13145
+ id: "hero",
13146
+ name: "Hero",
13147
+ enabled: true,
13148
+ priority: 1,
13149
+ background: { type: "solid", colorToken: "secondary" },
13150
+ textColorToken: "primary",
13151
+ borderRadius: "rounded-full",
13152
+ effects: {
13153
+ hover: [{ effectId: "pop" }]
13154
+ }
13155
+ },
13156
+ {
13157
+ id: "header",
13158
+ name: "Header",
13159
+ enabled: true,
13160
+ priority: 2,
13161
+ background: { type: "solid", colorToken: "background" },
13162
+ textColorToken: "primary",
13163
+ borderRadius: "rounded-full",
13164
+ border: { widthClass: "border-2", colorToken: "primary" },
13165
+ effects: {
13166
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
13167
+ }
13168
+ },
13169
+ {
13170
+ id: "outline",
13171
+ name: "Outline",
13172
+ enabled: true,
13173
+ priority: 3,
13174
+ background: { type: "transparent" },
13175
+ textColorToken: "primary",
13176
+ borderRadius: "rounded-full",
13177
+ border: { widthClass: "border-2", colorToken: "primary" },
13178
+ effects: {
13179
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
13180
+ }
13181
+ },
13182
+ {
13183
+ id: "ghost",
13184
+ name: "Ghost",
13185
+ enabled: true,
13186
+ priority: 3,
13187
+ background: { type: "transparent" },
13188
+ textColorToken: "primary",
13189
+ borderRadius: "rounded-full",
13190
+ effects: {
13191
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
13192
+ }
13193
+ }
13194
+ ]
13195
+ }
13196
+ });
13197
+
13198
+ // ../theme-core/src/buttons/personalities/soft-pill.ts
13199
+ var softPill = defineButtonPersonality({
13200
+ id: "soft-pill",
13201
+ name: "Soft Pill",
13202
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
13203
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
13204
+ buttonSystem: {
13205
+ global: {
13206
+ cornerStyle: "pill",
13207
+ shadow: "low",
13208
+ textTransform: "none",
13209
+ fontWeight: 500,
13210
+ borderWidth: 2,
13211
+ hoverTransform: "lift",
13212
+ hoverColor: "none"
13213
+ },
13214
+ variants: [
13215
+ {
13216
+ id: "primary",
13217
+ name: "Primary",
13218
+ enabled: true,
13219
+ priority: 1,
13220
+ background: { type: "solid", colorToken: "primary" },
13221
+ textColorToken: "primaryForeground",
13222
+ borderRadius: "rounded-full",
13223
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
13224
+ effects: {
13225
+ hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
13226
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
13227
+ }
13228
+ },
13229
+ {
13230
+ id: "secondary",
13231
+ name: "Secondary",
13232
+ enabled: true,
13233
+ priority: 2,
13234
+ background: { type: "transparent" },
13235
+ textColorToken: "primary",
13236
+ borderRadius: "rounded-full",
13237
+ border: { widthClass: "border-2", colorToken: "primary" },
13238
+ effects: {
13239
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
12936
13240
  }
12937
13241
  },
12938
13242
  {
@@ -12974,7 +13278,8 @@ var buttonPersonalities = [
12974
13278
  inkStamp,
12975
13279
  brushedWash,
12976
13280
  showtimePill,
12977
- joyStamp
13281
+ joyStamp,
13282
+ ornateRitual
12978
13283
  ];
12979
13284
  var personalitiesById = new Map(
12980
13285
  buttonPersonalities.map((p) => [p.id, p])
@@ -13604,7 +13909,7 @@ function rgbColorValue(token) {
13604
13909
  if (alpha === void 0) {
13605
13910
  return `rgb(var(${cssVar}))`;
13606
13911
  }
13607
- return `rgba(var(${cssVar}), ${alpha})`;
13912
+ return `rgb(var(${cssVar}) / ${alpha})`;
13608
13913
  }
13609
13914
  function backgroundColorStyle(token) {
13610
13915
  return { backgroundColor: rgbColorValue(token) };
@@ -14709,6 +15014,28 @@ var warmDarkEmber = definePaletteVariant({
14709
15014
  { name: "border", hex: "#894e31" }
14710
15015
  ]
14711
15016
  });
15017
+ var warmDarkKirtanGold = definePaletteVariant({
15018
+ id: "warm-dark-kirtan-gold",
15019
+ name: "Warm Dark \u2014 Kirtan Gold",
15020
+ description: "Deep plum ground with pale gold primary, rose accent, and soft devotional text.",
15021
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
15022
+ mode: "dark",
15023
+ colors: [
15024
+ { name: "primary", hex: "#ffcdb2" },
15025
+ { name: "secondary", hex: "#b5838d" },
15026
+ { name: "accent", hex: "#e5989b" },
15027
+ { name: "success", hex: "#8fbf8f" },
15028
+ { name: "warning", hex: "#f2b86b" },
15029
+ { name: "destructive", hex: "#d96b6b" },
15030
+ { name: "background", hex: "#403944" },
15031
+ { name: "surface", hex: "#403944" },
15032
+ { name: "surfaceAlt", hex: "#372f3b" },
15033
+ { name: "muted", hex: "#4d4550" },
15034
+ { name: "text", hex: "#e6d2d5" },
15035
+ { name: "primaryForeground", hex: "#403944" },
15036
+ { name: "border", hex: "#8d747a" }
15037
+ ]
15038
+ });
14712
15039
 
14713
15040
  // ../theme-core/src/palette/variants/index.ts
14714
15041
  var paletteVariants = [
@@ -14732,7 +15059,8 @@ var paletteVariants = [
14732
15059
  softNaturalWatercolor,
14733
15060
  softNaturalLilac,
14734
15061
  // Warm-dark family (dark mode)
14735
- warmDarkEmber
15062
+ warmDarkEmber,
15063
+ warmDarkKirtanGold
14736
15064
  ];
14737
15065
  var paletteVariantsById = new Map(
14738
15066
  paletteVariants.map((v) => [v.id, v])
@@ -16301,9 +16629,125 @@ function headerConfigurationKey(configuration) {
16301
16629
  function asFooterLookId(value) {
16302
16630
  return value;
16303
16631
  }
16304
- var guaranteedFallbackFooterLookId = asFooterLookId("footer-muted-grounding");
16632
+ function asFooterLayoutId(value) {
16633
+ return value;
16634
+ }
16635
+ function asFooterStyleId(value) {
16636
+ return value;
16637
+ }
16638
+ var guaranteedFallbackFooterLookId = asFooterLookId("footer-identity-quiet");
16639
+ var footerLayoutCatalog = defineExactCatalog()([
16640
+ {
16641
+ id: asFooterLayoutId("identity"),
16642
+ label: "Identity",
16643
+ description: "Logo, site text, address, and legal copy without relying on footer navigation."
16644
+ },
16645
+ {
16646
+ id: asFooterLayoutId("centered"),
16647
+ label: "Centered",
16648
+ description: "A calm centered stack for identity, short copy, and optional compact navigation.",
16649
+ maxRecommendedNavDensity: "sparse"
16650
+ },
16651
+ {
16652
+ id: asFooterLayoutId("split"),
16653
+ label: "Split",
16654
+ description: "Navigation and brand signoff separated into a wider split footer.",
16655
+ requiresFooterNav: true,
16656
+ maxRecommendedNavDensity: "balanced"
16657
+ },
16658
+ {
16659
+ id: asFooterLayoutId("columns"),
16660
+ label: "Columns",
16661
+ description: "Grouped footer navigation columns with a supporting bottom line.",
16662
+ requiresFooterNav: true,
16663
+ requiresFooterNavGroups: true
16664
+ }
16665
+ ]);
16666
+ var footerStyleCatalog = defineExactCatalog()([
16667
+ {
16668
+ id: asFooterStyleId("quiet"),
16669
+ label: "Quiet",
16670
+ description: "Lightweight, practical footer treatment."
16671
+ },
16672
+ {
16673
+ id: asFooterStyleId("calm"),
16674
+ label: "Calm",
16675
+ description: "Soft centered treatment with restrained dividers."
16676
+ },
16677
+ {
16678
+ id: asFooterStyleId("editorial"),
16679
+ label: "Editorial",
16680
+ description: "Text-forward treatment with fine-line structure."
16681
+ },
16682
+ {
16683
+ id: asFooterStyleId("brand-band"),
16684
+ label: "Brand band",
16685
+ description: "High-contrast brand treatment with a stronger bottom bar."
16686
+ }
16687
+ ]);
16688
+ var footerLayoutsById = new Map(
16689
+ footerLayoutCatalog.map((layout) => [layout.id, layout])
16690
+ );
16691
+ var footerStylesById = new Map(
16692
+ footerStyleCatalog.map((style) => [style.id, style])
16693
+ );
16694
+ function identityQuietFooter(theme) {
16695
+ return {
16696
+ ...theme.footer,
16697
+ variant: "simple",
16698
+ maxWidth: "container",
16699
+ background: {
16700
+ type: "color",
16701
+ color: "surface"
16702
+ },
16703
+ navStyle: "minimal",
16704
+ navWeight: "regular",
16705
+ navColor: "text",
16706
+ navLinkStyle: {
16707
+ typography: "body",
16708
+ fontWeight: "regular",
16709
+ textTransform: "none",
16710
+ italic: false,
16711
+ colorToken: "text",
16712
+ hoverColorToken: "primary",
16713
+ padding: "none",
16714
+ borderRadius: "none"
16715
+ },
16716
+ navLayout: {
16717
+ layout: "inline-wrap",
16718
+ align: "start",
16719
+ gapX: "default",
16720
+ gapY: "tight"
16721
+ },
16722
+ logo: {
16723
+ showLogo: true,
16724
+ showLogoText: true,
16725
+ placement: "left",
16726
+ size: "sm",
16727
+ align: "start"
16728
+ },
16729
+ bottomBar: {
16730
+ enabled: false,
16731
+ fullBleed: false,
16732
+ textAlign: "left",
16733
+ paddingX: "default",
16734
+ paddingY: "compact",
16735
+ borderTop: {
16736
+ width: "none"
16737
+ }
16738
+ }
16739
+ };
16740
+ }
16305
16741
  function mutedGroundingFooter(theme) {
16306
- return theme.footer;
16742
+ return {
16743
+ ...identityQuietFooter(theme),
16744
+ background: theme.footer.background,
16745
+ navStyle: theme.footer.navStyle,
16746
+ navColor: theme.footer.navColor,
16747
+ navWeight: theme.footer.navWeight,
16748
+ navLinkStyle: theme.footer.navLinkStyle,
16749
+ bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
16750
+ };
16307
16751
  }
16308
16752
  function brandTwoBandFooter(theme) {
16309
16753
  return {
@@ -16408,6 +16852,53 @@ function centeredCalmFooter(theme) {
16408
16852
  }
16409
16853
  };
16410
16854
  }
16855
+ function splitEditorialFooter(theme) {
16856
+ return {
16857
+ ...theme.footer,
16858
+ variant: "split",
16859
+ maxWidth: "container",
16860
+ background: {
16861
+ type: "color",
16862
+ color: "surface"
16863
+ },
16864
+ navStyle: "minimal",
16865
+ navWeight: "regular",
16866
+ navColor: "text",
16867
+ navLinkStyle: {
16868
+ typography: "body",
16869
+ fontWeight: "regular",
16870
+ textTransform: "none",
16871
+ italic: false,
16872
+ colorToken: "text",
16873
+ hoverColorToken: "primary",
16874
+ padding: "none",
16875
+ borderRadius: "none"
16876
+ },
16877
+ navLayout: {
16878
+ layout: "inline-wrap",
16879
+ align: "start",
16880
+ gapX: "relaxed",
16881
+ gapY: "tight"
16882
+ },
16883
+ logo: {
16884
+ showLogo: true,
16885
+ showLogoText: true,
16886
+ placement: "right",
16887
+ size: "sm",
16888
+ align: "end"
16889
+ },
16890
+ bottomBar: {
16891
+ enabled: true,
16892
+ fullBleed: false,
16893
+ textAlign: "left",
16894
+ paddingX: "default",
16895
+ paddingY: "compact",
16896
+ borderTop: {
16897
+ width: "thin"
16898
+ }
16899
+ }
16900
+ };
16901
+ }
16411
16902
  function editorialColumnsFooter(theme) {
16412
16903
  return {
16413
16904
  ...theme.footer,
@@ -16450,25 +16941,47 @@ function editorialColumnsFooter(theme) {
16450
16941
  };
16451
16942
  }
16452
16943
  var footerLookCatalog = defineExactCatalog()([
16944
+ {
16945
+ id: asFooterLookId("footer-identity-quiet"),
16946
+ label: "Identity footer",
16947
+ layoutId: asFooterLayoutId("identity"),
16948
+ styleId: asFooterStyleId("quiet"),
16949
+ compile: identityQuietFooter
16950
+ },
16453
16951
  {
16454
16952
  id: asFooterLookId("footer-muted-grounding"),
16455
16953
  label: "Muted grounding footer",
16954
+ layoutId: asFooterLayoutId("identity"),
16955
+ styleId: asFooterStyleId("quiet"),
16956
+ hiddenFromLayoutStyleControls: true,
16456
16957
  compile: mutedGroundingFooter
16457
16958
  },
16458
16959
  {
16459
16960
  id: asFooterLookId("footer-centered-calm"),
16460
16961
  label: "Centered calm footer",
16962
+ layoutId: asFooterLayoutId("centered"),
16963
+ styleId: asFooterStyleId("calm"),
16461
16964
  compile: centeredCalmFooter
16462
16965
  },
16966
+ {
16967
+ id: asFooterLookId("footer-split-editorial"),
16968
+ label: "Split editorial footer",
16969
+ layoutId: asFooterLayoutId("split"),
16970
+ styleId: asFooterStyleId("editorial"),
16971
+ compile: splitEditorialFooter
16972
+ },
16463
16973
  {
16464
16974
  id: asFooterLookId("footer-editorial-columns"),
16465
16975
  label: "Editorial columns footer",
16976
+ layoutId: asFooterLayoutId("columns"),
16977
+ styleId: asFooterStyleId("editorial"),
16466
16978
  compile: editorialColumnsFooter
16467
16979
  },
16468
16980
  {
16469
16981
  id: asFooterLookId("site-footer-brand-two-band"),
16470
16982
  label: "Two-band brand footer",
16471
- maxRecommendedNavDensity: "balanced",
16983
+ layoutId: asFooterLayoutId("split"),
16984
+ styleId: asFooterStyleId("brand-band"),
16472
16985
  allowedContentPresence: ["default-footer", "default-and-blocks"],
16473
16986
  compile: brandTwoBandFooter
16474
16987
  }
@@ -16671,6 +17184,30 @@ var luxeContrastTypography = {
16671
17184
  },
16672
17185
  scale: "spacious"
16673
17186
  };
17187
+ var kirtanOrnateTypography = {
17188
+ body: {
17189
+ family: "Jost, system-ui, sans-serif",
17190
+ size: "md",
17191
+ weight: "regular",
17192
+ lineHeight: "relaxed",
17193
+ letterSpacing: "normal"
17194
+ },
17195
+ headings: {
17196
+ default: {
17197
+ family: "Marcellus, Georgia, serif",
17198
+ weight: "regular",
17199
+ lineHeight: "normal",
17200
+ letterSpacing: "normal",
17201
+ colorToken: "primary",
17202
+ italic: null,
17203
+ case: null
17204
+ },
17205
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
17206
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
17207
+ h3: { size: "md", weight: "regular", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
17208
+ },
17209
+ scale: "spacious"
17210
+ };
16674
17211
  var boldDisplayTypography = {
16675
17212
  body: {
16676
17213
  family: "Manrope, system-ui, sans-serif",
@@ -16705,16 +17242,16 @@ var originalJoyTypography = {
16705
17242
  },
16706
17243
  headings: {
16707
17244
  default: {
16708
- family: "Bricolage Grotesque, system-ui, sans-serif",
16709
- weight: "bold",
17245
+ family: "Lobster, cursive",
17246
+ weight: "regular",
16710
17247
  lineHeight: "normal",
16711
- letterSpacing: "tight",
17248
+ letterSpacing: "normal",
16712
17249
  italic: null,
16713
17250
  case: null
16714
17251
  },
16715
- h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
16716
- h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
16717
- h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
17252
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
17253
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
17254
+ h3: { size: "lg", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null }
16718
17255
  },
16719
17256
  scale: "balanced"
16720
17257
  };
@@ -16779,6 +17316,32 @@ var typographyPresets = [
16779
17316
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
16780
17317
  typography: luxeContrastTypography
16781
17318
  }),
17319
+ defineTypographyPreset({
17320
+ id: "typography-preset:kirtan-ornate",
17321
+ name: "Kirtan Ornate",
17322
+ description: "Marcellus devotional headings over a refined Jost body, matching dark ceremonial layouts.",
17323
+ defaultFonts: { body: "Jost, system-ui, sans-serif", heading: "Marcellus, Georgia, serif" },
17324
+ recommendedFonts: {
17325
+ body: ["Jost", "Manrope", "Inter"],
17326
+ heading: ["Marcellus", "Cormorant Garamond", "Playfair Display"]
17327
+ },
17328
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
17329
+ typography: kirtanOrnateTypography,
17330
+ heroTypography: {
17331
+ headlineSize: "6xl",
17332
+ headlineLineHeight: "normal",
17333
+ subheadlineSize: "xl",
17334
+ subheadlineLineHeight: "relaxed",
17335
+ microHeadlineSize: "5xl",
17336
+ microHeadlineLineHeight: "normal",
17337
+ microSubheadlineSize: "lg",
17338
+ microSubheadlineLineHeight: "relaxed",
17339
+ responsive: {
17340
+ tablet: { headlineSize: "5xl" },
17341
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
17342
+ }
17343
+ }
17344
+ }),
16782
17345
  defineTypographyPreset({
16783
17346
  id: "typography-preset:bold-display",
16784
17347
  name: "Bold Display",
@@ -16808,11 +17371,11 @@ var typographyPresets = [
16808
17371
  defineTypographyPreset({
16809
17372
  id: "typography-preset:original-joy",
16810
17373
  name: "Original Joy",
16811
- description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
16812
- defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
17374
+ description: "Lobster display headings over a clean DM Sans body, expressive and warm.",
17375
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Lobster, cursive" },
16813
17376
  recommendedFonts: {
16814
17377
  body: ["DM Sans", "Inter", "Manrope"],
16815
- heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
17378
+ heading: ["Lobster", "Bricolage Grotesque", "Space Grotesk"]
16816
17379
  },
16817
17380
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
16818
17381
  typography: originalJoyTypography,
@@ -16836,6 +17399,319 @@ var typographyPresetsById = new Map(
16836
17399
  typographyPresets.map((preset2) => [preset2.id, preset2])
16837
17400
  );
16838
17401
 
17402
+ // ../theme-core/src/site-styles/designState.ts
17403
+ import { z as z24 } from "zod";
17404
+ var themeV2DesignStateSchemaVersion = 1;
17405
+ var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
17406
+ var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
17407
+ var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
17408
+ fields3[0],
17409
+ ...fields3.slice(1)
17410
+ ]);
17411
+ var heroLegibilityStrategySchema = z24.enum([
17412
+ "none",
17413
+ "scrim-gradient",
17414
+ "solid-panel"
17415
+ ]);
17416
+ var heroCompositionIntentSchema = z24.enum([
17417
+ "center",
17418
+ "bottom-left"
17419
+ ]);
17420
+ var heroTypographyScaleIntentSchema = z24.enum([
17421
+ "quiet",
17422
+ "editorial",
17423
+ "display",
17424
+ "poster"
17425
+ ]);
17426
+ var sectionHeightIntentSchema = z24.enum([
17427
+ "default",
17428
+ "banner",
17429
+ "hero",
17430
+ "immersive"
17431
+ ]);
17432
+ var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
17433
+ var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
17434
+ var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
17435
+ z24.object({ kind: z24.literal("none") }).strict(),
17436
+ z24.object({
17437
+ kind: z24.literal("brand-scrim"),
17438
+ token: z24.enum(["primary", "secondary", "accent"]),
17439
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
17440
+ }).strict(),
17441
+ z24.object({
17442
+ kind: z24.literal("brand-wash"),
17443
+ token: z24.enum(["primary", "secondary", "accent"]),
17444
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
17445
+ }).strict(),
17446
+ z24.object({
17447
+ kind: z24.literal("neutral-scrim"),
17448
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
17449
+ }).strict(),
17450
+ z24.object({
17451
+ kind: z24.literal("neutral-wash"),
17452
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
17453
+ }).strict(),
17454
+ z24.object({
17455
+ kind: z24.literal("solid-panel"),
17456
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
17457
+ }).strict()
17458
+ ]);
17459
+ var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
17460
+ var tileTreatmentSchema = z24.enum(tileTreatmentValues);
17461
+ var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
17462
+ var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
17463
+ function uniqueNonEmpty(values) {
17464
+ const uniqueValues = [...new Set(values)];
17465
+ const firstValue = uniqueValues[0];
17466
+ if (!firstValue) {
17467
+ throw new Error("Expected at least one Theme V2 design state option.");
17468
+ }
17469
+ return [firstValue, ...uniqueValues.slice(1)];
17470
+ }
17471
+ var userPanelTreatments = uniqueNonEmpty(
17472
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
17473
+ );
17474
+ var userFlushTreatments = uniqueNonEmpty(
17475
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
17476
+ );
17477
+ var userFlushBleeds = uniqueNonEmpty(
17478
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
17479
+ );
17480
+ var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
17481
+ z24.object({ kind: z24.literal("plain") }).strict(),
17482
+ z24.object({
17483
+ kind: z24.literal("panel"),
17484
+ treatment: z24.enum(userPanelTreatments)
17485
+ }).strict(),
17486
+ z24.object({
17487
+ kind: z24.literal("flush-panel"),
17488
+ treatment: z24.enum(userFlushTreatments),
17489
+ bleed: z24.enum(userFlushBleeds)
17490
+ }).strict()
17491
+ ]);
17492
+ var blockDesignPlanSchema = z24.object({
17493
+ blockId: z24.string().min(1).transform(asDesignBlockId),
17494
+ blockKind: z24.string().min(1),
17495
+ purpose: z24.string().min(1),
17496
+ sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
17497
+ contentFrame: contentFrameIntentSchema,
17498
+ itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
17499
+ transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
17500
+ emphasis: z24.enum(userDesignOptionCatalog.emphases),
17501
+ sectionHeight: sectionHeightIntentSchema.optional(),
17502
+ heroLegibility: heroLegibilityStrategySchema.optional(),
17503
+ heroComposition: heroCompositionIntentSchema.optional(),
17504
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
17505
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
17506
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
17507
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
17508
+ tileTreatment: tileTreatmentSchema.optional(),
17509
+ eventListTreatment: eventListTreatmentSchema.optional(),
17510
+ eyebrowTreatment: eyebrowTreatmentSchema.optional()
17511
+ }).strict();
17512
+ var styleAuthoritySchema = z24.discriminatedUnion("kind", [
17513
+ z24.object({
17514
+ kind: z24.literal("theme-v2"),
17515
+ source: designResolutionPolicySchema,
17516
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
17517
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
17518
+ templateVersion: z24.number().int().nonnegative(),
17519
+ resolverVersion: z24.number().int().nonnegative()
17520
+ }).strict(),
17521
+ z24.object({
17522
+ kind: z24.literal("legacy-raw"),
17523
+ reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
17524
+ }).strict(),
17525
+ z24.object({
17526
+ kind: z24.literal("advanced-detached"),
17527
+ reason: z24.literal("detached-custom-runtime-fields")
17528
+ }).strict()
17529
+ ]);
17530
+ var blockRuntimeStyleAuthoritySchema = z24.object({
17531
+ unit: z24.literal("block-runtime-fields"),
17532
+ blockId: z24.string().min(1).transform(asDesignBlockId),
17533
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
17534
+ authority: styleAuthoritySchema
17535
+ }).strict();
17536
+ var persistedPageDesignStateV1Schema = z24.object({
17537
+ schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
17538
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
17539
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
17540
+ templateVersion: z24.number().int().nonnegative(),
17541
+ resolverVersion: z24.number().int().nonnegative(),
17542
+ rhythmPresetId: z24.string().min(1),
17543
+ blocks: z24.array(blockDesignPlanSchema),
17544
+ styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
17545
+ }).strict();
17546
+
17547
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
17548
+ function defineDesignRuntimeRules(rules) {
17549
+ return rules;
17550
+ }
17551
+ function defineComponentRuntimeRules(rules) {
17552
+ return rules;
17553
+ }
17554
+ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
17555
+ sectionSurfaces: {
17556
+ base: {},
17557
+ "muted-band": {
17558
+ background: {
17559
+ type: "color",
17560
+ color: "muted"
17561
+ }
17562
+ },
17563
+ "accent-band": {
17564
+ background: {
17565
+ type: "color",
17566
+ color: "primary"
17567
+ }
17568
+ },
17569
+ "brand-depth-band": {
17570
+ background: {
17571
+ type: "color",
17572
+ color: "primary-800"
17573
+ }
17574
+ },
17575
+ "hero-image": {
17576
+ background: {
17577
+ type: "image",
17578
+ opacity: 1,
17579
+ position: "center center",
17580
+ ...uniformSectionForeground("text")
17581
+ }
17582
+ }
17583
+ },
17584
+ heroLegibility: {
17585
+ "scrim-gradient": {
17586
+ type: "gradient",
17587
+ gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
17588
+ opacity: 1
17589
+ },
17590
+ "solid-panel": {
17591
+ type: "color",
17592
+ color: "surface",
17593
+ opacity: 0.88
17594
+ }
17595
+ },
17596
+ transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
17597
+ });
17598
+ var defaultComponentRuntimeRules = defineComponentRuntimeRules({
17599
+ panelFrames: {
17600
+ inset: {
17601
+ spacing: "comfortable",
17602
+ rounded: "xl",
17603
+ raised: false,
17604
+ background: {
17605
+ type: "color",
17606
+ color: "surfaceAlt",
17607
+ textColor: "text"
17608
+ }
17609
+ },
17610
+ raised: {
17611
+ spacing: "comfortable",
17612
+ rounded: "xl",
17613
+ raised: true,
17614
+ background: {
17615
+ type: "color",
17616
+ color: "surfaceAlt",
17617
+ textColor: "text"
17618
+ }
17619
+ },
17620
+ editorial: {
17621
+ spacing: "medium",
17622
+ rounded: "xl",
17623
+ raised: false,
17624
+ background: {
17625
+ type: "color",
17626
+ color: "surface",
17627
+ textColor: "text"
17628
+ }
17629
+ }
17630
+ },
17631
+ flushFrames: {
17632
+ "media-panel": {
17633
+ fullWidth: true,
17634
+ spacing: "none",
17635
+ rounded: "none",
17636
+ raised: false
17637
+ }
17638
+ },
17639
+ itemSurfaces: {
17640
+ none: null,
17641
+ default: {
17642
+ spacing: "medium",
17643
+ rounded: "lg",
17644
+ raised: false
17645
+ },
17646
+ flat: {
17647
+ spacing: "medium",
17648
+ rounded: "lg",
17649
+ raised: false
17650
+ },
17651
+ outlined: {
17652
+ spacing: "medium",
17653
+ rounded: "lg",
17654
+ raised: false,
17655
+ border: {
17656
+ enabled: true,
17657
+ width: "1",
17658
+ colorToken: "border"
17659
+ }
17660
+ },
17661
+ raised: {
17662
+ spacing: "medium",
17663
+ rounded: "xl",
17664
+ raised: true
17665
+ },
17666
+ inset: {
17667
+ treatment: "soft-panel",
17668
+ spacing: "comfortable",
17669
+ rounded: "xl",
17670
+ raised: false,
17671
+ border: {
17672
+ enabled: false
17673
+ },
17674
+ background: {
17675
+ type: "color",
17676
+ color: "surfaceAlt",
17677
+ textColor: "text"
17678
+ }
17679
+ },
17680
+ editorial: {
17681
+ // Boxless open column with a short rule on top; the visual treatment
17682
+ // lives in blocks-static/card-treatments.css.
17683
+ treatment: "editorial-rule",
17684
+ spacing: "none",
17685
+ rounded: "none",
17686
+ raised: false,
17687
+ border: {
17688
+ enabled: false
17689
+ }
17690
+ },
17691
+ "color-blocked": {
17692
+ // Bold, flat colour-blocked cards. The per-card background colour cycle
17693
+ // (by position) and staggered offset live in
17694
+ // blocks-static/card-treatments.css; here we set the shared shape:
17695
+ // generous padding, large radius, no border, flat (no shadow).
17696
+ treatment: "color-blocked",
17697
+ spacing: "spacious",
17698
+ rounded: "2xl",
17699
+ raised: false,
17700
+ border: {
17701
+ enabled: false
17702
+ }
17703
+ }
17704
+ }
17705
+ });
17706
+ function uniformSectionForeground(token) {
17707
+ return {
17708
+ textColor: token,
17709
+ headingColor: token,
17710
+ linkColor: token,
17711
+ supportingColor: token
17712
+ };
17713
+ }
17714
+
16839
17715
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
16840
17716
  var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
16841
17717
  var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
@@ -16854,6 +17730,7 @@ var curatedSiteStyleIdValues = [
16854
17730
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
16855
17731
  "site-style:bold-launch",
16856
17732
  "site-style:south-west-twerk-school",
17733
+ "site-style:kirtan-ornate",
16857
17734
  "site-style:original-joy"
16858
17735
  ];
16859
17736
  var quietBudget = {
@@ -16880,6 +17757,50 @@ var expressiveBudget = {
16880
17757
  mediaDensity: "high",
16881
17758
  decorativeRepetition: "medium"
16882
17759
  };
17760
+ var kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
17761
+ ...defaultDesignRuntimeRules,
17762
+ defaultEyebrowTreatment: "accent",
17763
+ sectionSurfaces: {
17764
+ ...defaultDesignRuntimeRules.sectionSurfaces,
17765
+ "muted-band": {
17766
+ background: {
17767
+ type: "color",
17768
+ color: "muted"
17769
+ },
17770
+ foreground: {
17771
+ textColor: "text",
17772
+ headingColor: "primary",
17773
+ linkColor: "primary",
17774
+ supportingColor: "text"
17775
+ }
17776
+ },
17777
+ "brand-depth-band": {
17778
+ background: {
17779
+ type: "color",
17780
+ color: "primary-800"
17781
+ },
17782
+ foreground: {
17783
+ textColor: "text",
17784
+ headingColor: "primary",
17785
+ linkColor: "primary",
17786
+ supportingColor: "text"
17787
+ }
17788
+ },
17789
+ "hero-image": {
17790
+ background: {
17791
+ type: "image",
17792
+ opacity: 1,
17793
+ position: "center center"
17794
+ },
17795
+ foreground: {
17796
+ textColor: "text",
17797
+ headingColor: "primary",
17798
+ linkColor: "primary",
17799
+ supportingColor: "text"
17800
+ }
17801
+ }
17802
+ }
17803
+ });
16883
17804
  var expressiveUnderlineInputs = {
16884
17805
  base: {
16885
17806
  background: { type: "transparent" },
@@ -16917,6 +17838,43 @@ var expressiveUnderlineInputs = {
16917
17838
  opacity: 0.6
16918
17839
  }
16919
17840
  };
17841
+ var ornateDarkInputs = {
17842
+ base: {
17843
+ background: { type: "solid", colorToken: "surfaceAlt" },
17844
+ textColorToken: "text",
17845
+ border: {
17846
+ widthClass: "border",
17847
+ colorToken: "primary/45",
17848
+ style: "all"
17849
+ },
17850
+ corners: "square",
17851
+ shadow: null,
17852
+ spacing: "medium",
17853
+ fontSize: "base"
17854
+ },
17855
+ label: {
17856
+ textColorToken: "primary",
17857
+ fontWeight: "semibold",
17858
+ fontSize: "xs",
17859
+ textTransform: "uppercase",
17860
+ letterSpacing: "wider",
17861
+ opacity: 1
17862
+ },
17863
+ focus: {
17864
+ ringColorToken: "primary/18",
17865
+ ringWidth: "2",
17866
+ borderColorToken: "primary/70"
17867
+ },
17868
+ error: {
17869
+ borderColorToken: "destructive",
17870
+ textColorToken: "destructive"
17871
+ },
17872
+ disabled: {
17873
+ backgroundColorToken: "muted",
17874
+ textColorToken: "mutedText",
17875
+ opacity: 0.6
17876
+ }
17877
+ };
16920
17878
  function uniqueContentFrameKinds() {
16921
17879
  const kinds = [
16922
17880
  ...new Set(
@@ -16974,6 +17932,7 @@ function defineCuratedSiteStyle(input) {
16974
17932
  // clean/minimal styles default to none.
16975
17933
  headingDecoration: input.headingDecoration ?? noHeadingDecoration,
16976
17934
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
17935
+ ...input.designRuntimeRules ? { designRuntimeRules: input.designRuntimeRules } : {},
16977
17936
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
16978
17937
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
16979
17938
  defaultHeaderSelection: input.defaultHeaderSelection ? {
@@ -17924,6 +18883,80 @@ var curatedSiteStyles = [
17924
18883
  paletteChoice("high-contrast-ink")
17925
18884
  ]
17926
18885
  }),
18886
+ defineCuratedSiteStyle({
18887
+ id: "site-style:kirtan-ornate",
18888
+ name: "Kirtan Ornate",
18889
+ headingDecoration: { family: "short-center-rule", colorToken: "accent" },
18890
+ description: "Ceremonial, jewel-toned, and devotional: ornate frames, warm contrast, and composed rhythm for intimate music gatherings.",
18891
+ 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.",
18892
+ selectionKeywordRules: [
18893
+ { kind: "word", value: "kirtan" },
18894
+ { kind: "word", value: "chanting" },
18895
+ { kind: "word", value: "ceremony" },
18896
+ { kind: "word", value: "devotional" }
18897
+ ],
18898
+ tokenRecipes: {
18899
+ palette: "brand-led",
18900
+ contrast: "strong",
18901
+ radius: "soft",
18902
+ shadow: "subtle",
18903
+ typography: "serif-editorial",
18904
+ spacing: "airy",
18905
+ motion: "subtle"
18906
+ },
18907
+ compositionBudget: expressiveBudget,
18908
+ typographyPresetChoices: [
18909
+ typographyChoice("typography-preset:kirtan-ornate"),
18910
+ typographyChoice("typography-preset:luxe-contrast"),
18911
+ typographyChoice("typography-preset:editorial-serif")
18912
+ ],
18913
+ defaultTypographyPresetId: "typography-preset:kirtan-ornate",
18914
+ themeOverrides: {
18915
+ accordions: warmInsetAccordionSystem,
18916
+ cards: originalJoyCardSystem,
18917
+ testimonialQuote: serifDisplayQuote,
18918
+ bodyText: {
18919
+ intro: {
18920
+ paragraphSize: "editorial",
18921
+ headingSize: "editorial"
18922
+ }
18923
+ },
18924
+ inputs: ornateDarkInputs
18925
+ },
18926
+ designRuntimeRules: kirtanOrnateDesignRuntimeRules,
18927
+ recommendedAppearancePresetIds: [
18928
+ "hero-brand-scrim-fixed-frame",
18929
+ "media-text-quiet-story",
18930
+ "events-lined-panel",
18931
+ "schedule-details-brand-depth",
18932
+ "testimonials-statement-cards",
18933
+ "contact-form-panel"
18934
+ ],
18935
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
18936
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
18937
+ recommendedHeaderStyleChoicesByLayout: {
18938
+ floating: [
18939
+ headerStyleChoice("minimal-surface"),
18940
+ headerStyleChoice("split-glass"),
18941
+ headerStyleChoice("glass")
18942
+ ]
18943
+ },
18944
+ recommendedHeaderLookIds: ["minimal-transparent"],
18945
+ recommendedFooterLookIds: [
18946
+ "site-footer-brand-two-band",
18947
+ "footer-muted-grounding"
18948
+ ],
18949
+ buttonPersonalityChoices: [
18950
+ buttonChoice("ornate-ritual"),
18951
+ buttonChoice("joy-stamp"),
18952
+ buttonChoice("ink-stamp")
18953
+ ],
18954
+ paletteVariantChoices: [
18955
+ paletteChoice("warm-dark-kirtan-gold"),
18956
+ paletteChoice("warm-dark-ember"),
18957
+ paletteChoice("brand-led-burgundy-gold")
18958
+ ]
18959
+ }),
17927
18960
  defineCuratedSiteStyle({
17928
18961
  id: "site-style:original-joy",
17929
18962
  name: "Original Joy",
@@ -18027,319 +19060,6 @@ var pageFlowPresets = [
18027
19060
  }
18028
19061
  ];
18029
19062
 
18030
- // ../theme-core/src/site-styles/designState.ts
18031
- import { z as z24 } from "zod";
18032
- var themeV2DesignStateSchemaVersion = 1;
18033
- var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
18034
- var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
18035
- var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
18036
- fields3[0],
18037
- ...fields3.slice(1)
18038
- ]);
18039
- var heroLegibilityStrategySchema = z24.enum([
18040
- "none",
18041
- "scrim-gradient",
18042
- "solid-panel"
18043
- ]);
18044
- var heroCompositionIntentSchema = z24.enum([
18045
- "center",
18046
- "bottom-left"
18047
- ]);
18048
- var heroTypographyScaleIntentSchema = z24.enum([
18049
- "quiet",
18050
- "editorial",
18051
- "display",
18052
- "poster"
18053
- ]);
18054
- var sectionHeightIntentSchema = z24.enum([
18055
- "default",
18056
- "banner",
18057
- "hero",
18058
- "immersive"
18059
- ]);
18060
- var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
18061
- var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
18062
- var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
18063
- z24.object({ kind: z24.literal("none") }).strict(),
18064
- z24.object({
18065
- kind: z24.literal("brand-scrim"),
18066
- token: z24.enum(["primary", "secondary", "accent"]),
18067
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
18068
- }).strict(),
18069
- z24.object({
18070
- kind: z24.literal("brand-wash"),
18071
- token: z24.enum(["primary", "secondary", "accent"]),
18072
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
18073
- }).strict(),
18074
- z24.object({
18075
- kind: z24.literal("neutral-scrim"),
18076
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
18077
- }).strict(),
18078
- z24.object({
18079
- kind: z24.literal("neutral-wash"),
18080
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
18081
- }).strict(),
18082
- z24.object({
18083
- kind: z24.literal("solid-panel"),
18084
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
18085
- }).strict()
18086
- ]);
18087
- var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
18088
- var tileTreatmentSchema = z24.enum(tileTreatmentValues);
18089
- var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
18090
- var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
18091
- function uniqueNonEmpty(values) {
18092
- const uniqueValues = [...new Set(values)];
18093
- const firstValue = uniqueValues[0];
18094
- if (!firstValue) {
18095
- throw new Error("Expected at least one Theme V2 design state option.");
18096
- }
18097
- return [firstValue, ...uniqueValues.slice(1)];
18098
- }
18099
- var userPanelTreatments = uniqueNonEmpty(
18100
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
18101
- );
18102
- var userFlushTreatments = uniqueNonEmpty(
18103
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
18104
- );
18105
- var userFlushBleeds = uniqueNonEmpty(
18106
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
18107
- );
18108
- var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
18109
- z24.object({ kind: z24.literal("plain") }).strict(),
18110
- z24.object({
18111
- kind: z24.literal("panel"),
18112
- treatment: z24.enum(userPanelTreatments)
18113
- }).strict(),
18114
- z24.object({
18115
- kind: z24.literal("flush-panel"),
18116
- treatment: z24.enum(userFlushTreatments),
18117
- bleed: z24.enum(userFlushBleeds)
18118
- }).strict()
18119
- ]);
18120
- var blockDesignPlanSchema = z24.object({
18121
- blockId: z24.string().min(1).transform(asDesignBlockId),
18122
- blockKind: z24.string().min(1),
18123
- purpose: z24.string().min(1),
18124
- sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
18125
- contentFrame: contentFrameIntentSchema,
18126
- itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
18127
- transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
18128
- emphasis: z24.enum(userDesignOptionCatalog.emphases),
18129
- sectionHeight: sectionHeightIntentSchema.optional(),
18130
- heroLegibility: heroLegibilityStrategySchema.optional(),
18131
- heroComposition: heroCompositionIntentSchema.optional(),
18132
- heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
18133
- imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
18134
- imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
18135
- testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
18136
- tileTreatment: tileTreatmentSchema.optional(),
18137
- eventListTreatment: eventListTreatmentSchema.optional(),
18138
- eyebrowTreatment: eyebrowTreatmentSchema.optional()
18139
- }).strict();
18140
- var styleAuthoritySchema = z24.discriminatedUnion("kind", [
18141
- z24.object({
18142
- kind: z24.literal("theme-v2"),
18143
- source: designResolutionPolicySchema,
18144
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
18145
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
18146
- templateVersion: z24.number().int().nonnegative(),
18147
- resolverVersion: z24.number().int().nonnegative()
18148
- }).strict(),
18149
- z24.object({
18150
- kind: z24.literal("legacy-raw"),
18151
- reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
18152
- }).strict(),
18153
- z24.object({
18154
- kind: z24.literal("advanced-detached"),
18155
- reason: z24.literal("detached-custom-runtime-fields")
18156
- }).strict()
18157
- ]);
18158
- var blockRuntimeStyleAuthoritySchema = z24.object({
18159
- unit: z24.literal("block-runtime-fields"),
18160
- blockId: z24.string().min(1).transform(asDesignBlockId),
18161
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
18162
- authority: styleAuthoritySchema
18163
- }).strict();
18164
- var persistedPageDesignStateV1Schema = z24.object({
18165
- schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
18166
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
18167
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
18168
- templateVersion: z24.number().int().nonnegative(),
18169
- resolverVersion: z24.number().int().nonnegative(),
18170
- rhythmPresetId: z24.string().min(1),
18171
- blocks: z24.array(blockDesignPlanSchema),
18172
- styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
18173
- }).strict();
18174
-
18175
- // ../theme-core/src/site-styles/runtimeCompiler.ts
18176
- function defineDesignRuntimeRules(rules) {
18177
- return rules;
18178
- }
18179
- function defineComponentRuntimeRules(rules) {
18180
- return rules;
18181
- }
18182
- var defaultDesignRuntimeRules = defineDesignRuntimeRules({
18183
- sectionSurfaces: {
18184
- base: {},
18185
- "muted-band": {
18186
- background: {
18187
- type: "color",
18188
- color: "muted"
18189
- }
18190
- },
18191
- "accent-band": {
18192
- background: {
18193
- type: "color",
18194
- color: "primary"
18195
- }
18196
- },
18197
- "brand-depth-band": {
18198
- background: {
18199
- type: "color",
18200
- color: "primary-800"
18201
- }
18202
- },
18203
- "hero-image": {
18204
- background: {
18205
- type: "image",
18206
- opacity: 1,
18207
- position: "center center",
18208
- ...uniformSectionForeground("text")
18209
- }
18210
- }
18211
- },
18212
- heroLegibility: {
18213
- "scrim-gradient": {
18214
- type: "gradient",
18215
- gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
18216
- opacity: 1
18217
- },
18218
- "solid-panel": {
18219
- type: "color",
18220
- color: "surface",
18221
- opacity: 0.88
18222
- }
18223
- },
18224
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
18225
- });
18226
- var defaultComponentRuntimeRules = defineComponentRuntimeRules({
18227
- panelFrames: {
18228
- inset: {
18229
- spacing: "comfortable",
18230
- rounded: "xl",
18231
- raised: false,
18232
- background: {
18233
- type: "color",
18234
- color: "surfaceAlt",
18235
- textColor: "text"
18236
- }
18237
- },
18238
- raised: {
18239
- spacing: "comfortable",
18240
- rounded: "xl",
18241
- raised: true,
18242
- background: {
18243
- type: "color",
18244
- color: "surfaceAlt",
18245
- textColor: "text"
18246
- }
18247
- },
18248
- editorial: {
18249
- spacing: "medium",
18250
- rounded: "xl",
18251
- raised: false,
18252
- background: {
18253
- type: "color",
18254
- color: "surface",
18255
- textColor: "text"
18256
- }
18257
- }
18258
- },
18259
- flushFrames: {
18260
- "media-panel": {
18261
- fullWidth: true,
18262
- spacing: "none",
18263
- rounded: "none",
18264
- raised: false
18265
- }
18266
- },
18267
- itemSurfaces: {
18268
- none: null,
18269
- default: {
18270
- spacing: "medium",
18271
- rounded: "lg",
18272
- raised: false
18273
- },
18274
- flat: {
18275
- spacing: "medium",
18276
- rounded: "lg",
18277
- raised: false
18278
- },
18279
- outlined: {
18280
- spacing: "medium",
18281
- rounded: "lg",
18282
- raised: false,
18283
- border: {
18284
- enabled: true,
18285
- width: "1",
18286
- colorToken: "border"
18287
- }
18288
- },
18289
- raised: {
18290
- spacing: "medium",
18291
- rounded: "xl",
18292
- raised: true
18293
- },
18294
- inset: {
18295
- treatment: "soft-panel",
18296
- spacing: "comfortable",
18297
- rounded: "xl",
18298
- raised: false,
18299
- border: {
18300
- enabled: false
18301
- },
18302
- background: {
18303
- type: "color",
18304
- color: "surfaceAlt",
18305
- textColor: "text"
18306
- }
18307
- },
18308
- editorial: {
18309
- // Boxless open column with a short rule on top; the visual treatment
18310
- // lives in blocks-static/card-treatments.css.
18311
- treatment: "editorial-rule",
18312
- spacing: "none",
18313
- rounded: "none",
18314
- raised: false,
18315
- border: {
18316
- enabled: false
18317
- }
18318
- },
18319
- "color-blocked": {
18320
- // Bold, flat colour-blocked cards. The per-card background colour cycle
18321
- // (by position) and staggered offset live in
18322
- // blocks-static/card-treatments.css; here we set the shared shape:
18323
- // generous padding, large radius, no border, flat (no shadow).
18324
- treatment: "color-blocked",
18325
- spacing: "spacious",
18326
- rounded: "2xl",
18327
- raised: false,
18328
- border: {
18329
- enabled: false
18330
- }
18331
- }
18332
- }
18333
- });
18334
- function uniformSectionForeground(token) {
18335
- return {
18336
- textColor: token,
18337
- headingColor: token,
18338
- linkColor: token,
18339
- supportingColor: token
18340
- };
18341
- }
18342
-
18343
19063
  // ../theme-core/src/site-styles/generatedSchemas.ts
18344
19064
  import { z as z25 } from "zod";
18345
19065
  function uniqueNonEmpty2(values) {
@@ -19151,6 +19871,31 @@ function cardStylesField(options = {}) {
19151
19871
  return createBoxStylesFieldWithDepth("card", options);
19152
19872
  }
19153
19873
 
19874
+ // ../blocks/src/system/fields/imageShape.ts
19875
+ var standardImageShapeOptions = [
19876
+ { value: "default", label: "Default" },
19877
+ { value: "square", label: "Square corners" },
19878
+ { value: "rounded", label: "Rounded corners" },
19879
+ { value: "circle", label: "Circle" },
19880
+ { value: "arch", label: "Arch" }
19881
+ ];
19882
+ function createImageShapeField(options = {}) {
19883
+ return {
19884
+ id: options.id ?? "imageShape",
19885
+ type: "select",
19886
+ label: options.label ?? "Image shape",
19887
+ ...options.description ? { description: options.description } : {},
19888
+ required: false,
19889
+ defaultValue: options.defaultValue ?? "default",
19890
+ multiple: false,
19891
+ options: [...standardImageShapeOptions],
19892
+ ui: {
19893
+ intent: options.uiIntent ?? "display",
19894
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
19895
+ }
19896
+ };
19897
+ }
19898
+
19154
19899
  // ../blocks/src/utils/env.ts
19155
19900
  function isDevEnvironment() {
19156
19901
  try {
@@ -19965,7 +20710,7 @@ function buildFooterNavAll(common) {
19965
20710
  return stack(
19966
20711
  { className: common.className, gap: common.gap, align: "stretch" },
19967
20712
  [item],
19968
- when(collectionPath)
20713
+ whenCollectionHasItems(collectionPath)
19969
20714
  );
19970
20715
  }
19971
20716
  function buildFooterNavLinksOnly(common) {
@@ -19998,7 +20743,7 @@ function buildFooterNavLinksOnly(common) {
19998
20743
  return stack(
19999
20744
  { className: common.className, gap: common.gap, align: "stretch" },
20000
20745
  [item],
20001
- when(collectionPath)
20746
+ whenCollectionHasItems(collectionPath)
20002
20747
  );
20003
20748
  }
20004
20749
  function buildFooterNavFlatten(common) {
@@ -20047,9 +20792,20 @@ function buildFooterNavFlatten(common) {
20047
20792
  return stack(
20048
20793
  { className: common.className, gap: common.gap, align: "stretch" },
20049
20794
  [item],
20050
- when(collectionPath)
20795
+ whenCollectionHasItems(collectionPath)
20051
20796
  );
20052
20797
  }
20798
+ var whenCollectionHasItems = (collectionPath) => (node) => ({
20799
+ ...node,
20800
+ $when: {
20801
+ when: {
20802
+ from: collectionPath,
20803
+ transforms: [{ id: "array.length" }]
20804
+ },
20805
+ equals: 0,
20806
+ not: true
20807
+ }
20808
+ });
20053
20809
  function footerNav(opts) {
20054
20810
  const mode = opts?.mode ?? "all";
20055
20811
  const collectionPath = opts?.collectionPath ?? "footerMenu.items";
@@ -22632,8 +23388,23 @@ function fragmentsToRepeaterField(id, label, fragments, options = {}) {
22632
23388
  var heroLayoutControlsFragment = defineFragment({
22633
23389
  id: "heroLayoutControls",
22634
23390
  title: "Hero Layout",
22635
- description: "Alignment and content width controls for hero layouts.",
23391
+ description: "Title scale, alignment, and content width controls for hero layouts.",
22636
23392
  fields: [
23393
+ {
23394
+ id: "titleSize",
23395
+ type: "select",
23396
+ label: "Title size",
23397
+ description: "Adjust the visual scale of the hero title.",
23398
+ required: false,
23399
+ ui: { intent: "display" },
23400
+ options: [
23401
+ { value: "auto", label: "Auto" },
23402
+ { value: "quiet", label: "Normal" },
23403
+ { value: "editorial", label: "Large" },
23404
+ { value: "display", label: "Huge" },
23405
+ { value: "poster", label: "Poster" }
23406
+ ]
23407
+ },
22637
23408
  {
22638
23409
  id: "contentAlignment",
22639
23410
  type: "select",
@@ -23428,7 +24199,18 @@ function heroSplitImagePane() {
23428
24199
  return stack(
23429
24200
  {
23430
24201
  gap: "none",
23431
- className: "rb-relative rb-overflow-hidden rb-rounded-3xl",
24202
+ className: {
24203
+ $bind: {
24204
+ from: "content.imageShape",
24205
+ transforms: [
24206
+ {
24207
+ id: "ui.imageShapeClassName",
24208
+ options: { baseClass: "rb-relative rb-overflow-hidden rb-rounded-3xl" }
24209
+ }
24210
+ ],
24211
+ fallback: "rb-relative rb-overflow-hidden rb-rounded-3xl"
24212
+ }
24213
+ },
23432
24214
  style: {
23433
24215
  minHeight: "clamp(18rem, 36vw, 34rem)"
23434
24216
  }
@@ -23546,6 +24328,12 @@ var heroConfig = {
23546
24328
  label: "Content card",
23547
24329
  renderInHeader: true,
23548
24330
  intent: "style"
24331
+ }),
24332
+ createImageShapeField({
24333
+ id: "imageShape",
24334
+ label: "Image shape",
24335
+ defaultValue: "default",
24336
+ uiIntent: "display"
23549
24337
  })
23550
24338
  ],
23551
24339
  layout: classicLayout,
@@ -23560,6 +24348,15 @@ var heroConfig = {
23560
24348
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
23561
24349
  tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
23562
24350
  icon: "Sparkles",
24351
+ previewCustomize: {
24352
+ quickFieldPriority: [
24353
+ "titleSize",
24354
+ "contentAlignment",
24355
+ "contentMaxWidth",
24356
+ "verticalAlignment",
24357
+ "imageShape"
24358
+ ]
24359
+ },
23563
24360
  styleTokens: {
23564
24361
  typography: "display",
23565
24362
  spacing: "xl"
@@ -23576,7 +24373,8 @@ var standardAspectRatioOptions = [
23576
24373
  { value: "16/9", label: "16:9 (Landscape)" },
23577
24374
  { value: "4/3", label: "4:3 (Standard)" },
23578
24375
  { value: "1/1", label: "1:1 (Square)" },
23579
- { value: "3/4", label: "3:4 (Portrait)" }
24376
+ { value: "3/4", label: "3:4 (Portrait)" },
24377
+ { value: "9/16", label: "9:16 (Tall portrait)" }
23580
24378
  ];
23581
24379
  function createAspectRatioField(options = {}) {
23582
24380
  return {
@@ -24796,6 +25594,258 @@ var formBlockDefinition = {
24796
25594
  runtime: formBlockRuntime
24797
25595
  };
24798
25596
 
25597
+ // ../blocks/src/system/blocks/contact-newsletter.ts
25598
+ var contactNewsletterLayout = styledSection({
25599
+ children: sectionContainer([
25600
+ el(
25601
+ "div",
25602
+ { className: "contact-newsletter-grid" },
25603
+ [
25604
+ el(
25605
+ "div",
25606
+ { className: "contact-newsletter-column contact-newsletter-contact" },
25607
+ [
25608
+ el(
25609
+ "div",
25610
+ { className: "contact-newsletter-copy" },
25611
+ [
25612
+ text(
25613
+ {
25614
+ as: "h2",
25615
+ className: "form-copy-title"
25616
+ },
25617
+ when("contactTitle"),
25618
+ bind("contactTitle")
25619
+ ),
25620
+ richText(
25621
+ {
25622
+ className: "form-copy-intro rb-prose rb-max-w-none"
25623
+ },
25624
+ when("contactIntro"),
25625
+ bind("contactIntro")
25626
+ )
25627
+ ]
25628
+ ),
25629
+ el(
25630
+ "form",
25631
+ withApiBindings({
25632
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
25633
+ submitLabel: { $bind: { from: "contactSubmitLabel" } },
25634
+ successMessage: { $bind: { from: "contactSuccessMessage" } }
25635
+ }),
25636
+ [],
25637
+ bind("data.form")
25638
+ )
25639
+ ]
25640
+ ),
25641
+ el(
25642
+ "div",
25643
+ { className: "contact-newsletter-column contact-newsletter-info contact-newsletter-newsletter" },
25644
+ [
25645
+ el(
25646
+ "div",
25647
+ { className: "contact-newsletter-copy" },
25648
+ [
25649
+ text(
25650
+ {
25651
+ as: "h2",
25652
+ className: "newsletter-copy-title"
25653
+ },
25654
+ when("newsletterTitle"),
25655
+ bind("newsletterTitle")
25656
+ ),
25657
+ richText(
25658
+ {
25659
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none"
25660
+ },
25661
+ when("newsletterSubtitle"),
25662
+ bind("newsletterSubtitle")
25663
+ )
25664
+ ]
25665
+ ),
25666
+ el(
25667
+ "newsletter-form",
25668
+ withApiBindings({
25669
+ listId: { $bind: { from: "listId" } },
25670
+ preset: { $bind: { from: "preset" } },
25671
+ includePhone: { $bind: { from: "includePhone" } },
25672
+ buttonLabel: { $bind: { from: "newsletterButtonLabel" } },
25673
+ successMessage: { $bind: { from: "newsletterSuccessMessage" } },
25674
+ privacyNote: { $bind: { from: "newsletterPrivacyNote" } },
25675
+ tags: { $bind: { from: "newsletterTags" } },
25676
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } }
25677
+ }),
25678
+ []
25679
+ )
25680
+ ]
25681
+ )
25682
+ ]
25683
+ )
25684
+ ], {
25685
+ className: "contact-newsletter-container"
25686
+ }),
25687
+ baseClass: "",
25688
+ spacing: "medium",
25689
+ background: "surface"
25690
+ });
25691
+ var contactNewsletterManifest = createBlockManifest({
25692
+ id: "block.contact-newsletter",
25693
+ title: "Contact + Newsletter",
25694
+ titleSource: "contactTitle",
25695
+ description: "Two-column newsletter signup and contact form section.",
25696
+ category: "interactive",
25697
+ layout: contactNewsletterLayout,
25698
+ defaultVariant: "default",
25699
+ variants: {
25700
+ default: contactNewsletterLayout
25701
+ },
25702
+ variantOptions: {
25703
+ default: {
25704
+ label: "Two column",
25705
+ description: "Newsletter and contact form side by side.",
25706
+ icon: "Columns2"
25707
+ }
25708
+ },
25709
+ additionalFields: [
25710
+ {
25711
+ id: "newsletterTitle",
25712
+ type: "text",
25713
+ label: "Newsletter title",
25714
+ defaultValue: "Stay connected"
25715
+ },
25716
+ {
25717
+ id: "newsletterSubtitle",
25718
+ type: "richText",
25719
+ label: "Newsletter intro"
25720
+ },
25721
+ {
25722
+ id: "listId",
25723
+ type: "reference",
25724
+ label: "Newsletter list",
25725
+ description: "Select the list new subscribers should be added to.",
25726
+ required: true,
25727
+ referenceKind: "newsletterList",
25728
+ allowManualEntry: false,
25729
+ ui: { intent: "behavior" }
25730
+ },
25731
+ {
25732
+ id: "preset",
25733
+ type: "select",
25734
+ label: "Newsletter fields",
25735
+ defaultValue: "emailOnly",
25736
+ ui: { intent: "display" },
25737
+ options: [
25738
+ { value: "emailOnly", label: "Email only" },
25739
+ { value: "emailName", label: "Email + Name" },
25740
+ { value: "emailFirstLast", label: "Email + First/Last Name" },
25741
+ { value: "emailNameCompany", label: "Email + Name + Company (B2B)" }
25742
+ ]
25743
+ },
25744
+ {
25745
+ id: "includePhone",
25746
+ type: "boolean",
25747
+ label: "Include phone field",
25748
+ defaultValue: false,
25749
+ ui: { intent: "display" }
25750
+ },
25751
+ {
25752
+ id: "newsletterButtonLabel",
25753
+ type: "text",
25754
+ label: "Newsletter button label",
25755
+ defaultValue: "Subscribe",
25756
+ ui: { intent: "display" }
25757
+ },
25758
+ {
25759
+ id: "newsletterSuccessMessage",
25760
+ type: "text",
25761
+ label: "Newsletter success message",
25762
+ defaultValue: "Thanks for subscribing!",
25763
+ ui: { intent: "behavior" }
25764
+ },
25765
+ {
25766
+ id: "newsletterPrivacyNote",
25767
+ type: "text",
25768
+ label: "Privacy note",
25769
+ ui: { intent: "display" }
25770
+ },
25771
+ {
25772
+ id: "newsletterTags",
25773
+ type: "text",
25774
+ label: "Newsletter tags",
25775
+ description: "Optional tags to apply on subscribe, separated by comma or semicolon.",
25776
+ ui: { intent: "behavior" }
25777
+ },
25778
+ {
25779
+ id: "contactTitle",
25780
+ type: "text",
25781
+ label: "Contact title",
25782
+ defaultValue: "Get in touch"
25783
+ },
25784
+ {
25785
+ id: "contactIntro",
25786
+ type: "richText",
25787
+ label: "Contact intro"
25788
+ },
25789
+ {
25790
+ id: "formSlug",
25791
+ type: "reference",
25792
+ label: "Contact form",
25793
+ description: "Pick a saved form to render.",
25794
+ required: true,
25795
+ referenceKind: "form",
25796
+ allowManualEntry: false,
25797
+ ui: { intent: "behavior" }
25798
+ },
25799
+ {
25800
+ id: "contactSubmitLabel",
25801
+ type: "text",
25802
+ label: "Contact button label",
25803
+ defaultValue: "Send message",
25804
+ ui: { intent: "display" }
25805
+ },
25806
+ {
25807
+ id: "contactSuccessMessage",
25808
+ type: "text",
25809
+ label: "Contact success message",
25810
+ defaultValue: "Thanks - we received your message.",
25811
+ ui: { intent: "behavior" }
25812
+ }
25813
+ ],
25814
+ styleTokens: {
25815
+ background: "surface",
25816
+ typography: "body",
25817
+ spacing: "md"
25818
+ },
25819
+ behaviours: {
25820
+ supportsThemeSwitching: true,
25821
+ inlineEditing: true,
25822
+ animation: false,
25823
+ paletteHidden: false
25824
+ },
25825
+ tags: [
25826
+ "contact",
25827
+ "newsletter",
25828
+ "signup",
25829
+ "email",
25830
+ "form",
25831
+ "lead-capture"
25832
+ ],
25833
+ icon: "MailPlus"
25834
+ });
25835
+ var contactNewsletterBlockDefinition = {
25836
+ manifest: contactNewsletterManifest,
25837
+ dataSchemas: { form: formDataSchema.optional() },
25838
+ dataLoaders: {
25839
+ form: {
25840
+ endpoint: "getPublicFormById",
25841
+ params: {
25842
+ formSlug: { $bind: { from: "formSlug" } }
25843
+ },
25844
+ mode: "server"
25845
+ }
25846
+ }
25847
+ };
25848
+
24799
25849
  // ../blocks/src/system/blocks/faq.ts
24800
25850
  function fragmentLayoutNode2(layout) {
24801
25851
  return isNodeDefinitionArray2(layout) ? el("div", {}, [...layout]) : layout;
@@ -25024,6 +26074,7 @@ var joinClasses3 = (parts) => parts.filter(
25024
26074
  ).join(" ").replace(/\s+/g, " ").trim();
25025
26075
  var eyebrowTreatmentClassMap = {
25026
26076
  plain: "",
26077
+ accent: "rb-eyebrow-treatment-accent",
25027
26078
  pill: "rb-eyebrow-treatment-pill",
25028
26079
  "accent-pill": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent",
25029
26080
  "pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-pill-bounce",
@@ -25050,6 +26101,13 @@ var imageGalleryCornerClassMap = {
25050
26101
  "2xl": "rb-rounded-2xl",
25051
26102
  "3xl": "rb-rounded-3xl"
25052
26103
  };
26104
+ var imageShapeClassMap = {
26105
+ default: "",
26106
+ square: "rb-media-shape-square",
26107
+ rounded: "rb-media-shape-rounded",
26108
+ circle: "rb-media-shape-circle",
26109
+ arch: "rb-media-shape-arch"
26110
+ };
25053
26111
  var parseRatio = (raw) => {
25054
26112
  if (typeof raw !== "string") return null;
25055
26113
  const value = raw.trim();
@@ -25194,6 +26252,10 @@ function resolveHeroContentMaxWidth(content) {
25194
26252
  return "default";
25195
26253
  }
25196
26254
  function resolveHeroTypographyScale(content) {
26255
+ const titleSize = readString(content, "titleSize");
26256
+ if (titleSize === "quiet" || titleSize === "editorial" || titleSize === "display" || titleSize === "poster") {
26257
+ return titleSize;
26258
+ }
25197
26259
  const raw = readHeroLayoutString(
25198
26260
  content,
25199
26261
  "typographyScale",
@@ -25435,6 +26497,16 @@ var uiTransforms = [
25435
26497
  heroGridClassFromVerticalAlignmentTransform,
25436
26498
  imageFragmentClassTransform,
25437
26499
  imageFragmentSizeTransform,
26500
+ {
26501
+ id: "ui.imageShapeClassName",
26502
+ kind: "string",
26503
+ summary: "Apply a constrained media shape class",
26504
+ run: (value, options) => {
26505
+ const baseClass = typeof options?.baseClass === "string" ? options.baseClass : "";
26506
+ const shape = typeof value === "string" ? value.trim() : "default";
26507
+ return joinClasses3([baseClass, imageShapeClassMap[shape] ?? ""]);
26508
+ }
26509
+ },
25438
26510
  conditionalClassTransform,
25439
26511
  twoColumnContainerClassTransform,
25440
26512
  twoColumnFlexBasisTransform,
@@ -26781,6 +27853,21 @@ var siteHeaderManifest = createBlockManifest({
26781
27853
  id: "block.site-header",
26782
27854
  title: "Site Header",
26783
27855
  category: "layout",
27856
+ additionalFields: [
27857
+ {
27858
+ id: "mode",
27859
+ type: "select",
27860
+ label: "Header display",
27861
+ required: false,
27862
+ multiple: false,
27863
+ defaultValue: "default",
27864
+ options: [
27865
+ { value: "default", label: "Show header" },
27866
+ { value: "hidden", label: "Hide header" }
27867
+ ],
27868
+ ui: { intent: "display" }
27869
+ }
27870
+ ],
26784
27871
  // Skip section styles - this block uses theme-based styling
26785
27872
  skipSectionStyles: true,
26786
27873
  // Block manages its own wrapper - enables sticky positioning
@@ -28183,6 +29270,9 @@ var mediaTextManifest = createBlockManifest({
28183
29270
  category: "layout",
28184
29271
  includeContainerStyles: true,
28185
29272
  titleSource: "title",
29273
+ previewCustomize: {
29274
+ quickFieldPriority: ["imagePosition", "ratio", "imageShape", "titleAlignment", "aspectRatio"]
29275
+ },
28186
29276
  additionalFields: [
28187
29277
  {
28188
29278
  id: "images",
@@ -28221,7 +29311,7 @@ var mediaTextManifest = createBlockManifest({
28221
29311
  {
28222
29312
  id: "titleAlignment",
28223
29313
  type: "select",
28224
- label: "Title alignment",
29314
+ label: "Content alignment",
28225
29315
  required: false,
28226
29316
  defaultValue: "left",
28227
29317
  multiple: false,
@@ -28279,7 +29369,18 @@ var mediaTextManifest = createBlockManifest({
28279
29369
  transition: "slide"
28280
29370
  },
28281
29371
  ui: { intent: "behavior" }
28282
- }),
29372
+ }).map((field) => ({
29373
+ ...field,
29374
+ ui: {
29375
+ ...field.ui ?? {},
29376
+ visibleWhen: field.id === "carouselAutoplayDelay" ? {
29377
+ allOf: [
29378
+ { field: "images", minItems: 2 },
29379
+ { field: "carouselAutoplay", equals: true }
29380
+ ]
29381
+ } : { field: "images", minItems: 2 }
29382
+ }
29383
+ })),
28283
29384
  createAspectRatioField({
28284
29385
  id: "aspectRatio",
28285
29386
  label: "Media aspect ratio",
@@ -28287,6 +29388,12 @@ var mediaTextManifest = createBlockManifest({
28287
29388
  defaultValue: "auto",
28288
29389
  visibleWhen: { field: "images", notEquals: null }
28289
29390
  }),
29391
+ createImageShapeField({
29392
+ id: "imageShape",
29393
+ label: "Media shape",
29394
+ defaultValue: "default",
29395
+ visibleWhen: { field: "images", notEquals: null }
29396
+ }),
28290
29397
  {
28291
29398
  id: "text",
28292
29399
  type: "richText",
@@ -28320,6 +29427,30 @@ var mediaTextManifest = createBlockManifest({
28320
29427
  ...options?.not ? { not: true } : {}
28321
29428
  }
28322
29429
  });
29430
+ const bodyClassNameFromAlignment = {
29431
+ $bind: {
29432
+ from: "content.titleAlignment",
29433
+ transforms: [
29434
+ {
29435
+ id: "ui.bodyClassFromAlignment",
29436
+ options: { base: "rb-prose rb-max-w-none" }
29437
+ }
29438
+ ],
29439
+ fallback: "rb-prose rb-max-w-none"
29440
+ }
29441
+ };
29442
+ const titleClassNameFromAlignment = {
29443
+ $bind: {
29444
+ from: "content.titleAlignment",
29445
+ transforms: [
29446
+ {
29447
+ id: "ui.headingClassFromAlignment",
29448
+ options: { base: "" }
29449
+ }
29450
+ ],
29451
+ fallback: ""
29452
+ }
29453
+ };
28323
29454
  const defaultTextColumn = el("div", {}, [
28324
29455
  styledCard(
28325
29456
  [
@@ -28344,8 +29475,55 @@ var mediaTextManifest = createBlockManifest({
28344
29475
  bind("content.text")
28345
29476
  )
28346
29477
  ]);
29478
+ const bioTextColumn = el(
29479
+ "div",
29480
+ { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" },
29481
+ [
29482
+ text(
29483
+ {
29484
+ as: "h2",
29485
+ className: titleClassNameFromAlignment
29486
+ },
29487
+ when("content.title"),
29488
+ bind("content.title")
29489
+ ),
29490
+ styledCard(
29491
+ [
29492
+ richText(
29493
+ {
29494
+ className: bodyClassNameFromAlignment
29495
+ },
29496
+ bind("content.text")
29497
+ )
29498
+ ],
29499
+ {
29500
+ stylesFrom: "content._textCardStyles",
29501
+ backgroundFrom: "content._textCardStyles.background"
29502
+ },
29503
+ when("content.wrapTextInCard")
29504
+ ),
29505
+ richText(
29506
+ {
29507
+ className: bodyClassNameFromAlignment
29508
+ },
29509
+ when("content.wrapTextInCard", { not: true }),
29510
+ bind("content.text")
29511
+ )
29512
+ ]
29513
+ );
28347
29514
  const defaultImageCommonProps = {
28348
- className: "rb-w-full rb-h-auto rb-object-cover",
29515
+ className: {
29516
+ $bind: {
29517
+ from: "content.imageShape",
29518
+ transforms: [
29519
+ {
29520
+ id: "ui.imageShapeClassName",
29521
+ options: { baseClass: "rb-w-full rb-h-auto rb-object-cover" }
29522
+ }
29523
+ ],
29524
+ fallback: "rb-w-full rb-h-auto rb-object-cover"
29525
+ }
29526
+ },
28349
29527
  style: {
28350
29528
  aspectRatio: { $bind: { from: "content.aspectRatio" } }
28351
29529
  }
@@ -28386,6 +29564,27 @@ var mediaTextManifest = createBlockManifest({
28386
29564
  ],
28387
29565
  whenImagesLength(0, { not: true })
28388
29566
  );
29567
+ const bioImagesLayout = el(
29568
+ "div",
29569
+ {},
29570
+ [
29571
+ responsiveTwoColumn({
29572
+ image: el("div", {}, [
29573
+ el("div", {}, [defaultSingleImage], whenImagesLength(1)),
29574
+ el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))
29575
+ ]),
29576
+ text: bioTextColumn,
29577
+ ratioFrom: "content.ratio",
29578
+ imagePositionFrom: "content.imagePosition",
29579
+ containerClassName: "rb-flex rb-flex-col rb-md-flex-row rb-md-items-center",
29580
+ gapFrom: "content.gap",
29581
+ gapFallback: "comfortable",
29582
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
29583
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
29584
+ })
29585
+ ],
29586
+ whenImagesLength(0, { not: true })
29587
+ );
28389
29588
  const defaultTextOnlyLayout = el(
28390
29589
  "div",
28391
29590
  {},
@@ -28415,7 +29614,45 @@ var mediaTextManifest = createBlockManifest({
28415
29614
  ],
28416
29615
  whenImagesLength(0)
28417
29616
  );
29617
+ const bioTextOnlyLayout = el(
29618
+ "div",
29619
+ { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" },
29620
+ [
29621
+ text(
29622
+ {
29623
+ as: "h2",
29624
+ className: titleClassNameFromAlignment
29625
+ },
29626
+ when("content.title"),
29627
+ bind("content.title")
29628
+ ),
29629
+ styledCard(
29630
+ [
29631
+ richText(
29632
+ {
29633
+ className: bodyClassNameFromAlignment
29634
+ },
29635
+ bind("content.text")
29636
+ )
29637
+ ],
29638
+ {
29639
+ stylesFrom: "content._textCardStyles",
29640
+ backgroundFrom: "content._textCardStyles.background"
29641
+ },
29642
+ when("content.wrapTextInCard")
29643
+ ),
29644
+ richText(
29645
+ {
29646
+ className: bodyClassNameFromAlignment
29647
+ },
29648
+ when("content.wrapTextInCard", { not: true }),
29649
+ bind("content.text")
29650
+ )
29651
+ ],
29652
+ whenImagesLength(0)
29653
+ );
28418
29654
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
29655
+ const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
28419
29656
  const defaultLayout2 = styledSection({
28420
29657
  children: styledContainer({
28421
29658
  rootType: "stack",
@@ -28424,18 +29661,7 @@ var mediaTextManifest = createBlockManifest({
28424
29661
  text(
28425
29662
  {
28426
29663
  as: "h2",
28427
- className: {
28428
- $bind: {
28429
- from: "content.titleAlignment",
28430
- transforms: [
28431
- {
28432
- id: "ui.headingClassFromAlignment",
28433
- options: { base: "" }
28434
- }
28435
- ],
28436
- fallback: ""
28437
- }
28438
- }
29664
+ className: titleClassNameFromAlignment
28439
29665
  },
28440
29666
  when("content.title"),
28441
29667
  bind("content.title")
@@ -28447,14 +29673,28 @@ var mediaTextManifest = createBlockManifest({
28447
29673
  baseClass: "",
28448
29674
  spacing: "medium"
28449
29675
  });
29676
+ const bioLayout = styledSection({
29677
+ children: styledContainer({
29678
+ rootType: "stack",
29679
+ rootProps: { gap: "lg" },
29680
+ children: [bioInner]
29681
+ }),
29682
+ baseClass: "",
29683
+ spacing: "medium"
29684
+ });
28450
29685
  return {
28451
29686
  layout: defaultLayout2,
28452
29687
  variants: {
28453
- default: defaultLayout2
29688
+ default: defaultLayout2,
29689
+ bio: bioLayout
28454
29690
  },
28455
29691
  defaultVariant: "default",
28456
29692
  variantOptions: {
28457
- default: { label: "Default" }
29693
+ default: { label: "Default" },
29694
+ bio: {
29695
+ label: "Bio",
29696
+ description: "Vertically centered title and copy beside media."
29697
+ }
28458
29698
  }
28459
29699
  };
28460
29700
  })(),
@@ -29160,10 +30400,8 @@ var occurrenceContextSchema = z43.object({
29160
30400
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
29161
30401
  import { z as z45 } from "zod";
29162
30402
 
29163
- // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
29164
- import { z as z44 } from "zod";
29165
-
29166
30403
  // ../blocks/src/system/constants/events.ts
30404
+ var EVENT_CONTENT_TYPE_SLUGS = ["event", "events"];
29167
30405
  var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
29168
30406
  var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
29169
30407
  var eventCalendarListLayoutOptions = [
@@ -29177,8 +30415,133 @@ function isEventCalendarDisplayMode(value) {
29177
30415
  function isEventCalendarListLayout(value) {
29178
30416
  return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
29179
30417
  }
30418
+ function isEventContentType(slug) {
30419
+ if (!slug) return false;
30420
+ return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
30421
+ }
30422
+
30423
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
30424
+ var DEFAULT_EVENT_CURRENCY = "USD";
30425
+ function resolveRuntimeEventPricing(event) {
30426
+ if (isPublicEventPricing(event.pricing)) {
30427
+ return event.pricing;
30428
+ }
30429
+ const legacy = event;
30430
+ const currency = readCurrency(legacy.currency);
30431
+ if (event.requiresRegistration === false) {
30432
+ return {
30433
+ kind: "drop_in",
30434
+ currency,
30435
+ display: { kind: "free", currency }
30436
+ };
30437
+ }
30438
+ if (legacy.pricingMode === "ticket_types") {
30439
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
30440
+ return {
30441
+ kind: "ticket_types",
30442
+ currency,
30443
+ ticketTypes,
30444
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
30445
+ };
30446
+ }
30447
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
30448
+ if (legacy.pricingType === "paid" && amount > 0) {
30449
+ return {
30450
+ kind: "single_paid",
30451
+ amount,
30452
+ currency,
30453
+ display: { kind: "exact", amount, currency }
30454
+ };
30455
+ }
30456
+ return {
30457
+ kind: "free_registration",
30458
+ currency,
30459
+ display: { kind: "free", currency }
30460
+ };
30461
+ }
30462
+ function readCurrency(value) {
30463
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
30464
+ }
30465
+ function isRecord3(value) {
30466
+ return typeof value === "object" && value !== null && !Array.isArray(value);
30467
+ }
30468
+ function isPublicEventPricing(value) {
30469
+ if (!isRecord3(value) || typeof value.kind !== "string") return false;
30470
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
30471
+ }
30472
+ function isPublicEventTicketType(value) {
30473
+ return isRecord3(value) && typeof value.id === "string";
30474
+ }
30475
+ function readTicketTypePriceDisplay(value, currency) {
30476
+ const display = readLegacyPriceDisplay(value, currency);
30477
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
30478
+ }
30479
+ function readLegacyPriceDisplay(value, currency) {
30480
+ if (!isRecord3(value) || typeof value.kind !== "string") {
30481
+ return { kind: "unavailable", currency };
30482
+ }
30483
+ const displayCurrency = readCurrency(value.currency);
30484
+ switch (value.kind) {
30485
+ case "free":
30486
+ return { kind: "free", currency: displayCurrency };
30487
+ case "exact":
30488
+ return readAmount(value.amount) !== null ? {
30489
+ kind: "exact",
30490
+ amount: readAmount(value.amount) ?? 0,
30491
+ currency: displayCurrency
30492
+ } : { kind: "unavailable", currency };
30493
+ case "from":
30494
+ return readAmount(value.amount) !== null ? {
30495
+ kind: "from",
30496
+ amount: readAmount(value.amount) ?? 0,
30497
+ currency: displayCurrency
30498
+ } : { kind: "unavailable", currency };
30499
+ case "mixed":
30500
+ return readAmount(value.paidFromAmount) !== null ? {
30501
+ kind: "mixed",
30502
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
30503
+ currency: displayCurrency
30504
+ } : { kind: "unavailable", currency };
30505
+ case "unavailable":
30506
+ return { kind: "unavailable", currency: displayCurrency };
30507
+ case "course":
30508
+ return isRecord3(value.display) ? {
30509
+ kind: "course",
30510
+ display: readCoursePriceDisplay(value.display, displayCurrency)
30511
+ } : {
30512
+ kind: "course",
30513
+ display: { kind: "unavailable", currency: displayCurrency }
30514
+ };
30515
+ default:
30516
+ return { kind: "unavailable", currency };
30517
+ }
30518
+ }
30519
+ function readCoursePriceDisplay(value, currency) {
30520
+ switch (value.kind) {
30521
+ case "free":
30522
+ return { kind: "free", currency: readCurrency(value.currency) };
30523
+ case "exact":
30524
+ return readAmount(value.amount) !== null ? {
30525
+ kind: "exact",
30526
+ amount: readAmount(value.amount) ?? 0,
30527
+ currency: readCurrency(value.currency)
30528
+ } : { kind: "unavailable", currency };
30529
+ case "from":
30530
+ return readAmount(value.amount) !== null ? {
30531
+ kind: "from",
30532
+ amount: readAmount(value.amount) ?? 0,
30533
+ currency: readCurrency(value.currency)
30534
+ } : { kind: "unavailable", currency };
30535
+ default:
30536
+ return { kind: "unavailable", currency };
30537
+ }
30538
+ }
30539
+ function readAmount(value) {
30540
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
30541
+ }
29180
30542
 
29181
30543
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
30544
+ import { z as z44 } from "zod";
29182
30545
  var previewStageSchema = z44.enum(["preview", "published"]);
29183
30546
  var registrationButtonVariantSchema = z44.enum(["primary", "secondary", "outline"]);
29184
30547
  var eventButtonVariantSchema = z44.enum(["primary", "secondary", "outline", "link"]);
@@ -29189,12 +30552,73 @@ var weekStartSchema = z44.enum(["sunday", "monday"]);
29189
30552
  var filterAutoShowSchema = z44.enum(["auto", "always", "never"]);
29190
30553
  var calendarTabViewsSchema = z44.enum(["both", "month", "week"]);
29191
30554
 
30555
+ // ../blocks/src/system/runtime/nodes/event-registration/wizardSteps.ts
30556
+ function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep) {
30557
+ const baseSteps = hasPreSelectedContext ? ["select-tickets", "enter-details"] : ["select-event", "select-tickets", "enter-details"];
30558
+ if (!needsPaymentStep) {
30559
+ return baseSteps;
30560
+ }
30561
+ return [...baseSteps, "select-payment"];
30562
+ }
30563
+
30564
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationDerivations.ts
30565
+ function eventMatchesOccurrenceId(event, occurrenceId) {
30566
+ return event.registrationOccurrenceId === occurrenceId || event.publicEventId === occurrenceId;
30567
+ }
30568
+ function findPreSelectedEvent(input) {
30569
+ const occurrenceContext = input.occurrenceContext;
30570
+ if (!occurrenceContext) {
30571
+ return null;
30572
+ }
30573
+ const contextDate = getBookingLocalDateKey(toScheduledBookingDateTime({
30574
+ startsAt: occurrenceContext.startsAt,
30575
+ timeZone: occurrenceContext.timeZone
30576
+ }));
30577
+ return input.scopedEvents.find(
30578
+ (event) => eventMatchesOccurrenceId(event, occurrenceContext.id) || getBookingLocalDateKey(toScheduledBookingDateTime({
30579
+ startsAt: event.startsAt,
30580
+ timeZone: event.timeZone
30581
+ })) === contextDate
30582
+ ) ?? null;
30583
+ }
30584
+ function resolveEventRequiresPayment(input) {
30585
+ if (input.eligibility) {
30586
+ return input.eligibility.requiresPayment;
30587
+ }
30588
+ if (input.selectedTicketType) {
30589
+ return input.selectedTicketType.priceAmount > 0;
30590
+ }
30591
+ if (!input.event) {
30592
+ return false;
30593
+ }
30594
+ return publicEventPricingType(resolveRuntimeEventPricing(input.event)) !== "free";
30595
+ }
30596
+
30597
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.ts
30598
+ function toRegistrationEvent(event) {
30599
+ return {
30600
+ ...event,
30601
+ pricing: resolveRuntimeEventPricing(event),
30602
+ publicEventId: event.id,
30603
+ registrationOccurrenceId: event.occurrenceId
30604
+ };
30605
+ }
30606
+ function toRegistrationEvents(events) {
30607
+ return events.map(toRegistrationEvent);
30608
+ }
30609
+
29192
30610
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
30611
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
30612
+ var EVENT_REGISTRATION_SHELL_STEP_LABELS = ["Event", "Date", "Tickets", "Details", "Payment"];
29193
30613
  var contentEntrySchema = z45.object({
29194
30614
  id: z45.string(),
29195
30615
  slug: z45.string(),
29196
30616
  contentTypeSlug: z45.string()
29197
30617
  });
30618
+ var eventRegistrationPublicEventSchema = z45.preprocess(
30619
+ normalizeEventRegistrationEventInput,
30620
+ publicEventSchema
30621
+ );
29198
30622
  var eventRegistrationSourceSchema = z45.object({
29199
30623
  siteId: z45.string().optional(),
29200
30624
  apiBaseUrl: z45.string().optional(),
@@ -29202,7 +30626,7 @@ var eventRegistrationSourceSchema = z45.object({
29202
30626
  previewToken: z45.string().nullable().optional(),
29203
30627
  occurrenceContext: occurrenceContextSchema.optional(),
29204
30628
  contentEntry: contentEntrySchema.nullable().optional(),
29205
- events: z45.array(publicEventSchema).nullable().optional(),
30629
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
29206
30630
  className: z45.string().nullable().optional(),
29207
30631
  buttonText: z45.string().nullable().optional(),
29208
30632
  maxTickets: z45.string().nullable().optional(),
@@ -29217,14 +30641,17 @@ var eventRegistrationSourceSchema = z45.object({
29217
30641
  });
29218
30642
  var eventRegistrationDisplaySchema = z45.object({
29219
30643
  kind: z45.literal("event-registration"),
29220
- state: z45.literal("shell"),
30644
+ state: z45.literal("generic-shell"),
29221
30645
  className: z45.string().nullable(),
30646
+ titleText: z45.string(),
30647
+ bodyText: z45.string(),
30648
+ stepLabels: z45.array(z45.enum(EVENT_REGISTRATION_SHELL_STEP_LABELS)).min(1),
29222
30649
  summaryButtonText: z45.string()
29223
30650
  });
29224
30651
  var eventRegistrationHydrationSchema = z45.object({
29225
30652
  occurrenceContext: occurrenceContextSchema.optional(),
29226
30653
  contentEntry: contentEntrySchema.nullable().optional(),
29227
- events: z45.array(publicEventSchema).nullable().optional(),
30654
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
29228
30655
  maxTickets: z45.string().optional(),
29229
30656
  showVenue: z45.boolean().optional(),
29230
30657
  showCapacity: z45.boolean().optional(),
@@ -29253,13 +30680,81 @@ var eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys(
29253
30680
  "stage"
29254
30681
  );
29255
30682
  function buildEventRegistrationDisplay(source) {
30683
+ const stepLabels = buildEventRegistrationShellStepLabels(source);
29256
30684
  return {
29257
30685
  kind: "event-registration",
29258
- state: "shell",
30686
+ state: "generic-shell",
29259
30687
  className: source.className ?? null,
30688
+ titleText: "Event registration",
30689
+ bodyText: buildEventRegistrationShellBodyText(stepLabels),
30690
+ stepLabels,
29260
30691
  summaryButtonText: source.buttonText?.trim() || "Register"
29261
30692
  };
29262
30693
  }
30694
+ function buildEventRegistrationShellStepLabels(source) {
30695
+ const scopedEvents = scopeEventRegistrationEvents(source);
30696
+ if (scopedEvents.length === 0) {
30697
+ return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
30698
+ }
30699
+ const preSelectedEvent = findPreSelectedEvent({
30700
+ scopedEvents,
30701
+ occurrenceContext: source.occurrenceContext
30702
+ });
30703
+ const hasPreSelectedContext = Boolean(source.occurrenceContext || preSelectedEvent);
30704
+ const needsPaymentStep = hasPreSelectedContext && preSelectedEvent ? resolveEventRequiresPayment({
30705
+ eligibility: null,
30706
+ selectedTicketType: null,
30707
+ event: preSelectedEvent
30708
+ }) : false;
30709
+ return getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
30710
+ }
30711
+ function scopeEventRegistrationEvents(source) {
30712
+ const events = toRegistrationEvents(source.events ?? []);
30713
+ if (source.occurrenceContext?.seriesId) {
30714
+ return events.filter((event) => event.seriesId === source.occurrenceContext?.seriesId);
30715
+ }
30716
+ const entrySlug = source.contentEntry?.slug;
30717
+ const entryContentType = source.contentEntry?.contentTypeSlug;
30718
+ if (entrySlug && entryContentType && isEventContentType(entryContentType)) {
30719
+ return events.filter((event) => event.slug === entrySlug);
30720
+ }
30721
+ return events;
30722
+ }
30723
+ function shellLabelForRegistrationStep(step, events) {
30724
+ switch (step) {
30725
+ case "select-event":
30726
+ return isDateSelection(events) ? "Date" : "Event";
30727
+ case "select-tickets":
30728
+ return "Tickets";
30729
+ case "enter-details":
30730
+ return "Details";
30731
+ case "select-payment":
30732
+ return "Payment";
30733
+ case "error":
30734
+ case "success":
30735
+ case "submitting":
30736
+ case "redirecting":
30737
+ case "verifying-payment":
30738
+ case "verifying-timeout":
30739
+ case "payment-failed":
30740
+ return "Details";
30741
+ }
30742
+ }
30743
+ function isDateSelection(events) {
30744
+ const firstSeriesId = events[0]?.seriesId;
30745
+ return Boolean(
30746
+ events.length > 1 && firstSeriesId && events.every((event) => event.seriesId === firstSeriesId)
30747
+ );
30748
+ }
30749
+ function buildEventRegistrationShellBodyText(stepLabels) {
30750
+ if (stepLabels.includes("Payment")) {
30751
+ return "Preparing tickets, details, and payment options.";
30752
+ }
30753
+ if (stepLabels[0] === "Tickets") {
30754
+ return "Preparing tickets and booking details.";
30755
+ }
30756
+ return "Preparing dates, tickets, and booking details.";
30757
+ }
29263
30758
  var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
29264
30759
  kind: "client-owned",
29265
30760
  contracts: {
@@ -29283,6 +30778,18 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
29283
30778
  }
29284
30779
  })
29285
30780
  });
30781
+ function normalizeEventRegistrationEventInput(value) {
30782
+ if (!isRecord4(value)) {
30783
+ return value;
30784
+ }
30785
+ return {
30786
+ ...value,
30787
+ pricing: resolveRuntimeEventPricing(value)
30788
+ };
30789
+ }
30790
+ function isRecord4(value) {
30791
+ return typeof value === "object" && value !== null && !Array.isArray(value);
30792
+ }
29286
30793
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
29287
30794
  runtime: eventRegistrationBlockRuntime,
29288
30795
  mode: "event-registration",
@@ -31781,7 +33288,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
31781
33288
  return keys.length >= 2 ? keys : [];
31782
33289
  }
31783
33290
  function normalizeOfferingsPreviewContentForWrite(value) {
31784
- if (!isRecord3(value)) return null;
33291
+ if (!isRecord5(value)) return null;
31785
33292
  const groupOrderValue = value.groupOrder;
31786
33293
  if (Array.isArray(groupOrderValue)) {
31787
33294
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -31794,7 +33301,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
31794
33301
  return { ...value, groupOrder: [] };
31795
33302
  }
31796
33303
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
31797
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord3) : []
33304
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord5) : []
31798
33305
  );
31799
33306
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
31800
33307
  }
@@ -31808,7 +33315,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
31808
33315
  }
31809
33316
  return keys;
31810
33317
  }
31811
- function isRecord3(value) {
33318
+ function isRecord5(value) {
31812
33319
  return typeof value === "object" && value !== null && !Array.isArray(value);
31813
33320
  }
31814
33321
 
@@ -32175,7 +33682,7 @@ function isOfferingsPreviewItemLimit(value) {
32175
33682
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
32176
33683
  }
32177
33684
  function normalizeOfferingsPreviewGroupOverride(value) {
32178
- if (!isRecord4(value)) return [];
33685
+ if (!isRecord6(value)) return [];
32179
33686
  const override = {};
32180
33687
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
32181
33688
  override.sourceKey = value.sourceKey;
@@ -32207,12 +33714,12 @@ function isButtonVariant(value) {
32207
33714
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
32208
33715
  }
32209
33716
  function normalizeCardStylesContent(value) {
32210
- return isRecord4(value) || value === null ? value : void 0;
33717
+ return isRecord6(value) || value === null ? value : void 0;
32211
33718
  }
32212
33719
  function normalizeSectionStylesContent(value) {
32213
- return isRecord4(value) || value === null ? value : void 0;
33720
+ return isRecord6(value) || value === null ? value : void 0;
32214
33721
  }
32215
- function isRecord4(value) {
33722
+ function isRecord6(value) {
32216
33723
  return typeof value === "object" && value !== null && !Array.isArray(value);
32217
33724
  }
32218
33725
 
@@ -36172,11 +37679,13 @@ var heroImageSurfaceMotions = [
36172
37679
  ];
36173
37680
  var standardEyebrowTreatments = [
36174
37681
  "plain",
37682
+ "accent",
36175
37683
  "pill",
36176
37684
  "accent-pill"
36177
37685
  ];
36178
37686
  var animatedEyebrowTreatments = [
36179
37687
  "plain",
37688
+ "accent",
36180
37689
  "pill",
36181
37690
  "accent-pill",
36182
37691
  "pill-bounce",
@@ -36477,6 +37986,17 @@ var systemBlockDefinitionsRaw = [
36477
37986
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
36478
37987
  ]
36479
37988
  })),
37989
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
37990
+ flow: conversionFlow,
37991
+ layoutProfiles: [
37992
+ layoutProfile({
37993
+ variantKey: "default",
37994
+ family: "split",
37995
+ weight: "featured",
37996
+ bias: "soft"
37997
+ })
37998
+ ]
37999
+ })),
36480
38000
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
36481
38001
  sectionSurfaces: "supported",
36482
38002
  contentFrames: ["plain", "panel"],
@@ -36568,6 +38088,12 @@ var systemBlockDefinitionsRaw = [
36568
38088
  family: "media-text",
36569
38089
  weight: "featured",
36570
38090
  bias: "soft"
38091
+ }),
38092
+ layoutProfile({
38093
+ variantKey: "bio",
38094
+ family: "media-text",
38095
+ weight: "featured",
38096
+ bias: "soft"
36571
38097
  })
36572
38098
  ]
36573
38099
  })),
@@ -37369,7 +38895,7 @@ var defaultTransforms = createTransformRegistry(builtinTransformDefinitions);
37369
38895
  // ../blocks/src/system/data/linkedContentEntries.ts
37370
38896
  var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
37371
38897
  function coerceLinkedContentEntriesPayload(payload) {
37372
- if (!isRecord5(payload)) return payload;
38898
+ if (!isRecord7(payload)) return payload;
37373
38899
  const response = payload;
37374
38900
  if (!Array.isArray(response.entries)) return payload;
37375
38901
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -37377,12 +38903,12 @@ function coerceLinkedContentEntriesPayload(payload) {
37377
38903
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
37378
38904
  }
37379
38905
  function enrichLinkedContentEntry(entry, contentType) {
37380
- if (!isRecord5(entry)) return entry;
38906
+ if (!isRecord7(entry)) return entry;
37381
38907
  const entryId = typeof entry.id === "string" ? entry.id : null;
37382
38908
  if (!entryId) return entry;
37383
38909
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
37384
38910
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
37385
- const content = isRecord5(entry.content) ? entry.content : {};
38911
+ const content = isRecord7(entry.content) ? entry.content : {};
37386
38912
  const meta = {
37387
38913
  kind: "linked-content-entry",
37388
38914
  entryId,
@@ -37475,7 +39001,7 @@ function capitalize(value) {
37475
39001
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
37476
39002
  }
37477
39003
  function parsePublicContentTypeMeta(value) {
37478
- if (!isRecord5(value)) return null;
39004
+ if (!isRecord7(value)) return null;
37479
39005
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
37480
39006
  return {
37481
39007
  key: value.key,
@@ -37485,7 +39011,7 @@ function parsePublicContentTypeMeta(value) {
37485
39011
  };
37486
39012
  }
37487
39013
  function parsePublicContentTypeLinkedEntryEditing(value) {
37488
- if (!isRecord5(value) || typeof value.kind !== "string") return null;
39014
+ if (!isRecord7(value) || typeof value.kind !== "string") return null;
37489
39015
  switch (value.kind) {
37490
39016
  case "generic":
37491
39017
  return { kind: "generic" };
@@ -37499,7 +39025,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
37499
39025
  }
37500
39026
  }
37501
39027
  function parsePublicContentTypeFieldMeta(value) {
37502
- if (!isRecord5(value)) return [];
39028
+ if (!isRecord7(value)) return [];
37503
39029
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
37504
39030
  return [{
37505
39031
  id: value.id,
@@ -37513,7 +39039,7 @@ function parseStringArray(value) {
37513
39039
  if (!Array.isArray(value)) return null;
37514
39040
  return value.filter((item) => typeof item === "string");
37515
39041
  }
37516
- function isRecord5(value) {
39042
+ function isRecord7(value) {
37517
39043
  return typeof value === "object" && value !== null && !Array.isArray(value);
37518
39044
  }
37519
39045
 
@@ -37741,6 +39267,11 @@ ${root} {
37741
39267
  --er-event-card-bg: rgb(var(--tb-surface));
37742
39268
  --er-event-card-border-width: var(--rb-border-width, 1px);
37743
39269
  --er-event-card-hover-opacity: 1;
39270
+ --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
39271
+ --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
39272
+ --er-radius: var(--rb-block-radius);
39273
+ --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
39274
+ --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
37744
39275
 
37745
39276
  /* Step indicator */
37746
39277
  --er-step-active: rgb(var(--tb-primary));
@@ -38383,11 +39914,11 @@ function resolveParamsBindings(input, vm, meta) {
38383
39914
  return binding.fallback;
38384
39915
  }
38385
39916
  return resolved;
38386
- } catch (err) {
39917
+ } catch (err3) {
38387
39918
  if (shouldLogWarnings) {
38388
39919
  console.warn(
38389
39920
  `bindings: failed to parse loader param binding for block "${meta?.blockKind ?? "unknown"}"`,
38390
- err
39921
+ err3
38391
39922
  );
38392
39923
  }
38393
39924
  return void 0;
@@ -39308,7 +40839,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
39308
40839
  }
39309
40840
 
39310
40841
  // ../api/src/utils/isRecord.ts
39311
- function isRecord6(value) {
40842
+ function isRecord8(value) {
39312
40843
  return typeof value === "object" && value !== null && !Array.isArray(value);
39313
40844
  }
39314
40845
 
@@ -39615,7 +41146,7 @@ function sanitizeMarks(marks) {
39615
41146
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
39616
41147
  return [{ type: mark.type }];
39617
41148
  }
39618
- if (mark.type === "link" && isRecord6(mark.attrs) && typeof mark.attrs.href === "string") {
41149
+ if (mark.type === "link" && isRecord8(mark.attrs) && typeof mark.attrs.href === "string") {
39619
41150
  const attrs = { href: mark.attrs.href };
39620
41151
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
39621
41152
  attrs.target = mark.attrs.target;
@@ -39630,10 +41161,10 @@ function sanitizeMarks(marks) {
39630
41161
  return sanitized.length > 0 ? sanitized : void 0;
39631
41162
  }
39632
41163
  function unwrapRichTextValue(value) {
39633
- if (isRecord6(value) && isRecord6(value.doc)) {
41164
+ if (isRecord8(value) && isRecord8(value.doc)) {
39634
41165
  return unwrapRichTextValue(value.doc);
39635
41166
  }
39636
- if (isRecord6(value) && value.type === "doc") {
41167
+ if (isRecord8(value) && value.type === "doc") {
39637
41168
  return {
39638
41169
  type: "doc",
39639
41170
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -39642,7 +41173,7 @@ function unwrapRichTextValue(value) {
39642
41173
  return EMPTY_SITE_BANNER_BODY;
39643
41174
  }
39644
41175
  function isTipTapNodeLike(value) {
39645
- return isRecord6(value) && typeof value.type === "string";
41176
+ return isRecord8(value) && typeof value.type === "string";
39646
41177
  }
39647
41178
  function coerceTipTapNode(value) {
39648
41179
  return {
@@ -39650,9 +41181,9 @@ function coerceTipTapNode(value) {
39650
41181
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
39651
41182
  ...typeof value.text === "string" ? { text: value.text } : {},
39652
41183
  ...Array.isArray(value.marks) ? {
39653
- marks: value.marks.filter((mark) => isRecord6(mark) && typeof mark.type === "string").map((mark) => ({
41184
+ marks: value.marks.filter((mark) => isRecord8(mark) && typeof mark.type === "string").map((mark) => ({
39654
41185
  type: mark.type,
39655
- ...isRecord6(mark.attrs) ? { attrs: mark.attrs } : {}
41186
+ ...isRecord8(mark.attrs) ? { attrs: mark.attrs } : {}
39656
41187
  }))
39657
41188
  } : {}
39658
41189
  };
@@ -39800,7 +41331,7 @@ var ENTRY_REF_KEYS = [
39800
41331
  "entryId",
39801
41332
  "slug"
39802
41333
  ];
39803
- function isRecord7(value) {
41334
+ function isRecord9(value) {
39804
41335
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
39805
41336
  }
39806
41337
  function extractManualEntryRef(item) {
@@ -39808,7 +41339,7 @@ function extractManualEntryRef(item) {
39808
41339
  const trimmed = item.trim();
39809
41340
  return trimmed.length > 0 ? trimmed : null;
39810
41341
  }
39811
- if (!isRecord7(item)) return null;
41342
+ if (!isRecord9(item)) return null;
39812
41343
  for (const key of ENTRY_REF_KEYS) {
39813
41344
  const raw = item[key];
39814
41345
  if (typeof raw === "string" && raw.trim().length > 0) {
@@ -40439,6 +41970,31 @@ function isDocWrapper(value) {
40439
41970
  var normalizeBindingOutput2 = normalizeBindingOutput;
40440
41971
  var applyBindingsToContent2 = applyBindingsToContent;
40441
41972
 
41973
+ // ../content-model/src/entry-slots/types.ts
41974
+ function ok2(value) {
41975
+ return { ok: true, value };
41976
+ }
41977
+ function err2(error) {
41978
+ return { ok: false, error };
41979
+ }
41980
+ var SLOT_KEY_PATTERN = /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/;
41981
+ function unsafeAsSlotKey(value) {
41982
+ return value;
41983
+ }
41984
+ function parseSlotKey(value) {
41985
+ if (typeof value !== "string") return err2({ kind: "not-string" });
41986
+ const normalized = value.trim();
41987
+ if (!normalized) return err2({ kind: "empty" });
41988
+ if (!SLOT_KEY_PATTERN.test(normalized)) {
41989
+ return err2({ kind: "invalid-format", value: normalized });
41990
+ }
41991
+ return ok2(unsafeAsSlotKey(normalized));
41992
+ }
41993
+ var SYSTEM_ENTRY_SLOT_BLOCK_KIND = "system.entry-slot";
41994
+ function selectBlocksForDeclaredEntrySlot(input) {
41995
+ return input.entrySlots.find((slot) => slot.slotKey === input.declaredSlotKey)?.blocks ?? [];
41996
+ }
41997
+
40442
41998
  // src/rendering/helpers/loadContent.ts
40443
41999
  function isPageContent(result) {
40444
42000
  return result.type === "page";
@@ -40491,6 +42047,7 @@ async function loadContent(params) {
40491
42047
  };
40492
42048
  const { templatePage, resolvedData: resolvedData2 } = await processEntryTemplate(
40493
42049
  contentResponse.templates,
42050
+ contentResponse.entrySlots,
40494
42051
  entry,
40495
42052
  { siteId, preview },
40496
42053
  client,
@@ -40614,7 +42171,7 @@ function validateAndConvertBlock(block, source) {
40614
42171
  content
40615
42172
  };
40616
42173
  }
40617
- async function processEntryTemplate(templates, entry, context, client, options) {
42174
+ async function processEntryTemplate(templates, entrySlots, entry, context, client, options) {
40618
42175
  const template = templates?.[0];
40619
42176
  if (!template || !template.blocks?.length) {
40620
42177
  return { templatePage: null, resolvedData: {} };
@@ -40632,7 +42189,12 @@ async function processEntryTemplate(templates, entry, context, client, options)
40632
42189
  updatedAt: entry.updatedAt
40633
42190
  }
40634
42191
  };
40635
- const blocks = template.blocks.map((block) => resolveTemplateBlock(block, bindingContext));
42192
+ const blocks = template.blocks.flatMap(
42193
+ (block) => resolveTemplateBlockSequence(block, bindingContext, entrySlots)
42194
+ );
42195
+ if (blocks.length === 0) {
42196
+ return { templatePage: null, resolvedData: {} };
42197
+ }
40636
42198
  const templatePage = {
40637
42199
  name: template.name || "Entry Template",
40638
42200
  path: entry.path || "/",
@@ -40672,6 +42234,48 @@ function resolveTemplateBlock(block, bindingContext) {
40672
42234
  content: resolvedContent
40673
42235
  };
40674
42236
  }
42237
+ function resolveTemplateBlockSequence(block, bindingContext, entrySlots) {
42238
+ const slotKey = readEntrySlotKey(block);
42239
+ if (slotKey) {
42240
+ return selectBlocksForDeclaredEntrySlot({
42241
+ declaredSlotKey: slotKey,
42242
+ entrySlots: entrySlots ?? []
42243
+ }).map(mapEntrySlotBlock);
42244
+ }
42245
+ if (block.blockKind === SYSTEM_ENTRY_SLOT_BLOCK_KIND) {
42246
+ return [];
42247
+ }
42248
+ return [resolveTemplateBlock(block, bindingContext)];
42249
+ }
42250
+ function readEntrySlotKey(block) {
42251
+ if (block.blockKind !== SYSTEM_ENTRY_SLOT_BLOCK_KIND) return null;
42252
+ if (block.scope !== "template") return null;
42253
+ const content = block.content;
42254
+ const slotKey = content?.slotKey;
42255
+ const parsed = parseSlotKey(slotKey);
42256
+ return parsed.ok ? parsed.value : null;
42257
+ }
42258
+ function mapEntrySlotBlock(block) {
42259
+ const mapped = {
42260
+ id: block.id ?? block.blockId ?? null,
42261
+ kind: block.kind,
42262
+ purpose: block.purpose,
42263
+ orderIndex: block.orderIndex ?? null,
42264
+ content: normalizeBindingOutput2(block.content ?? {}),
42265
+ draftContent: normalizeNullableEntrySlotContent(block.draftContent),
42266
+ publishedContent: normalizeNullableEntrySlotContent(block.publishedContent)
42267
+ };
42268
+ if (block.bindings == null) {
42269
+ return mapped;
42270
+ }
42271
+ return {
42272
+ ...mapped,
42273
+ bindings: block.bindings
42274
+ };
42275
+ }
42276
+ function normalizeNullableEntrySlotContent(content) {
42277
+ return content == null ? null : normalizeBindingOutput2(content);
42278
+ }
40675
42279
  export {
40676
42280
  createRiverbankClient,
40677
42281
  isEntryContent,