@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
@@ -3243,6 +3243,46 @@ var ENDPOINT_DEFINITIONS = {
3243
3243
  auth: "user",
3244
3244
  responseKind: "json"
3245
3245
  },
3246
+ listEntrySlotBlocks: {
3247
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3248
+ method: "GET",
3249
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3250
+ auth: "user",
3251
+ responseKind: "json",
3252
+ errors: ["resource:not_found"]
3253
+ },
3254
+ listEntryPageContentSlots: {
3255
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots",
3256
+ method: "GET",
3257
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slots", "blocks"],
3258
+ auth: "user",
3259
+ responseKind: "json",
3260
+ errors: ["resource:not_found"]
3261
+ },
3262
+ createEntrySlotBlock: {
3263
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3264
+ method: "POST",
3265
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3266
+ auth: "user",
3267
+ responseKind: "json",
3268
+ errors: ["validation:invalid_input", "resource:not_found"]
3269
+ },
3270
+ reorderEntrySlotBlocks: {
3271
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/reorder",
3272
+ method: "POST",
3273
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3274
+ auth: "user",
3275
+ responseKind: "json",
3276
+ errors: ["validation:invalid_input", "resource:not_found"]
3277
+ },
3278
+ deleteEntrySlotBlock: {
3279
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/{blockId}",
3280
+ method: "DELETE",
3281
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3282
+ auth: "user",
3283
+ responseKind: "json",
3284
+ errors: ["resource:not_found"]
3285
+ },
3246
3286
  createBlock: {
3247
3287
  path: "/sites/{siteId}/pages/{pageId}/blocks",
3248
3288
  method: "POST",
@@ -6335,6 +6375,171 @@ var ENDPOINT_DEFINITIONS = {
6335
6375
  }
6336
6376
  };
6337
6377
 
6378
+ // ../core/src/result.ts
6379
+ function ok(value) {
6380
+ return { ok: true, value };
6381
+ }
6382
+ function err(error) {
6383
+ return { ok: false, error };
6384
+ }
6385
+
6386
+ // ../core/src/event-pricing.ts
6387
+ function publicEventPricingType(pricing) {
6388
+ switch (pricing.kind) {
6389
+ case "drop_in":
6390
+ case "free_registration":
6391
+ return "free";
6392
+ case "single_paid":
6393
+ case "ticket_types":
6394
+ case "course":
6395
+ return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
6396
+ }
6397
+ }
6398
+ function isFreePublicEventPriceDisplay(display) {
6399
+ switch (display.kind) {
6400
+ case "free":
6401
+ return true;
6402
+ case "course":
6403
+ return display.display.kind === "free";
6404
+ case "exact":
6405
+ case "from":
6406
+ case "mixed":
6407
+ case "unavailable":
6408
+ return false;
6409
+ }
6410
+ }
6411
+
6412
+ // ../core/src/booking-date-time.ts
6413
+ var DEFAULT_LOCALE = "en-US";
6414
+ var FALLBACK_TIMEZONE = "UTC";
6415
+ function isValidTimeZone(timeZone) {
6416
+ try {
6417
+ new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
6418
+ return true;
6419
+ } catch {
6420
+ return false;
6421
+ }
6422
+ }
6423
+ function getSafeTimeZone(timeZone) {
6424
+ const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
6425
+ return normalized && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
6426
+ }
6427
+ function parseStrictBookingTimeZone(timeZone) {
6428
+ const normalized = timeZone.trim();
6429
+ if (!normalized || !isValidTimeZone(normalized)) {
6430
+ return null;
6431
+ }
6432
+ return normalized;
6433
+ }
6434
+ function formatParseError(error) {
6435
+ switch (error.reason) {
6436
+ case "invalid_starts_at":
6437
+ return `Expected a valid UTC/offset-aware ISO datetime in startsAt, received "${error.value}"`;
6438
+ case "invalid_ends_at":
6439
+ return `Expected a valid UTC/offset-aware ISO datetime in endsAt, received "${error.value ?? ""}"`;
6440
+ case "invalid_time_zone":
6441
+ return `Expected a valid IANA timezone in timeZone, received "${error.value}"`;
6442
+ }
6443
+ }
6444
+ function formatToPartsLookup(date, locale, timeZone, format) {
6445
+ return new Map(
6446
+ new Intl.DateTimeFormat(locale, {
6447
+ ...format,
6448
+ timeZone
6449
+ }).formatToParts(date).map((part) => [part.type, part.value])
6450
+ );
6451
+ }
6452
+ function getZonedDateTimeParts(date, timeZone) {
6453
+ const parts = formatToPartsLookup(date, "en-GB", timeZone, {
6454
+ year: "numeric",
6455
+ month: "2-digit",
6456
+ day: "2-digit",
6457
+ hour: "2-digit",
6458
+ minute: "2-digit",
6459
+ second: "2-digit",
6460
+ hour12: false
6461
+ });
6462
+ const read = (type) => Number(parts.get(type) ?? "");
6463
+ return {
6464
+ year: read("year"),
6465
+ month: read("month"),
6466
+ day: read("day"),
6467
+ hour: read("hour"),
6468
+ minute: read("minute"),
6469
+ second: read("second")
6470
+ };
6471
+ }
6472
+ function formatDateKey(date) {
6473
+ const year = String(date.year).padStart(4, "0");
6474
+ const month = String(date.month).padStart(2, "0");
6475
+ const day = String(date.day).padStart(2, "0");
6476
+ return `${year}-${month}-${day}`;
6477
+ }
6478
+ function parseUtcIsoDateTimeString(value) {
6479
+ const normalized = value.trim();
6480
+ const hasUtcSuffix = normalized.endsWith("Z");
6481
+ const hasExplicitOffset = /[+-]\d{2}:\d{2}$/u.test(normalized);
6482
+ if (!hasUtcSuffix && !hasExplicitOffset) {
6483
+ return err("missing-timezone-offset");
6484
+ }
6485
+ const date = new Date(normalized);
6486
+ if (Number.isNaN(date.getTime())) {
6487
+ return err("invalid-date-time");
6488
+ }
6489
+ return ok(date.toISOString());
6490
+ }
6491
+ function toUtcIsoDateTimeString(value) {
6492
+ const parsed = parseUtcIsoDateTimeString(value);
6493
+ if (!parsed.ok) {
6494
+ const message = parsed.error === "missing-timezone-offset" ? `Expected an offset-aware ISO datetime, received "${value}"` : `Expected a valid ISO datetime, received "${value}"`;
6495
+ throw new Error(message);
6496
+ }
6497
+ return parsed.value;
6498
+ }
6499
+ function parseScheduledBookingDateTime(input) {
6500
+ try {
6501
+ const startsAt = toUtcIsoDateTimeString(input.startsAt);
6502
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
6503
+ if (!timeZone) {
6504
+ return {
6505
+ ok: false,
6506
+ field: "timeZone",
6507
+ reason: "invalid_time_zone",
6508
+ value: input.timeZone
6509
+ };
6510
+ }
6511
+ return {
6512
+ ok: true,
6513
+ value: {
6514
+ startsAt,
6515
+ timeZone,
6516
+ locale: input.locale
6517
+ }
6518
+ };
6519
+ } catch {
6520
+ return {
6521
+ ok: false,
6522
+ field: "startsAt",
6523
+ reason: "invalid_starts_at",
6524
+ value: input.startsAt
6525
+ };
6526
+ }
6527
+ }
6528
+ function toScheduledBookingDateTime(input) {
6529
+ const result = parseScheduledBookingDateTime(input);
6530
+ if (result.ok) {
6531
+ return result.value;
6532
+ }
6533
+ throw new Error(formatParseError(result));
6534
+ }
6535
+ function getBookingLocalDateKey(input) {
6536
+ return formatDateKey(getLocalScheduleDate(new Date(input.startsAt), input.timeZone));
6537
+ }
6538
+ function getLocalScheduleDate(date, timeZone) {
6539
+ const parts = getZonedDateTimeParts(date, getSafeTimeZone(timeZone));
6540
+ return { year: parts.year, month: parts.month, day: parts.day };
6541
+ }
6542
+
6338
6543
  // ../core/src/location.ts
