@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
@@ -3250,6 +3250,46 @@ var ENDPOINT_DEFINITIONS = {
3250
3250
  auth: "user",
3251
3251
  responseKind: "json"
3252
3252
  },
3253
+ listEntrySlotBlocks: {
3254
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3255
+ method: "GET",
3256
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3257
+ auth: "user",
3258
+ responseKind: "json",
3259
+ errors: ["resource:not_found"]
3260
+ },
3261
+ listEntryPageContentSlots: {
3262
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots",
3263
+ method: "GET",
3264
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slots", "blocks"],
3265
+ auth: "user",
3266
+ responseKind: "json",
3267
+ errors: ["resource:not_found"]
3268
+ },
3269
+ createEntrySlotBlock: {
3270
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3271
+ method: "POST",
3272
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3273
+ auth: "user",
3274
+ responseKind: "json",
3275
+ errors: ["validation:invalid_input", "resource:not_found"]
3276
+ },
3277
+ reorderEntrySlotBlocks: {
3278
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/reorder",
3279
+ method: "POST",
3280
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3281
+ auth: "user",
3282
+ responseKind: "json",
3283
+ errors: ["validation:invalid_input", "resource:not_found"]
3284
+ },
3285
+ deleteEntrySlotBlock: {
3286
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/{blockId}",
3287
+ method: "DELETE",
3288
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3289
+ auth: "user",
3290
+ responseKind: "json",
3291
+ errors: ["resource:not_found"]
3292
+ },
3253
3293
  createBlock: {
3254
3294
  path: "/sites/{siteId}/pages/{pageId}/blocks",
3255
3295
  method: "POST",
@@ -6342,6 +6382,171 @@ var ENDPOINT_DEFINITIONS = {
6342
6382
  }
6343
6383
  };
6344
6384
 
6385
+ // ../core/src/result.ts
6386
+ function ok(value) {
6387
+ return { ok: true, value };
6388
+ }
6389
+ function err(error) {
6390
+ return { ok: false, error };
6391
+ }
6392
+
6393
+ // ../core/src/event-pricing.ts
6394
+ function publicEventPricingType(pricing) {
6395
+ switch (pricing.kind) {
6396
+ case "drop_in":
6397
+ case "free_registration":
6398
+ return "free";
6399
+ case "single_paid":
6400
+ case "ticket_types":
6401
+ case "course":
6402
+ return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
6403
+ }
6404
+ }
6405
+ function isFreePublicEventPriceDisplay(display) {
6406
+ switch (display.kind) {
6407
+ case "free":
6408
+ return true;
6409
+ case "course":
6410
+ return display.display.kind === "free";
6411
+ case "exact":
6412
+ case "from":
6413
+ case "mixed":
6414
+ case "unavailable":
6415
+ return false;
6416
+ }
6417
+ }
6418
+
6419
+ // ../core/src/booking-date-time.ts
6420
+ var DEFAULT_LOCALE = "en-US";
6421
+ var FALLBACK_TIMEZONE = "UTC";
6422
+ function isValidTimeZone(timeZone) {
6423
+ try {
6424
+ new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
6425
+ return true;
6426
+ } catch {
6427
+ return false;
6428
+ }
6429
+ }
6430
+ function getSafeTimeZone(timeZone) {
6431
+ const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
6432
+ return normalized && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
6433
+ }
6434
+ function parseStrictBookingTimeZone(timeZone) {
6435
+ const normalized = timeZone.trim();
6436
+ if (!normalized || !isValidTimeZone(normalized)) {
6437
+ return null;
6438
+ }
6439
+ return normalized;
6440
+ }
6441
+ function formatParseError(error) {
6442
+ switch (error.reason) {
6443
+ case "invalid_starts_at":
6444
+ return `Expected a valid UTC/offset-aware ISO datetime in startsAt, received "${error.value}"`;
6445
+ case "invalid_ends_at":
6446
+ return `Expected a valid UTC/offset-aware ISO datetime in endsAt, received "${error.value ?? ""}"`;
6447
+ case "invalid_time_zone":
6448
+ return `Expected a valid IANA timezone in timeZone, received "${error.value}"`;
6449
+ }
6450
+ }
6451
+ function formatToPartsLookup(date, locale, timeZone, format) {
6452
+ return new Map(
6453
+ new Intl.DateTimeFormat(locale, {
6454
+ ...format,
6455
+ timeZone
6456
+ }).formatToParts(date).map((part) => [part.type, part.value])
6457
+ );
6458
+ }
6459
+ function getZonedDateTimeParts(date, timeZone) {
6460
+ const parts = formatToPartsLookup(date, "en-GB", timeZone, {
6461
+ year: "numeric",
6462
+ month: "2-digit",
6463
+ day: "2-digit",
6464
+ hour: "2-digit",
6465
+ minute: "2-digit",
6466
+ second: "2-digit",
6467
+ hour12: false
6468
+ });
6469
+ const read = (type) => Number(parts.get(type) ?? "");
6470
+ return {
6471
+ year: read("year"),
6472
+ month: read("month"),
6473
+ day: read("day"),
6474
+ hour: read("hour"),
6475
+ minute: read("minute"),
6476
+ second: read("second")
6477
+ };
6478
+ }
6479
+ function formatDateKey(date) {
6480
+ const year = String(date.year).padStart(4, "0");
6481
+ const month = String(date.month).padStart(2, "0");
6482
+ const day = String(date.day).padStart(2, "0");
6483
+ return `${year}-${month}-${day}`;
6484
+ }
6485
+ function parseUtcIsoDateTimeString(value) {
6486
+ const normalized = value.trim();
6487
+ const hasUtcSuffix = normalized.endsWith("Z");
6488
+ const hasExplicitOffset = /[+-]\d{2}:\d{2}$/u.test(normalized);
6489
+ if (!hasUtcSuffix && !hasExplicitOffset) {
6490
+ return err("missing-timezone-offset");
6491
+ }
6492
+ const date = new Date(normalized);
6493
+ if (Number.isNaN(date.getTime())) {
6494
+ return err("invalid-date-time");
6495
+ }
6496
+ return ok(date.toISOString());
6497
+ }
6498
+ function toUtcIsoDateTimeString(value) {
6499
+ const parsed = parseUtcIsoDateTimeString(value);
6500
+ if (!parsed.ok) {
6501
+ const message = parsed.error === "missing-timezone-offset" ? `Expected an offset-aware ISO datetime, received "${value}"` : `Expected a valid ISO datetime, received "${value}"`;
6502
+ throw new Error(message);
6503
+ }
6504
+ return parsed.value;
6505
+ }
6506
+ function parseScheduledBookingDateTime(input) {
6507
+ try {
6508
+ const startsAt = toUtcIsoDateTimeString(input.startsAt);
6509
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
6510
+ if (!timeZone) {
6511
+ return {
6512
+ ok: false,
6513
+ field: "timeZone",
6514
+ reason: "invalid_time_zone",
6515
+ value: input.timeZone
6516
+ };
6517
+ }
6518
+ return {
6519
+ ok: true,
6520
+ value: {
6521
+ startsAt,
6522
+ timeZone,
6523
+ locale: input.locale
6524
+ }
6525
+ };
6526
+ } catch {
6527
+ return {
6528
+ ok: false,
6529
+ field: "startsAt",
6530
+ reason: "invalid_starts_at",
6531
+ value: input.startsAt
6532
+ };
6533
+ }
6534
+ }
6535
+ function toScheduledBookingDateTime(input) {
6536
+ const result = parseScheduledBookingDateTime(input);
6537
+ if (result.ok) {
6538
+ return result.value;
6539
+ }
6540
+ throw new Error(formatParseError(result));
6541
+ }
6542
+ function getBookingLocalDateKey(input) {
6543
+ return formatDateKey(getLocalScheduleDate(new Date(input.startsAt), input.timeZone));
6544
+ }
6545
+ function getLocalScheduleDate(date, timeZone) {
6546
+ const parts = getZonedDateTimeParts(date, getSafeTimeZone(timeZone));
6547
+ return { year: parts.year, month: parts.month, day: parts.day };
6548
+ }
6549
+
6345
6550
  // ../core/src/location.ts
6346
6551
  function normalizeLocationAddressText(value) {
6347
6552
  if (typeof value !== "string") {
@@ -6789,6 +6994,21 @@ var selectSourceSchema = z4.discriminatedUnion("kind", [
6789
6994
  function assertNeverSelectSource(value) {
6790
6995
  throw new Error(`Unhandled select source: ${JSON.stringify(value)}`);
6791
6996
  }
6997
+ var visibleWhenPredicateSchema = z4.object({
6998
+ field: z4.string().min(1),
6999
+ equals: z4.any().optional(),
7000
+ notEquals: z4.any().optional(),
7001
+ oneOf: z4.array(z4.any()).optional(),
7002
+ notIn: z4.array(z4.any()).optional(),
7003
+ minItems: z4.number().int().nonnegative().optional(),
7004
+ maxItems: z4.number().int().nonnegative().optional()
7005
+ });
7006
+ var visibleWhenSchema = z4.union([
7007
+ visibleWhenPredicateSchema,
7008
+ z4.object({
7009
+ allOf: z4.array(visibleWhenPredicateSchema).min(1)
7010
+ })
7011
+ ]);
6792
7012
  var uiSchema = z4.object({
6793
7013
  widget: z4.string().optional(),
6794
7014
  // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)
@@ -6821,13 +7041,7 @@ var uiSchema = z4.object({
6821
7041
  showValue: z4.boolean().optional(),
6822
7042
  pattern: z4.string().optional(),
6823
7043
  placeholder: z4.string().optional(),
6824
- visibleWhen: z4.object({
6825
- field: z4.string().min(1),
6826
- equals: z4.any().optional(),
6827
- notEquals: z4.any().optional(),
6828
- oneOf: z4.array(z4.any()).optional(),
6829
- notIn: z4.array(z4.any()).optional()
6830
- }).optional(),
7044
+ visibleWhen: visibleWhenSchema.optional(),
6831
7045
  // Modal configuration for modal and group fields
6832
7046
  modalConfig: z4.object({
6833
7047
  buttonLabel: z4.string().optional(),
@@ -7594,6 +7808,7 @@ var eventListTreatmentValues = [
7594
7808
  ];
7595
7809
  var eyebrowTreatmentValues = [
7596
7810
  "plain",
7811
+ "accent",
7597
7812
  "pill",
7598
7813
  "accent-pill",
7599
7814
  "pill-bounce",
@@ -9185,9 +9400,9 @@ var _Vibrant = class _Vibrant2 {
9185
9400
  }
9186
9401
  image.remove();
9187
9402
  return res;
9188
- } catch (err) {
9403
+ } catch (err2) {
9189
9404
  image.remove();
9190
- return Promise.reject(err);
9405
+ return Promise.reject(err2);
9191
9406
  }
9192
9407
  }
9193
9408
  async getPalettes() {
@@ -9201,9 +9416,9 @@ var _Vibrant = class _Vibrant2 {
9201
9416
  const res = result1.palettes;
9202
9417
  image.remove();
9203
9418
  return res;
9204
- } catch (err) {
9419
+ } catch (err2) {
9205
9420
  image.remove();
9206
- return Promise.reject(err);
9421
+ return Promise.reject(err2);
9207
9422
  }
9208
9423
  }
9209
9424
  };
@@ -10608,27 +10823,28 @@ var joyStamp = defineButtonPersonality({
10608
10823
  }
10609
10824
  });
10610
10825
 
10611
- // ../theme-core/src/buttons/personalities/pebble.ts
10612
- var pebble = defineButtonPersonality({
10613
- id: "pebble",
10614
- name: "Pebble",
10615
- description: "Generous pill buttons with a quiet colour-softening hover.",
10616
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
10826
+ // ../theme-core/src/buttons/personalities/ornate-ritual.ts
10827
+ var ornateRitual = defineButtonPersonality({
10828
+ id: "ornate-ritual",
10829
+ name: "Ornate Ritual",
10830
+ description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
10831
+ tags: { tone: "classic", energy: "vibrant", motion: "subtle", era: "organic" },
10617
10832
  buttonSystem: {
10618
10833
  global: {
10619
- cornerStyle: "pill",
10834
+ cornerStyle: "rounded",
10620
10835
  shadow: "none",
10621
- textTransform: "none",
10622
- fontWeight: 500,
10623
- borderWidth: 2,
10836
+ textTransform: "uppercase",
10837
+ fontWeight: 600,
10838
+ borderWidth: 1,
10624
10839
  hoverTransform: "none",
10625
- hoverColor: "none"
10840
+ hoverColor: "none",
10841
+ letterSpacing: "loose"
10626
10842
  },
10627
10843
  sizes: {
10628
- sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
10629
- md: { padding: "0.875rem 2.25rem" },
10630
- lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
10631
- xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
10844
+ sm: { padding: "0.5625rem 1.25rem", fontSize: "text-xs" },
10845
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-xs" },
10846
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-sm" },
10847
+ xl: { padding: "1rem 2.75rem", fontSize: "text-base" }
10632
10848
  },
10633
10849
  variants: [
10634
10850
  {
@@ -10638,97 +10854,12 @@ var pebble = defineButtonPersonality({
10638
10854
  priority: 1,
10639
10855
  background: { type: "solid", colorToken: "primary" },
10640
10856
  textColorToken: "primaryForeground",
10641
- borderRadius: "rounded-full",
10642
- effects: {
10643
- hover: [
10644
- { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 88 } }
10645
- ]
10646
- }
10647
- },
10648
- {
10649
- id: "secondary",
10650
- name: "Secondary",
10651
- enabled: true,
10652
- priority: 2,
10653
- background: { type: "transparent" },
10654
- textColorToken: "primary",
10655
- borderRadius: "rounded-full",
10656
- border: { widthClass: "border-2", colorToken: "accent" },
10657
- effects: {
10658
- hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
10659
- }
10660
- },
10661
- {
10662
- id: "outline",
10663
- name: "Outline",
10664
- enabled: true,
10665
- priority: 3,
10666
- background: { type: "transparent" },
10667
- textColorToken: "text",
10668
- borderRadius: "rounded-full",
10669
- border: { widthClass: "border", colorToken: "border" },
10670
- effects: {
10671
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10672
- }
10673
- },
10674
- {
10675
- id: "ghost",
10676
- name: "Ghost",
10677
- enabled: true,
10678
- priority: 3,
10679
- background: { type: "transparent" },
10680
- textColorToken: "primary",
10681
- borderRadius: "rounded-full",
10682
- sizes: {
10683
- sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
10684
- md: { padding: "0.5rem 1rem" },
10685
- lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
10686
- xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
10687
- },
10688
- effects: {
10689
- hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
10690
- }
10691
- }
10692
- ]
10693
- }
10694
- });
10695
-
10696
- // ../theme-core/src/buttons/personalities/showtime-pill.ts
10697
- var showtimePill = defineButtonPersonality({
10698
- id: "showtime-pill",
10699
- name: "Showtime Pill",
10700
- description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
10701
- tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
10702
- buttonSystem: {
10703
- global: {
10704
- cornerStyle: "pill",
10705
- shadow: "low",
10706
- textTransform: "uppercase",
10707
- fontWeight: 700,
10708
- borderWidth: 2,
10709
- hoverTransform: "lift",
10710
- hoverColor: "darken",
10711
- typography: "body",
10712
- paddingPreset: "spacious",
10713
- italic: false
10714
- },
10715
- sizes: {
10716
- sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
10717
- md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
10718
- lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
10719
- xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
10720
- },
10721
- variants: [
10722
- {
10723
- id: "primary",
10724
- name: "Primary",
10725
- enabled: true,
10726
- priority: 1,
10727
- background: { type: "solid", colorToken: "primary" },
10728
- textColorToken: "background",
10729
- borderRadius: "rounded-full",
10857
+ borderRadius: "rounded-md",
10858
+ border: { widthClass: "border", colorToken: "primary" },
10859
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10730
10860
  effects: {
10731
- hover: [{ effectId: "pop" }]
10861
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "primary-100" } }],
10862
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
10732
10863
  }
10733
10864
  },
10734
10865
  {
@@ -10736,35 +10867,11 @@ var showtimePill = defineButtonPersonality({
10736
10867
  name: "Secondary",
10737
10868
  enabled: true,
10738
10869
  priority: 2,
10739
- background: { type: "transparent" },
10740
- textColorToken: "primary",
10741
- borderRadius: "rounded-full",
10742
- border: { widthClass: "border-2", colorToken: "primary" },
10743
- effects: {
10744
- hover: [{ effectId: "pop" }]
10745
- }
10746
- },
10747
- {
10748
- id: "hero",
10749
- name: "Hero",
10750
- enabled: true,
10751
- priority: 1,
10752
10870
  background: { type: "solid", colorToken: "secondary" },
10753
- textColorToken: "primary",
10754
- borderRadius: "rounded-full",
10755
- effects: {
10756
- hover: [{ effectId: "pop" }]
10757
- }
10758
- },
10759
- {
10760
- id: "header",
10761
- name: "Header",
10762
- enabled: true,
10763
- priority: 2,
10764
- background: { type: "solid", colorToken: "background" },
10765
- textColorToken: "primary",
10766
- borderRadius: "rounded-full",
10767
- border: { widthClass: "border-2", colorToken: "primary" },
10871
+ textColorToken: "primaryForeground",
10872
+ borderRadius: "rounded-md",
10873
+ border: { widthClass: "border", colorToken: "primary" },
10874
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10768
10875
  effects: {
10769
10876
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10770
10877
  }
@@ -10776,10 +10883,11 @@ var showtimePill = defineButtonPersonality({
10776
10883
  priority: 3,
10777
10884
  background: { type: "transparent" },
10778
10885
  textColorToken: "primary",
10779
- borderRadius: "rounded-full",
10780
- border: { widthClass: "border-2", colorToken: "primary" },
10886
+ borderRadius: "rounded-md",
10887
+ border: { widthClass: "border", colorToken: "primary" },
10888
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10781
10889
  effects: {
10782
- hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
10890
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
10783
10891
  }
10784
10892
  },
10785
10893
  {
@@ -10788,32 +10896,44 @@ var showtimePill = defineButtonPersonality({
10788
10896
  enabled: true,
10789
10897
  priority: 3,
10790
10898
  background: { type: "transparent" },
10791
- textColorToken: "primary",
10792
- borderRadius: "rounded-full",
10899
+ textColorToken: "accent",
10900
+ borderRadius: "rounded-none",
10901
+ sizes: {
10902
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
10903
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
10904
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
10905
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
10906
+ },
10793
10907
  effects: {
10794
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10908
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
10795
10909
  }
10796
10910
  }
10797
10911
  ]
10798
10912
  }
10799
10913
  });
10800
10914
 
10801
- // ../theme-core/src/buttons/personalities/soft-pill.ts
10802
- var softPill = defineButtonPersonality({
10803
- id: "soft-pill",
10804
- name: "Soft Pill",
10805
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
10806
- tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
10915
+ // ../theme-core/src/buttons/personalities/pebble.ts
10916
+ var pebble = defineButtonPersonality({
10917
+ id: "pebble",
10918
+ name: "Pebble",
10919
+ description: "Generous pill buttons with a quiet colour-softening hover.",
10920
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
10807
10921
  buttonSystem: {
10808
10922
  global: {
10809
10923
  cornerStyle: "pill",
10810
- shadow: "low",
10924
+ shadow: "none",
10811
10925
  textTransform: "none",
10812
10926
  fontWeight: 500,
10813
10927
  borderWidth: 2,
10814
- hoverTransform: "lift",
10928
+ hoverTransform: "none",
10815
10929
  hoverColor: "none"
10816
10930
  },
10931
+ sizes: {
10932
+ sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
10933
+ md: { padding: "0.875rem 2.25rem" },
10934
+ lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
10935
+ xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
10936
+ },
10817
10937
  variants: [
10818
10938
  {
10819
10939
  id: "primary",
@@ -10823,10 +10943,10 @@ var softPill = defineButtonPersonality({
10823
10943
  background: { type: "solid", colorToken: "primary" },
10824
10944
  textColorToken: "primaryForeground",
10825
10945
  borderRadius: "rounded-full",
10826
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
10827
10946
  effects: {
10828
- hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
10829
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
10947
+ hover: [
10948
+ { effectId: "background-on-hover-alpha", options: { colorToken: "primary", opacity: 88 } }
10949
+ ]
10830
10950
  }
10831
10951
  },
10832
10952
  {
@@ -10837,9 +10957,193 @@ var softPill = defineButtonPersonality({
10837
10957
  background: { type: "transparent" },
10838
10958
  textColorToken: "primary",
10839
10959
  borderRadius: "rounded-full",
10840
- border: { widthClass: "border-2", colorToken: "primary" },
10960
+ border: { widthClass: "border-2", colorToken: "accent" },
10841
10961
  effects: {
10842
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10962
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
10963
+ }
10964
+ },
10965
+ {
10966
+ id: "outline",
10967
+ name: "Outline",
10968
+ enabled: true,
10969
+ priority: 3,
10970
+ background: { type: "transparent" },
10971
+ textColorToken: "text",
10972
+ borderRadius: "rounded-full",
10973
+ border: { widthClass: "border", colorToken: "border" },
10974
+ effects: {
10975
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10976
+ }
10977
+ },
10978
+ {
10979
+ id: "ghost",
10980
+ name: "Ghost",
10981
+ enabled: true,
10982
+ priority: 3,
10983
+ background: { type: "transparent" },
10984
+ textColorToken: "primary",
10985
+ borderRadius: "rounded-full",
10986
+ sizes: {
10987
+ sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
10988
+ md: { padding: "0.5rem 1rem" },
10989
+ lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
10990
+ xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
10991
+ },
10992
+ effects: {
10993
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
10994
+ }
10995
+ }
10996
+ ]
10997
+ }
10998
+ });
10999
+
11000
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
11001
+ var showtimePill = defineButtonPersonality({
11002
+ id: "showtime-pill",
11003
+ name: "Showtime Pill",
11004
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
11005
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
11006
+ buttonSystem: {
11007
+ global: {
11008
+ cornerStyle: "pill",
11009
+ shadow: "low",
11010
+ textTransform: "uppercase",
11011
+ fontWeight: 700,
11012
+ borderWidth: 2,
11013
+ hoverTransform: "lift",
11014
+ hoverColor: "darken",
11015
+ typography: "body",
11016
+ paddingPreset: "spacious",
11017
+ italic: false
11018
+ },
11019
+ sizes: {
11020
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
11021
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
11022
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
11023
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
11024
+ },
11025
+ variants: [
11026
+ {
11027
+ id: "primary",
11028
+ name: "Primary",
11029
+ enabled: true,
11030
+ priority: 1,
11031
+ background: { type: "solid", colorToken: "primary" },
11032
+ textColorToken: "background",
11033
+ borderRadius: "rounded-full",
11034
+ effects: {
11035
+ hover: [{ effectId: "pop" }]
11036
+ }
11037
+ },
11038
+ {
11039
+ id: "secondary",
11040
+ name: "Secondary",
11041
+ enabled: true,
11042
+ priority: 2,
11043
+ background: { type: "transparent" },
11044
+ textColorToken: "primary",
11045
+ borderRadius: "rounded-full",
11046
+ border: { widthClass: "border-2", colorToken: "primary" },
11047
+ effects: {
11048
+ hover: [{ effectId: "pop" }]
11049
+ }
11050
+ },
11051
+ {
11052
+ id: "hero",
11053
+ name: "Hero",
11054
+ enabled: true,
11055
+ priority: 1,
11056
+ background: { type: "solid", colorToken: "secondary" },
11057
+ textColorToken: "primary",
11058
+ borderRadius: "rounded-full",
11059
+ effects: {
11060
+ hover: [{ effectId: "pop" }]
11061
+ }
11062
+ },
11063
+ {
11064
+ id: "header",
11065
+ name: "Header",
11066
+ enabled: true,
11067
+ priority: 2,
11068
+ background: { type: "solid", colorToken: "background" },
11069
+ textColorToken: "primary",
11070
+ borderRadius: "rounded-full",
11071
+ border: { widthClass: "border-2", colorToken: "primary" },
11072
+ effects: {
11073
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11074
+ }
11075
+ },
11076
+ {
11077
+ id: "outline",
11078
+ name: "Outline",
11079
+ enabled: true,
11080
+ priority: 3,
11081
+ background: { type: "transparent" },
11082
+ textColorToken: "primary",
11083
+ borderRadius: "rounded-full",
11084
+ border: { widthClass: "border-2", colorToken: "primary" },
11085
+ effects: {
11086
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
11087
+ }
11088
+ },
11089
+ {
11090
+ id: "ghost",
11091
+ name: "Ghost",
11092
+ enabled: true,
11093
+ priority: 3,
11094
+ background: { type: "transparent" },
11095
+ textColorToken: "primary",
11096
+ borderRadius: "rounded-full",
11097
+ effects: {
11098
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
11099
+ }
11100
+ }
11101
+ ]
11102
+ }
11103
+ });
11104
+
11105
+ // ../theme-core/src/buttons/personalities/soft-pill.ts
11106
+ var softPill = defineButtonPersonality({
11107
+ id: "soft-pill",
11108
+ name: "Soft Pill",
11109
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
11110
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
11111
+ buttonSystem: {
11112
+ global: {
11113
+ cornerStyle: "pill",
11114
+ shadow: "low",
11115
+ textTransform: "none",
11116
+ fontWeight: 500,
11117
+ borderWidth: 2,
11118
+ hoverTransform: "lift",
11119
+ hoverColor: "none"
11120
+ },
11121
+ variants: [
11122
+ {
11123
+ id: "primary",
11124
+ name: "Primary",
11125
+ enabled: true,
11126
+ priority: 1,
11127
+ background: { type: "solid", colorToken: "primary" },
11128
+ textColorToken: "primaryForeground",
11129
+ borderRadius: "rounded-full",
11130
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
11131
+ effects: {
11132
+ hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
11133
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
11134
+ }
11135
+ },
11136
+ {
11137
+ id: "secondary",
11138
+ name: "Secondary",
11139
+ enabled: true,
11140
+ priority: 2,
11141
+ background: { type: "transparent" },
11142
+ textColorToken: "primary",
11143
+ borderRadius: "rounded-full",
11144
+ border: { widthClass: "border-2", colorToken: "primary" },
11145
+ effects: {
11146
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10843
11147
  }
10844
11148
  },
10845
11149
  {
@@ -10881,7 +11185,8 @@ var buttonPersonalities = [
10881
11185
  inkStamp,
10882
11186
  brushedWash,
10883
11187
  showtimePill,
10884
- joyStamp
11188
+ joyStamp,
11189
+ ornateRitual
10885
11190
  ];
10886
11191
  var personalitiesById = new Map(
10887
11192
  buttonPersonalities.map((p) => [p.id, p])
@@ -11511,7 +11816,7 @@ function rgbColorValue(token) {
11511
11816
  if (alpha === void 0) {
11512
11817
  return `rgb(var(${cssVar}))`;
11513
11818
  }
11514
- return `rgba(var(${cssVar}), ${alpha})`;
11819
+ return `rgb(var(${cssVar}) / ${alpha})`;
11515
11820
  }
11516
11821
  function backgroundColorStyle(token) {
11517
11822
  return { backgroundColor: rgbColorValue(token) };
@@ -12616,6 +12921,28 @@ var warmDarkEmber = definePaletteVariant({
12616
12921
  { name: "border", hex: "#894e31" }
12617
12922
  ]
12618
12923
  });
12924
+ var warmDarkKirtanGold = definePaletteVariant({
12925
+ id: "warm-dark-kirtan-gold",
12926
+ name: "Warm Dark \u2014 Kirtan Gold",
12927
+ description: "Deep plum ground with pale gold primary, rose accent, and soft devotional text.",
12928
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
12929
+ mode: "dark",
12930
+ colors: [
12931
+ { name: "primary", hex: "#ffcdb2" },
12932
+ { name: "secondary", hex: "#b5838d" },
12933
+ { name: "accent", hex: "#e5989b" },
12934
+ { name: "success", hex: "#8fbf8f" },
12935
+ { name: "warning", hex: "#f2b86b" },
12936
+ { name: "destructive", hex: "#d96b6b" },
12937
+ { name: "background", hex: "#403944" },
12938
+ { name: "surface", hex: "#403944" },
12939
+ { name: "surfaceAlt", hex: "#372f3b" },
12940
+ { name: "muted", hex: "#4d4550" },
12941
+ { name: "text", hex: "#e6d2d5" },
12942
+ { name: "primaryForeground", hex: "#403944" },
12943
+ { name: "border", hex: "#8d747a" }
12944
+ ]
12945
+ });
12619
12946
 
12620
12947
  // ../theme-core/src/palette/variants/index.ts
12621
12948
  var paletteVariants = [
@@ -12639,7 +12966,8 @@ var paletteVariants = [
12639
12966
  softNaturalWatercolor,
12640
12967
  softNaturalLilac,
12641
12968
  // Warm-dark family (dark mode)
12642
- warmDarkEmber
12969
+ warmDarkEmber,
12970
+ warmDarkKirtanGold
12643
12971
  ];
12644
12972
  var paletteVariantsById = new Map(
12645
12973
  paletteVariants.map((v) => [v.id, v])
@@ -14208,9 +14536,125 @@ function headerConfigurationKey(configuration) {
14208
14536
  function asFooterLookId(value) {
14209
14537
  return value;
14210
14538
  }
14211
- var guaranteedFallbackFooterLookId = asFooterLookId("footer-muted-grounding");
14539
+ function asFooterLayoutId(value) {
14540
+ return value;
14541
+ }
14542
+ function asFooterStyleId(value) {
14543
+ return value;
14544
+ }
14545
+ var guaranteedFallbackFooterLookId = asFooterLookId("footer-identity-quiet");
14546
+ var footerLayoutCatalog = defineExactCatalog()([
14547
+ {
14548
+ id: asFooterLayoutId("identity"),
14549
+ label: "Identity",
14550
+ description: "Logo, site text, address, and legal copy without relying on footer navigation."
14551
+ },
14552
+ {
14553
+ id: asFooterLayoutId("centered"),
14554
+ label: "Centered",
14555
+ description: "A calm centered stack for identity, short copy, and optional compact navigation.",
14556
+ maxRecommendedNavDensity: "sparse"
14557
+ },
14558
+ {
14559
+ id: asFooterLayoutId("split"),
14560
+ label: "Split",
14561
+ description: "Navigation and brand signoff separated into a wider split footer.",
14562
+ requiresFooterNav: true,
14563
+ maxRecommendedNavDensity: "balanced"
14564
+ },
14565
+ {
14566
+ id: asFooterLayoutId("columns"),
14567
+ label: "Columns",
14568
+ description: "Grouped footer navigation columns with a supporting bottom line.",
14569
+ requiresFooterNav: true,
14570
+ requiresFooterNavGroups: true
14571
+ }
14572
+ ]);
14573
+ var footerStyleCatalog = defineExactCatalog()([
14574
+ {
14575
+ id: asFooterStyleId("quiet"),
14576
+ label: "Quiet",
14577
+ description: "Lightweight, practical footer treatment."
14578
+ },
14579
+ {
14580
+ id: asFooterStyleId("calm"),
14581
+ label: "Calm",
14582
+ description: "Soft centered treatment with restrained dividers."
14583
+ },
14584
+ {
14585
+ id: asFooterStyleId("editorial"),
14586
+ label: "Editorial",
14587
+ description: "Text-forward treatment with fine-line structure."
14588
+ },
14589
+ {
14590
+ id: asFooterStyleId("brand-band"),
14591
+ label: "Brand band",
14592
+ description: "High-contrast brand treatment with a stronger bottom bar."
14593
+ }
14594
+ ]);
14595
+ var footerLayoutsById = new Map(
14596
+ footerLayoutCatalog.map((layout) => [layout.id, layout])
14597
+ );
14598
+ var footerStylesById = new Map(
14599
+ footerStyleCatalog.map((style) => [style.id, style])
14600
+ );
14601
+ function identityQuietFooter(theme) {
14602
+ return {
14603
+ ...theme.footer,
14604
+ variant: "simple",
14605
+ maxWidth: "container",
14606
+ background: {
14607
+ type: "color",
14608
+ color: "surface"
14609
+ },
14610
+ navStyle: "minimal",
14611
+ navWeight: "regular",
14612
+ navColor: "text",
14613
+ navLinkStyle: {
14614
+ typography: "body",
14615
+ fontWeight: "regular",
14616
+ textTransform: "none",
14617
+ italic: false,
14618
+ colorToken: "text",
14619
+ hoverColorToken: "primary",
14620
+ padding: "none",
14621
+ borderRadius: "none"
14622
+ },
14623
+ navLayout: {
14624
+ layout: "inline-wrap",
14625
+ align: "start",
14626
+ gapX: "default",
14627
+ gapY: "tight"
14628
+ },
14629
+ logo: {
14630
+ showLogo: true,
14631
+ showLogoText: true,
14632
+ placement: "left",
14633
+ size: "sm",
14634
+ align: "start"
14635
+ },
14636
+ bottomBar: {
14637
+ enabled: false,
14638
+ fullBleed: false,
14639
+ textAlign: "left",
14640
+ paddingX: "default",
14641
+ paddingY: "compact",
14642
+ borderTop: {
14643
+ width: "none"
14644
+ }
14645
+ }
14646
+ };
14647
+ }
14212
14648
  function mutedGroundingFooter(theme) {
14213
- return theme.footer;
14649
+ return {
14650
+ ...identityQuietFooter(theme),
14651
+ background: theme.footer.background,
14652
+ navStyle: theme.footer.navStyle,
14653
+ navColor: theme.footer.navColor,
14654
+ navWeight: theme.footer.navWeight,
14655
+ navLinkStyle: theme.footer.navLinkStyle,
14656
+ bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
14657
+ };
14214
14658
  }
14215
14659
  function brandTwoBandFooter(theme) {
14216
14660
  return {
@@ -14315,6 +14759,53 @@ function centeredCalmFooter(theme) {
14315
14759
  }
14316
14760
  };
14317
14761
  }
14762
+ function splitEditorialFooter(theme) {
14763
+ return {
14764
+ ...theme.footer,
14765
+ variant: "split",
14766
+ maxWidth: "container",
14767
+ background: {
14768
+ type: "color",
14769
+ color: "surface"
14770
+ },
14771
+ navStyle: "minimal",
14772
+ navWeight: "regular",
14773
+ navColor: "text",
14774
+ navLinkStyle: {
14775
+ typography: "body",
14776
+ fontWeight: "regular",
14777
+ textTransform: "none",
14778
+ italic: false,
14779
+ colorToken: "text",
14780
+ hoverColorToken: "primary",
14781
+ padding: "none",
14782
+ borderRadius: "none"
14783
+ },
14784
+ navLayout: {
14785
+ layout: "inline-wrap",
14786
+ align: "start",
14787
+ gapX: "relaxed",
14788
+ gapY: "tight"
14789
+ },
14790
+ logo: {
14791
+ showLogo: true,
14792
+ showLogoText: true,
14793
+ placement: "right",
14794
+ size: "sm",
14795
+ align: "end"
14796
+ },
14797
+ bottomBar: {
14798
+ enabled: true,
14799
+ fullBleed: false,
14800
+ textAlign: "left",
14801
+ paddingX: "default",
14802
+ paddingY: "compact",
14803
+ borderTop: {
14804
+ width: "thin"
14805
+ }
14806
+ }
14807
+ };
14808
+ }
14318
14809
  function editorialColumnsFooter(theme) {
14319
14810
  return {
14320
14811
  ...theme.footer,
@@ -14357,25 +14848,47 @@ function editorialColumnsFooter(theme) {
14357
14848
  };
14358
14849
  }
14359
14850
  var footerLookCatalog = defineExactCatalog()([
14851
+ {
14852
+ id: asFooterLookId("footer-identity-quiet"),
14853
+ label: "Identity footer",
14854
+ layoutId: asFooterLayoutId("identity"),
14855
+ styleId: asFooterStyleId("quiet"),
14856
+ compile: identityQuietFooter
14857
+ },
14360
14858
  {
14361
14859
  id: asFooterLookId("footer-muted-grounding"),
14362
14860
  label: "Muted grounding footer",
14861
+ layoutId: asFooterLayoutId("identity"),
14862
+ styleId: asFooterStyleId("quiet"),
14863
+ hiddenFromLayoutStyleControls: true,
14363
14864
  compile: mutedGroundingFooter
14364
14865
  },
14365
14866
  {
14366
14867
  id: asFooterLookId("footer-centered-calm"),
14367
14868
  label: "Centered calm footer",
14869
+ layoutId: asFooterLayoutId("centered"),
14870
+ styleId: asFooterStyleId("calm"),
14368
14871
  compile: centeredCalmFooter
14369
14872
  },
14873
+ {
14874
+ id: asFooterLookId("footer-split-editorial"),
14875
+ label: "Split editorial footer",
14876
+ layoutId: asFooterLayoutId("split"),
14877
+ styleId: asFooterStyleId("editorial"),
14878
+ compile: splitEditorialFooter
14879
+ },
14370
14880
  {
14371
14881
  id: asFooterLookId("footer-editorial-columns"),
14372
14882
  label: "Editorial columns footer",
14883
+ layoutId: asFooterLayoutId("columns"),
14884
+ styleId: asFooterStyleId("editorial"),
14373
14885
  compile: editorialColumnsFooter
14374
14886
  },
14375
14887
  {
14376
14888
  id: asFooterLookId("site-footer-brand-two-band"),
14377
14889
  label: "Two-band brand footer",
14378
- maxRecommendedNavDensity: "balanced",
14890
+ layoutId: asFooterLayoutId("split"),
14891
+ styleId: asFooterStyleId("brand-band"),
14379
14892
  allowedContentPresence: ["default-footer", "default-and-blocks"],
14380
14893
  compile: brandTwoBandFooter
14381
14894
  }
@@ -14578,6 +15091,30 @@ var luxeContrastTypography = {
14578
15091
  },
14579
15092
  scale: "spacious"
14580
15093
  };
15094
+ var kirtanOrnateTypography = {
15095
+ body: {
15096
+ family: "Jost, system-ui, sans-serif",
15097
+ size: "md",
15098
+ weight: "regular",
15099
+ lineHeight: "relaxed",
15100
+ letterSpacing: "normal"
15101
+ },
15102
+ headings: {
15103
+ default: {
15104
+ family: "Marcellus, Georgia, serif",
15105
+ weight: "regular",
15106
+ lineHeight: "normal",
15107
+ letterSpacing: "normal",
15108
+ colorToken: "primary",
15109
+ italic: null,
15110
+ case: null
15111
+ },
15112
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15113
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15114
+ h3: { size: "md", weight: "regular", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
15115
+ },
15116
+ scale: "spacious"
15117
+ };
14581
15118
  var boldDisplayTypography = {
14582
15119
  body: {
14583
15120
  family: "Manrope, system-ui, sans-serif",
@@ -14612,16 +15149,16 @@ var originalJoyTypography = {
14612
15149
  },
14613
15150
  headings: {
14614
15151
  default: {
14615
- family: "Bricolage Grotesque, system-ui, sans-serif",
14616
- weight: "bold",
15152
+ family: "Lobster, cursive",
15153
+ weight: "regular",
14617
15154
  lineHeight: "normal",
14618
- letterSpacing: "tight",
15155
+ letterSpacing: "normal",
14619
15156
  italic: null,
14620
15157
  case: null
14621
15158
  },
14622
- h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
14623
- h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
14624
- h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
15159
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15160
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
15161
+ h3: { size: "lg", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null }
14625
15162
  },
14626
15163
  scale: "balanced"
14627
15164
  };
@@ -14686,6 +15223,32 @@ var typographyPresets = [
14686
15223
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
14687
15224
  typography: luxeContrastTypography
14688
15225
  }),
15226
+ defineTypographyPreset({
15227
+ id: "typography-preset:kirtan-ornate",
15228
+ name: "Kirtan Ornate",
15229
+ description: "Marcellus devotional headings over a refined Jost body, matching dark ceremonial layouts.",
15230
+ defaultFonts: { body: "Jost, system-ui, sans-serif", heading: "Marcellus, Georgia, serif" },
15231
+ recommendedFonts: {
15232
+ body: ["Jost", "Manrope", "Inter"],
15233
+ heading: ["Marcellus", "Cormorant Garamond", "Playfair Display"]
15234
+ },
15235
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
15236
+ typography: kirtanOrnateTypography,
15237
+ heroTypography: {
15238
+ headlineSize: "6xl",
15239
+ headlineLineHeight: "normal",
15240
+ subheadlineSize: "xl",
15241
+ subheadlineLineHeight: "relaxed",
15242
+ microHeadlineSize: "5xl",
15243
+ microHeadlineLineHeight: "normal",
15244
+ microSubheadlineSize: "lg",
15245
+ microSubheadlineLineHeight: "relaxed",
15246
+ responsive: {
15247
+ tablet: { headlineSize: "5xl" },
15248
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
15249
+ }
15250
+ }
15251
+ }),
14689
15252
  defineTypographyPreset({
14690
15253
  id: "typography-preset:bold-display",
14691
15254
  name: "Bold Display",
@@ -14715,11 +15278,11 @@ var typographyPresets = [
14715
15278
  defineTypographyPreset({
14716
15279
  id: "typography-preset:original-joy",
14717
15280
  name: "Original Joy",
14718
- description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
14719
- defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
15281
+ description: "Lobster display headings over a clean DM Sans body, expressive and warm.",
15282
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Lobster, cursive" },
14720
15283
  recommendedFonts: {
14721
15284
  body: ["DM Sans", "Inter", "Manrope"],
14722
- heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
15285
+ heading: ["Lobster", "Bricolage Grotesque", "Space Grotesk"]
14723
15286
  },
14724
15287
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
14725
15288
  typography: originalJoyTypography,
@@ -14743,6 +15306,319 @@ var typographyPresetsById = new Map(
14743
15306
  typographyPresets.map((preset2) => [preset2.id, preset2])
14744
15307
  );
14745
15308
 
15309
+ // ../theme-core/src/site-styles/designState.ts
15310
+ import { z as z24 } from "zod";
15311
+ var themeV2DesignStateSchemaVersion = 1;
15312
+ var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
15313
+ var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
15314
+ var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
15315
+ fields3[0],
15316
+ ...fields3.slice(1)
15317
+ ]);
15318
+ var heroLegibilityStrategySchema = z24.enum([
15319
+ "none",
15320
+ "scrim-gradient",
15321
+ "solid-panel"
15322
+ ]);
15323
+ var heroCompositionIntentSchema = z24.enum([
15324
+ "center",
15325
+ "bottom-left"
15326
+ ]);
15327
+ var heroTypographyScaleIntentSchema = z24.enum([
15328
+ "quiet",
15329
+ "editorial",
15330
+ "display",
15331
+ "poster"
15332
+ ]);
15333
+ var sectionHeightIntentSchema = z24.enum([
15334
+ "default",
15335
+ "banner",
15336
+ "hero",
15337
+ "immersive"
15338
+ ]);
15339
+ var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
15340
+ var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
15341
+ var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
15342
+ z24.object({ kind: z24.literal("none") }).strict(),
15343
+ z24.object({
15344
+ kind: z24.literal("brand-scrim"),
15345
+ token: z24.enum(["primary", "secondary", "accent"]),
15346
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15347
+ }).strict(),
15348
+ z24.object({
15349
+ kind: z24.literal("brand-wash"),
15350
+ token: z24.enum(["primary", "secondary", "accent"]),
15351
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15352
+ }).strict(),
15353
+ z24.object({
15354
+ kind: z24.literal("neutral-scrim"),
15355
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15356
+ }).strict(),
15357
+ z24.object({
15358
+ kind: z24.literal("neutral-wash"),
15359
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15360
+ }).strict(),
15361
+ z24.object({
15362
+ kind: z24.literal("solid-panel"),
15363
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
15364
+ }).strict()
15365
+ ]);
15366
+ var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
15367
+ var tileTreatmentSchema = z24.enum(tileTreatmentValues);
15368
+ var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
15369
+ var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
15370
+ function uniqueNonEmpty(values) {
15371
+ const uniqueValues = [...new Set(values)];
15372
+ const firstValue = uniqueValues[0];
15373
+ if (!firstValue) {
15374
+ throw new Error("Expected at least one Theme V2 design state option.");
15375
+ }
15376
+ return [firstValue, ...uniqueValues.slice(1)];
15377
+ }
15378
+ var userPanelTreatments = uniqueNonEmpty(
15379
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
15380
+ );
15381
+ var userFlushTreatments = uniqueNonEmpty(
15382
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
15383
+ );
15384
+ var userFlushBleeds = uniqueNonEmpty(
15385
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
15386
+ );
15387
+ var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
15388
+ z24.object({ kind: z24.literal("plain") }).strict(),
15389
+ z24.object({
15390
+ kind: z24.literal("panel"),
15391
+ treatment: z24.enum(userPanelTreatments)
15392
+ }).strict(),
15393
+ z24.object({
15394
+ kind: z24.literal("flush-panel"),
15395
+ treatment: z24.enum(userFlushTreatments),
15396
+ bleed: z24.enum(userFlushBleeds)
15397
+ }).strict()
15398
+ ]);
15399
+ var blockDesignPlanSchema = z24.object({
15400
+ blockId: z24.string().min(1).transform(asDesignBlockId),
15401
+ blockKind: z24.string().min(1),
15402
+ purpose: z24.string().min(1),
15403
+ sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
15404
+ contentFrame: contentFrameIntentSchema,
15405
+ itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
15406
+ transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
15407
+ emphasis: z24.enum(userDesignOptionCatalog.emphases),
15408
+ sectionHeight: sectionHeightIntentSchema.optional(),
15409
+ heroLegibility: heroLegibilityStrategySchema.optional(),
15410
+ heroComposition: heroCompositionIntentSchema.optional(),
15411
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
15412
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
15413
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
15414
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
15415
+ tileTreatment: tileTreatmentSchema.optional(),
15416
+ eventListTreatment: eventListTreatmentSchema.optional(),
15417
+ eyebrowTreatment: eyebrowTreatmentSchema.optional()
15418
+ }).strict();
15419
+ var styleAuthoritySchema = z24.discriminatedUnion("kind", [
15420
+ z24.object({
15421
+ kind: z24.literal("theme-v2"),
15422
+ source: designResolutionPolicySchema,
15423
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
15424
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
15425
+ templateVersion: z24.number().int().nonnegative(),
15426
+ resolverVersion: z24.number().int().nonnegative()
15427
+ }).strict(),
15428
+ z24.object({
15429
+ kind: z24.literal("legacy-raw"),
15430
+ reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
15431
+ }).strict(),
15432
+ z24.object({
15433
+ kind: z24.literal("advanced-detached"),
15434
+ reason: z24.literal("detached-custom-runtime-fields")
15435
+ }).strict()
15436
+ ]);
15437
+ var blockRuntimeStyleAuthoritySchema = z24.object({
15438
+ unit: z24.literal("block-runtime-fields"),
15439
+ blockId: z24.string().min(1).transform(asDesignBlockId),
15440
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
15441
+ authority: styleAuthoritySchema
15442
+ }).strict();
15443
+ var persistedPageDesignStateV1Schema = z24.object({
15444
+ schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
15445
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
15446
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
15447
+ templateVersion: z24.number().int().nonnegative(),
15448
+ resolverVersion: z24.number().int().nonnegative(),
15449
+ rhythmPresetId: z24.string().min(1),
15450
+ blocks: z24.array(blockDesignPlanSchema),
15451
+ styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
15452
+ }).strict();
15453
+
15454
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
15455
+ function defineDesignRuntimeRules(rules) {
15456
+ return rules;
15457
+ }
15458
+ function defineComponentRuntimeRules(rules) {
15459
+ return rules;
15460
+ }
15461
+ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
15462
+ sectionSurfaces: {
15463
+ base: {},
15464
+ "muted-band": {
15465
+ background: {
15466
+ type: "color",
15467
+ color: "muted"
15468
+ }
15469
+ },
15470
+ "accent-band": {
15471
+ background: {
15472
+ type: "color",
15473
+ color: "primary"
15474
+ }
15475
+ },
15476
+ "brand-depth-band": {
15477
+ background: {
15478
+ type: "color",
15479
+ color: "primary-800"
15480
+ }
15481
+ },
15482
+ "hero-image": {
15483
+ background: {
15484
+ type: "image",
15485
+ opacity: 1,
15486
+ position: "center center",
15487
+ ...uniformSectionForeground("text")
15488
+ }
15489
+ }
15490
+ },
15491
+ heroLegibility: {
15492
+ "scrim-gradient": {
15493
+ type: "gradient",
15494
+ gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
15495
+ opacity: 1
15496
+ },
15497
+ "solid-panel": {
15498
+ type: "color",
15499
+ color: "surface",
15500
+ opacity: 0.88
15501
+ }
15502
+ },
15503
+ transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
15504
+ });
15505
+ var defaultComponentRuntimeRules = defineComponentRuntimeRules({
15506
+ panelFrames: {
15507
+ inset: {
15508
+ spacing: "comfortable",
15509
+ rounded: "xl",
15510
+ raised: false,
15511
+ background: {
15512
+ type: "color",
15513
+ color: "surfaceAlt",
15514
+ textColor: "text"
15515
+ }
15516
+ },
15517
+ raised: {
15518
+ spacing: "comfortable",
15519
+ rounded: "xl",
15520
+ raised: true,
15521
+ background: {
15522
+ type: "color",
15523
+ color: "surfaceAlt",
15524
+ textColor: "text"
15525
+ }
15526
+ },
15527
+ editorial: {
15528
+ spacing: "medium",
15529
+ rounded: "xl",
15530
+ raised: false,
15531
+ background: {
15532
+ type: "color",
15533
+ color: "surface",
15534
+ textColor: "text"
15535
+ }
15536
+ }
15537
+ },
15538
+ flushFrames: {
15539
+ "media-panel": {
15540
+ fullWidth: true,
15541
+ spacing: "none",
15542
+ rounded: "none",
15543
+ raised: false
15544
+ }
15545
+ },
15546
+ itemSurfaces: {
15547
+ none: null,
15548
+ default: {
15549
+ spacing: "medium",
15550
+ rounded: "lg",
15551
+ raised: false
15552
+ },
15553
+ flat: {
15554
+ spacing: "medium",
15555
+ rounded: "lg",
15556
+ raised: false
15557
+ },
15558
+ outlined: {
15559
+ spacing: "medium",
15560
+ rounded: "lg",
15561
+ raised: false,
15562
+ border: {
15563
+ enabled: true,
15564
+ width: "1",
15565
+ colorToken: "border"
15566
+ }
15567
+ },
15568
+ raised: {
15569
+ spacing: "medium",
15570
+ rounded: "xl",
15571
+ raised: true
15572
+ },
15573
+ inset: {
15574
+ treatment: "soft-panel",
15575
+ spacing: "comfortable",
15576
+ rounded: "xl",
15577
+ raised: false,
15578
+ border: {
15579
+ enabled: false
15580
+ },
15581
+ background: {
15582
+ type: "color",
15583
+ color: "surfaceAlt",
15584
+ textColor: "text"
15585
+ }
15586
+ },
15587
+ editorial: {
15588
+ // Boxless open column with a short rule on top; the visual treatment
15589
+ // lives in blocks-static/card-treatments.css.
15590
+ treatment: "editorial-rule",
15591
+ spacing: "none",
15592
+ rounded: "none",
15593
+ raised: false,
15594
+ border: {
15595
+ enabled: false
15596
+ }
15597
+ },
15598
+ "color-blocked": {
15599
+ // Bold, flat colour-blocked cards. The per-card background colour cycle
15600
+ // (by position) and staggered offset live in
15601
+ // blocks-static/card-treatments.css; here we set the shared shape:
15602
+ // generous padding, large radius, no border, flat (no shadow).
15603
+ treatment: "color-blocked",
15604
+ spacing: "spacious",
15605
+ rounded: "2xl",
15606
+ raised: false,
15607
+ border: {
15608
+ enabled: false
15609
+ }
15610
+ }
15611
+ }
15612
+ });
15613
+ function uniformSectionForeground(token) {
15614
+ return {
15615
+ textColor: token,
15616
+ headingColor: token,
15617
+ linkColor: token,
15618
+ supportingColor: token
15619
+ };
15620
+ }
15621
+
14746
15622
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
14747
15623
  var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
14748
15624
  var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
@@ -14761,6 +15637,7 @@ var curatedSiteStyleIdValues = [
14761
15637
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
14762
15638
  "site-style:bold-launch",
14763
15639
  "site-style:south-west-twerk-school",
15640
+ "site-style:kirtan-ornate",
14764
15641
  "site-style:original-joy"
14765
15642
  ];
14766
15643
  var quietBudget = {
@@ -14787,6 +15664,50 @@ var expressiveBudget = {
14787
15664
  mediaDensity: "high",
14788
15665
  decorativeRepetition: "medium"
14789
15666
  };
15667
+ var kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
15668
+ ...defaultDesignRuntimeRules,
15669
+ defaultEyebrowTreatment: "accent",
15670
+ sectionSurfaces: {
15671
+ ...defaultDesignRuntimeRules.sectionSurfaces,
15672
+ "muted-band": {
15673
+ background: {
15674
+ type: "color",
15675
+ color: "muted"
15676
+ },
15677
+ foreground: {
15678
+ textColor: "text",
15679
+ headingColor: "primary",
15680
+ linkColor: "primary",
15681
+ supportingColor: "text"
15682
+ }
15683
+ },
15684
+ "brand-depth-band": {
15685
+ background: {
15686
+ type: "color",
15687
+ color: "primary-800"
15688
+ },
15689
+ foreground: {
15690
+ textColor: "text",
15691
+ headingColor: "primary",
15692
+ linkColor: "primary",
15693
+ supportingColor: "text"
15694
+ }
15695
+ },
15696
+ "hero-image": {
15697
+ background: {
15698
+ type: "image",
15699
+ opacity: 1,
15700
+ position: "center center"
15701
+ },
15702
+ foreground: {
15703
+ textColor: "text",
15704
+ headingColor: "primary",
15705
+ linkColor: "primary",
15706
+ supportingColor: "text"
15707
+ }
15708
+ }
15709
+ }
15710
+ });
14790
15711
  var expressiveUnderlineInputs = {
14791
15712
  base: {
14792
15713
  background: { type: "transparent" },
@@ -14824,6 +15745,43 @@ var expressiveUnderlineInputs = {
14824
15745
  opacity: 0.6
14825
15746
  }
14826
15747
  };
15748
+ var ornateDarkInputs = {
15749
+ base: {
15750
+ background: { type: "solid", colorToken: "surfaceAlt" },
15751
+ textColorToken: "text",
15752
+ border: {
15753
+ widthClass: "border",
15754
+ colorToken: "primary/45",
15755
+ style: "all"
15756
+ },
15757
+ corners: "square",
15758
+ shadow: null,
15759
+ spacing: "medium",
15760
+ fontSize: "base"
15761
+ },
15762
+ label: {
15763
+ textColorToken: "primary",
15764
+ fontWeight: "semibold",
15765
+ fontSize: "xs",
15766
+ textTransform: "uppercase",
15767
+ letterSpacing: "wider",
15768
+ opacity: 1
15769
+ },
15770
+ focus: {
15771
+ ringColorToken: "primary/18",
15772
+ ringWidth: "2",
15773
+ borderColorToken: "primary/70"
15774
+ },
15775
+ error: {
15776
+ borderColorToken: "destructive",
15777
+ textColorToken: "destructive"
15778
+ },
15779
+ disabled: {
15780
+ backgroundColorToken: "muted",
15781
+ textColorToken: "mutedText",
15782
+ opacity: 0.6
15783
+ }
15784
+ };
14827
15785
  function uniqueContentFrameKinds() {
14828
15786
  const kinds = [
14829
15787
  ...new Set(
@@ -14881,6 +15839,7 @@ function defineCuratedSiteStyle(input) {
14881
15839
  // clean/minimal styles default to none.
14882
15840
  headingDecoration: input.headingDecoration ?? noHeadingDecoration,
14883
15841
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
15842
+ ...input.designRuntimeRules ? { designRuntimeRules: input.designRuntimeRules } : {},
14884
15843
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
14885
15844
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
14886
15845
  defaultHeaderSelection: input.defaultHeaderSelection ? {
@@ -15831,6 +16790,80 @@ var curatedSiteStyles = [
15831
16790
  paletteChoice("high-contrast-ink")
15832
16791
  ]
15833
16792
  }),
16793
+ defineCuratedSiteStyle({
16794
+ id: "site-style:kirtan-ornate",
16795
+ name: "Kirtan Ornate",
16796
+ headingDecoration: { family: "short-center-rule", colorToken: "accent" },
16797
+ description: "Ceremonial, jewel-toned, and devotional: ornate frames, warm contrast, and composed rhythm for intimate music gatherings.",
16798
+ 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.",
16799
+ selectionKeywordRules: [
16800
+ { kind: "word", value: "kirtan" },
16801
+ { kind: "word", value: "chanting" },
16802
+ { kind: "word", value: "ceremony" },
16803
+ { kind: "word", value: "devotional" }
16804
+ ],
16805
+ tokenRecipes: {
16806
+ palette: "brand-led",
16807
+ contrast: "strong",
16808
+ radius: "soft",
16809
+ shadow: "subtle",
16810
+ typography: "serif-editorial",
16811
+ spacing: "airy",
16812
+ motion: "subtle"
16813
+ },
16814
+ compositionBudget: expressiveBudget,
16815
+ typographyPresetChoices: [
16816
+ typographyChoice("typography-preset:kirtan-ornate"),
16817
+ typographyChoice("typography-preset:luxe-contrast"),
16818
+ typographyChoice("typography-preset:editorial-serif")
16819
+ ],
16820
+ defaultTypographyPresetId: "typography-preset:kirtan-ornate",
16821
+ themeOverrides: {
16822
+ accordions: warmInsetAccordionSystem,
16823
+ cards: originalJoyCardSystem,
16824
+ testimonialQuote: serifDisplayQuote,
16825
+ bodyText: {
16826
+ intro: {
16827
+ paragraphSize: "editorial",
16828
+ headingSize: "editorial"
16829
+ }
16830
+ },
16831
+ inputs: ornateDarkInputs
16832
+ },
16833
+ designRuntimeRules: kirtanOrnateDesignRuntimeRules,
16834
+ recommendedAppearancePresetIds: [
16835
+ "hero-brand-scrim-fixed-frame",
16836
+ "media-text-quiet-story",
16837
+ "events-lined-panel",
16838
+ "schedule-details-brand-depth",
16839
+ "testimonials-statement-cards",
16840
+ "contact-form-panel"
16841
+ ],
16842
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
16843
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
16844
+ recommendedHeaderStyleChoicesByLayout: {
16845
+ floating: [
16846
+ headerStyleChoice("minimal-surface"),
16847
+ headerStyleChoice("split-glass"),
16848
+ headerStyleChoice("glass")
16849
+ ]
16850
+ },
16851
+ recommendedHeaderLookIds: ["minimal-transparent"],
16852
+ recommendedFooterLookIds: [
16853
+ "site-footer-brand-two-band",
16854
+ "footer-muted-grounding"
16855
+ ],
16856
+ buttonPersonalityChoices: [
16857
+ buttonChoice("ornate-ritual"),
16858
+ buttonChoice("joy-stamp"),
16859
+ buttonChoice("ink-stamp")
16860
+ ],
16861
+ paletteVariantChoices: [
16862
+ paletteChoice("warm-dark-kirtan-gold"),
16863
+ paletteChoice("warm-dark-ember"),
16864
+ paletteChoice("brand-led-burgundy-gold")
16865
+ ]
16866
+ }),
15834
16867
  defineCuratedSiteStyle({
15835
16868
  id: "site-style:original-joy",
15836
16869
  name: "Original Joy",
@@ -15934,319 +16967,6 @@ var pageFlowPresets = [
15934
16967
  }
15935
16968
  ];
15936
16969
 
15937
- // ../theme-core/src/site-styles/designState.ts
15938
- import { z as z24 } from "zod";
15939
- var themeV2DesignStateSchemaVersion = 1;
15940
- var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
15941
- var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
15942
- var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
15943
- fields3[0],
15944
- ...fields3.slice(1)
15945
- ]);
15946
- var heroLegibilityStrategySchema = z24.enum([
15947
- "none",
15948
- "scrim-gradient",
15949
- "solid-panel"
15950
- ]);
15951
- var heroCompositionIntentSchema = z24.enum([
15952
- "center",
15953
- "bottom-left"
15954
- ]);
15955
- var heroTypographyScaleIntentSchema = z24.enum([
15956
- "quiet",
15957
- "editorial",
15958
- "display",
15959
- "poster"
15960
- ]);
15961
- var sectionHeightIntentSchema = z24.enum([
15962
- "default",
15963
- "banner",
15964
- "hero",
15965
- "immersive"
15966
- ]);
15967
- var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
15968
- var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
15969
- var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
15970
- z24.object({ kind: z24.literal("none") }).strict(),
15971
- z24.object({
15972
- kind: z24.literal("brand-scrim"),
15973
- token: z24.enum(["primary", "secondary", "accent"]),
15974
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
15975
- }).strict(),
15976
- z24.object({
15977
- kind: z24.literal("brand-wash"),
15978
- token: z24.enum(["primary", "secondary", "accent"]),
15979
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
15980
- }).strict(),
15981
- z24.object({
15982
- kind: z24.literal("neutral-scrim"),
15983
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
15984
- }).strict(),
15985
- z24.object({
15986
- kind: z24.literal("neutral-wash"),
15987
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
15988
- }).strict(),
15989
- z24.object({
15990
- kind: z24.literal("solid-panel"),
15991
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
15992
- }).strict()
15993
- ]);
15994
- var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
15995
- var tileTreatmentSchema = z24.enum(tileTreatmentValues);
15996
- var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
15997
- var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
15998
- function uniqueNonEmpty(values) {
15999
- const uniqueValues = [...new Set(values)];
16000
- const firstValue = uniqueValues[0];
16001
- if (!firstValue) {
16002
- throw new Error("Expected at least one Theme V2 design state option.");
16003
- }
16004
- return [firstValue, ...uniqueValues.slice(1)];
16005
- }
16006
- var userPanelTreatments = uniqueNonEmpty(
16007
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
16008
- );
16009
- var userFlushTreatments = uniqueNonEmpty(
16010
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
16011
- );
16012
- var userFlushBleeds = uniqueNonEmpty(
16013
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
16014
- );
16015
- var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
16016
- z24.object({ kind: z24.literal("plain") }).strict(),
16017
- z24.object({
16018
- kind: z24.literal("panel"),
16019
- treatment: z24.enum(userPanelTreatments)
16020
- }).strict(),
16021
- z24.object({
16022
- kind: z24.literal("flush-panel"),
16023
- treatment: z24.enum(userFlushTreatments),
16024
- bleed: z24.enum(userFlushBleeds)
16025
- }).strict()
16026
- ]);
16027
- var blockDesignPlanSchema = z24.object({
16028
- blockId: z24.string().min(1).transform(asDesignBlockId),
16029
- blockKind: z24.string().min(1),
16030
- purpose: z24.string().min(1),
16031
- sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
16032
- contentFrame: contentFrameIntentSchema,
16033
- itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
16034
- transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
16035
- emphasis: z24.enum(userDesignOptionCatalog.emphases),
16036
- sectionHeight: sectionHeightIntentSchema.optional(),
16037
- heroLegibility: heroLegibilityStrategySchema.optional(),
16038
- heroComposition: heroCompositionIntentSchema.optional(),
16039
- heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
16040
- imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
16041
- imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
16042
- testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
16043
- tileTreatment: tileTreatmentSchema.optional(),
16044
- eventListTreatment: eventListTreatmentSchema.optional(),
16045
- eyebrowTreatment: eyebrowTreatmentSchema.optional()
16046
- }).strict();
16047
- var styleAuthoritySchema = z24.discriminatedUnion("kind", [
16048
- z24.object({
16049
- kind: z24.literal("theme-v2"),
16050
- source: designResolutionPolicySchema,
16051
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
16052
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
16053
- templateVersion: z24.number().int().nonnegative(),
16054
- resolverVersion: z24.number().int().nonnegative()
16055
- }).strict(),
16056
- z24.object({
16057
- kind: z24.literal("legacy-raw"),
16058
- reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
16059
- }).strict(),
16060
- z24.object({
16061
- kind: z24.literal("advanced-detached"),
16062
- reason: z24.literal("detached-custom-runtime-fields")
16063
- }).strict()
16064
- ]);
16065
- var blockRuntimeStyleAuthoritySchema = z24.object({
16066
- unit: z24.literal("block-runtime-fields"),
16067
- blockId: z24.string().min(1).transform(asDesignBlockId),
16068
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
16069
- authority: styleAuthoritySchema
16070
- }).strict();
16071
- var persistedPageDesignStateV1Schema = z24.object({
16072
- schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
16073
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
16074
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
16075
- templateVersion: z24.number().int().nonnegative(),
16076
- resolverVersion: z24.number().int().nonnegative(),
16077
- rhythmPresetId: z24.string().min(1),
16078
- blocks: z24.array(blockDesignPlanSchema),
16079
- styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
16080
- }).strict();
16081
-
16082
- // ../theme-core/src/site-styles/runtimeCompiler.ts
16083
- function defineDesignRuntimeRules(rules) {
16084
- return rules;
16085
- }
16086
- function defineComponentRuntimeRules(rules) {
16087
- return rules;
16088
- }
16089
- var defaultDesignRuntimeRules = defineDesignRuntimeRules({
16090
- sectionSurfaces: {
16091
- base: {},
16092
- "muted-band": {
16093
- background: {
16094
- type: "color",
16095
- color: "muted"
16096
- }
16097
- },
16098
- "accent-band": {
16099
- background: {
16100
- type: "color",
16101
- color: "primary"
16102
- }
16103
- },
16104
- "brand-depth-band": {
16105
- background: {
16106
- type: "color",
16107
- color: "primary-800"
16108
- }
16109
- },
16110
- "hero-image": {
16111
- background: {
16112
- type: "image",
16113
- opacity: 1,
16114
- position: "center center",
16115
- ...uniformSectionForeground("text")
16116
- }
16117
- }
16118
- },
16119
- heroLegibility: {
16120
- "scrim-gradient": {
16121
- type: "gradient",
16122
- gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
16123
- opacity: 1
16124
- },
16125
- "solid-panel": {
16126
- type: "color",
16127
- color: "surface",
16128
- opacity: 0.88
16129
- }
16130
- },
16131
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
16132
- });
16133
- var defaultComponentRuntimeRules = defineComponentRuntimeRules({
16134
- panelFrames: {
16135
- inset: {
16136
- spacing: "comfortable",
16137
- rounded: "xl",
16138
- raised: false,
16139
- background: {
16140
- type: "color",
16141
- color: "surfaceAlt",
16142
- textColor: "text"
16143
- }
16144
- },
16145
- raised: {
16146
- spacing: "comfortable",
16147
- rounded: "xl",
16148
- raised: true,
16149
- background: {
16150
- type: "color",
16151
- color: "surfaceAlt",
16152
- textColor: "text"
16153
- }
16154
- },
16155
- editorial: {
16156
- spacing: "medium",
16157
- rounded: "xl",
16158
- raised: false,
16159
- background: {
16160
- type: "color",
16161
- color: "surface",
16162
- textColor: "text"
16163
- }
16164
- }
16165
- },
16166
- flushFrames: {
16167
- "media-panel": {
16168
- fullWidth: true,
16169
- spacing: "none",
16170
- rounded: "none",
16171
- raised: false
16172
- }
16173
- },
16174
- itemSurfaces: {
16175
- none: null,
16176
- default: {
16177
- spacing: "medium",
16178
- rounded: "lg",
16179
- raised: false
16180
- },
16181
- flat: {
16182
- spacing: "medium",
16183
- rounded: "lg",
16184
- raised: false
16185
- },
16186
- outlined: {
16187
- spacing: "medium",
16188
- rounded: "lg",
16189
- raised: false,
16190
- border: {
16191
- enabled: true,
16192
- width: "1",
16193
- colorToken: "border"
16194
- }
16195
- },
16196
- raised: {
16197
- spacing: "medium",
16198
- rounded: "xl",
16199
- raised: true
16200
- },
16201
- inset: {
16202
- treatment: "soft-panel",
16203
- spacing: "comfortable",
16204
- rounded: "xl",
16205
- raised: false,
16206
- border: {
16207
- enabled: false
16208
- },
16209
- background: {
16210
- type: "color",
16211
- color: "surfaceAlt",
16212
- textColor: "text"
16213
- }
16214
- },
16215
- editorial: {
16216
- // Boxless open column with a short rule on top; the visual treatment
16217
- // lives in blocks-static/card-treatments.css.
16218
- treatment: "editorial-rule",
16219
- spacing: "none",
16220
- rounded: "none",
16221
- raised: false,
16222
- border: {
16223
- enabled: false
16224
- }
16225
- },
16226
- "color-blocked": {
16227
- // Bold, flat colour-blocked cards. The per-card background colour cycle
16228
- // (by position) and staggered offset live in
16229
- // blocks-static/card-treatments.css; here we set the shared shape:
16230
- // generous padding, large radius, no border, flat (no shadow).
16231
- treatment: "color-blocked",
16232
- spacing: "spacious",
16233
- rounded: "2xl",
16234
- raised: false,
16235
- border: {
16236
- enabled: false
16237
- }
16238
- }
16239
- }
16240
- });
16241
- function uniformSectionForeground(token) {
16242
- return {
16243
- textColor: token,
16244
- headingColor: token,
16245
- linkColor: token,
16246
- supportingColor: token
16247
- };
16248
- }
16249
-
16250
16970
  // ../theme-core/src/site-styles/generatedSchemas.ts
16251
16971
  import { z as z25 } from "zod";
16252
16972
  function uniqueNonEmpty2(values) {
@@ -17058,6 +17778,31 @@ function cardStylesField(options = {}) {
17058
17778
  return createBoxStylesFieldWithDepth("card", options);
17059
17779
  }
17060
17780
 
17781
+ // ../blocks/src/system/fields/imageShape.ts
17782
+ var standardImageShapeOptions = [
17783
+ { value: "default", label: "Default" },
17784
+ { value: "square", label: "Square corners" },
17785
+ { value: "rounded", label: "Rounded corners" },
17786
+ { value: "circle", label: "Circle" },
17787
+ { value: "arch", label: "Arch" }
17788
+ ];
17789
+ function createImageShapeField(options = {}) {
17790
+ return {
17791
+ id: options.id ?? "imageShape",
17792
+ type: "select",
17793
+ label: options.label ?? "Image shape",
17794
+ ...options.description ? { description: options.description } : {},
17795
+ required: false,
17796
+ defaultValue: options.defaultValue ?? "default",
17797
+ multiple: false,
17798
+ options: [...standardImageShapeOptions],
17799
+ ui: {
17800
+ intent: options.uiIntent ?? "display",
17801
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
17802
+ }
17803
+ };
17804
+ }
17805
+
17061
17806
  // ../blocks/src/utils/env.ts
17062
17807
  function isDevEnvironment() {
17063
17808
  try {
@@ -17872,7 +18617,7 @@ function buildFooterNavAll(common) {
17872
18617
  return stack(
17873
18618
  { className: common.className, gap: common.gap, align: "stretch" },
17874
18619
  [item],
17875
- when(collectionPath)
18620
+ whenCollectionHasItems(collectionPath)
17876
18621
  );
17877
18622
  }
17878
18623
  function buildFooterNavLinksOnly(common) {
@@ -17905,7 +18650,7 @@ function buildFooterNavLinksOnly(common) {
17905
18650
  return stack(
17906
18651
  { className: common.className, gap: common.gap, align: "stretch" },
17907
18652
  [item],
17908
- when(collectionPath)
18653
+ whenCollectionHasItems(collectionPath)
17909
18654
  );
17910
18655
  }
17911
18656
  function buildFooterNavFlatten(common) {
@@ -17954,9 +18699,20 @@ function buildFooterNavFlatten(common) {
17954
18699
  return stack(
17955
18700
  { className: common.className, gap: common.gap, align: "stretch" },
17956
18701
  [item],
17957
- when(collectionPath)
18702
+ whenCollectionHasItems(collectionPath)
17958
18703
  );
17959
18704
  }
18705
+ var whenCollectionHasItems = (collectionPath) => (node) => ({
18706
+ ...node,
18707
+ $when: {
18708
+ when: {
18709
+ from: collectionPath,
18710
+ transforms: [{ id: "array.length" }]
18711
+ },
18712
+ equals: 0,
18713
+ not: true
18714
+ }
18715
+ });
17960
18716
  function footerNav(opts) {
17961
18717
  const mode = opts?.mode ?? "all";
17962
18718
  const collectionPath = opts?.collectionPath ?? "footerMenu.items";
@@ -20539,8 +21295,23 @@ function fragmentsToRepeaterField(id, label, fragments, options = {}) {
20539
21295
  var heroLayoutControlsFragment = defineFragment({
20540
21296
  id: "heroLayoutControls",
20541
21297
  title: "Hero Layout",
20542
- description: "Alignment and content width controls for hero layouts.",
21298
+ description: "Title scale, alignment, and content width controls for hero layouts.",
20543
21299
  fields: [
21300
+ {
21301
+ id: "titleSize",
21302
+ type: "select",
21303
+ label: "Title size",
21304
+ description: "Adjust the visual scale of the hero title.",
21305
+ required: false,
21306
+ ui: { intent: "display" },
21307
+ options: [
21308
+ { value: "auto", label: "Auto" },
21309
+ { value: "quiet", label: "Normal" },
21310
+ { value: "editorial", label: "Large" },
21311
+ { value: "display", label: "Huge" },
21312
+ { value: "poster", label: "Poster" }
21313
+ ]
21314
+ },
20544
21315
  {
20545
21316
  id: "contentAlignment",
20546
21317
  type: "select",
@@ -21335,7 +22106,18 @@ function heroSplitImagePane() {
21335
22106
  return stack(
21336
22107
  {
21337
22108
  gap: "none",
21338
- className: "rb-relative rb-overflow-hidden rb-rounded-3xl",
22109
+ className: {
22110
+ $bind: {
22111
+ from: "content.imageShape",
22112
+ transforms: [
22113
+ {
22114
+ id: "ui.imageShapeClassName",
22115
+ options: { baseClass: "rb-relative rb-overflow-hidden rb-rounded-3xl" }
22116
+ }
22117
+ ],
22118
+ fallback: "rb-relative rb-overflow-hidden rb-rounded-3xl"
22119
+ }
22120
+ },
21339
22121
  style: {
21340
22122
  minHeight: "clamp(18rem, 36vw, 34rem)"
21341
22123
  }
@@ -21453,6 +22235,12 @@ var heroConfig = {
21453
22235
  label: "Content card",
21454
22236
  renderInHeader: true,
21455
22237
  intent: "style"
22238
+ }),
22239
+ createImageShapeField({
22240
+ id: "imageShape",
22241
+ label: "Image shape",
22242
+ defaultValue: "default",
22243
+ uiIntent: "display"
21456
22244
  })
21457
22245
  ],
21458
22246
  layout: classicLayout,
@@ -21467,6 +22255,15 @@ var heroConfig = {
21467
22255
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
21468
22256
  tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
21469
22257
  icon: "Sparkles",
22258
+ previewCustomize: {
22259
+ quickFieldPriority: [
22260
+ "titleSize",
22261
+ "contentAlignment",
22262
+ "contentMaxWidth",
22263
+ "verticalAlignment",
22264
+ "imageShape"
22265
+ ]
22266
+ },
21470
22267
  styleTokens: {
21471
22268
  typography: "display",
21472
22269
  spacing: "xl"
@@ -21483,7 +22280,8 @@ var standardAspectRatioOptions = [
21483
22280
  { value: "16/9", label: "16:9 (Landscape)" },
21484
22281
  { value: "4/3", label: "4:3 (Standard)" },
21485
22282
  { value: "1/1", label: "1:1 (Square)" },
21486
- { value: "3/4", label: "3:4 (Portrait)" }
22283
+ { value: "3/4", label: "3:4 (Portrait)" },
22284
+ { value: "9/16", label: "9:16 (Tall portrait)" }
21487
22285
  ];
21488
22286
  function createAspectRatioField(options = {}) {
21489
22287
  return {
@@ -22703,6 +23501,258 @@ var formBlockDefinition = {
22703
23501
  runtime: formBlockRuntime
22704
23502
  };
22705
23503
 
23504
+ // ../blocks/src/system/blocks/contact-newsletter.ts
23505
+ var contactNewsletterLayout = styledSection({
23506
+ children: sectionContainer([
23507
+ el(
23508
+ "div",
23509
+ { className: "contact-newsletter-grid" },
23510
+ [
23511
+ el(
23512
+ "div",
23513
+ { className: "contact-newsletter-column contact-newsletter-contact" },
23514
+ [
23515
+ el(
23516
+ "div",
23517
+ { className: "contact-newsletter-copy" },
23518
+ [
23519
+ text(
23520
+ {
23521
+ as: "h2",
23522
+ className: "form-copy-title"
23523
+ },
23524
+ when("contactTitle"),
23525
+ bind("contactTitle")
23526
+ ),
23527
+ richText(
23528
+ {
23529
+ className: "form-copy-intro rb-prose rb-max-w-none"
23530
+ },
23531
+ when("contactIntro"),
23532
+ bind("contactIntro")
23533
+ )
23534
+ ]
23535
+ ),
23536
+ el(
23537
+ "form",
23538
+ withApiBindings({
23539
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
23540
+ submitLabel: { $bind: { from: "contactSubmitLabel" } },
23541
+ successMessage: { $bind: { from: "contactSuccessMessage" } }
23542
+ }),
23543
+ [],
23544
+ bind("data.form")
23545
+ )
23546
+ ]
23547
+ ),
23548
+ el(
23549
+ "div",
23550
+ { className: "contact-newsletter-column contact-newsletter-info contact-newsletter-newsletter" },
23551
+ [
23552
+ el(
23553
+ "div",
23554
+ { className: "contact-newsletter-copy" },
23555
+ [
23556
+ text(
23557
+ {
23558
+ as: "h2",
23559
+ className: "newsletter-copy-title"
23560
+ },
23561
+ when("newsletterTitle"),
23562
+ bind("newsletterTitle")
23563
+ ),
23564
+ richText(
23565
+ {
23566
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none"
23567
+ },
23568
+ when("newsletterSubtitle"),
23569
+ bind("newsletterSubtitle")
23570
+ )
23571
+ ]
23572
+ ),
23573
+ el(
23574
+ "newsletter-form",
23575
+ withApiBindings({
23576
+ listId: { $bind: { from: "listId" } },
23577
+ preset: { $bind: { from: "preset" } },
23578
+ includePhone: { $bind: { from: "includePhone" } },
23579
+ buttonLabel: { $bind: { from: "newsletterButtonLabel" } },
23580
+ successMessage: { $bind: { from: "newsletterSuccessMessage" } },
23581
+ privacyNote: { $bind: { from: "newsletterPrivacyNote" } },
23582
+ tags: { $bind: { from: "newsletterTags" } },
23583
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } }
23584
+ }),
23585
+ []
23586
+ )
23587
+ ]
23588
+ )
23589
+ ]
23590
+ )
23591
+ ], {
23592
+ className: "contact-newsletter-container"
23593
+ }),
23594
+ baseClass: "",
23595
+ spacing: "medium",
23596
+ background: "surface"
23597
+ });
23598
+ var contactNewsletterManifest = createBlockManifest({
23599
+ id: "block.contact-newsletter",
23600
+ title: "Contact + Newsletter",
23601
+ titleSource: "contactTitle",
23602
+ description: "Two-column newsletter signup and contact form section.",
23603
+ category: "interactive",
23604
+ layout: contactNewsletterLayout,
23605
+ defaultVariant: "default",
23606
+ variants: {
23607
+ default: contactNewsletterLayout
23608
+ },
23609
+ variantOptions: {
23610
+ default: {
23611
+ label: "Two column",
23612
+ description: "Newsletter and contact form side by side.",
23613
+ icon: "Columns2"
23614
+ }
23615
+ },
23616
+ additionalFields: [
23617
+ {
23618
+ id: "newsletterTitle",
23619
+ type: "text",
23620
+ label: "Newsletter title",
23621
+ defaultValue: "Stay connected"
23622
+ },
23623
+ {
23624
+ id: "newsletterSubtitle",
23625
+ type: "richText",
23626
+ label: "Newsletter intro"
23627
+ },
23628
+ {
23629
+ id: "listId",
23630
+ type: "reference",
23631
+ label: "Newsletter list",
23632
+ description: "Select the list new subscribers should be added to.",
23633
+ required: true,
23634
+ referenceKind: "newsletterList",
23635
+ allowManualEntry: false,
23636
+ ui: { intent: "behavior" }
23637
+ },
23638
+ {
23639
+ id: "preset",
23640
+ type: "select",
23641
+ label: "Newsletter fields",
23642
+ defaultValue: "emailOnly",
23643
+ ui: { intent: "display" },
23644
+ options: [
23645
+ { value: "emailOnly", label: "Email only" },
23646
+ { value: "emailName", label: "Email + Name" },
23647
+ { value: "emailFirstLast", label: "Email + First/Last Name" },
23648
+ { value: "emailNameCompany", label: "Email + Name + Company (B2B)" }
23649
+ ]
23650
+ },
23651
+ {
23652
+ id: "includePhone",
23653
+ type: "boolean",
23654
+ label: "Include phone field",
23655
+ defaultValue: false,
23656
+ ui: { intent: "display" }
23657
+ },
23658
+ {
23659
+ id: "newsletterButtonLabel",
23660
+ type: "text",
23661
+ label: "Newsletter button label",
23662
+ defaultValue: "Subscribe",
23663
+ ui: { intent: "display" }
23664
+ },
23665
+ {
23666
+ id: "newsletterSuccessMessage",
23667
+ type: "text",
23668
+ label: "Newsletter success message",
23669
+ defaultValue: "Thanks for subscribing!",
23670
+ ui: { intent: "behavior" }
23671
+ },
23672
+ {
23673
+ id: "newsletterPrivacyNote",
23674
+ type: "text",
23675
+ label: "Privacy note",
23676
+ ui: { intent: "display" }
23677
+ },
23678
+ {
23679
+ id: "newsletterTags",
23680
+ type: "text",
23681
+ label: "Newsletter tags",
23682
+ description: "Optional tags to apply on subscribe, separated by comma or semicolon.",
23683
+ ui: { intent: "behavior" }
23684
+ },
23685
+ {
23686
+ id: "contactTitle",
23687
+ type: "text",
23688
+ label: "Contact title",
23689
+ defaultValue: "Get in touch"
23690
+ },
23691
+ {
23692
+ id: "contactIntro",
23693
+ type: "richText",
23694
+ label: "Contact intro"
23695
+ },
23696
+ {
23697
+ id: "formSlug",
23698
+ type: "reference",
23699
+ label: "Contact form",
23700
+ description: "Pick a saved form to render.",
23701
+ required: true,
23702
+ referenceKind: "form",
23703
+ allowManualEntry: false,
23704
+ ui: { intent: "behavior" }
23705
+ },
23706
+ {
23707
+ id: "contactSubmitLabel",
23708
+ type: "text",
23709
+ label: "Contact button label",
23710
+ defaultValue: "Send message",
23711
+ ui: { intent: "display" }
23712
+ },
23713
+ {
23714
+ id: "contactSuccessMessage",
23715
+ type: "text",
23716
+ label: "Contact success message",
23717
+ defaultValue: "Thanks - we received your message.",
23718
+ ui: { intent: "behavior" }
23719
+ }
23720
+ ],
23721
+ styleTokens: {
23722
+ background: "surface",
23723
+ typography: "body",
23724
+ spacing: "md"
23725
+ },
23726
+ behaviours: {
23727
+ supportsThemeSwitching: true,
23728
+ inlineEditing: true,
23729
+ animation: false,
23730
+ paletteHidden: false
23731
+ },
23732
+ tags: [
23733
+ "contact",
23734
+ "newsletter",
23735
+ "signup",
23736
+ "email",
23737
+ "form",
23738
+ "lead-capture"
23739
+ ],
23740
+ icon: "MailPlus"
23741
+ });
23742
+ var contactNewsletterBlockDefinition = {
23743
+ manifest: contactNewsletterManifest,
23744
+ dataSchemas: { form: formDataSchema.optional() },
23745
+ dataLoaders: {
23746
+ form: {
23747
+ endpoint: "getPublicFormById",
23748
+ params: {
23749
+ formSlug: { $bind: { from: "formSlug" } }
23750
+ },
23751
+ mode: "server"
23752
+ }
23753
+ }
23754
+ };
23755
+
22706
23756
  // ../blocks/src/system/blocks/faq.ts
22707
23757
  function fragmentLayoutNode2(layout) {
22708
23758
  return isNodeDefinitionArray2(layout) ? el("div", {}, [...layout]) : layout;
@@ -22931,6 +23981,7 @@ var joinClasses3 = (parts) => parts.filter(
22931
23981
  ).join(" ").replace(/\s+/g, " ").trim();
22932
23982
  var eyebrowTreatmentClassMap = {
22933
23983
  plain: "",
23984
+ accent: "rb-eyebrow-treatment-accent",
22934
23985
  pill: "rb-eyebrow-treatment-pill",
22935
23986
  "accent-pill": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent",
22936
23987
  "pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-pill-bounce",
@@ -22957,6 +24008,13 @@ var imageGalleryCornerClassMap = {
22957
24008
  "2xl": "rb-rounded-2xl",
22958
24009
  "3xl": "rb-rounded-3xl"
22959
24010
  };
24011
+ var imageShapeClassMap = {
24012
+ default: "",
24013
+ square: "rb-media-shape-square",
24014
+ rounded: "rb-media-shape-rounded",
24015
+ circle: "rb-media-shape-circle",
24016
+ arch: "rb-media-shape-arch"
24017
+ };
22960
24018
  var parseRatio = (raw) => {
22961
24019
  if (typeof raw !== "string") return null;
22962
24020
  const value = raw.trim();
@@ -23101,6 +24159,10 @@ function resolveHeroContentMaxWidth(content) {
23101
24159
  return "default";
23102
24160
  }
23103
24161
  function resolveHeroTypographyScale(content) {
24162
+ const titleSize = readString(content, "titleSize");
24163
+ if (titleSize === "quiet" || titleSize === "editorial" || titleSize === "display" || titleSize === "poster") {
24164
+ return titleSize;
24165
+ }
23104
24166
  const raw = readHeroLayoutString(
23105
24167
  content,
23106
24168
  "typographyScale",
@@ -23342,6 +24404,16 @@ var uiTransforms = [
23342
24404
  heroGridClassFromVerticalAlignmentTransform,
23343
24405
  imageFragmentClassTransform,
23344
24406
  imageFragmentSizeTransform,
24407
+ {
24408
+ id: "ui.imageShapeClassName",
24409
+ kind: "string",
24410
+ summary: "Apply a constrained media shape class",
24411
+ run: (value, options) => {
24412
+ const baseClass = typeof options?.baseClass === "string" ? options.baseClass : "";
24413
+ const shape = typeof value === "string" ? value.trim() : "default";
24414
+ return joinClasses3([baseClass, imageShapeClassMap[shape] ?? ""]);
24415
+ }
24416
+ },
23345
24417
  conditionalClassTransform,
23346
24418
  twoColumnContainerClassTransform,
23347
24419
  twoColumnFlexBasisTransform,
@@ -24688,6 +25760,21 @@ var siteHeaderManifest = createBlockManifest({
24688
25760
  id: "block.site-header",
24689
25761
  title: "Site Header",
24690
25762
  category: "layout",
25763
+ additionalFields: [
25764
+ {
25765
+ id: "mode",
25766
+ type: "select",
25767
+ label: "Header display",
25768
+ required: false,
25769
+ multiple: false,
25770
+ defaultValue: "default",
25771
+ options: [
25772
+ { value: "default", label: "Show header" },
25773
+ { value: "hidden", label: "Hide header" }
25774
+ ],
25775
+ ui: { intent: "display" }
25776
+ }
25777
+ ],
24691
25778
  // Skip section styles - this block uses theme-based styling
24692
25779
  skipSectionStyles: true,
24693
25780
  // Block manages its own wrapper - enables sticky positioning
@@ -26090,6 +27177,9 @@ var mediaTextManifest = createBlockManifest({
26090
27177
  category: "layout",
26091
27178
  includeContainerStyles: true,
26092
27179
  titleSource: "title",
27180
+ previewCustomize: {
27181
+ quickFieldPriority: ["imagePosition", "ratio", "imageShape", "titleAlignment", "aspectRatio"]
27182
+ },
26093
27183
  additionalFields: [
26094
27184
  {
26095
27185
  id: "images",
@@ -26128,7 +27218,7 @@ var mediaTextManifest = createBlockManifest({
26128
27218
  {
26129
27219
  id: "titleAlignment",
26130
27220
  type: "select",
26131
- label: "Title alignment",
27221
+ label: "Content alignment",
26132
27222
  required: false,
26133
27223
  defaultValue: "left",
26134
27224
  multiple: false,
@@ -26186,7 +27276,18 @@ var mediaTextManifest = createBlockManifest({
26186
27276
  transition: "slide"
26187
27277
  },
26188
27278
  ui: { intent: "behavior" }
26189
- }),
27279
+ }).map((field) => ({
27280
+ ...field,
27281
+ ui: {
27282
+ ...field.ui ?? {},
27283
+ visibleWhen: field.id === "carouselAutoplayDelay" ? {
27284
+ allOf: [
27285
+ { field: "images", minItems: 2 },
27286
+ { field: "carouselAutoplay", equals: true }
27287
+ ]
27288
+ } : { field: "images", minItems: 2 }
27289
+ }
27290
+ })),
26190
27291
  createAspectRatioField({
26191
27292
  id: "aspectRatio",
26192
27293
  label: "Media aspect ratio",
@@ -26194,6 +27295,12 @@ var mediaTextManifest = createBlockManifest({
26194
27295
  defaultValue: "auto",
26195
27296
  visibleWhen: { field: "images", notEquals: null }
26196
27297
  }),
27298
+ createImageShapeField({
27299
+ id: "imageShape",
27300
+ label: "Media shape",
27301
+ defaultValue: "default",
27302
+ visibleWhen: { field: "images", notEquals: null }
27303
+ }),
26197
27304
  {
26198
27305
  id: "text",
26199
27306
  type: "richText",
@@ -26227,6 +27334,30 @@ var mediaTextManifest = createBlockManifest({
26227
27334
  ...options?.not ? { not: true } : {}
26228
27335
  }
26229
27336
  });
27337
+ const bodyClassNameFromAlignment = {
27338
+ $bind: {
27339
+ from: "content.titleAlignment",
27340
+ transforms: [
27341
+ {
27342
+ id: "ui.bodyClassFromAlignment",
27343
+ options: { base: "rb-prose rb-max-w-none" }
27344
+ }
27345
+ ],
27346
+ fallback: "rb-prose rb-max-w-none"
27347
+ }
27348
+ };
27349
+ const titleClassNameFromAlignment = {
27350
+ $bind: {
27351
+ from: "content.titleAlignment",
27352
+ transforms: [
27353
+ {
27354
+ id: "ui.headingClassFromAlignment",
27355
+ options: { base: "" }
27356
+ }
27357
+ ],
27358
+ fallback: ""
27359
+ }
27360
+ };
26230
27361
  const defaultTextColumn = el("div", {}, [
26231
27362
  styledCard(
26232
27363
  [
@@ -26251,8 +27382,55 @@ var mediaTextManifest = createBlockManifest({
26251
27382
  bind("content.text")
26252
27383
  )
26253
27384
  ]);
27385
+ const bioTextColumn = el(
27386
+ "div",
27387
+ { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" },
27388
+ [
27389
+ text(
27390
+ {
27391
+ as: "h2",
27392
+ className: titleClassNameFromAlignment
27393
+ },
27394
+ when("content.title"),
27395
+ bind("content.title")
27396
+ ),
27397
+ styledCard(
27398
+ [
27399
+ richText(
27400
+ {
27401
+ className: bodyClassNameFromAlignment
27402
+ },
27403
+ bind("content.text")
27404
+ )
27405
+ ],
27406
+ {
27407
+ stylesFrom: "content._textCardStyles",
27408
+ backgroundFrom: "content._textCardStyles.background"
27409
+ },
27410
+ when("content.wrapTextInCard")
27411
+ ),
27412
+ richText(
27413
+ {
27414
+ className: bodyClassNameFromAlignment
27415
+ },
27416
+ when("content.wrapTextInCard", { not: true }),
27417
+ bind("content.text")
27418
+ )
27419
+ ]
27420
+ );
26254
27421
  const defaultImageCommonProps = {
26255
- className: "rb-w-full rb-h-auto rb-object-cover",
27422
+ className: {
27423
+ $bind: {
27424
+ from: "content.imageShape",
27425
+ transforms: [
27426
+ {
27427
+ id: "ui.imageShapeClassName",
27428
+ options: { baseClass: "rb-w-full rb-h-auto rb-object-cover" }
27429
+ }
27430
+ ],
27431
+ fallback: "rb-w-full rb-h-auto rb-object-cover"
27432
+ }
27433
+ },
26256
27434
  style: {
26257
27435
  aspectRatio: { $bind: { from: "content.aspectRatio" } }
26258
27436
  }
@@ -26293,6 +27471,27 @@ var mediaTextManifest = createBlockManifest({
26293
27471
  ],
26294
27472
  whenImagesLength(0, { not: true })
26295
27473
  );
27474
+ const bioImagesLayout = el(
27475
+ "div",
27476
+ {},
27477
+ [
27478
+ responsiveTwoColumn({
27479
+ image: el("div", {}, [
27480
+ el("div", {}, [defaultSingleImage], whenImagesLength(1)),
27481
+ el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))
27482
+ ]),
27483
+ text: bioTextColumn,
27484
+ ratioFrom: "content.ratio",
27485
+ imagePositionFrom: "content.imagePosition",
27486
+ containerClassName: "rb-flex rb-flex-col rb-md-flex-row rb-md-items-center",
27487
+ gapFrom: "content.gap",
27488
+ gapFallback: "comfortable",
27489
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
27490
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
27491
+ })
27492
+ ],
27493
+ whenImagesLength(0, { not: true })
27494
+ );
26296
27495
  const defaultTextOnlyLayout = el(
26297
27496
  "div",
26298
27497
  {},
@@ -26322,7 +27521,45 @@ var mediaTextManifest = createBlockManifest({
26322
27521
  ],
26323
27522
  whenImagesLength(0)
26324
27523
  );
27524
+ const bioTextOnlyLayout = el(
27525
+ "div",
27526
+ { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" },
27527
+ [
27528
+ text(
27529
+ {
27530
+ as: "h2",
27531
+ className: titleClassNameFromAlignment
27532
+ },
27533
+ when("content.title"),
27534
+ bind("content.title")
27535
+ ),
27536
+ styledCard(
27537
+ [
27538
+ richText(
27539
+ {
27540
+ className: bodyClassNameFromAlignment
27541
+ },
27542
+ bind("content.text")
27543
+ )
27544
+ ],
27545
+ {
27546
+ stylesFrom: "content._textCardStyles",
27547
+ backgroundFrom: "content._textCardStyles.background"
27548
+ },
27549
+ when("content.wrapTextInCard")
27550
+ ),
27551
+ richText(
27552
+ {
27553
+ className: bodyClassNameFromAlignment
27554
+ },
27555
+ when("content.wrapTextInCard", { not: true }),
27556
+ bind("content.text")
27557
+ )
27558
+ ],
27559
+ whenImagesLength(0)
27560
+ );
26325
27561
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
27562
+ const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
26326
27563
  const defaultLayout2 = styledSection({
26327
27564
  children: styledContainer({
26328
27565
  rootType: "stack",
@@ -26331,18 +27568,7 @@ var mediaTextManifest = createBlockManifest({
26331
27568
  text(
26332
27569
  {
26333
27570
  as: "h2",
26334
- className: {
26335
- $bind: {
26336
- from: "content.titleAlignment",
26337
- transforms: [
26338
- {
26339
- id: "ui.headingClassFromAlignment",
26340
- options: { base: "" }
26341
- }
26342
- ],
26343
- fallback: ""
26344
- }
26345
- }
27571
+ className: titleClassNameFromAlignment
26346
27572
  },
26347
27573
  when("content.title"),
26348
27574
  bind("content.title")
@@ -26354,14 +27580,28 @@ var mediaTextManifest = createBlockManifest({
26354
27580
  baseClass: "",
26355
27581
  spacing: "medium"
26356
27582
  });
27583
+ const bioLayout = styledSection({
27584
+ children: styledContainer({
27585
+ rootType: "stack",
27586
+ rootProps: { gap: "lg" },
27587
+ children: [bioInner]
27588
+ }),
27589
+ baseClass: "",
27590
+ spacing: "medium"
27591
+ });
26357
27592
  return {
26358
27593
  layout: defaultLayout2,
26359
27594
  variants: {
26360
- default: defaultLayout2
27595
+ default: defaultLayout2,
27596
+ bio: bioLayout
26361
27597
  },
26362
27598
  defaultVariant: "default",
26363
27599
  variantOptions: {
26364
- default: { label: "Default" }
27600
+ default: { label: "Default" },
27601
+ bio: {
27602
+ label: "Bio",
27603
+ description: "Vertically centered title and copy beside media."
27604
+ }
26365
27605
  }
26366
27606
  };
26367
27607
  })(),
@@ -27067,10 +28307,8 @@ var occurrenceContextSchema = z43.object({
27067
28307
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
27068
28308
  import { z as z45 } from "zod";
27069
28309
 
27070
- // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
27071
- import { z as z44 } from "zod";
27072
-
27073
28310
  // ../blocks/src/system/constants/events.ts
28311
+ var EVENT_CONTENT_TYPE_SLUGS = ["event", "events"];
27074
28312
  var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
27075
28313
  var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
27076
28314
  var eventCalendarListLayoutOptions = [
@@ -27084,8 +28322,133 @@ function isEventCalendarDisplayMode(value) {
27084
28322
  function isEventCalendarListLayout(value) {
27085
28323
  return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
27086
28324
  }
28325
+ function isEventContentType(slug) {
28326
+ if (!slug) return false;
28327
+ return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
28328
+ }
28329
+
28330
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
28331
+ var DEFAULT_EVENT_CURRENCY = "USD";
28332
+ function resolveRuntimeEventPricing(event) {
28333
+ if (isPublicEventPricing(event.pricing)) {
28334
+ return event.pricing;
28335
+ }
28336
+ const legacy = event;
28337
+ const currency = readCurrency(legacy.currency);
28338
+ if (event.requiresRegistration === false) {
28339
+ return {
28340
+ kind: "drop_in",
28341
+ currency,
28342
+ display: { kind: "free", currency }
28343
+ };
28344
+ }
28345
+ if (legacy.pricingMode === "ticket_types") {
28346
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
28347
+ return {
28348
+ kind: "ticket_types",
28349
+ currency,
28350
+ ticketTypes,
28351
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
28352
+ };
28353
+ }
28354
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
28355
+ if (legacy.pricingType === "paid" && amount > 0) {
28356
+ return {
28357
+ kind: "single_paid",
28358
+ amount,
28359
+ currency,
28360
+ display: { kind: "exact", amount, currency }
28361
+ };
28362
+ }
28363
+ return {
28364
+ kind: "free_registration",
28365
+ currency,
28366
+ display: { kind: "free", currency }
28367
+ };
28368
+ }
28369
+ function readCurrency(value) {
28370
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
28371
+ }
28372
+ function isRecord3(value) {
28373
+ return typeof value === "object" && value !== null && !Array.isArray(value);
28374
+ }
28375
+ function isPublicEventPricing(value) {
28376
+ if (!isRecord3(value) || typeof value.kind !== "string") return false;
28377
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
28378
+ }
28379
+ function isPublicEventTicketType(value) {
28380
+ return isRecord3(value) && typeof value.id === "string";
28381
+ }
28382
+ function readTicketTypePriceDisplay(value, currency) {
28383
+ const display = readLegacyPriceDisplay(value, currency);
28384
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
28385
+ }
28386
+ function readLegacyPriceDisplay(value, currency) {
28387
+ if (!isRecord3(value) || typeof value.kind !== "string") {
28388
+ return { kind: "unavailable", currency };
28389
+ }
28390
+ const displayCurrency = readCurrency(value.currency);
28391
+ switch (value.kind) {
28392
+ case "free":
28393
+ return { kind: "free", currency: displayCurrency };
28394
+ case "exact":
28395
+ return readAmount(value.amount) !== null ? {
28396
+ kind: "exact",
28397
+ amount: readAmount(value.amount) ?? 0,
28398
+ currency: displayCurrency
28399
+ } : { kind: "unavailable", currency };
28400
+ case "from":
28401
+ return readAmount(value.amount) !== null ? {
28402
+ kind: "from",
28403
+ amount: readAmount(value.amount) ?? 0,
28404
+ currency: displayCurrency
28405
+ } : { kind: "unavailable", currency };
28406
+ case "mixed":
28407
+ return readAmount(value.paidFromAmount) !== null ? {
28408
+ kind: "mixed",
28409
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
28410
+ currency: displayCurrency
28411
+ } : { kind: "unavailable", currency };
28412
+ case "unavailable":
28413
+ return { kind: "unavailable", currency: displayCurrency };
28414
+ case "course":
28415
+ return isRecord3(value.display) ? {
28416
+ kind: "course",
28417
+ display: readCoursePriceDisplay(value.display, displayCurrency)
28418
+ } : {
28419
+ kind: "course",
28420
+ display: { kind: "unavailable", currency: displayCurrency }
28421
+ };
28422
+ default:
28423
+ return { kind: "unavailable", currency };
28424
+ }
28425
+ }
28426
+ function readCoursePriceDisplay(value, currency) {
28427
+ switch (value.kind) {
28428
+ case "free":
28429
+ return { kind: "free", currency: readCurrency(value.currency) };
28430
+ case "exact":
28431
+ return readAmount(value.amount) !== null ? {
28432
+ kind: "exact",
28433
+ amount: readAmount(value.amount) ?? 0,
28434
+ currency: readCurrency(value.currency)
28435
+ } : { kind: "unavailable", currency };
28436
+ case "from":
28437
+ return readAmount(value.amount) !== null ? {
28438
+ kind: "from",
28439
+ amount: readAmount(value.amount) ?? 0,
28440
+ currency: readCurrency(value.currency)
28441
+ } : { kind: "unavailable", currency };
28442
+ default:
28443
+ return { kind: "unavailable", currency };
28444
+ }
28445
+ }
28446
+ function readAmount(value) {
28447
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
28448
+ }
27087
28449
 
27088
28450
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
28451
+ import { z as z44 } from "zod";
27089
28452
  var previewStageSchema = z44.enum(["preview", "published"]);
27090
28453
  var registrationButtonVariantSchema = z44.enum(["primary", "secondary", "outline"]);
27091
28454
  var eventButtonVariantSchema = z44.enum(["primary", "secondary", "outline", "link"]);
@@ -27096,12 +28459,73 @@ var weekStartSchema = z44.enum(["sunday", "monday"]);
27096
28459
  var filterAutoShowSchema = z44.enum(["auto", "always", "never"]);
27097
28460
  var calendarTabViewsSchema = z44.enum(["both", "month", "week"]);
27098
28461
 
28462
+ // ../blocks/src/system/runtime/nodes/event-registration/wizardSteps.ts
28463
+ function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep) {
28464
+ const baseSteps = hasPreSelectedContext ? ["select-tickets", "enter-details"] : ["select-event", "select-tickets", "enter-details"];
28465
+ if (!needsPaymentStep) {
28466
+ return baseSteps;
28467
+ }
28468
+ return [...baseSteps, "select-payment"];
28469
+ }
28470
+
28471
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationDerivations.ts
28472
+ function eventMatchesOccurrenceId(event, occurrenceId) {
28473
+ return event.registrationOccurrenceId === occurrenceId || event.publicEventId === occurrenceId;
28474
+ }
28475
+ function findPreSelectedEvent(input) {
28476
+ const occurrenceContext = input.occurrenceContext;
28477
+ if (!occurrenceContext) {
28478
+ return null;
28479
+ }
28480
+ const contextDate = getBookingLocalDateKey(toScheduledBookingDateTime({
28481
+ startsAt: occurrenceContext.startsAt,
28482
+ timeZone: occurrenceContext.timeZone
28483
+ }));
28484
+ return input.scopedEvents.find(
28485
+ (event) => eventMatchesOccurrenceId(event, occurrenceContext.id) || getBookingLocalDateKey(toScheduledBookingDateTime({
28486
+ startsAt: event.startsAt,
28487
+ timeZone: event.timeZone
28488
+ })) === contextDate
28489
+ ) ?? null;
28490
+ }
28491
+ function resolveEventRequiresPayment(input) {
28492
+ if (input.eligibility) {
28493
+ return input.eligibility.requiresPayment;
28494
+ }
28495
+ if (input.selectedTicketType) {
28496
+ return input.selectedTicketType.priceAmount > 0;
28497
+ }
28498
+ if (!input.event) {
28499
+ return false;
28500
+ }
28501
+ return publicEventPricingType(resolveRuntimeEventPricing(input.event)) !== "free";
28502
+ }
28503
+
28504
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.ts
28505
+ function toRegistrationEvent(event) {
28506
+ return {
28507
+ ...event,
28508
+ pricing: resolveRuntimeEventPricing(event),
28509
+ publicEventId: event.id,
28510
+ registrationOccurrenceId: event.occurrenceId
28511
+ };
28512
+ }
28513
+ function toRegistrationEvents(events) {
28514
+ return events.map(toRegistrationEvent);
28515
+ }
28516
+
27099
28517
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
28518
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
28519
+ var EVENT_REGISTRATION_SHELL_STEP_LABELS = ["Event", "Date", "Tickets", "Details", "Payment"];
27100
28520
  var contentEntrySchema = z45.object({
27101
28521
  id: z45.string(),
27102
28522
  slug: z45.string(),
27103
28523
  contentTypeSlug: z45.string()
27104
28524
  });
28525
+ var eventRegistrationPublicEventSchema = z45.preprocess(
28526
+ normalizeEventRegistrationEventInput,
28527
+ publicEventSchema
28528
+ );
27105
28529
  var eventRegistrationSourceSchema = z45.object({
27106
28530
  siteId: z45.string().optional(),
27107
28531
  apiBaseUrl: z45.string().optional(),
@@ -27109,7 +28533,7 @@ var eventRegistrationSourceSchema = z45.object({
27109
28533
  previewToken: z45.string().nullable().optional(),
27110
28534
  occurrenceContext: occurrenceContextSchema.optional(),
27111
28535
  contentEntry: contentEntrySchema.nullable().optional(),
27112
- events: z45.array(publicEventSchema).nullable().optional(),
28536
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
27113
28537
  className: z45.string().nullable().optional(),
27114
28538
  buttonText: z45.string().nullable().optional(),
27115
28539
  maxTickets: z45.string().nullable().optional(),
@@ -27124,14 +28548,17 @@ var eventRegistrationSourceSchema = z45.object({
27124
28548
  });
27125
28549
  var eventRegistrationDisplaySchema = z45.object({
27126
28550
  kind: z45.literal("event-registration"),
27127
- state: z45.literal("shell"),
28551
+ state: z45.literal("generic-shell"),
27128
28552
  className: z45.string().nullable(),
28553
+ titleText: z45.string(),
28554
+ bodyText: z45.string(),
28555
+ stepLabels: z45.array(z45.enum(EVENT_REGISTRATION_SHELL_STEP_LABELS)).min(1),
27129
28556
  summaryButtonText: z45.string()
27130
28557
  });
27131
28558
  var eventRegistrationHydrationSchema = z45.object({
27132
28559
  occurrenceContext: occurrenceContextSchema.optional(),
27133
28560
  contentEntry: contentEntrySchema.nullable().optional(),
27134
- events: z45.array(publicEventSchema).nullable().optional(),
28561
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
27135
28562
  maxTickets: z45.string().optional(),
27136
28563
  showVenue: z45.boolean().optional(),
27137
28564
  showCapacity: z45.boolean().optional(),
@@ -27160,13 +28587,81 @@ var eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys(
27160
28587
  "stage"
27161
28588
  );
27162
28589
  function buildEventRegistrationDisplay(source) {
28590
+ const stepLabels = buildEventRegistrationShellStepLabels(source);
27163
28591
  return {
27164
28592
  kind: "event-registration",
27165
- state: "shell",
28593
+ state: "generic-shell",
27166
28594
  className: source.className ?? null,
28595
+ titleText: "Event registration",
28596
+ bodyText: buildEventRegistrationShellBodyText(stepLabels),
28597
+ stepLabels,
27167
28598
  summaryButtonText: source.buttonText?.trim() || "Register"
27168
28599
  };
27169
28600
  }
28601
+ function buildEventRegistrationShellStepLabels(source) {
28602
+ const scopedEvents = scopeEventRegistrationEvents(source);
28603
+ if (scopedEvents.length === 0) {
28604
+ return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
28605
+ }
28606
+ const preSelectedEvent = findPreSelectedEvent({
28607
+ scopedEvents,
28608
+ occurrenceContext: source.occurrenceContext
28609
+ });
28610
+ const hasPreSelectedContext = Boolean(source.occurrenceContext || preSelectedEvent);
28611
+ const needsPaymentStep = hasPreSelectedContext && preSelectedEvent ? resolveEventRequiresPayment({
28612
+ eligibility: null,
28613
+ selectedTicketType: null,
28614
+ event: preSelectedEvent
28615
+ }) : false;
28616
+ return getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
28617
+ }
28618
+ function scopeEventRegistrationEvents(source) {
28619
+ const events = toRegistrationEvents(source.events ?? []);
28620
+ if (source.occurrenceContext?.seriesId) {
28621
+ return events.filter((event) => event.seriesId === source.occurrenceContext?.seriesId);
28622
+ }
28623
+ const entrySlug = source.contentEntry?.slug;
28624
+ const entryContentType = source.contentEntry?.contentTypeSlug;
28625
+ if (entrySlug && entryContentType && isEventContentType(entryContentType)) {
28626
+ return events.filter((event) => event.slug === entrySlug);
28627
+ }
28628
+ return events;
28629
+ }
28630
+ function shellLabelForRegistrationStep(step, events) {
28631
+ switch (step) {
28632
+ case "select-event":
28633
+ return isDateSelection(events) ? "Date" : "Event";
28634
+ case "select-tickets":
28635
+ return "Tickets";
28636
+ case "enter-details":
28637
+ return "Details";
28638
+ case "select-payment":
28639
+ return "Payment";
28640
+ case "error":
28641
+ case "success":
28642
+ case "submitting":
28643
+ case "redirecting":
28644
+ case "verifying-payment":
28645
+ case "verifying-timeout":
28646
+ case "payment-failed":
28647
+ return "Details";
28648
+ }
28649
+ }
28650
+ function isDateSelection(events) {
28651
+ const firstSeriesId = events[0]?.seriesId;
28652
+ return Boolean(
28653
+ events.length > 1 && firstSeriesId && events.every((event) => event.seriesId === firstSeriesId)
28654
+ );
28655
+ }
28656
+ function buildEventRegistrationShellBodyText(stepLabels) {
28657
+ if (stepLabels.includes("Payment")) {
28658
+ return "Preparing tickets, details, and payment options.";
28659
+ }
28660
+ if (stepLabels[0] === "Tickets") {
28661
+ return "Preparing tickets and booking details.";
28662
+ }
28663
+ return "Preparing dates, tickets, and booking details.";
28664
+ }
27170
28665
  var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
27171
28666
  kind: "client-owned",
27172
28667
  contracts: {
@@ -27190,6 +28685,18 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
27190
28685
  }
27191
28686
  })
27192
28687
  });
28688
+ function normalizeEventRegistrationEventInput(value) {
28689
+ if (!isRecord4(value)) {
28690
+ return value;
28691
+ }
28692
+ return {
28693
+ ...value,
28694
+ pricing: resolveRuntimeEventPricing(value)
28695
+ };
28696
+ }
28697
+ function isRecord4(value) {
28698
+ return typeof value === "object" && value !== null && !Array.isArray(value);
28699
+ }
27193
28700
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
27194
28701
  runtime: eventRegistrationBlockRuntime,
27195
28702
  mode: "event-registration",
@@ -29688,7 +31195,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
29688
31195
  return keys.length >= 2 ? keys : [];
29689
31196
  }
29690
31197
  function normalizeOfferingsPreviewContentForWrite(value) {
29691
- if (!isRecord3(value)) return null;
31198
+ if (!isRecord5(value)) return null;
29692
31199
  const groupOrderValue = value.groupOrder;
29693
31200
  if (Array.isArray(groupOrderValue)) {
29694
31201
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -29701,7 +31208,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
29701
31208
  return { ...value, groupOrder: [] };
29702
31209
  }
29703
31210
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
29704
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord3) : []
31211
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord5) : []
29705
31212
  );
29706
31213
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
29707
31214
  }
@@ -29715,7 +31222,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
29715
31222
  }
29716
31223
  return keys;
29717
31224
  }
29718
- function isRecord3(value) {
31225
+ function isRecord5(value) {
29719
31226
  return typeof value === "object" && value !== null && !Array.isArray(value);
29720
31227
  }
29721
31228
 
@@ -30082,7 +31589,7 @@ function isOfferingsPreviewItemLimit(value) {
30082
31589
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
30083
31590
  }
30084
31591
  function normalizeOfferingsPreviewGroupOverride(value) {
30085
- if (!isRecord4(value)) return [];
31592
+ if (!isRecord6(value)) return [];
30086
31593
  const override = {};
30087
31594
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
30088
31595
  override.sourceKey = value.sourceKey;
@@ -30114,12 +31621,12 @@ function isButtonVariant(value) {
30114
31621
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
30115
31622
  }
30116
31623
  function normalizeCardStylesContent(value) {
30117
- return isRecord4(value) || value === null ? value : void 0;
31624
+ return isRecord6(value) || value === null ? value : void 0;
30118
31625
  }
30119
31626
  function normalizeSectionStylesContent(value) {
30120
- return isRecord4(value) || value === null ? value : void 0;
31627
+ return isRecord6(value) || value === null ? value : void 0;
30121
31628
  }
30122
- function isRecord4(value) {
31629
+ function isRecord6(value) {
30123
31630
  return typeof value === "object" && value !== null && !Array.isArray(value);
30124
31631
  }
30125
31632
 
@@ -34079,11 +35586,13 @@ var heroImageSurfaceMotions = [
34079
35586
  ];
34080
35587
  var standardEyebrowTreatments = [
34081
35588
  "plain",
35589
+ "accent",
34082
35590
  "pill",
34083
35591
  "accent-pill"
34084
35592
  ];
34085
35593
  var animatedEyebrowTreatments = [
34086
35594
  "plain",
35595
+ "accent",
34087
35596
  "pill",
34088
35597
  "accent-pill",
34089
35598
  "pill-bounce",
@@ -34384,6 +35893,17 @@ var systemBlockDefinitionsRaw = [
34384
35893
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
34385
35894
  ]
34386
35895
  })),
35896
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
35897
+ flow: conversionFlow,
35898
+ layoutProfiles: [
35899
+ layoutProfile({
35900
+ variantKey: "default",
35901
+ family: "split",
35902
+ weight: "featured",
35903
+ bias: "soft"
35904
+ })
35905
+ ]
35906
+ })),
34387
35907
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
34388
35908
  sectionSurfaces: "supported",
34389
35909
  contentFrames: ["plain", "panel"],
@@ -34475,6 +35995,12 @@ var systemBlockDefinitionsRaw = [
34475
35995
  family: "media-text",
34476
35996
  weight: "featured",
34477
35997
  bias: "soft"
35998
+ }),
35999
+ layoutProfile({
36000
+ variantKey: "bio",
36001
+ family: "media-text",
36002
+ weight: "featured",
36003
+ bias: "soft"
34478
36004
  })
34479
36005
  ]
34480
36006
  })),
@@ -35276,7 +36802,7 @@ var defaultTransforms = createTransformRegistry(builtinTransformDefinitions);
35276
36802
  // ../blocks/src/system/data/linkedContentEntries.ts
35277
36803
  var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
35278
36804
  function coerceLinkedContentEntriesPayload(payload) {
35279
- if (!isRecord5(payload)) return payload;
36805
+ if (!isRecord7(payload)) return payload;
35280
36806
  const response = payload;
35281
36807
  if (!Array.isArray(response.entries)) return payload;
35282
36808
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -35284,12 +36810,12 @@ function coerceLinkedContentEntriesPayload(payload) {
35284
36810
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
35285
36811
  }
35286
36812
  function enrichLinkedContentEntry(entry, contentType) {
35287
- if (!isRecord5(entry)) return entry;
36813
+ if (!isRecord7(entry)) return entry;
35288
36814
  const entryId = typeof entry.id === "string" ? entry.id : null;
35289
36815
  if (!entryId) return entry;
35290
36816
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
35291
36817
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
35292
- const content = isRecord5(entry.content) ? entry.content : {};
36818
+ const content = isRecord7(entry.content) ? entry.content : {};
35293
36819
  const meta = {
35294
36820
  kind: "linked-content-entry",
35295
36821
  entryId,
@@ -35382,7 +36908,7 @@ function capitalize(value) {
35382
36908
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
35383
36909
  }
35384
36910
  function parsePublicContentTypeMeta(value) {
35385
- if (!isRecord5(value)) return null;
36911
+ if (!isRecord7(value)) return null;
35386
36912
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
35387
36913
  return {
35388
36914
  key: value.key,
@@ -35392,7 +36918,7 @@ function parsePublicContentTypeMeta(value) {
35392
36918
  };
35393
36919
  }
35394
36920
  function parsePublicContentTypeLinkedEntryEditing(value) {
35395
- if (!isRecord5(value) || typeof value.kind !== "string") return null;
36921
+ if (!isRecord7(value) || typeof value.kind !== "string") return null;
35396
36922
  switch (value.kind) {
35397
36923
  case "generic":
35398
36924
  return { kind: "generic" };
@@ -35406,7 +36932,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
35406
36932
  }
35407
36933
  }
35408
36934
  function parsePublicContentTypeFieldMeta(value) {
35409
- if (!isRecord5(value)) return [];
36935
+ if (!isRecord7(value)) return [];
35410
36936
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
35411
36937
  return [{
35412
36938
  id: value.id,
@@ -35420,7 +36946,7 @@ function parseStringArray(value) {
35420
36946
  if (!Array.isArray(value)) return null;
35421
36947
  return value.filter((item) => typeof item === "string");
35422
36948
  }
35423
- function isRecord5(value) {
36949
+ function isRecord7(value) {
35424
36950
  return typeof value === "object" && value !== null && !Array.isArray(value);
35425
36951
  }
35426
36952
 
@@ -35613,6 +37139,11 @@ ${root} {
35613
37139
  --er-event-card-bg: rgb(var(--tb-surface));
35614
37140
  --er-event-card-border-width: var(--rb-border-width, 1px);
35615
37141
  --er-event-card-hover-opacity: 1;
37142
+ --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
37143
+ --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
37144
+ --er-radius: var(--rb-block-radius);
37145
+ --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
37146
+ --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
35616
37147
 
35617
37148
  /* Step indicator */
35618
37149
  --er-step-active: rgb(var(--tb-primary));
@@ -36255,11 +37786,11 @@ function resolveParamsBindings(input, vm, meta) {
36255
37786
  return binding.fallback;
36256
37787
  }
36257
37788
  return resolved;
36258
- } catch (err) {
37789
+ } catch (err2) {
36259
37790
  if (shouldLogWarnings) {
36260
37791
  console.warn(
36261
37792
  `bindings: failed to parse loader param binding for block "${meta?.blockKind ?? "unknown"}"`,
36262
- err
37793
+ err2
36263
37794
  );
36264
37795
  }
36265
37796
  return void 0;
@@ -37187,7 +38718,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
37187
38718
  }
37188
38719
 
37189
38720
  // ../api/src/utils/isRecord.ts
37190
- function isRecord6(value) {
38721
+ function isRecord8(value) {
37191
38722
  return typeof value === "object" && value !== null && !Array.isArray(value);
37192
38723
  }
37193
38724
 
@@ -37494,7 +39025,7 @@ function sanitizeMarks(marks) {
37494
39025
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
37495
39026
  return [{ type: mark.type }];
37496
39027
  }
37497
- if (mark.type === "link" && isRecord6(mark.attrs) && typeof mark.attrs.href === "string") {
39028
+ if (mark.type === "link" && isRecord8(mark.attrs) && typeof mark.attrs.href === "string") {
37498
39029
  const attrs = { href: mark.attrs.href };
37499
39030
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
37500
39031
  attrs.target = mark.attrs.target;
@@ -37509,10 +39040,10 @@ function sanitizeMarks(marks) {
37509
39040
  return sanitized.length > 0 ? sanitized : void 0;
37510
39041
  }
37511
39042
  function unwrapRichTextValue(value) {
37512
- if (isRecord6(value) && isRecord6(value.doc)) {
39043
+ if (isRecord8(value) && isRecord8(value.doc)) {
37513
39044
  return unwrapRichTextValue(value.doc);
37514
39045
  }
37515
- if (isRecord6(value) && value.type === "doc") {
39046
+ if (isRecord8(value) && value.type === "doc") {
37516
39047
  return {
37517
39048
  type: "doc",
37518
39049
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -37521,7 +39052,7 @@ function unwrapRichTextValue(value) {
37521
39052
  return EMPTY_SITE_BANNER_BODY;
37522
39053
  }
37523
39054
  function isTipTapNodeLike(value) {
37524
- return isRecord6(value) && typeof value.type === "string";
39055
+ return isRecord8(value) && typeof value.type === "string";
37525
39056
  }
37526
39057
  function coerceTipTapNode(value) {
37527
39058
  return {
@@ -37529,9 +39060,9 @@ function coerceTipTapNode(value) {
37529
39060
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
37530
39061
  ...typeof value.text === "string" ? { text: value.text } : {},
37531
39062
  ...Array.isArray(value.marks) ? {
37532
- marks: value.marks.filter((mark) => isRecord6(mark) && typeof mark.type === "string").map((mark) => ({
39063
+ marks: value.marks.filter((mark) => isRecord8(mark) && typeof mark.type === "string").map((mark) => ({
37533
39064
  type: mark.type,
37534
- ...isRecord6(mark.attrs) ? { attrs: mark.attrs } : {}
39065
+ ...isRecord8(mark.attrs) ? { attrs: mark.attrs } : {}
37535
39066
  }))
37536
39067
  } : {}
37537
39068
  };
@@ -37714,7 +39245,7 @@ var ENTRY_REF_KEYS = [
37714
39245
  "entryId",
37715
39246
  "slug"
37716
39247
  ];
37717
- function isRecord7(value) {
39248
+ function isRecord9(value) {
37718
39249
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
37719
39250
  }
37720
39251
  function extractManualEntryRef(item) {
@@ -37722,7 +39253,7 @@ function extractManualEntryRef(item) {
37722
39253
  const trimmed = item.trim();
37723
39254
  return trimmed.length > 0 ? trimmed : null;
37724
39255
  }
37725
- if (!isRecord7(item)) return null;
39256
+ if (!isRecord9(item)) return null;
37726
39257
  for (const key of ENTRY_REF_KEYS) {
37727
39258
  const raw = item[key];
37728
39259
  if (typeof raw === "string" && raw.trim().length > 0) {