6339
6544
  function normalizeLocationAddressText(value) {
6340
6545
  if (typeof value !== "string") {
@@ -6782,6 +6987,21 @@ var selectSourceSchema = z4.discriminatedUnion("kind", [
6782
6987
  function assertNeverSelectSource(value) {
6783
6988
  throw new Error(`Unhandled select source: ${JSON.stringify(value)}`);
6784
6989
  }
6990
+ var visibleWhenPredicateSchema = z4.object({
6991
+ field: z4.string().min(1),
6992
+ equals: z4.any().optional(),
6993
+ notEquals: z4.any().optional(),
6994
+ oneOf: z4.array(z4.any()).optional(),
6995
+ notIn: z4.array(z4.any()).optional(),
6996
+ minItems: z4.number().int().nonnegative().optional(),
6997
+ maxItems: z4.number().int().nonnegative().optional()
6998
+ });
6999
+ var visibleWhenSchema = z4.union([
7000
+ visibleWhenPredicateSchema,
7001
+ z4.object({
7002
+ allOf: z4.array(visibleWhenPredicateSchema).min(1)
7003
+ })
7004
+ ]);
6785
7005
  var uiSchema = z4.object({
6786
7006
  widget: z4.string().optional(),
6787
7007
  // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)
@@ -6814,13 +7034,7 @@ var uiSchema = z4.object({
6814
7034
  showValue: z4.boolean().optional(),
6815
7035
  pattern: z4.string().optional(),
6816
7036
  placeholder: z4.string().optional(),
6817
- visibleWhen: z4.object({
6818
- field: z4.string().min(1),
6819
- equals: z4.any().optional(),
6820
- notEquals: z4.any().optional(),
6821
- oneOf: z4.array(z4.any()).optional(),
6822
- notIn: z4.array(z4.any()).optional()
6823
- }).optional(),
7037
+ visibleWhen: visibleWhenSchema.optional(),
6824
7038
  // Modal configuration for modal and group fields
6825
7039
  modalConfig: z4.object({
6826
7040
  buttonLabel: z4.string().optional(),
@@ -7587,6 +7801,7 @@ var eventListTreatmentValues = [
7587
7801
  ];
7588
7802
  var eyebrowTreatmentValues = [
7589
7803
  "plain",
7804
+ "accent",
7590
7805
  "pill",
7591
7806
  "accent-pill",
7592
7807
  "pill-bounce",
@@ -9178,9 +9393,9 @@ var _Vibrant = class _Vibrant2 {
9178
9393
  }
9179
9394
  image.remove();
9180
9395
  return res;
9181
- } catch (err) {
9396
+ } catch (err2) {
9182
9397
  image.remove();
9183
- return Promise.reject(err);
9398
+ return Promise.reject(err2);
9184
9399
  }
9185
9400
  }
9186
9401
  async getPalettes() {
@@ -9194,9 +9409,9 @@ var _Vibrant = class _Vibrant2 {
9194
9409
  const res = result1.palettes;
9195
9410
  image.remove();
9196
9411
  return res;
9197
- } catch (err) {
9412
+ } catch (err2) {
9198
9413
  image.remove();
9199
- return Promise.reject(err);
9414
+ return Promise.reject(err2);
9200
9415
  }
9201
9416
  }
9202
9417
  };
@@ -10601,27 +10816,28 @@ var joyStamp = defineButtonPersonality({
10601
10816
  }
10602
10817
  });
10603
10818
 
10604
- // ../theme-core/src/buttons/personalities/pebble.ts
10605
- var pebble = defineButtonPersonality({
10606
- id: "pebble",
10607
- name: "Pebble",
10608
- description: "Generous pill buttons with a quiet colour-softening hover.",
10609
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
10819
+ // ../theme-core/src/buttons/personalities/ornate-ritual.ts
10820
+ var ornateRitual = defineButtonPersonality({
10821
+ id: "ornate-ritual",
10822
+ name: "Ornate Ritual",
10823
+ description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
10824
+ tags: { tone: "classic", energy: "vibrant", motion: "subtle", era: "organic" },
10610
10825
  buttonSystem: {
10611
10826
  global: {
10612
- cornerStyle: "pill",
10827
+ cornerStyle: "rounded",
10613
10828
  shadow: "none",
10614
- textTransform: "none",
10615
- fontWeight: 500,
10616
- borderWidth: 2,
10829
+ textTransform: "uppercase",
10830
+ fontWeight: 600,
10831
+ borderWidth: 1,
10617
10832
  hoverTransform: "none",
10618
- hoverColor: "none"
10833
+ hoverColor: "none",
10834
+ letterSpacing: "loose"
10619
10835
  },
10620
10836
  sizes: {
10621
- sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
10622
- md: { padding: "0.875rem 2.25rem" },
10623
- lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
10624
- xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
10837
+ sm: { padding: "0.5625rem 1.25rem", fontSize: "text-xs" },
10838
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-xs" },
10839
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-sm" },
10840
+ xl: { padding: "1rem 2.75rem", fontSize: "text-base" }
10625
10841
  },
10626
10842
  variants: [
10627
10843
  {
@@ -10631,97 +10847,12 @@ var pebble = defineButtonPersonality({
10631
10847
  priority: 1,
10632
10848
  background: { type: "solid", colorToken: "primary" },
10633
10849
  textColorToken: "primaryForeground",
10634
- borderRadius: "rounded-full",
10635
- effects: {
10636
- hover: [
10637
- { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 88 } }
10638
- ]
10639
- }
10640
- },
10641
- {
10642
- id: "secondary",
10643
- name: "Secondary",
10644
- enabled: true,
10645
- priority: 2,
10646
- background: { type: "transparent" },
10647
- textColorToken: "primary",
10648
- borderRadius: "rounded-full",
10649
- border: { widthClass: "border-2", colorToken: "accent" },
10650
- effects: {
10651
- hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
10652
- }
10653
- },
10654
- {
10655
- id: "outline",
10656
- name: "Outline",
10657
- enabled: true,
10658
- priority: 3,
10659
- background: { type: "transparent" },
10660
- textColorToken: "text",
10661
- borderRadius: "rounded-full",
10662
- border: { widthClass: "border", colorToken: "border" },
10663
- effects: {
10664
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10665
- }
10666
- },
10667
- {
10668
- id: "ghost",
10669
- name: "Ghost",
10670
- enabled: true,
10671
- priority: 3,
10672
- background: { type: "transparent" },
10673
- textColorToken: "primary",
10674
- borderRadius: "rounded-full",
10675
- sizes: {
10676
- sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
10677
- md: { padding: "0.5rem 1rem" },
10678
- lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
10679
- xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
10680
- },
10681
- effects: {
10682
- hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
10683
- }
10684
- }
10685
- ]
10686
- }
10687
- });
10688
-
10689
- // ../theme-core/src/buttons/personalities/showtime-pill.ts
10690
- var showtimePill = defineButtonPersonality({
10691
- id: "showtime-pill",
10692
- name: "Showtime Pill",
10693
- description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
10694
- tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
10695
- buttonSystem: {
10696
- global: {
10697
- cornerStyle: "pill",
10698
- shadow: "low",
10699
- textTransform: "uppercase",
10700
- fontWeight: 700,
10701
- borderWidth: 2,
10702
- hoverTransform: "lift",
10703
- hoverColor: "darken",
10704
- typography: "body",
10705
- paddingPreset: "spacious",
10706
- italic: false
10707
- },
10708
- sizes: {
10709
- sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
10710
- md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
10711
- lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
10712
- xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
10713
- },
10714
- variants: [
10715
- {
10716
- id: "primary",
10717
- name: "Primary",
10718
- enabled: true,
10719
- priority: 1,
10720
- background: { type: "solid", colorToken: "primary" },
10721
- textColorToken: "background",
10722
- borderRadius: "rounded-full",
10850
+ borderRadius: "rounded-md",
10851
+ border: { widthClass: "border", colorToken: "primary" },
10852
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10723
10853
  effects: {
10724
- hover: [{ effectId: "pop" }]
10854
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "primary-100" } }],
10855
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
10725
10856
  }
10726
10857
  },
10727
10858
  {
@@ -10729,35 +10860,11 @@ var showtimePill = defineButtonPersonality({
10729
10860
  name: "Secondary",
10730
10861
  enabled: true,
10731
10862
  priority: 2,
10732
- background: { type: "transparent" },
10733
- textColorToken: "primary",
10734
- borderRadius: "rounded-full",
10735
- border: { widthClass: "border-2", colorToken: "primary" },
10736
- effects: {
10737
- hover: [{ effectId: "pop" }]
10738
- }
10739
- },
10740
- {
10741
- id: "hero",
10742
- name: "Hero",
10743
- enabled: true,
10744
- priority: 1,
10745
10863
  background: { type: "solid", colorToken: "secondary" },
10746
- textColorToken: "primary",
10747
- borderRadius: "rounded-full",
10748
- effects: {
10749
- hover: [{ effectId: "pop" }]
10750
- }
10751
- },
10752
- {
10753
- id: "header",
10754
- name: "Header",
10755
- enabled: true,
10756
- priority: 2,
10757
- background: { type: "solid", colorToken: "background" },
10758
- textColorToken: "primary",
10759
- borderRadius: "rounded-full",
10760
- border: { widthClass: "border-2", colorToken: "primary" },
10864
+ textColorToken: "primaryForeground",
10865
+ borderRadius: "rounded-md",
10866
+ border: { widthClass: "border", colorToken: "primary" },
10867
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10761
10868
  effects: {
10762
10869
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10763
10870
  }
@@ -10769,10 +10876,11 @@ var showtimePill = defineButtonPersonality({
10769
10876
  priority: 3,
10770
10877
  background: { type: "transparent" },
10771
10878
  textColorToken: "primary",
10772
- borderRadius: "rounded-full",
10773
- border: { widthClass: "border-2", colorToken: "primary" },
10879
+ borderRadius: "rounded-md",
10880
+ border: { widthClass: "border", colorToken: "primary" },
10881
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10774
10882
  effects: {
10775
- hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
10883
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
10776
10884
  }
10777
10885
  },
10778
10886
  {
@@ -10781,32 +10889,44 @@ var showtimePill = defineButtonPersonality({
10781
10889
  enabled: true,
10782
10890
  priority: 3,
10783
10891
  background: { type: "transparent" },
10784
- textColorToken: "primary",
10785
- borderRadius: "rounded-full",
10892
+ textColorToken: "accent",
10893
+ borderRadius: "rounded-none",
10894
+ sizes: {
10895
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
10896
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
10897
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
10898
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
10899
+ },
10786
10900
  effects: {
10787
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10901
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
10788
10902
  }
10789
10903
  }
10790
10904
  ]
10791
10905
  }
10792
10906
  });
10793
10907
 
10794
- // ../theme-core/src/buttons/personalities/soft-pill.ts
10795
- var softPill = defineButtonPersonality({
10796
- id: "soft-pill",
10797
- name: "Soft Pill",
10798
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
10799
- tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
10908
+ // ../theme-core/src/buttons/personalities/pebble.ts
10909
+ var pebble = defineButtonPersonality({
10910
+ id: "pebble",
10911
+ name: "Pebble",
10912
+ description: "Generous pill buttons with a quiet colour-softening hover.",
10913
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
10800
10914
  buttonSystem: {
10801
10915
  global: {
10802
10916
  cornerStyle: "pill",
10803
- shadow: "low",
10917
+ shadow: "none",
10804
10918
  textTransform: "none",
10805
10919
  fontWeight: 500,
10806
10920
  borderWidth: 2,
10807
- hoverTransform: "lift",
10921
+ hoverTransform: "none",
10808
10922
  hoverColor: "none"
10809
10923
  },
10924
+ sizes: {
10925
+ sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
10926
+ md: { padding: "0.875rem 2.25rem" },
10927
+ lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
10928
+ xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
10929
+ },
10810
10930
  variants: [
10811
10931
  {
10812
10932
  id: "primary",
@@ -10816,10 +10936,10 @@ var softPill = defineButtonPersonality({
10816
10936
  background: { type: "solid", colorToken: "primary" },
10817
10937
  textColorToken: "primaryForeground",
10818
10938
  borderRadius: "rounded-full",
10819
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
10820
10939
  effects: {
10821
- hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
10822
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
10940
+ hover: [
10941
+ { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 88 } }
10942
+ ]
10823
10943
  }
10824
10944
  },
10825
10945
  {
@@ -10830,9 +10950,193 @@ var softPill = defineButtonPersonality({
10830
10950
  background: { type: "transparent" },
10831
10951
  textColorToken: "primary",
10832
10952
  borderRadius: "rounded-full",
10833
- border: { widthClass: "border-2", colorToken: "primary" },
10953
+ border: { widthClass: "border-2", colorToken: "accent" },
10834
10954
  effects: {
10835
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10955
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
10956
+ }
10957
+ },
10958
+ {
10959
+ id: "outline",
10960
+ name: "Outline",
10961
+ enabled: true,
10962
+ priority: 3,
10963
+ background: { type: "transparent" },
10964
+ textColorToken: "text",
10965
+ borderRadius: "rounded-full",
10966
+ border: { widthClass: "border", colorToken: "border" },
10967
+ effects: {
10968
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10969
+ }
10970
+ },
10971
+ {
10972
+ id: "ghost",
10973
+ name: "Ghost",
10974
+ enabled: true,
10975
+ priority: 3,
10976
+ background: { type: "transparent" },
10977
+ textColorToken: "primary",
10978
+ borderRadius: "rounded-full",
10979
+ sizes: {
10980
+ sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
10981
+ md: { padding: "0.5rem 1rem" },
10982
+ lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
10983
+ xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
10984
+ },
10985
+ effects: {
10986
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
10987
+ }
10988
+ }
10989
+ ]
10990
+ }
10991
+ });
10992
+
10993
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
10994
+ var showtimePill = defineButtonPersonality({
10995
+ id: "showtime-pill",
10996
+ name: "Showtime Pill",
10997
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
10998
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
10999
+ buttonSystem: {
11000
+ global: {
11001
+ cornerStyle: "pill",
11002
+ shadow: "low",
11003
+ textTransform: "uppercase",
11004
+ fontWeight: 700,
11005
+ borderWidth: 2,
11006
+ hoverTransform: "lift",
11007
+ hoverColor: "darken",
11008
+ typography: "body",
11009
+ paddingPreset: "spacious",
11010
+ italic: false
11011
+ },
11012
+ sizes: {
11013
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
11014
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
11015
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
11016
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
11017
+ },
11018
+ variants: [
11019
+ {
11020
+ id: "primary",
11021
+ name: "Primary",
11022
+ enabled: true,
11023
+ priority: 1,
11024
+ background: { type: "solid", colorToken: "primary" },
11025
+ textColorToken: "background",
11026
+ borderRadius: "rounded-full",
11027
+ effects: {
11028
+ hover: [{ effectId: "pop" }]
11029
+ }
11030
+ },
11031
+ {
11032
+ id: "secondary",
11033
+ name: "Secondary",
11034
+ enabled: true,
11035
+ priority: 2,
11036
+ background: { type: "transparent" },
11037
+ textColorToken: "primary",
11038
+ borderRadius: "rounded-full",
11039
+ border: { widthClass: "border-2", colorToken: "primary" },
11040
+ effects: {
11041
+ hover: [{ effectId: "pop" }]
11042
+ }
11043
+ },
11044
+ {
11045
+ id: "hero",
11046
+ name: "Hero",
11047
+ enabled: true,
11048
+ priority: 1,
11049
+ background: { type: "solid", colorToken: "secondary" },
11050
+ textColorToken: "primary",
11051
+ borderRadius: "rounded-full",
11052
+ effects: {
11053
+ hover: [{ effectId: "pop" }]
11054
+ }
11055
+ },
11056
+ {
11057
+ id: "header",
11058
+ name: "Header",
11059
+ enabled: true,
11060
+ priority: 2,
11061
+ background: { type: "solid", colorToken: "background" },
11062
+ textColorToken: "primary",
11063
+ borderRadius: "rounded-full",
11064
+ border: { widthClass: "border-2", colorToken: "primary" },
11065
+ effects: {
11066
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11067
+ }
11068
+ },
11069
+ {
11070
+ id: "outline",
11071
+ name: "Outline",
11072
+ enabled: true,
11073
+ priority: 3,
11074
+ background: { type: "transparent" },
11075
+ textColorToken: "primary",
11076
+ borderRadius: "rounded-full",
11077
+ border: { widthClass: "border-2", colorToken: "primary" },
11078
+ effects: {
11079
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
11080
+ }
11081
+ },
11082
+ {
11083
+ id: "ghost",
11084
+ name: "Ghost",
11085
+ enabled: true,
11086
+ priority: 3,
11087
+ background: { type: "transparent" },
11088
+ textColorToken: "primary",
11089
+ borderRadius: "rounded-full",
11090
+ effects: {
11091
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11092
+ }
11093
+ }
11094
+ ]
11095
+ }
11096
+ });
11097
+
11098
+ // ../theme-core/src/buttons/personalities/soft-pill.ts
11099
+ var softPill = defineButtonPersonality({
11100
+ id: "soft-pill",
11101
+ name: "Soft Pill",
11102
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
11103
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
11104
+ buttonSystem: {
11105
+ global: {
11106
+ cornerStyle: "pill",
11107
+ shadow: "low",
11108
+ textTransform: "none",
11109
+ fontWeight: 500,
11110
+ borderWidth: 2,
11111
+ hoverTransform: "lift",
11112
+ hoverColor: "none"
11113
+ },
11114
+ variants: [
11115
+ {
11116
+ id: "primary",
11117
+ name: "Primary",
11118
+ enabled: true,
11119
+ priority: 1,
11120
+ background: { type: "solid", colorToken: "primary" },
11121
+ textColorToken: "primaryForeground",
11122
+ borderRadius: "rounded-full",
11123
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
11124
+ effects: {
11125
+ hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
11126
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
11127
+ }
11128
+ },
11129
+ {
11130
+ id: "secondary",
11131
+ name: "Secondary",
11132
+ enabled: true,
11133
+ priority: 2,
11134
+ background: { type: "transparent" },
11135
+ textColorToken: "primary",
11136
+ borderRadius: "rounded-full",
11137
+ border: { widthClass: "border-2", colorToken: "primary" },
11138
+ effects: {
11139
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10836
11140
  }
10837
11141
  },
10838
11142
  {
@@ -10874,7 +11178,8 @@ var buttonPersonalities = [
10874
11178
  inkStamp,
10875
11179
  brushedWash,
10876
11180
  showtimePill,
10877
- joyStamp
11181
+ joyStamp,
11182
+ ornateRitual
10878
11183
  ];
10879
11184
  var personalitiesById = new Map(
10880
11185
  buttonPersonalities.map((p) => [p.id, p])
@@ -11504,7 +11809,7 @@ function rgbColorValue(token) {
11504
11809
  if (alpha === void 0) {
11505
11810
  return `rgb(var(${cssVar}))`;
11506
11811
  }
11507
- return `rgba(var(${cssVar}), ${alpha})`;
11812
+ return `rgb(var(${cssVar}) / ${alpha})`;
11508
11813
  }
11509
11814
  function backgroundColorStyle(token) {
11510
11815
  return { backgroundColor: rgbColorValue(token) };
@@ -12609,6 +12914,28 @@ var warmDarkEmber = definePaletteVariant({
12609
12914
  { name: "border", hex: "#894e31" }
12610
12915
  ]
12611
12916
  });
12917
+ var warmDarkKirtanGold = definePaletteVariant({
12918
+ id: "warm-dark-kirtan-gold",
12919
+ name: "Warm Dark \u2014 Kirtan Gold",
12920
+ description: "Deep plum ground with pale gold primary, rose accent, and soft devotional text.",
12921
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
12922
+ mode: "dark",
12923
+ colors: [
12924
+ { name: "primary", hex: "#ffcdb2" },
12925
+ { name: "secondary", hex: "#b5838d" },
12926
+ { name: "accent", hex: "#e5989b" },
12927
+ { name: "success", hex: "#8fbf8f" },
12928
+ { name: "warning", hex: "#f2b86b" },
12929
+ { name: "destructive", hex: "#d96b6b" },
12930
+ { name: "background", hex: "#403944" },
12931
+ { name: "surface", hex: "#403944" },
12932
+ { name: "surfaceAlt", hex: "#372f3b" },
12933
+ { name: "muted", hex: "#4d4550" },
12934
+ { name: "text", hex: "#e6d2d5" },
12935
+ { name: "primaryForeground", hex: "#403944" },
12936
+ { name: "border", hex: "#8d747a" }
12937
+ ]
12938
+ });
12612
12939
 
12613
12940
  // ../theme-core/src/palette/variants/index.ts
12614
12941
  var paletteVariants = [
@@ -12632,7 +12959,8 @@ var paletteVariants = [
12632
12959
  softNaturalWatercolor,
12633
12960
  softNaturalLilac,
12634
12961
  // Warm-dark family (dark mode)
12635
- warmDarkEmber
12962
+ warmDarkEmber,
12963
+ warmDarkKirtanGold
12636
12964
  ];
12637
12965
  var paletteVariantsById = new Map(
12638
12966
  paletteVariants.map((v) => [v.id, v])
@@ -14201,9 +14529,125 @@ function headerConfigurationKey(configuration) {
14201
14529
  function asFooterLookId(value) {
14202
14530
  return value;
14203
14531
  }
14204
- var guaranteedFallbackFooterLookId = asFooterLookId("footer-muted-grounding");
14532
+ function asFooterLayoutId(value) {
14533
+ return value;
14534
+ }
14535
+ function asFooterStyleId(value) {
14536
+ return value;
14537
+ }
14538
+ var guaranteedFallbackFooterLookId = asFooterLookId("footer-identity-quiet");
14539
+ var footerLayoutCatalog = defineExactCatalog()([
14540
+ {
14541
+ id: asFooterLayoutId("identity"),
14542
+ label: "Identity",
14543
+ description: "Logo, site text, address, and legal copy without relying on footer navigation."
14544
+ },
14545
+ {
14546
+ id: asFooterLayoutId("centered"),
14547
+ label: "Centered",
14548
+ description: "A calm centered stack for identity, short copy, and optional compact navigation.",
14549
+ maxRecommendedNavDensity: "sparse"
14550
+ },
14551
+ {
14552
+ id: asFooterLayoutId("split"),
14553
+ label: "Split",
14554
+ description: "Navigation and brand signoff separated into a wider split footer.",
14555
+ requiresFooterNav: true,
14556
+ maxRecommendedNavDensity: "balanced"
14557
+ },
14558
+ {
14559
+ id: asFooterLayoutId("columns"),
14560
+ label: "Columns",
14561
+ description: "Grouped footer navigation columns with a supporting bottom line.",
14562
+ requiresFooterNav: true,
14563
+ requiresFooterNavGroups: true
14564
+ }
14565
+ ]);
14566
+ var footerStyleCatalog = defineExactCatalog()([
14567
+ {
14568
+ id: asFooterStyleId("quiet"),
14569
+ label: "Quiet",
14570
+ description: "Lightweight, practical footer treatment."
14571
+ },
14572
+ {
14573
+ id: asFooterStyleId("calm"),
14574
+ label: "Calm",
14575
+ description: "Soft centered treatment with restrained dividers."
14576
+ },
14577
+ {
14578
+ id: asFooterStyleId("editorial"),
14579
+ label: "Editorial",
14580
+ description: "Text-forward treatment with fine-line structure."
14581
+ },
14582
+ {
14583
+ id: asFooterStyleId("brand-band"),
14584
+ label: "Brand band",
14585
+ description: "High-contrast brand treatment with a stronger bottom bar."
14586
+ }
14587
+ ]);
14588
+ var footerLayoutsById = new Map(
14589
+ footerLayoutCatalog.map((layout) => [layout.id, layout])
14590
+ );
14591
+ var footerStylesById = new Map(
14592
+ footerStyleCatalog.map((style) => [style.id, style])
14593
+ );
14594
+ function identityQuietFooter(theme) {
14595
+ return {
14596
+ ...theme.footer,
14597
+ variant: "simple",
14598
+ maxWidth: "container",
14599
+ background: {
14600
+ type: "color",
14601
+ color: "surface"
14602
+ },
14603
+ navStyle: "minimal",
14604
+ navWeight: "regular",
14605
+ navColor: "text",
14606
+ navLinkStyle: {
14607
+ typography: "body",
14608
+ fontWeight: "regular",
14609
+ textTransform: "none",
14610
+ italic: false,
14611
+ colorToken: "text",
14612
+ hoverColorToken: "primary",
14613
+ padding: "none",
14614
+ borderRadius: "none"
14615
+ },
14616
+ navLayout: {
14617
+ layout: "inline-wrap",
14618
+ align: "start",
14619
+ gapX: "default",
14620
+ gapY: "tight"
14621
+ },
14622
+ logo: {
14623
+ showLogo: true,
14624
+ showLogoText: true,
14625
+ placement: "left",
14626
+ size: "sm",
14627
+ align: "start"
14628
+ },
14629
+ bottomBar: {
14630
+ enabled: false,
14631
+ fullBleed: false,
14632
+ textAlign: "left",
14633
+ paddingX: "default",
14634
+ paddingY: "compact",
14635
+ borderTop: {
14636
+ width: "none"
14637
+ }
14638
+ }
14639
+ };
14640
+ }
14205
14641
  function mutedGroundingFooter(theme) {
14206
- return theme.footer;
14642
+ return {
14643
+ ...identityQuietFooter(theme),
14644
+ background: theme.footer.background,
14645
+ navStyle: theme.footer.navStyle,
14646
+ navColor: theme.footer.navColor,
14647
+ navWeight: theme.footer.navWeight,
14648
+ navLinkStyle: theme.footer.navLinkStyle,
14649
+ bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
14650
+ };
14207
14651
  }
14208
14652
  function brandTwoBandFooter(theme) {
14209
14653
  return {
@@ -14308,6 +14752,53 @@ function centeredCalmFooter(theme) {
14308
14752
  }
14309
14753
  };
14310
14754
  }
14755
+ function splitEditorialFooter(theme) {
14756
+ return {
14757
+ ...theme.footer,
14758
+ variant: "split",
14759
+ maxWidth: "container",
14760
+ background: {
14761
+ type: "color",
14762
+ color: "surface"
14763
+ },
14764
+ navStyle: "minimal",
14765
+ navWeight: "regular",
14766
+ navColor: "text",
14767
+ navLinkStyle: {
14768
+ typography: "body",
14769
+ fontWeight: "regular",
14770
+ textTransform: "none",
14771
+ italic: false,
14772
+ colorToken: "text",
14773
+ hoverColorToken: "primary",
14774
+ padding: "none",
14775
+ borderRadius: "none"
14776
+ },
14777
+ navLayout: {
14778
+ layout: "inline-wrap",
14779
+ align: "start",
14780
+ gapX: "relaxed",
14781
+ gapY: "tight"
14782
+ },
14783
+ logo: {
14784
+ showLogo: true,
14785
+ showLogoText: true,
14786
+ placement: "right",
14787
+ size: "sm",
14788
+ align: "end"
14789
+ },
14790
+ bottomBar: {
14791
+ enabled: true,
14792
+ fullBleed: false,
14793
+ textAlign: "left",
14794
+ paddingX: "default",
14795
+ paddingY: "compact",
14796
+ borderTop: {
14797
+ width: "thin"
14798
+ }
14799
+ }
14800
+ };
14801
+ }
14311
14802
  function editorialColumnsFooter(theme) {
14312
14803
  return {
14313
14804
  ...theme.footer,
@@ -14350,25 +14841,47 @@ function editorialColumnsFooter(theme) {
14350
14841
  };
14351
14842
  }
14352
14843
  var footerLookCatalog = defineExactCatalog()([
14844
+ {
14845
+ id: asFooterLookId("footer-identity-quiet"),
14846
+ label: "Identity footer",
14847
+ layoutId: asFooterLayoutId("identity"),
14848
+ styleId: asFooterStyleId("quiet"),
14849
+ compile: identityQuietFooter
14850
+ },
14353
14851
  {
14354
14852
  id: asFooterLookId("footer-muted-grounding"),
14355
14853
  label: "Muted grounding footer",
14854
+ layoutId: asFooterLayoutId("identity"),
14855
+ styleId: asFooterStyleId("quiet"),
14856
+ hiddenFromLayoutStyleControls: true,
14356
14857
  compile: mutedGroundingFooter
14357
14858
  },
14358
14859
  {
14359
14860
  id: asFooterLookId("footer-centered-calm"),
14360
14861
  label: "Centered calm footer",
14862
+ layoutId: asFooterLayoutId("centered"),
14863
+ styleId: asFooterStyleId("calm"),
14361
14864
  compile: centeredCalmFooter
14362
14865
  },
14866
+ {
14867
+ id: asFooterLookId("footer-split-editorial"),
14868
+ label: "Split editorial footer",
14869
+ layoutId: asFooterLayoutId("split"),
14870
+ styleId: asFooterStyleId("editorial"),
14871
+ compile: splitEditorialFooter
14872
+ },
14363
14873
  {
14364
14874
  id: asFooterLookId("footer-editorial-columns"),
14365
14875
  label: "Editorial columns footer",
14876
+ layoutId: asFooterLayoutId("columns"),
14877
+ styleId: asFooterStyleId("editorial"),
14366
14878
  compile: editorialColumnsFooter
14367
14879
  },
14368
14880
  {
14369
14881
  id: asFooterLookId("site-footer-brand-two-band"),
14370
14882
  label: "Two-band brand footer",
14371
- maxRecommendedNavDensity: "balanced",
14883
+ layoutId: asFooterLayoutId("split"),
14884
+ styleId: asFooterStyleId("brand-band"),
14372
14885
  allowedContentPresence: ["default-footer", "default-and-blocks"],
14373
14886
  compile: brandTwoBandFooter
14374
14887
  }
@@ -14571,6 +15084,30 @@ var luxeContrastTypography = {
14571
15084
  },
14572
15085
  scale: "spacious"
14573
15086
  };
15087
+ var kirtanOrnateTypography = {
15088
+ body: {
15089
+ family: "Jost, system-ui, sans-serif",
15090
+ size: "md",
15091
+ weight: "regular",
15092
+ lineHeight: "relaxed",
15093
+ letterSpacing: "normal"
15094
+ },
15095
+ headings: {
15096
+ default: {
15097
+ family: "Marcellus, Georgia, serif",
15098
+ weight: "regular",
15099
+ lineHeight: "normal",
15100
+ letterSpacing: "normal",
15101
+ colorToken: "primary",
15102
+ italic: null,
15103
+ case: null
15104
+ },
15105
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15106
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15107
+ h3: { size: "md", weight: "regular", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
15108
+ },
15109
+ scale: "spacious"
15110
+ };
14574
15111
  var boldDisplayTypography = {
14575
15112
  body: {
14576
15113
  family: "Manrope, system-ui, sans-serif",
@@ -14605,16 +15142,16 @@ var originalJoyTypography = {
14605
15142
  },
14606
15143
  headings: {
14607
15144
  default: {
14608
- family: "Bricolage Grotesque, system-ui, sans-serif",
14609
- weight: "bold",
15145
+ family: "Lobster, cursive",
15146
+ weight: "regular",
14610
15147
  lineHeight: "normal",
14611
- letterSpacing: "tight",
15148
+ letterSpacing: "normal",
14612
15149
  italic: null,
14613
15150
  case: null
14614
15151
  },
14615
- h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
14616
- h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
14617
- h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
15152
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15153
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15154
+ h3: { size: "lg", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null }
14618
15155
  },
14619
15156
  scale: "balanced"
14620
15157
  };
@@ -14679,6 +15216,32 @@ var typographyPresets = [
14679
15216
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
14680
15217
  typography: luxeContrastTypography
14681
15218
  }),
15219
+ defineTypographyPreset({
15220
+ id: "typography-preset:kirtan-ornate",
15221
+ name: "Kirtan Ornate",
15222
+ description: "Marcellus devotional headings over a refined Jost body, matching dark ceremonial layouts.",
15223
+ defaultFonts: { body: "Jost, system-ui, sans-serif", heading: "Marcellus, Georgia, serif" },
15224
+ recommendedFonts: {
15225
+ body: ["Jost", "Manrope", "Inter"],
15226
+ heading: ["Marcellus", "Cormorant Garamond", "Playfair Display"]
15227
+ },
15228
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
15229
+ typography: kirtanOrnateTypography,
15230
+ heroTypography: {
15231
+ headlineSize: "6xl",
15232
+ headlineLineHeight: "normal",
15233
+ subheadlineSize: "xl",
15234
+ subheadlineLineHeight: "relaxed",
15235
+ microHeadlineSize: "5xl",
15236
+ microHeadlineLineHeight: "normal",
15237
+ microSubheadlineSize: "lg",
15238
+ microSubheadlineLineHeight: "relaxed",
15239
+ responsive: {
15240
+ tablet: { headlineSize: "5xl" },
15241
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
15242
+ }
15243
+ }
15244
+ }),
14682
15245
  defineTypographyPreset({
14683
15246
  id: "typography-preset:bold-display",
14684
15247
  name: "Bold Display",
@@ -14708,11 +15271,11 @@ var typographyPresets = [
14708
15271
  defineTypographyPreset({
14709
15272
  id: "typography-preset:original-joy",
14710
15273
  name: "Original Joy",
14711
- description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
14712
- defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
15274
+ description: "Lobster display headings over a clean DM Sans body, expressive and warm.",
15275
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Lobster, cursive" },
14713
15276
  recommendedFonts: {
14714
15277
  body: ["DM Sans", "Inter", "Manrope"],
14715
- heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
15278
+ heading: ["Lobster", "Bricolage Grotesque", "Space Grotesk"]
14716
15279
  },
14717
15280
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
14718
15281
  typography: originalJoyTypography,
@@ -14736,6 +15299,319 @@ var typographyPresetsById = new Map(
14736
15299
  typographyPresets.map((preset2) => [preset2.id, preset2])
14737
15300
  );
14738
15301
 
15302
+ // ../theme-core/src/site-styles/designState.ts
15303
+ import { z as z24 } from "zod";
15304
+ var themeV2DesignStateSchemaVersion = 1;
15305
+ var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
15306
+ var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
15307
+ var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
15308
+ fields3[0],
15309
+ ...fields3.slice(1)
15310
+ ]);
15311
+ var heroLegibilityStrategySchema = z24.enum([
15312
+ "none",
15313
+ "scrim-gradient",
15314
+ "solid-panel"
15315
+ ]);
15316
+ var heroCompositionIntentSchema = z24.enum([
15317
+ "center",
15318
+ "bottom-left"
15319
+ ]);
15320
+ var heroTypographyScaleIntentSchema = z24.enum([
15321
+ "quiet",
15322
+ "editorial",
15323
+ "display",
15324
+ "poster"
15325
+ ]);
15326
+ var sectionHeightIntentSchema = z24.enum([
15327
+ "default",
15328
+ "banner",
15329
+ "hero",
15330
+ "immersive"
15331
+ ]);
15332
+ var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
15333
+ var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
15334
+ var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
15335
+ z24.object({ kind: z24.literal("none") }).strict(),
15336
+ z24.object({
15337
+ kind: z24.literal("brand-scrim"),
15338
+ token: z24.enum(["primary", "secondary", "accent"]),
15339
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15340
+ }).strict(),
15341
+ z24.object({
15342
+ kind: z24.literal("brand-wash"),
15343
+ token: z24.enum(["primary", "secondary", "accent"]),
15344
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15345
+ }).strict(),
15346
+ z24.object({
15347
+ kind: z24.literal("neutral-scrim"),
15348
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15349
+ }).strict(),
15350
+ z24.object({
15351
+ kind: z24.literal("neutral-wash"),
15352
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15353
+ }).strict(),
15354
+ z24.object({
15355
+ kind: z24.literal("solid-panel"),
15356
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15357
+ }).strict()
15358
+ ]);
15359
+ var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
15360
+ var tileTreatmentSchema = z24.enum(tileTreatmentValues);
15361
+ var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
15362
+ var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
15363
+ function uniqueNonEmpty(values) {
15364
+ const uniqueValues = [...new Set(values)];
15365
+ const firstValue = uniqueValues[0];
15366
+ if (!firstValue) {
15367
+ throw new Error("Expected at least one Theme V2 design state option.");
15368
+ }
15369
+ return [firstValue, ...uniqueValues.slice(1)];
15370
+ }
15371
+ var userPanelTreatments = uniqueNonEmpty(
15372
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
15373
+ );
15374
+ var userFlushTreatments = uniqueNonEmpty(
15375
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
15376
+ );
15377
+ var userFlushBleeds = uniqueNonEmpty(
15378
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
15379
+ );
15380
+ var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
15381
+ z24.object({ kind: z24.literal("plain") }).strict(),
15382
+ z24.object({
15383
+ kind: z24.literal("panel"),
15384
+ treatment: z24.enum(userPanelTreatments)
15385
+ }).strict(),
15386
+ z24.object({
15387
+ kind: z24.literal("flush-panel"),
15388
+ treatment: z24.enum(userFlushTreatments),
15389
+ bleed: z24.enum(userFlushBleeds)
15390
+ }).strict()
15391
+ ]);
15392
+ var blockDesignPlanSchema = z24.object({
15393
+ blockId: z24.string().min(1).transform(asDesignBlockId),
15394
+ blockKind: z24.string().min(1),
15395
+ purpose: z24.string().min(1),
15396
+ sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
15397
+ contentFrame: contentFrameIntentSchema,
15398
+ itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
15399
+ transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
15400
+ emphasis: z24.enum(userDesignOptionCatalog.emphases),
15401
+ sectionHeight: sectionHeightIntentSchema.optional(),
15402
+ heroLegibility: heroLegibilityStrategySchema.optional(),
15403
+ heroComposition: heroCompositionIntentSchema.optional(),
15404
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
15405
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
15406
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
15407
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
15408
+ tileTreatment: tileTreatmentSchema.optional(),
15409
+ eventListTreatment: eventListTreatmentSchema.optional(),
15410
+ eyebrowTreatment: eyebrowTreatmentSchema.optional()
15411
+ }).strict();
15412
+ var styleAuthoritySchema = z24.discriminatedUnion("kind", [
15413
+ z24.object({
15414
+ kind: z24.literal("theme-v2"),
15415
+ source: designResolutionPolicySchema,
15416
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
15417
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
15418
+ templateVersion: z24.number().int().nonnegative(),
15419
+ resolverVersion: z24.number().int().nonnegative()
15420
+ }).strict(),
15421
+ z24.object({
15422
+ kind: z24.literal("legacy-raw"),
15423
+ reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
15424
+ }).strict(),
15425
+ z24.object({
15426
+ kind: z24.literal("advanced-detached"),
15427
+ reason: z24.literal("detached-custom-runtime-fields")
15428
+ }).strict()
15429
+ ]);
15430
+ var blockRuntimeStyleAuthoritySchema = z24.object({
15431
+ unit: z24.literal("block-runtime-fields"),
15432
+ blockId: z24.string().min(1).transform(asDesignBlockId),
15433
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
15434
+ authority: styleAuthoritySchema
15435
+ }).strict();
15436
+ var persistedPageDesignStateV1Schema = z24.object({
15437
+ schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
15438
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
15439
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
15440
+ templateVersion: z24.number().int().nonnegative(),
15441
+ resolverVersion: z24.number().int().nonnegative(),
15442
+ rhythmPresetId: z24.string().min(1),
15443
+ blocks: z24.array(blockDesignPlanSchema),
15444
+ styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
15445
+ }).strict();
15446
+
15447
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
15448
+ function defineDesignRuntimeRules(rules) {
15449
+ return rules;
15450
+ }
15451
+ function defineComponentRuntimeRules(rules) {
15452
+ return rules;
15453
+ }
15454
+ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
15455
+ sectionSurfaces: {
15456
+ base: {},
15457
+ "muted-band": {
15458
+ background: {
15459
+ type: "color",
15460
+ color: "muted"
15461
+ }
15462
+ },
15463
+ "accent-band": {
15464
+ background: {
15465
+ type: "color",
15466
+ color: "primary"
15467
+ }
15468
+ },
15469
+ "brand-depth-band": {
15470
+ background: {
15471
+ type: "color",
15472
+ color: "primary-800"
15473
+ }
15474
+ },
15475
+ "hero-image": {
15476
+ background: {
15477
+ type: "image",
15478
+ opacity: 1,
15479
+ position: "center center",
15480
+ ...uniformSectionForeground("text")
15481
+ }
15482
+ }
15483
+ },
15484
+ heroLegibility: {
15485
+ "scrim-gradient": {
15486
+ type: "gradient",
15487
+ gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
15488
+ opacity: 1
15489
+ },
15490
+ "solid-panel": {
15491
+ type: "color",
15492
+ color: "surface",
15493
+ opacity: 0.88
15494
+ }
15495
+ },
15496
+ transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
15497
+ });
15498
+ var defaultComponentRuntimeRules = defineComponentRuntimeRules({
15499
+ panelFrames: {
15500
+ inset: {
15501
+ spacing: "comfortable",
15502
+ rounded: "xl",
15503
+ raised: false,
15504
+ background: {
15505
+ type: "color",
15506
+ color: "surfaceAlt",
15507
+ textColor: "text"
15508
+ }
15509
+ },
15510
+ raised: {
15511
+ spacing: "comfortable",
15512
+ rounded: "xl",
15513
+ raised: true,
15514
+ background: {
15515
+ type: "color",
15516
+ color: "surfaceAlt",
15517
+ textColor: "text"
15518
+ }
15519
+ },
15520
+ editorial: {
15521
+ spacing: "medium",
15522
+ rounded: "xl",
15523
+ raised: false,
15524
+ background: {
15525
+ type: "color",
15526
+ color: "surface",
15527
+ textColor: "text"
15528
+ }
15529
+ }
15530
+ },
15531
+ flushFrames: {
15532
+ "media-panel": {
15533
+ fullWidth: true,
15534
+ spacing: "none",
15535
+ rounded: "none",
15536
+ raised: false
15537
+ }
15538
+ },
15539
+ itemSurfaces: {
15540
+ none: null,
15541
+ default: {
15542
+ spacing: "medium",
15543
+ rounded: "lg",
15544
+ raised: false
15545
+ },
15546
+ flat: {
15547
+ spacing: "medium",
15548
+ rounded: "lg",
15549
+ raised: false
15550
+ },
15551
+ outlined: {
15552
+ spacing: "medium",
15553
+ rounded: "lg",
15554
+ raised: false,
15555
+ border: {
15556
+ enabled: true,
15557
+ width: "1",
15558
+ colorToken: "border"
15559
+ }
15560
+ },
15561
+ raised: {
15562
+ spacing: "medium",
15563
+ rounded: "xl",
15564
+ raised: true
15565
+ },
15566
+ inset: {
15567
+ treatment: "soft-panel",
15568
+ spacing: "comfortable",
15569
+ rounded: "xl",
15570
+ raised: false,
15571
+ border: {
15572
+ enabled: false
15573
+ },
15574
+ background: {
15575
+ type: "color",
15576
+ color: "surfaceAlt",
15577
+ textColor: "text"
15578
+ }
15579
+ },
15580
+ editorial: {
15581
+ // Boxless open column with a short rule on top; the visual treatment
15582
+ // lives in blocks-static/card-treatments.css.
15583
+ treatment: "editorial-rule",
15584
+ spacing: "none",
15585
+ rounded: "none",
15586
+ raised: false,
15587
+ border: {
15588
+ enabled: false
15589
+ }
15590
+ },
15591
+ "color-blocked": {
15592
+ // Bold, flat colour-blocked cards. The per-card background colour cycle
15593
+ // (by position) and staggered offset live in
15594
+ // blocks-static/card-treatments.css; here we set the shared shape:
15595
+ // generous padding, large radius, no border, flat (no shadow).
15596
+ treatment: "color-blocked",
15597
+ spacing: "spacious",
15598
+ rounded: "2xl",
15599
+ raised: false,
15600
+ border: {
15601
+ enabled: false
15602
+ }
15603
+ }
15604
+ }
15605
+ });
15606
+ function uniformSectionForeground(token) {
15607
+ return {
15608
+ textColor: token,
15609
+ headingColor: token,
15610
+ linkColor: token,
15611
+ supportingColor: token
15612
+ };
15613
+ }
15614
+
14739
15615
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
14740
15616
  var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
14741
15617
  var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
@@ -14754,6 +15630,7 @@ var curatedSiteStyleIdValues = [
14754
15630
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
14755
15631
  "site-style:bold-launch",
14756
15632
  "site-style:south-west-twerk-school",
15633
+ "site-style:kirtan-ornate",
14757
15634
  "site-style:original-joy"
14758
15635
  ];
14759
15636
  var quietBudget = {
@@ -14780,6 +15657,50 @@ var expressiveBudget = {
14780
15657
  mediaDensity: "high",
14781
15658
  decorativeRepetition: "medium"
14782
15659
  };
15660
+ var kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
15661
+ ...defaultDesignRuntimeRules,
15662
+ defaultEyebrowTreatment: "accent",
15663
+ sectionSurfaces: {
15664
+ ...defaultDesignRuntimeRules.sectionSurfaces,
15665
+ "muted-band": {
15666
+ background: {
15667
+ type: "color",
15668
+ color: "muted"
15669
+ },
15670
+ foreground: {
15671
+ textColor: "text",
15672
+ headingColor: "primary",
15673
+ linkColor: "primary",
15674
+ supportingColor: "text"
15675
+ }
15676
+ },
15677
+ "brand-depth-band": {
15678
+ background: {
15679
+ type: "color",
15680
+ color: "primary-800"
15681
+ },
15682
+ foreground: {
15683
+ textColor: "text",
15684
+ headingColor: "primary",
15685
+ linkColor: "primary",
15686
+ supportingColor: "text"
15687
+ }
15688
+ },
15689
+ "hero-image": {
15690
+ background: {
15691
+ type: "image",
15692
+ opacity: 1,
15693
+ position: "center center"
15694
+ },
15695
+ foreground: {
15696
+ textColor: "text",
15697
+ headingColor: "primary",
15698
+ linkColor: "primary",
15699
+ supportingColor: "text"
15700
+ }
15701
+ }
15702
+ }
15703
+ });
14783
15704
  var expressiveUnderlineInputs = {
14784
15705
  base: {
14785
15706
  background: { type: "transparent" },
@@ -14817,6 +15738,43 @@ var expressiveUnderlineInputs = {
14817
15738
  opacity: 0.6
14818
15739
  }
14819
15740
  };
15741
+ var ornateDarkInputs = {
15742
+ base: {
15743
+ background: { type: "solid", colorToken: "surfaceAlt" },
15744
+ textColorToken: "text",
15745
+ border: {
15746
+ widthClass: "border",
15747
+ colorToken: "primary/45",
15748
+ style: "all"
15749
+ },
15750
+ corners: "square",
15751
+ shadow: null,
15752
+ spacing: "medium",
15753
+ fontSize: "base"
15754
+ },
15755
+ label: {
15756
+ textColorToken: "primary",
15757
+ fontWeight: "semibold",
15758
+ fontSize: "xs",
15759
+ textTransform: "uppercase",
15760
+ letterSpacing: "wider",
15761
+ opacity: 1
15762
+ },
15763
+ focus: {
15764
+ ringColorToken: "primary/18",
15765
+ ringWidth: "2",
15766
+ borderColorToken: "primary/70"
15767
+ },
15768
+ error: {
15769
+ borderColorToken: "destructive",
15770
+ textColorToken: "destructive"
15771
+ },
15772
+ disabled: {
15773
+ backgroundColorToken: "muted",
15774
+ textColorToken: "mutedText",
15775
+ opacity: 0.6
15776
+ }
15777
+ };
14820
15778
  function uniqueContentFrameKinds() {
14821
15779
  const kinds = [
14822
15780
  ...new Set(
@@ -14874,6 +15832,7 @@ function defineCuratedSiteStyle(input) {
14874
15832
  // clean/minimal styles default to none.
14875
15833
  headingDecoration: input.headingDecoration ?? noHeadingDecoration,
14876
15834
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
15835
+ ...input.designRuntimeRules ? { designRuntimeRules: input.designRuntimeRules } : {},
14877
15836
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
14878
15837
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
14879
15838
  defaultHeaderSelection: input.defaultHeaderSelection ? {
@@ -15824,6 +16783,80 @@ var curatedSiteStyles = [
15824
16783
  paletteChoice("high-contrast-ink")
15825
16784
  ]
15826
16785
  }),
16786
+ defineCuratedSiteStyle({
16787
+ id: "site-style:kirtan-ornate",
16788
+ name: "Kirtan Ornate",
16789
+ headingDecoration: { family: "short-center-rule", colorToken: "accent" },
16790
+ description: "Ceremonial, jewel-toned, and devotional: ornate frames, warm contrast, and composed rhythm for intimate music gatherings.",
16791
+ 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.",
16792
+ selectionKeywordRules: [
16793
+ { kind: "word", value: "kirtan" },
16794
+ { kind: "word", value: "chanting" },
16795
+ { kind: "word", value: "ceremony" },
16796
+ { kind: "word", value: "devotional" }
16797
+ ],
16798
+ tokenRecipes: {
16799
+ palette: "brand-led",
16800
+ contrast: "strong",
16801
+ radius: "soft",
16802
+ shadow: "subtle",
16803
+ typography: "serif-editorial",
16804
+ spacing: "airy",
16805
+ motion: "subtle"
16806
+ },
16807
+ compositionBudget: expressiveBudget,
16808
+ typographyPresetChoices: [
16809
+ typographyChoice("typography-preset:kirtan-ornate"),
16810
+ typographyChoice("typography-preset:luxe-contrast"),
16811
+ typographyChoice("typography-preset:editorial-serif")
16812
+ ],
16813
+ defaultTypographyPresetId: "typography-preset:kirtan-ornate",
16814
+ themeOverrides: {
16815
+ accordions: warmInsetAccordionSystem,
16816
+ cards: originalJoyCardSystem,
16817
+ testimonialQuote: serifDisplayQuote,
16818
+ bodyText: {
16819
+ intro: {
16820
+ paragraphSize: "editorial",
16821
+ headingSize: "editorial"
16822
+ }
16823
+ },
16824
+ inputs: ornateDarkInputs
16825
+ },
16826
+ designRuntimeRules: kirtanOrnateDesignRuntimeRules,
16827
+ recommendedAppearancePresetIds: [
16828
+ "hero-brand-scrim-fixed-frame",
16829
+ "media-text-quiet-story",
16830
+ "events-lined-panel",
16831
+ "schedule-details-brand-depth",
16832
+ "testimonials-statement-cards",
16833
+ "contact-form-panel"
16834
+ ],
16835
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
16836
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
16837
+ recommendedHeaderStyleChoicesByLayout: {
16838
+ floating: [
16839
+ headerStyleChoice("minimal-surface"),
16840
+ headerStyleChoice("split-glass"),
16841
+ headerStyleChoice("glass")
16842
+ ]
16843
+ },
16844
+ recommendedHeaderLookIds: ["minimal-transparent"],
16845
+ recommendedFooterLookIds: [
16846
+ "site-footer-brand-two-band",
16847
+ "footer-muted-grounding"
16848
+ ],
16849
+ buttonPersonalityChoices: [
16850
+ buttonChoice("ornate-ritual"),
16851
+ buttonChoice("joy-stamp"),
16852
+ buttonChoice("ink-stamp")
16853
+ ],
16854
+ paletteVariantChoices: [
16855
+ paletteChoice("warm-dark-kirtan-gold"),
16856
+ paletteChoice("warm-dark-ember"),
16857
+ paletteChoice("brand-led-burgundy-gold")
16858
+ ]
16859
+ }),
15827
16860
  defineCuratedSiteStyle({
15828
16861
  id: "site-style:original-joy",
15829
16862
  name: "Original Joy",
@@ -15927,319 +16960,6 @@ var pageFlowPresets = [
15927
16960
  }
15928
16961
  ];
15929
16962
 
15930
- // ../theme-core/src/site-styles/designState.ts
15931
- import { z as z24 } from "zod";
15932
- var themeV2DesignStateSchemaVersion = 1;
15933
- var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
15934
- var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
15935
- var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
15936
- fields3[0],
15937
- ...fields3.slice(1)
15938
- ]);
15939
- var heroLegibilityStrategySchema = z24.enum([
15940
- "none",
15941
- "scrim-gradient",
15942
- "solid-panel"
15943
- ]);
15944
- var heroCompositionIntentSchema = z24.enum([
15945
- "center",
15946
- "bottom-left"
15947
- ]);
15948
- var heroTypographyScaleIntentSchema = z24.enum([
15949
- "quiet",
15950
- "editorial",
15951
- "display",
15952
- "poster"
15953
- ]);
15954
- var sectionHeightIntentSchema = z24.enum([
15955
- "default",
15956
- "banner",
15957
- "hero",
15958
- "immersive"
15959
- ]);
15960
- var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
15961
- var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
15962
- var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
15963
- z24.object({ kind: z24.literal("none") }).strict(),
15964
- z24.object({
15965
- kind: z24.literal("brand-scrim"),
15966
- token: z24.enum(["primary", "secondary", "accent"]),
15967
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
15968
- }).strict(),
15969
- z24.object({
15970
- kind: z24.literal("brand-wash"),
15971
- token: z24.enum(["primary", "secondary", "accent"]),
15972
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
15973
- }).strict(),
15974
- z24.object({
15975
- kind: z24.literal("neutral-scrim"),
15976
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
15977
- }).strict(),
15978
- z24.object({
15979
- kind: z24.literal("neutral-wash"),
15980
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
15981
- }).strict(),
15982
- z24.object({
15983
- kind: z24.literal("solid-panel"),
15984
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
15985
- }).strict()
15986
- ]);
15987
- var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
15988
- var tileTreatmentSchema = z24.enum(tileTreatmentValues);
15989
- var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
15990
- var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
15991
- function uniqueNonEmpty(values) {
15992
- const uniqueValues = [...new Set(values)];
15993
- const firstValue = uniqueValues[0];
15994
- if (!firstValue) {
15995
- throw new Error("Expected at least one Theme V2 design state option.");
15996
- }
15997
- return [firstValue, ...uniqueValues.slice(1)];
15998
- }
15999
- var userPanelTreatments = uniqueNonEmpty(
16000
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
16001
- );
16002
- var userFlushTreatments = uniqueNonEmpty(
16003
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
16004
- );
16005
- var userFlushBleeds = uniqueNonEmpty(
16006
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
16007
- );
16008
- var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
16009
- z24.object({ kind: z24.literal("plain") }).strict(),
16010
- z24.object({
16011
- kind: z24.literal("panel"),
16012
- treatment: z24.enum(userPanelTreatments)
16013
- }).strict(),
16014
- z24.object({
16015
- kind: z24.literal("flush-panel"),
16016
- treatment: z24.enum(userFlushTreatments),
16017
- bleed: z24.enum(userFlushBleeds)
16018
- }).strict()
16019
- ]);
16020
- var blockDesignPlanSchema = z24.object({
16021
- blockId: z24.string().min(1).transform(asDesignBlockId),
16022
- blockKind: z24.string().min(1),
16023
- purpose: z24.string().min(1),
16024
- sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
16025
- contentFrame: contentFrameIntentSchema,
16026
- itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
16027
- transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
16028
- emphasis: z24.enum(userDesignOptionCatalog.emphases),
16029
- sectionHeight: sectionHeightIntentSchema.optional(),
16030
- heroLegibility: heroLegibilityStrategySchema.optional(),
16031
- heroComposition: heroCompositionIntentSchema.optional(),
16032
- heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
16033
- imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
16034
- imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
16035
- testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
16036
- tileTreatment: tileTreatmentSchema.optional(),
16037
- eventListTreatment: eventListTreatmentSchema.optional(),
16038
- eyebrowTreatment: eyebrowTreatmentSchema.optional()
16039
- }).strict();
16040
- var styleAuthoritySchema = z24.discriminatedUnion("kind", [
16041
- z24.object({
16042
- kind: z24.literal("theme-v2"),
16043
- source: designResolutionPolicySchema,
16044
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
16045
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
16046
- templateVersion: z24.number().int().nonnegative(),
16047
- resolverVersion: z24.number().int().nonnegative()
16048
- }).strict(),
16049
- z24.object({
16050
- kind: z24.literal("legacy-raw"),
16051
- reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
16052
- }).strict(),
16053
- z24.object({
16054
- kind: z24.literal("advanced-detached"),
16055
- reason: z24.literal("detached-custom-runtime-fields")
16056
- }).strict()
16057
- ]);
16058
- var blockRuntimeStyleAuthoritySchema = z24.object({
16059
- unit: z24.literal("block-runtime-fields"),
16060
- blockId: z24.string().min(1).transform(asDesignBlockId),
16061
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
16062
- authority: styleAuthoritySchema
16063
- }).strict();
16064
- var persistedPageDesignStateV1Schema = z24.object({
16065
- schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
16066
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
16067
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
16068
- templateVersion: z24.number().int().nonnegative(),
16069
- resolverVersion: z24.number().int().nonnegative(),
16070
- rhythmPresetId: z24.string().min(1),
16071
- blocks: z24.array(blockDesignPlanSchema),
16072
- styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
16073
- }).strict();
16074
-
16075
- // ../theme-core/src/site-styles/runtimeCompiler.ts
16076
- function defineDesignRuntimeRules(rules) {
16077
- return rules;
16078
- }
16079
- function defineComponentRuntimeRules(rules) {
16080
- return rules;
16081
- }
16082
- var defaultDesignRuntimeRules = defineDesignRuntimeRules({
16083
- sectionSurfaces: {
16084
- base: {},
16085
- "muted-band": {
16086
- background: {
16087
- type: "color",
16088
- color: "muted"
16089
- }
16090
- },
16091
- "accent-band": {
16092
- background: {
16093
- type: "color",
16094
- color: "primary"
16095
- }
16096
- },
16097
- "brand-depth-band": {
16098
- background: {
16099
- type: "color",
16100
- color: "primary-800"
16101
- }
16102
- },
16103
- "hero-image": {
16104
- background: {
16105
- type: "image",
16106
- opacity: 1,
16107
- position: "center center",
16108
- ...uniformSectionForeground("text")
16109
- }
16110
- }
16111
- },
16112
- heroLegibility: {
16113
- "scrim-gradient": {
16114
- type: "gradient",
16115
- gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
16116
- opacity: 1
16117
- },
16118
- "solid-panel": {
16119
- type: "color",
16120
- color: "surface",
16121
- opacity: 0.88
16122
- }
16123
- },
16124
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
16125
- });
16126
- var defaultComponentRuntimeRules = defineComponentRuntimeRules({
16127
- panelFrames: {
16128
- inset: {
16129
- spacing: "comfortable",
16130
- rounded: "xl",
16131
- raised: false,
16132
- background: {
16133
- type: "color",
16134
- color: "surfaceAlt",
16135
- textColor: "text"
16136
- }
16137
- },
16138
- raised: {
16139
- spacing: "comfortable",
16140
- rounded: "xl",
16141
- raised: true,
16142
- background: {
16143
- type: "color",
16144
- color: "surfaceAlt",
16145
- textColor: "text"
16146
- }
16147
- },
16148
- editorial: {
16149
- spacing: "medium",
16150
- rounded: "xl",
16151
- raised: false,
16152
- background: {
16153
- type: "color",
16154
- color: "surface",
16155
- textColor: "text"
16156
- }
16157
- }
16158
- },
16159
- flushFrames: {
16160
- "media-panel": {
16161
- fullWidth: true,
16162
- spacing: "none",
16163
- rounded: "none",
16164
- raised: false
16165
- }
16166
- },
16167
- itemSurfaces: {
16168
- none: null,
16169
- default: {
16170
- spacing: "medium",
16171
- rounded: "lg",
16172
- raised: false
16173
- },
16174
- flat: {
16175
- spacing: "medium",
16176
- rounded: "lg",
16177
- raised: false
16178
- },
16179
- outlined: {
16180
- spacing: "medium",
16181
- rounded: "lg",
16182
- raised: false,
16183
- border: {
16184
- enabled: true,
16185
- width: "1",
16186
- colorToken: "border"
16187
- }
16188
- },
16189
- raised: {
16190
- spacing: "medium",
16191
- rounded: "xl",
16192
- raised: true
16193
- },
16194
- inset: {
16195
- treatment: "soft-panel",
16196
- spacing: "comfortable",
16197
- rounded: "xl",
16198
- raised: false,
16199
- border: {
16200
- enabled: false
16201
- },
16202
- background: {
16203
- type: "color",
16204
- color: "surfaceAlt",
16205
- textColor: "text"
16206
- }
16207
- },
16208
- editorial: {
16209
- // Boxless open column with a short rule on top; the visual treatment
16210
- // lives in blocks-static/card-treatments.css.
16211
- treatment: "editorial-rule",
16212
- spacing: "none",
16213
- rounded: "none",
16214
- raised: false,
16215
- border: {
16216
- enabled: false
16217
- }
16218
- },
16219
- "color-blocked": {
16220
- // Bold, flat colour-blocked cards. The per-card background colour cycle
16221
- // (by position) and staggered offset live in
16222
- // blocks-static/card-treatments.css; here we set the shared shape:
16223
- // generous padding, large radius, no border, flat (no shadow).
16224
- treatment: "color-blocked",
16225
- spacing: "spacious",
16226
- rounded: "2xl",
16227
- raised: false,
16228
- border: {
16229
- enabled: false
16230
- }
16231
- }
16232
- }
16233
- });
16234
- function uniformSectionForeground(token) {
16235
- return {
16236
- textColor: token,
16237
- headingColor: token,
16238
- linkColor: token,
16239
- supportingColor: token
16240
- };
16241
- }
16242
-
16243
16963
  // ../theme-core/src/site-styles/generatedSchemas.ts
16244
16964
  import { z as z25 } from "zod";
16245
16965
  function uniqueNonEmpty2(values) {
@@ -17051,6 +17771,31 @@ function cardStylesField(options = {}) {
17051
17771
  return createBoxStylesFieldWithDepth("card", options);
17052
17772
  }
17053
17773
 
17774
+ // ../blocks/src/system/fields/imageShape.ts
17775
+ var standardImageShapeOptions = [
17776
+ { value: "default", label: "Default" },
17777
+ { value: "square", label: "Square corners" },
17778
+ { value: "rounded", label: "Rounded corners" },
17779
+ { value: "circle", label: "Circle" },
17780
+ { value: "arch", label: "Arch" }
17781
+ ];
17782
+ function createImageShapeField(options = {}) {
17783
+ return {
17784
+ id: options.id ?? "imageShape",
17785
+ type: "select",
17786
+ label: options.label ?? "Image shape",
17787
+ ...options.description ? { description: options.description } : {},
17788
+ required: false,
17789
+ defaultValue: options.defaultValue ?? "default",
17790
+ multiple: false,
17791
+ options: [...standardImageShapeOptions],
17792
+ ui: {
17793
+ intent: options.uiIntent ?? "display",
17794
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
17795
+ }
17796
+ };
17797
+ }
17798
+
17054
17799
  // ../blocks/src/utils/env.ts
17055
17800
  function isDevEnvironment() {
17056
17801
  try {
@@ -17865,7 +18610,7 @@ function buildFooterNavAll(common) {
17865
18610
  return stack(
17866
18611
  { className: common.className, gap: common.gap, align: "stretch" },
17867
18612
  [item],
17868
- when(collectionPath)
18613
+ whenCollectionHasItems(collectionPath)
17869
18614
  );
17870
18615
  }
17871
18616
  function buildFooterNavLinksOnly(common) {
@@ -17898,7 +18643,7 @@ function buildFooterNavLinksOnly(common) {
17898
18643
  return stack(
17899
18644
  { className: common.className, gap: common.gap, align: "stretch" },
17900
18645
  [item],
17901
- when(collectionPath)
18646
+ whenCollectionHasItems(collectionPath)
17902
18647
  );
17903
18648
  }
17904
18649
  function buildFooterNavFlatten(common) {
@@ -17947,9 +18692,20 @@ function buildFooterNavFlatten(common) {
17947
18692
  return stack(
17948
18693
  { className: common.className, gap: common.gap, align: "stretch" },
17949
18694
  [item],
17950
- when(collectionPath)
18695
+ whenCollectionHasItems(collectionPath)
17951
18696
  );
17952
18697
  }
18698
+ var whenCollectionHasItems = (collectionPath) => (node) => ({
18699
+ ...node,
18700
+ $when: {
18701
+ when: {
18702
+ from: collectionPath,
18703
+ transforms: [{ id: "array.length" }]
18704
+ },
18705
+ equals: 0,
18706
+ not: true
18707
+ }
18708
+ });
17953
18709
  function footerNav(opts) {
17954
18710
  const mode = opts?.mode ?? "all";
17955
18711
  const collectionPath = opts?.collectionPath ?? "footerMenu.items";
@@ -20532,8 +21288,23 @@ function fragmentsToRepeaterField(id, label, fragments, options = {}) {
20532
21288
  var heroLayoutControlsFragment = defineFragment({
20533
21289
  id: "heroLayoutControls",
20534
21290
  title: "Hero Layout",
20535
- description: "Alignment and content width controls for hero layouts.",
21291
+ description: "Title scale, alignment, and content width controls for hero layouts.",
20536
21292
  fields: [
21293
+ {
21294
+ id: "titleSize",
21295
+ type: "select",
21296
+ label: "Title size",
21297
+ description: "Adjust the visual scale of the hero title.",
21298
+ required: false,
21299
+ ui: { intent: "display" },
21300
+ options: [
21301
+ { value: "auto", label: "Auto" },
21302
+ { value: "quiet", label: "Normal" },
21303
+ { value: "editorial", label: "Large" },
21304
+ { value: "display", label: "Huge" },
21305
+ { value: "poster", label: "Poster" }
21306
+ ]
21307
+ },
20537
21308
  {
20538
21309
  id: "contentAlignment",
20539
21310
  type: "select",
@@ -21328,7 +22099,18 @@ function heroSplitImagePane() {
21328
22099
  return stack(
21329
22100
  {
21330
22101
  gap: "none",
21331
- className: "rb-relative rb-overflow-hidden rb-rounded-3xl",
22102
+ className: {
22103
+ $bind: {
22104
+ from: "content.imageShape",
22105
+ transforms: [
22106
+ {
22107
+ id: "ui.imageShapeClassName",
22108
+ options: { baseClass: "rb-relative rb-overflow-hidden rb-rounded-3xl" }
22109
+ }
22110
+ ],
22111
+ fallback: "rb-relative rb-overflow-hidden rb-rounded-3xl"
22112
+ }
22113
+ },
21332
22114
  style: {
21333
22115
  minHeight: "clamp(18rem, 36vw, 34rem)"
21334
22116
  }
@@ -21446,6 +22228,12 @@ var heroConfig = {
21446
22228
  label: "Content card",
21447
22229
  renderInHeader: true,
21448
22230
  intent: "style"
22231
+ }),
22232
+ createImageShapeField({
22233
+ id: "imageShape",
22234
+ label: "Image shape",
22235
+ defaultValue: "default",
22236
+ uiIntent: "display"
21449
22237
  })
21450
22238
  ],
21451
22239
  layout: classicLayout,
@@ -21460,6 +22248,15 @@ var heroConfig = {
21460
22248
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
21461
22249
  tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
21462
22250
  icon: "Sparkles",
22251
+ previewCustomize: {
22252
+ quickFieldPriority: [
22253
+ "titleSize",
22254
+ "contentAlignment",
22255
+ "contentMaxWidth",
22256
+ "verticalAlignment",
22257
+ "imageShape"
22258
+ ]
22259
+ },
21463
22260
  styleTokens: {
21464
22261
  typography: "display",
21465
22262
  spacing: "xl"
@@ -21476,7 +22273,8 @@ var standardAspectRatioOptions = [
21476
22273
  { value: "16/9", label: "16:9 (Landscape)" },
21477
22274
  { value: "4/3", label: "4:3 (Standard)" },
21478
22275
  { value: "1/1", label: "1:1 (Square)" },
21479
- { value: "3/4", label: "3:4 (Portrait)" }
22276
+ { value: "3/4", label: "3:4 (Portrait)" },
22277
+ { value: "9/16", label: "9:16 (Tall portrait)" }
21480
22278
  ];
21481
22279
  function createAspectRatioField(options = {}) {
21482
22280
  return {
@@ -22696,6 +23494,258 @@ var formBlockDefinition = {
22696
23494
  runtime: formBlockRuntime
22697
23495
  };
22698
23496
 
23497
+ // ../blocks/src/system/blocks/contact-newsletter.ts
23498
+ var contactNewsletterLayout = styledSection({
23499
+ children: sectionContainer([
23500
+ el(
23501
+ "div",
23502
+ { className: "contact-newsletter-grid" },
23503
+ [
23504
+ el(
23505
+ "div",
23506
+ { className: "contact-newsletter-column contact-newsletter-contact" },
23507
+ [
23508
+ el(
23509
+ "div",
23510
+ { className: "contact-newsletter-copy" },
23511
+ [
23512
+ text(
23513
+ {
23514
+ as: "h2",
23515
+ className: "form-copy-title"
23516
+ },
23517
+ when("contactTitle"),
23518
+ bind("contactTitle")
23519
+ ),
23520
+ richText(
23521
+ {
23522
+ className: "form-copy-intro rb-prose rb-max-w-none"
23523
+ },
23524
+ when("contactIntro"),
23525
+ bind("contactIntro")
23526
+ )
23527
+ ]
23528
+ ),
23529
+ el(
23530
+ "form",
23531
+ withApiBindings({
23532
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
23533
+ submitLabel: { $bind: { from: "contactSubmitLabel" } },
23534
+ successMessage: { $bind: { from: "contactSuccessMessage" } }
23535
+ }),
23536
+ [],
23537
+ bind("data.form")
23538
+ )
23539
+ ]
23540
+ ),
23541
+ el(
23542
+ "div",
23543
+ { className: "contact-newsletter-column contact-newsletter-info contact-newsletter-newsletter" },
23544
+ [
23545
+ el(
23546
+ "div",
23547
+ { className: "contact-newsletter-copy" },
23548
+ [
23549
+ text(
23550
+ {
23551
+ as: "h2",
23552
+ className: "newsletter-copy-title"
23553
+ },
23554
+ when("newsletterTitle"),
23555
+ bind("newsletterTitle")
23556
+ ),
23557
+ richText(
23558
+ {
23559
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none"
23560
+ },
23561
+ when("newsletterSubtitle"),
23562
+ bind("newsletterSubtitle")
23563
+ )
23564
+ ]
23565
+ ),
23566
+ el(
23567
+ "newsletter-form",
23568
+ withApiBindings({
23569
+ listId: { $bind: { from: "listId" } },
23570
+ preset: { $bind: { from: "preset" } },
23571
+ includePhone: { $bind: { from: "includePhone" } },
23572
+ buttonLabel: { $bind: { from: "newsletterButtonLabel" } },
23573
+ successMessage: { $bind: { from: "newsletterSuccessMessage" } },
23574
+ privacyNote: { $bind: { from: "newsletterPrivacyNote" } },
23575
+ tags: { $bind: { from: "newsletterTags" } },
23576
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } }
23577
+ }),
23578
+ []
23579
+ )
23580
+ ]
23581
+ )
23582
+ ]
23583
+ )
23584
+ ], {
23585
+ className: "contact-newsletter-container"
23586
+ }),
23587
+ baseClass: "",
23588
+ spacing: "medium",
23589
+ background: "surface"
23590
+ });
23591
+ var contactNewsletterManifest = createBlockManifest({
23592
+ id: "block.contact-newsletter",
23593
+ title: "Contact + Newsletter",
23594
+ titleSource: "contactTitle",
23595
+ description: "Two-column newsletter signup and contact form section.",
23596
+ category: "interactive",
23597
+ layout: contactNewsletterLayout,
23598
+ defaultVariant: "default",
23599
+ variants: {
23600
+ default: contactNewsletterLayout
23601
+ },
23602
+ variantOptions: {
23603
+ default: {
23604
+ label: "Two column",
23605
+ description: "Newsletter and contact form side by side.",
23606
+ icon: "Columns2"
23607
+ }
23608
+ },
23609
+ additionalFields: [
23610
+ {
23611
+ id: "newsletterTitle",
23612
+ type: "text",
23613
+ label: "Newsletter title",
23614
+ defaultValue: "Stay connected"
23615
+ },
23616
+ {
23617
+ id: "newsletterSubtitle",
23618
+ type: "richText",
23619
+ label: "Newsletter intro"
23620
+ },
23621
+ {
23622
+ id: "listId",
23623
+ type: "reference",
23624
+ label: "Newsletter list",
23625
+ description: "Select the list new subscribers should be added to.",
23626
+ required: true,
23627
+ referenceKind: "newsletterList",
23628
+ allowManualEntry: false,
23629
+ ui: { intent: "behavior" }
23630
+ },
23631
+ {
23632
+ id: "preset",
23633
+ type: "select",
23634
+ label: "Newsletter fields",
23635
+ defaultValue: "emailOnly",
23636
+ ui: { intent: "display" },
23637
+ options: [
23638
+ { value: "emailOnly", label: "Email only" },
23639
+ { value: "emailName", label: "Email + Name" },
23640
+ { value: "emailFirstLast", label: "Email + First/Last Name" },
23641
+ { value: "emailNameCompany", label: "Email + Name + Company (B2B)" }
23642
+ ]
23643
+ },
23644
+ {
23645
+ id: "includePhone",
23646
+ type: "boolean",
23647
+ label: "Include phone field",
23648
+ defaultValue: false,
23649
+ ui: { intent: "display" }
23650
+ },
23651
+ {
23652
+ id: "newsletterButtonLabel",
23653
+ type: "text",
23654
+ label: "Newsletter button label",
23655
+ defaultValue: "Subscribe",
23656
+ ui: { intent: "display" }
23657
+ },
23658
+ {
23659
+ id: "newsletterSuccessMessage",
23660
+ type: "text",
23661
+ label: "Newsletter success message",
23662
+ defaultValue: "Thanks for subscribing!",
23663
+ ui: { intent: "behavior" }
23664
+ },
23665
+ {
23666
+ id: "newsletterPrivacyNote",
23667
+ type: "text",
23668
+ label: "Privacy note",
23669
+ ui: { intent: "display" }
23670
+ },
23671
+ {
23672
+ id: "newsletterTags",
23673
+ type: "text",
23674
+ label: "Newsletter tags",
23675
+ description: "Optional tags to apply on subscribe, separated by comma or semicolon.",
23676
+ ui: { intent: "behavior" }
23677
+ },
23678
+ {
23679
+ id: "contactTitle",
23680
+ type: "text",
23681
+ label: "Contact title",
23682
+ defaultValue: "Get in touch"
23683
+ },
23684
+ {
23685
+ id: "contactIntro",
23686
+ type: "richText",
23687
+ label: "Contact intro"
23688
+ },
23689
+ {
23690
+ id: "formSlug",
23691
+ type: "reference",
23692
+ label: "Contact form",
23693
+ description: "Pick a saved form to render.",
23694
+ required: true,
23695
+ referenceKind: "form",
23696
+ allowManualEntry: false,
23697
+ ui: { intent: "behavior" }
23698
+ },
23699
+ {
23700
+ id: "contactSubmitLabel",
23701
+ type: "text",
23702
+ label: "Contact button label",
23703
+ defaultValue: "Send message",
23704
+ ui: { intent: "display" }
23705
+ },
23706
+ {
23707
+ id: "contactSuccessMessage",
23708
+ type: "text",
23709
+ label: "Contact success message",
23710
+ defaultValue: "Thanks - we received your message.",
23711
+ ui: { intent: "behavior" }
23712
+ }
23713
+ ],
23714
+ styleTokens: {
23715
+ background: "surface",
23716
+ typography: "body",
23717
+ spacing: "md"
23718
+ },
23719
+ behaviours: {
23720
+ supportsThemeSwitching: true,
23721
+ inlineEditing: true,
23722
+ animation: false,
23723
+ paletteHidden: false
23724
+ },
23725
+ tags: [
23726
+ "contact",
23727
+ "newsletter",
23728
+ "signup",
23729
+ "email",
23730
+ "form",
23731
+ "lead-capture"
23732
+ ],
23733
+ icon: "MailPlus"
23734
+ });
23735
+ var contactNewsletterBlockDefinition = {
23736
+ manifest: contactNewsletterManifest,
23737
+ dataSchemas: { form: formDataSchema.optional() },
23738
+ dataLoaders: {
23739
+ form: {
23740
+ endpoint: "getPublicFormById",
23741
+ params: {
23742
+ formSlug: { $bind: { from: "formSlug" } }
23743
+ },
23744
+ mode: "server"
23745
+ }
23746
+ }
23747
+ };
23748
+
22699
23749
  // ../blocks/src/system/blocks/faq.ts
22700
23750
  function fragmentLayoutNode2(layout) {
22701
23751
  return isNodeDefinitionArray2(layout) ? el("div", {}, [...layout]) : layout;
@@ -22924,6 +23974,7 @@ var joinClasses3 = (parts) => parts.filter(
22924
23974
  ).join(" ").replace(/\s+/g, " ").trim();
22925
23975
  var eyebrowTreatmentClassMap = {
22926
23976
  plain: "",
23977
+ accent: "rb-eyebrow-treatment-accent",
22927
23978
  pill: "rb-eyebrow-treatment-pill",
22928
23979
  "accent-pill": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent",
22929
23980
  "pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-pill-bounce",
@@ -22950,6 +24001,13 @@ var imageGalleryCornerClassMap = {
22950
24001
  "2xl": "rb-rounded-2xl",
22951
24002
  "3xl": "rb-rounded-3xl"
22952
24003
  };
24004
+ var imageShapeClassMap = {
24005
+ default: "",
24006
+ square: "rb-media-shape-square",
24007
+ rounded: "rb-media-shape-rounded",
24008
+ circle: "rb-media-shape-circle",
24009
+ arch: "rb-media-shape-arch"
24010
+ };
22953
24011
  var parseRatio = (raw) => {
22954
24012
  if (typeof raw !== "string") return null;
22955
24013
  const value = raw.trim();
@@ -23094,6 +24152,10 @@ function resolveHeroContentMaxWidth(content) {
23094
24152
  return "default";
23095
24153
  }
23096
24154
  function resolveHeroTypographyScale(content) {
24155
+ const titleSize = readString(content, "titleSize");
24156
+ if (titleSize === "quiet" || titleSize === "editorial" || titleSize === "display" || titleSize === "poster") {
24157
+ return titleSize;
24158
+ }
23097
24159
  const raw = readHeroLayoutString(
23098
24160
  content,
23099
24161
  "typographyScale",
@@ -23335,6 +24397,16 @@ var uiTransforms = [
23335
24397
  heroGridClassFromVerticalAlignmentTransform,
23336
24398
  imageFragmentClassTransform,
23337
24399
  imageFragmentSizeTransform,
24400
+ {
24401
+ id: "ui.imageShapeClassName",
24402
+ kind: "string",
24403
+ summary: "Apply a constrained media shape class",
24404
+ run: (value, options) => {
24405
+ const baseClass = typeof options?.baseClass === "string" ? options.baseClass : "";
24406
+ const shape = typeof value === "string" ? value.trim() : "default";
24407
+ return joinClasses3([baseClass, imageShapeClassMap[shape] ?? ""]);
24408
+ }
24409
+ },
23338
24410
  conditionalClassTransform,
23339
24411
  twoColumnContainerClassTransform,
23340
24412
  twoColumnFlexBasisTransform,
@@ -24681,6 +25753,21 @@ var siteHeaderManifest = createBlockManifest({
24681
25753
  id: "block.site-header",
24682
25754
  title: "Site Header",
24683
25755
  category: "layout",
25756
+ additionalFields: [
25757
+ {
25758
+ id: "mode",
25759
+ type: "select",
25760
+ label: "Header display",
25761
+ required: false,
25762
+ multiple: false,
25763
+ defaultValue: "default",
25764
+ options: [
25765
+ { value: "default", label: "Show header" },
25766
+ { value: "hidden", label: "Hide header" }
25767
+ ],
25768
+ ui: { intent: "display" }
25769
+ }
25770
+ ],
24684
25771
  // Skip section styles - this block uses theme-based styling
24685
25772
  skipSectionStyles: true,
24686
25773
  // Block manages its own wrapper - enables sticky positioning
@@ -26083,6 +27170,9 @@ var mediaTextManifest = createBlockManifest({
26083
27170
  category: "layout",
26084
27171
  includeContainerStyles: true,
26085
27172
  titleSource: "title",
27173
+ previewCustomize: {
27174
+ quickFieldPriority: ["imagePosition", "ratio", "imageShape", "titleAlignment", "aspectRatio"]
27175
+ },
26086
27176
  additionalFields: [
26087
27177
  {
26088
27178
  id: "images",
@@ -26121,7 +27211,7 @@ var mediaTextManifest = createBlockManifest({
26121
27211
  {
26122
27212
  id: "titleAlignment",
26123
27213
  type: "select",
26124
- label: "Title alignment",
27214
+ label: "Content alignment",
26125
27215
  required: false,
26126
27216
  defaultValue: "left",
26127
27217
  multiple: false,
@@ -26179,7 +27269,18 @@ var mediaTextManifest = createBlockManifest({
26179
27269
  transition: "slide"
26180
27270
  },
26181
27271
  ui: { intent: "behavior" }
26182
- }),
27272
+ }).map((field) => ({
27273
+ ...field,
27274
+ ui: {
27275
+ ...field.ui ?? {},
27276
+ visibleWhen: field.id === "carouselAutoplayDelay" ? {
27277
+ allOf: [
27278
+ { field: "images", minItems: 2 },
27279
+ { field: "carouselAutoplay", equals: true }
27280
+ ]
27281
+ } : { field: "images", minItems: 2 }
27282
+ }
27283
+ })),
26183
27284
  createAspectRatioField({
26184
27285
  id: "aspectRatio",
26185
27286
  label: "Media aspect ratio",
@@ -26187,6 +27288,12 @@ var mediaTextManifest = createBlockManifest({
26187
27288
  defaultValue: "auto",
26188
27289
  visibleWhen: { field: "images", notEquals: null }
26189
27290
  }),
27291
+ createImageShapeField({
27292
+ id: "imageShape",
27293
+ label: "Media shape",
27294
+ defaultValue: "default",
27295
+ visibleWhen: { field: "images", notEquals: null }
27296
+ }),
26190
27297
  {
26191
27298
  id: "text",
26192
27299
  type: "richText",
@@ -26220,6 +27327,30 @@ var mediaTextManifest = createBlockManifest({
26220
27327
  ...options?.not ? { not: true } : {}
26221
27328
  }
26222
27329
  });
27330
+ const bodyClassNameFromAlignment = {
27331
+ $bind: {
27332
+ from: "content.titleAlignment",
27333
+ transforms: [
27334
+ {
27335
+ id: "ui.bodyClassFromAlignment",
27336
+ options: { base: "rb-prose rb-max-w-none" }
27337
+ }
27338
+ ],
27339
+ fallback: "rb-prose rb-max-w-none"
27340
+ }
27341
+ };
27342
+ const titleClassNameFromAlignment = {
27343
+ $bind: {
27344
+ from: "content.titleAlignment",
27345
+ transforms: [
27346
+ {
27347
+ id: "ui.headingClassFromAlignment",
27348
+ options: { base: "" }
27349
+ }
27350
+ ],
27351
+ fallback: ""
27352
+ }
27353
+ };
26223
27354
  const defaultTextColumn = el("div", {}, [
26224
27355
  styledCard(
26225
27356
  [
@@ -26244,8 +27375,55 @@ var mediaTextManifest = createBlockManifest({
26244
27375
  bind("content.text")
26245
27376
  )
26246
27377
  ]);
27378
+ const bioTextColumn = el(
27379
+ "div",
27380
+ { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" },
27381
+ [
27382
+ text(
27383
+ {
27384
+ as: "h2",
27385
+ className: titleClassNameFromAlignment
27386
+ },
27387
+ when("content.title"),
27388
+ bind("content.title")
27389
+ ),
27390
+ styledCard(
27391
+ [
27392
+ richText(
27393
+ {
27394
+ className: bodyClassNameFromAlignment
27395
+ },
27396
+ bind("content.text")
27397
+ )
27398
+ ],
27399
+ {
27400
+ stylesFrom: "content._textCardStyles",
27401
+ backgroundFrom: "content._textCardStyles.background"
27402
+ },
27403
+ when("content.wrapTextInCard")
27404
+ ),
27405
+ richText(
27406
+ {
27407
+ className: bodyClassNameFromAlignment
27408
+ },
27409
+ when("content.wrapTextInCard", { not: true }),
27410
+ bind("content.text")
27411
+ )
27412
+ ]
27413
+ );
26247
27414
  const defaultImageCommonProps = {
26248
- className: "rb-w-full rb-h-auto rb-object-cover",
27415
+ className: {
27416
+ $bind: {
27417
+ from: "content.imageShape",
27418
+ transforms: [
27419
+ {
27420
+ id: "ui.imageShapeClassName",
27421
+ options: { baseClass: "rb-w-full rb-h-auto rb-object-cover" }
27422
+ }
27423
+ ],
27424
+ fallback: "rb-w-full rb-h-auto rb-object-cover"
27425
+ }
27426
+ },
26249
27427
  style: {
26250
27428
  aspectRatio: { $bind: { from: "content.aspectRatio" } }
26251
27429
  }
@@ -26286,6 +27464,27 @@ var mediaTextManifest = createBlockManifest({
26286
27464
  ],
26287
27465
  whenImagesLength(0, { not: true })
26288
27466
  );
27467
+ const bioImagesLayout = el(
27468
+ "div",
27469
+ {},
27470
+ [
27471
+ responsiveTwoColumn({
27472
+ image: el("div", {}, [
27473
+ el("div", {}, [defaultSingleImage], whenImagesLength(1)),
27474
+ el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))
27475
+ ]),
27476
+ text: bioTextColumn,
27477
+ ratioFrom: "content.ratio",
27478
+ imagePositionFrom: "content.imagePosition",
27479
+ containerClassName: "rb-flex rb-flex-col rb-md-flex-row rb-md-items-center",
27480
+ gapFrom: "content.gap",
27481
+ gapFallback: "comfortable",
27482
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
27483
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
27484
+ })
27485
+ ],
27486
+ whenImagesLength(0, { not: true })
27487
+ );
26289
27488
  const defaultTextOnlyLayout = el(
26290
27489
  "div",
26291
27490
  {},
@@ -26315,7 +27514,45 @@ var mediaTextManifest = createBlockManifest({
26315
27514
  ],
26316
27515
  whenImagesLength(0)
26317
27516
  );
27517
+ const bioTextOnlyLayout = el(
27518
+ "div",
27519
+ { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" },
27520
+ [
27521
+ text(
27522
+ {
27523
+ as: "h2",
27524
+ className: titleClassNameFromAlignment
27525
+ },
27526
+ when("content.title"),
27527
+ bind("content.title")
27528
+ ),
27529
+ styledCard(
27530
+ [
27531
+ richText(
27532
+ {
27533
+ className: bodyClassNameFromAlignment
27534
+ },
27535
+ bind("content.text")
27536
+ )
27537
+ ],
27538
+ {
27539
+ stylesFrom: "content._textCardStyles",
27540
+ backgroundFrom: "content._textCardStyles.background"
27541
+ },
27542
+ when("content.wrapTextInCard")
27543
+ ),
27544
+ richText(
27545
+ {
27546
+ className: bodyClassNameFromAlignment
27547
+ },
27548
+ when("content.wrapTextInCard", { not: true }),
27549
+ bind("content.text")
27550
+ )
27551
+ ],
27552
+ whenImagesLength(0)
27553
+ );
26318
27554
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
27555
+ const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
26319
27556
  const defaultLayout2 = styledSection({
26320
27557
  children: styledContainer({
26321
27558
  rootType: "stack",
@@ -26324,18 +27561,7 @@ var mediaTextManifest = createBlockManifest({
26324
27561
  text(
26325
27562
  {
26326
27563
  as: "h2",
26327
- className: {
26328
- $bind: {
26329
- from: "content.titleAlignment",
26330
- transforms: [
26331
- {
26332
- id: "ui.headingClassFromAlignment",
26333
- options: { base: "" }
26334
- }
26335
- ],
26336
- fallback: ""
26337
- }
26338
- }
27564
+ className: titleClassNameFromAlignment
26339
27565
  },
26340
27566
  when("content.title"),
26341
27567
  bind("content.title")
@@ -26347,14 +27573,28 @@ var mediaTextManifest = createBlockManifest({
26347
27573
  baseClass: "",
26348
27574
  spacing: "medium"
26349
27575
  });
27576
+ const bioLayout = styledSection({
27577
+ children: styledContainer({
27578
+ rootType: "stack",
27579
+ rootProps: { gap: "lg" },
27580
+ children: [bioInner]
27581
+ }),
27582
+ baseClass: "",
27583
+ spacing: "medium"
27584
+ });
26350
27585
  return {
26351
27586
  layout: defaultLayout2,
26352
27587
  variants: {
26353
- default: defaultLayout2
27588
+ default: defaultLayout2,
27589
+ bio: bioLayout
26354
27590
  },
26355
27591
  defaultVariant: "default",
26356
27592
  variantOptions: {
26357
- default: { label: "Default" }
27593
+ default: { label: "Default" },
27594
+ bio: {
27595
+ label: "Bio",
27596
+ description: "Vertically centered title and copy beside media."
27597
+ }
26358
27598
  }
26359
27599
  };
26360
27600
  })(),
@@ -27060,10 +28300,8 @@ var occurrenceContextSchema = z43.object({
27060
28300
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
27061
28301
  import { z as z45 } from "zod";
27062
28302
 
27063
- // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
27064
- import { z as z44 } from "zod";
27065
-
27066
28303
  // ../blocks/src/system/constants/events.ts
28304
+ var EVENT_CONTENT_TYPE_SLUGS = ["event", "events"];
27067
28305
  var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
27068
28306
  var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
27069
28307
  var eventCalendarListLayoutOptions = [
@@ -27077,8 +28315,133 @@ function isEventCalendarDisplayMode(value) {
27077
28315
  function isEventCalendarListLayout(value) {
27078
28316
  return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
27079
28317
  }
28318
+ function isEventContentType(slug) {
28319
+ if (!slug) return false;
28320
+ return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
28321
+ }
28322
+
28323
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
28324
+ var DEFAULT_EVENT_CURRENCY = "USD";
28325
+ function resolveRuntimeEventPricing(event) {
28326
+ if (isPublicEventPricing(event.pricing)) {
28327
+ return event.pricing;
28328
+ }
28329
+ const legacy = event;
28330
+ const currency = readCurrency(legacy.currency);
28331
+ if (event.requiresRegistration === false) {
28332
+ return {
28333
+ kind: "drop_in",
28334
+ currency,
28335
+ display: { kind: "free", currency }
28336
+ };
28337
+ }
28338
+ if (legacy.pricingMode === "ticket_types") {
28339
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
28340
+ return {
28341
+ kind: "ticket_types",
28342
+ currency,
28343
+ ticketTypes,
28344
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
28345
+ };
28346
+ }
28347
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
28348
+ if (legacy.pricingType === "paid" && amount > 0) {
28349
+ return {
28350
+ kind: "single_paid",
28351
+ amount,
28352
+ currency,
28353
+ display: { kind: "exact", amount, currency }
28354
+ };
28355
+ }
28356
+ return {
28357
+ kind: "free_registration",
28358
+ currency,
28359
+ display: { kind: "free", currency }
28360
+ };
28361
+ }
28362
+ function readCurrency(value) {
28363
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
28364
+ }
28365
+ function isRecord3(value) {
28366
+ return typeof value === "object" && value !== null && !Array.isArray(value);
28367
+ }
28368
+ function isPublicEventPricing(value) {
28369
+ if (!isRecord3(value) || typeof value.kind !== "string") return false;
28370
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
28371
+ }
28372
+ function isPublicEventTicketType(value) {
28373
+ return isRecord3(value) && typeof value.id === "string";
28374
+ }
28375
+ function readTicketTypePriceDisplay(value, currency) {
28376
+ const display = readLegacyPriceDisplay(value, currency);
28377
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
28378
+ }
28379
+ function readLegacyPriceDisplay(value, currency) {
28380
+ if (!isRecord3(value) || typeof value.kind !== "string") {
28381
+ return { kind: "unavailable", currency };
28382
+ }
28383
+ const displayCurrency = readCurrency(value.currency);
28384
+ switch (value.kind) {
28385
+ case "free":
28386
+ return { kind: "free", currency: displayCurrency };
28387
+ case "exact":
28388
+ return readAmount(value.amount) !== null ? {
28389
+ kind: "exact",
28390
+ amount: readAmount(value.amount) ?? 0,
28391
+ currency: displayCurrency
28392
+ } : { kind: "unavailable", currency };
28393
+ case "from":
28394
+ return readAmount(value.amount) !== null ? {
28395
+ kind: "from",
28396
+ amount: readAmount(value.amount) ?? 0,
28397
+ currency: displayCurrency
28398
+ } : { kind: "unavailable", currency };
28399
+ case "mixed":
28400
+ return readAmount(value.paidFromAmount) !== null ? {
28401
+ kind: "mixed",
28402
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
28403
+ currency: displayCurrency
28404
+ } : { kind: "unavailable", currency };
28405
+ case "unavailable":
28406
+ return { kind: "unavailable", currency: displayCurrency };
28407
+ case "course":
28408
+ return isRecord3(value.display) ? {
28409
+ kind: "course",
28410
+ display: readCoursePriceDisplay(value.display, displayCurrency)
28411
+ } : {
28412
+ kind: "course",
28413
+ display: { kind: "unavailable", currency: displayCurrency }
28414
+ };
28415
+ default:
28416
+ return { kind: "unavailable", currency };
28417
+ }
28418
+ }
28419
+ function readCoursePriceDisplay(value, currency) {
28420
+ switch (value.kind) {
28421
+ case "free":
28422
+ return { kind: "free", currency: readCurrency(value.currency) };
28423
+ case "exact":
28424
+ return readAmount(value.amount) !== null ? {
28425
+ kind: "exact",
28426
+ amount: readAmount(value.amount) ?? 0,
28427
+ currency: readCurrency(value.currency)
28428
+ } : { kind: "unavailable", currency };
28429
+ case "from":
28430
+ return readAmount(value.amount) !== null ? {
28431
+ kind: "from",
28432
+ amount: readAmount(value.amount) ?? 0,
28433
+ currency: readCurrency(value.currency)
28434
+ } : { kind: "unavailable", currency };
28435
+ default:
28436
+ return { kind: "unavailable", currency };
28437
+ }
28438
+ }
28439
+ function readAmount(value) {
28440
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
28441
+ }
27080
28442
 
27081
28443
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
28444
+ import { z as z44 } from "zod";
27082
28445
  var previewStageSchema = z44.enum(["preview", "published"]);
27083
28446
  var registrationButtonVariantSchema = z44.enum(["primary", "secondary", "outline"]);
27084
28447
  var eventButtonVariantSchema = z44.enum(["primary", "secondary", "outline", "link"]);
@@ -27089,12 +28452,73 @@ var weekStartSchema = z44.enum(["sunday", "monday"]);
27089
28452
  var filterAutoShowSchema = z44.enum(["auto", "always", "never"]);
27090
28453
  var calendarTabViewsSchema = z44.enum(["both", "month", "week"]);
27091
28454
 
28455
+ // ../blocks/src/system/runtime/nodes/event-registration/wizardSteps.ts
28456
+ function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep) {
28457
+ const baseSteps = hasPreSelectedContext ? ["select-tickets", "enter-details"] : ["select-event", "select-tickets", "enter-details"];
28458
+ if (!needsPaymentStep) {
28459
+ return baseSteps;
28460
+ }
28461
+ return [...baseSteps, "select-payment"];
28462
+ }
28463
+
28464
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationDerivations.ts
28465
+ function eventMatchesOccurrenceId(event, occurrenceId) {
28466
+ return event.registrationOccurrenceId === occurrenceId || event.publicEventId === occurrenceId;
28467
+ }
28468
+ function findPreSelectedEvent(input) {
28469
+ const occurrenceContext = input.occurrenceContext;
28470
+ if (!occurrenceContext) {
28471
+ return null;
28472
+ }
28473
+ const contextDate = getBookingLocalDateKey(toScheduledBookingDateTime({
28474
+ startsAt: occurrenceContext.startsAt,
28475
+ timeZone: occurrenceContext.timeZone
28476
+ }));
28477
+ return input.scopedEvents.find(
28478
+ (event) => eventMatchesOccurrenceId(event, occurrenceContext.id) || getBookingLocalDateKey(toScheduledBookingDateTime({
28479
+ startsAt: event.startsAt,
28480
+ timeZone: event.timeZone
28481
+ })) === contextDate
28482
+ ) ?? null;
28483
+ }
28484
+ function resolveEventRequiresPayment(input) {
28485
+ if (input.eligibility) {
28486
+ return input.eligibility.requiresPayment;
28487
+ }
28488
+ if (input.selectedTicketType) {
28489
+ return input.selectedTicketType.priceAmount > 0;
28490
+ }
28491
+ if (!input.event) {
28492
+ return false;
28493
+ }
28494
+ return publicEventPricingType(resolveRuntimeEventPricing(input.event)) !== "free";
28495
+ }
28496
+
28497
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.ts
28498
+ function toRegistrationEvent(event) {
28499
+ return {
28500
+ ...event,
28501
+ pricing: resolveRuntimeEventPricing(event),
28502
+ publicEventId: event.id,
28503
+ registrationOccurrenceId: event.occurrenceId
28504
+ };
28505
+ }
28506
+ function toRegistrationEvents(events) {
28507
+ return events.map(toRegistrationEvent);
28508
+ }
28509
+
27092
28510
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
28511
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
28512
+ var EVENT_REGISTRATION_SHELL_STEP_LABELS = ["Event", "Date", "Tickets", "Details", "Payment"];
27093
28513
  var contentEntrySchema = z45.object({
27094
28514
  id: z45.string(),
27095
28515
  slug: z45.string(),
27096
28516
  contentTypeSlug: z45.string()
27097
28517
  });
28518
+ var eventRegistrationPublicEventSchema = z45.preprocess(
28519
+ normalizeEventRegistrationEventInput,
28520
+ publicEventSchema
28521
+ );
27098
28522
  var eventRegistrationSourceSchema = z45.object({
27099
28523
  siteId: z45.string().optional(),
27100
28524
  apiBaseUrl: z45.string().optional(),
@@ -27102,7 +28526,7 @@ var eventRegistrationSourceSchema = z45.object({
27102
28526
  previewToken: z45.string().nullable().optional(),
27103
28527
  occurrenceContext: occurrenceContextSchema.optional(),
27104
28528
  contentEntry: contentEntrySchema.nullable().optional(),
27105
- events: z45.array(publicEventSchema).nullable().optional(),
28529
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
27106
28530
  className: z45.string().nullable().optional(),
27107
28531
  buttonText: z45.string().nullable().optional(),
27108
28532
  maxTickets: z45.string().nullable().optional(),
@@ -27117,14 +28541,17 @@ var eventRegistrationSourceSchema = z45.object({
27117
28541
  });
27118
28542
  var eventRegistrationDisplaySchema = z45.object({
27119
28543
  kind: z45.literal("event-registration"),
27120
- state: z45.literal("shell"),
28544
+ state: z45.literal("generic-shell"),
27121
28545
  className: z45.string().nullable(),
28546
+ titleText: z45.string(),
28547
+ bodyText: z45.string(),
28548
+ stepLabels: z45.array(z45.enum(EVENT_REGISTRATION_SHELL_STEP_LABELS)).min(1),
27122
28549
  summaryButtonText: z45.string()
27123
28550
  });
27124
28551
  var eventRegistrationHydrationSchema = z45.object({
27125
28552
  occurrenceContext: occurrenceContextSchema.optional(),
27126
28553
  contentEntry: contentEntrySchema.nullable().optional(),
27127
- events: z45.array(publicEventSchema).nullable().optional(),
28554
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
27128
28555
  maxTickets: z45.string().optional(),
27129
28556
  showVenue: z45.boolean().optional(),
27130
28557
  showCapacity: z45.boolean().optional(),
@@ -27153,13 +28580,81 @@ var eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys(
27153
28580
  "stage"
27154
28581
  );
27155
28582
  function buildEventRegistrationDisplay(source) {
28583
+ const stepLabels = buildEventRegistrationShellStepLabels(source);
27156
28584
  return {
27157
28585
  kind: "event-registration",
27158
- state: "shell",
28586
+ state: "generic-shell",
27159
28587
  className: source.className ?? null,
28588
+ titleText: "Event registration",
28589
+ bodyText: buildEventRegistrationShellBodyText(stepLabels),
28590
+ stepLabels,
27160
28591
  summaryButtonText: source.buttonText?.trim() || "Register"
27161
28592
  };
27162
28593
  }
28594
+ function buildEventRegistrationShellStepLabels(source) {
28595
+ const scopedEvents = scopeEventRegistrationEvents(source);
28596
+ if (scopedEvents.length === 0) {
28597
+ return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
28598
+ }
28599
+ const preSelectedEvent = findPreSelectedEvent({
28600
+ scopedEvents,
28601
+ occurrenceContext: source.occurrenceContext
28602
+ });
28603
+ const hasPreSelectedContext = Boolean(source.occurrenceContext || preSelectedEvent);
28604
+ const needsPaymentStep = hasPreSelectedContext && preSelectedEvent ? resolveEventRequiresPayment({
28605
+ eligibility: null,
28606
+ selectedTicketType: null,
28607
+ event: preSelectedEvent
28608
+ }) : false;
28609
+ return getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
28610
+ }
28611
+ function scopeEventRegistrationEvents(source) {
28612
+ const events = toRegistrationEvents(source.events ?? []);
28613
+ if (source.occurrenceContext?.seriesId) {
28614
+ return events.filter((event) => event.seriesId === source.occurrenceContext?.seriesId);
28615
+ }
28616
+ const entrySlug = source.contentEntry?.slug;
28617
+ const entryContentType = source.contentEntry?.contentTypeSlug;
28618
+ if (entrySlug && entryContentType && isEventContentType(entryContentType)) {
28619
+ return events.filter((event) => event.slug === entrySlug);
28620
+ }
28621
+ return events;
28622
+ }
28623
+ function shellLabelForRegistrationStep(step, events) {
28624
+ switch (step) {
28625
+ case "select-event":
28626
+ return isDateSelection(events) ? "Date" : "Event";
28627
+ case "select-tickets":
28628
+ return "Tickets";
28629
+ case "enter-details":
28630
+ return "Details";
28631
+ case "select-payment":
28632
+ return "Payment";
28633
+ case "error":
28634
+ case "success":
28635
+ case "submitting":
28636
+ case "redirecting":
28637
+ case "verifying-payment":
28638
+ case "verifying-timeout":
28639
+ case "payment-failed":
28640
+ return "Details";
28641
+ }
28642
+ }
28643
+ function isDateSelection(events) {
28644
+ const firstSeriesId = events[0]?.seriesId;
28645
+ return Boolean(
28646
+ events.length > 1 && firstSeriesId && events.every((event) => event.seriesId === firstSeriesId)
28647
+ );
28648
+ }
28649
+ function buildEventRegistrationShellBodyText(stepLabels) {
28650
+ if (stepLabels.includes("Payment")) {
28651
+ return "Preparing tickets, details, and payment options.";
28652
+ }
28653
+ if (stepLabels[0] === "Tickets") {
28654
+ return "Preparing tickets and booking details.";
28655
+ }
28656
+ return "Preparing dates, tickets, and booking details.";
28657
+ }
27163
28658
  var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
27164
28659
  kind: "client-owned",
27165
28660
  contracts: {
@@ -27183,6 +28678,18 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
27183
28678
  }
27184
28679
  })
27185
28680
  });
28681
+ function normalizeEventRegistrationEventInput(value) {
28682
+ if (!isRecord4(value)) {
28683
+ return value;
28684
+ }
28685
+ return {
28686
+ ...value,
28687
+ pricing: resolveRuntimeEventPricing(value)
28688
+ };
28689
+ }
28690
+ function isRecord4(value) {
28691
+ return typeof value === "object" && value !== null && !Array.isArray(value);
28692
+ }
27186
28693
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
27187
28694
  runtime: eventRegistrationBlockRuntime,
27188
28695
  mode: "event-registration",
@@ -29681,7 +31188,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
29681
31188
  return keys.length >= 2 ? keys : [];
29682
31189
  }
29683
31190
  function normalizeOfferingsPreviewContentForWrite(value) {
29684
- if (!isRecord3(value)) return null;
31191
+ if (!isRecord5(value)) return null;
29685
31192
  const groupOrderValue = value.groupOrder;
29686
31193
  if (Array.isArray(groupOrderValue)) {
29687
31194
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -29694,7 +31201,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
29694
31201
  return { ...value, groupOrder: [] };
29695
31202
  }
29696
31203
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
29697
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord3) : []
31204
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord5) : []
29698
31205
  );
29699
31206
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
29700
31207
  }
@@ -29708,7 +31215,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
29708
31215
  }
29709
31216
  return keys;
29710
31217
  }
29711
- function isRecord3(value) {
31218
+ function isRecord5(value) {
29712
31219
  return typeof value === "object" && value !== null && !Array.isArray(value);
29713
31220
  }
29714
31221
 
@@ -30075,7 +31582,7 @@ function isOfferingsPreviewItemLimit(value) {
30075
31582
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
30076
31583
  }
30077
31584
  function normalizeOfferingsPreviewGroupOverride(value) {
30078
- if (!isRecord4(value)) return [];
31585
+ if (!isRecord6(value)) return [];
30079
31586
  const override = {};
30080
31587
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
30081
31588
  override.sourceKey = value.sourceKey;
@@ -30107,12 +31614,12 @@ function isButtonVariant(value) {
30107
31614
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
30108
31615
  }
30109
31616
  function normalizeCardStylesContent(value) {
30110
- return isRecord4(value) || value === null ? value : void 0;
31617
+ return isRecord6(value) || value === null ? value : void 0;
30111
31618
  }
30112
31619
  function normalizeSectionStylesContent(value) {
30113
- return isRecord4(value) || value === null ? value : void 0;
31620
+ return isRecord6(value) || value === null ? value : void 0;
30114
31621
  }
30115
- function isRecord4(value) {
31622
+ function isRecord6(value) {
30116
31623
  return typeof value === "object" && value !== null && !Array.isArray(value);
30117
31624
  }
30118
31625
 
@@ -34072,11 +35579,13 @@ var heroImageSurfaceMotions = [
34072
35579
  ];
34073
35580
  var standardEyebrowTreatments = [
34074
35581
  "plain",
35582
+ "accent",
34075
35583
  "pill",
34076
35584
  "accent-pill"
34077
35585
  ];
34078
35586
  var animatedEyebrowTreatments = [
34079
35587
  "plain",
35588
+ "accent",
34080
35589
  "pill",
34081
35590
  "accent-pill",
34082
35591
  "pill-bounce",
@@ -34377,6 +35886,17 @@ var systemBlockDefinitionsRaw = [
34377
35886
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
34378
35887
  ]
34379
35888
  })),
35889
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
35890
+ flow: conversionFlow,
35891
+ layoutProfiles: [
35892
+ layoutProfile({
35893
+ variantKey: "default",
35894
+ family: "split",
35895
+ weight: "featured",
35896
+ bias: "soft"
35897
+ })
35898
+ ]
35899
+ })),
34380
35900
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
34381
35901
  sectionSurfaces: "supported",
34382
35902
  contentFrames: ["plain", "panel"],
@@ -34468,6 +35988,12 @@ var systemBlockDefinitionsRaw = [
34468
35988
  family: "media-text",
34469
35989
  weight: "featured",
34470
35990
  bias: "soft"
35991
+ }),
35992
+ layoutProfile({
35993
+ variantKey: "bio",
35994
+ family: "media-text",
35995
+ weight: "featured",
35996
+ bias: "soft"
34471
35997
  })
34472
35998
  ]
34473
35999
  })),
@@ -35269,7 +36795,7 @@ var defaultTransforms = createTransformRegistry(builtinTransformDefinitions);
35269
36795
  // ../blocks/src/system/data/linkedContentEntries.ts
35270
36796
  var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
35271
36797
  function coerceLinkedContentEntriesPayload(payload) {
35272
- if (!isRecord5(payload)) return payload;
36798
+ if (!isRecord7(payload)) return payload;
35273
36799
  const response = payload;
35274
36800
  if (!Array.isArray(response.entries)) return payload;
35275
36801
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -35277,12 +36803,12 @@ function coerceLinkedContentEntriesPayload(payload) {
35277
36803
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
35278
36804
  }
35279
36805
  function enrichLinkedContentEntry(entry, contentType) {
35280
- if (!isRecord5(entry)) return entry;
36806
+ if (!isRecord7(entry)) return entry;
35281
36807
  const entryId = typeof entry.id === "string" ? entry.id : null;
35282
36808
  if (!entryId) return entry;
35283
36809
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
35284
36810
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
35285
- const content = isRecord5(entry.content) ? entry.content : {};
36811
+ const content = isRecord7(entry.content) ? entry.content : {};
35286
36812
  const meta = {
35287
36813
  kind: "linked-content-entry",
35288
36814
  entryId,
@@ -35375,7 +36901,7 @@ function capitalize(value) {
35375
36901
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
35376
36902
  }
35377
36903
  function parsePublicContentTypeMeta(value) {
35378
- if (!isRecord5(value)) return null;
36904
+ if (!isRecord7(value)) return null;
35379
36905
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
35380
36906
  return {
35381
36907
  key: value.key,
@@ -35385,7 +36911,7 @@ function parsePublicContentTypeMeta(value) {
35385
36911
  };
35386
36912
  }
35387
36913
  function parsePublicContentTypeLinkedEntryEditing(value) {
35388
- if (!isRecord5(value) || typeof value.kind !== "string") return null;
36914
+ if (!isRecord7(value) || typeof value.kind !== "string") return null;
35389
36915
  switch (value.kind) {
35390
36916
  case "generic":
35391
36917
  return { kind: "generic" };
@@ -35399,7 +36925,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
35399
36925
  }
35400
36926
  }
35401
36927
  function parsePublicContentTypeFieldMeta(value) {
35402
- if (!isRecord5(value)) return [];
36928
+ if (!isRecord7(value)) return [];
35403
36929
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
35404
36930
  return [{
35405
36931
  id: value.id,
@@ -35413,7 +36939,7 @@ function parseStringArray(value) {
35413
36939
  if (!Array.isArray(value)) return null;
35414
36940
  return value.filter((item) => typeof item === "string");
35415
36941
  }
35416
- function isRecord5(value) {
36942
+ function isRecord7(value) {
35417
36943
  return typeof value === "object" && value !== null && !Array.isArray(value);
35418
36944
  }
35419
36945
 
@@ -35606,6 +37132,11 @@ ${root} {
35606
37132
  --er-event-card-bg: rgb(var(--tb-surface));
35607
37133
  --er-event-card-border-width: var(--rb-border-width, 1px);
35608
37134
  --er-event-card-hover-opacity: 1;
37135
+ --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
37136
+ --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
37137
+ --er-radius: var(--rb-block-radius);
37138
+ --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
37139
+ --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
35609
37140
 
35610
37141
  /* Step indicator */
35611
37142
  --er-step-active: rgb(var(--tb-primary));
@@ -36248,11 +37779,11 @@ function resolveParamsBindings(input, vm, meta) {
36248
37779
  return binding.fallback;
36249
37780
  }
36250
37781
  return resolved;
36251
- } catch (err) {
37782
+ } catch (err2) {
36252
37783
  if (shouldLogWarnings) {
36253
37784
  console.warn(
36254
37785
  `bindings: failed to parse loader param binding for block "${meta?.blockKind ?? "unknown"}"`,
36255
- err
37786
+ err2
36256
37787
  );
36257
37788
  }
36258
37789
  return void 0;
@@ -37180,7 +38711,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
37180
38711
  }
37181
38712
 
37182
38713
  // ../api/src/utils/isRecord.ts
37183
- function isRecord6(value) {
38714
+ function isRecord8(value) {
37184
38715
  return typeof value === "object" && value !== null && !Array.isArray(value);
37185
38716
  }
37186
38717
 
@@ -37487,7 +39018,7 @@ function sanitizeMarks(marks) {
37487
39018
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
37488
39019
  return [{ type: mark.type }];
37489
39020
  }
37490
- if (mark.type === "link" && isRecord6(mark.attrs) && typeof mark.attrs.href === "string") {
39021
+ if (mark.type === "link" && isRecord8(mark.attrs) && typeof mark.attrs.href === "string") {
37491
39022
  const attrs = { href: mark.attrs.href };
37492
39023
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
37493
39024
  attrs.target = mark.attrs.target;
@@ -37502,10 +39033,10 @@ function sanitizeMarks(marks) {
37502
39033
  return sanitized.length > 0 ? sanitized : void 0;
37503
39034
  }
37504
39035
  function unwrapRichTextValue(value) {
37505
- if (isRecord6(value) && isRecord6(value.doc)) {
39036
+ if (isRecord8(value) && isRecord8(value.doc)) {
37506
39037
  return unwrapRichTextValue(value.doc);
37507
39038
  }
37508
- if (isRecord6(value) && value.type === "doc") {
39039
+ if (isRecord8(value) && value.type === "doc") {
37509
39040
  return {
37510
39041
  type: "doc",
37511
39042
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -37514,7 +39045,7 @@ function unwrapRichTextValue(value) {
37514
39045
  return EMPTY_SITE_BANNER_BODY;
37515
39046
  }
37516
39047
  function isTipTapNodeLike(value) {
37517
- return isRecord6(value) && typeof value.type === "string";
39048
+ return isRecord8(value) && typeof value.type === "string";
37518
39049
  }
37519
39050
  function coerceTipTapNode(value) {
37520
39051
  return {
@@ -37522,9 +39053,9 @@ function coerceTipTapNode(value) {
37522
39053
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
37523
39054
  ...typeof value.text === "string" ? { text: value.text } : {},
37524
39055
  ...Array.isArray(value.marks) ? {
37525
- marks: value.marks.filter((mark) => isRecord6(mark) && typeof mark.type === "string").map((mark) => ({
39056
+ marks: value.marks.filter((mark) => isRecord8(mark) && typeof mark.type === "string").map((mark) => ({
37526
39057
  type: mark.type,
37527
- ...isRecord6(mark.attrs) ? { attrs: mark.attrs } : {}
39058
+ ...isRecord8(mark.attrs) ? { attrs: mark.attrs } : {}
37528
39059
  }))
37529
39060
  } : {}
37530
39061
  };
@@ -37707,7 +39238,7 @@ var ENTRY_REF_KEYS = [
37707
39238
  "entryId",
37708
39239
  "slug"
37709
39240
  ];
37710
- function isRecord7(value) {
39241
+ function isRecord9(value) {
37711
39242
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
37712
39243
  }
37713
39244
  function extractManualEntryRef(item) {
@@ -37715,7 +39246,7 @@ function extractManualEntryRef(item) {
37715
39246
  const trimmed = item.trim();
37716
39247
  return trimmed.length > 0 ? trimmed : null;
37717
39248
  }
37718
- if (!isRecord7(item)) return null;
39249
+ if (!isRecord9(item)) return null;
37719
39250
  for (const key of ENTRY_REF_KEYS) {
37720
39251
  const raw = item[key];
37721
39252
  if (typeof raw === "string" && raw.trim().length > 0) {