@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
@@ -3276,6 +3276,46 @@ var ENDPOINT_DEFINITIONS = {
3276
3276
  auth: "user",
3277
3277
  responseKind: "json"
3278
3278
  },
3279
+ listEntrySlotBlocks: {
3280
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3281
+ method: "GET",
3282
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3283
+ auth: "user",
3284
+ responseKind: "json",
3285
+ errors: ["resource:not_found"]
3286
+ },
3287
+ listEntryPageContentSlots: {
3288
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots",
3289
+ method: "GET",
3290
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slots", "blocks"],
3291
+ auth: "user",
3292
+ responseKind: "json",
3293
+ errors: ["resource:not_found"]
3294
+ },
3295
+ createEntrySlotBlock: {
3296
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3297
+ method: "POST",
3298
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3299
+ auth: "user",
3300
+ responseKind: "json",
3301
+ errors: ["validation:invalid_input", "resource:not_found"]
3302
+ },
3303
+ reorderEntrySlotBlocks: {
3304
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/reorder",
3305
+ method: "POST",
3306
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3307
+ auth: "user",
3308
+ responseKind: "json",
3309
+ errors: ["validation:invalid_input", "resource:not_found"]
3310
+ },
3311
+ deleteEntrySlotBlock: {
3312
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/{blockId}",
3313
+ method: "DELETE",
3314
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3315
+ auth: "user",
3316
+ responseKind: "json",
3317
+ errors: ["resource:not_found"]
3318
+ },
3279
3319
  createBlock: {
3280
3320
  path: "/sites/{siteId}/pages/{pageId}/blocks",
3281
3321
  method: "POST",
@@ -7351,6 +7391,21 @@ var selectSourceSchema = z5.discriminatedUnion("kind", [
7351
7391
  function assertNeverSelectSource(value) {
7352
7392
  throw new Error(`Unhandled select source: ${JSON.stringify(value)}`);
7353
7393
  }
7394
+ var visibleWhenPredicateSchema = z5.object({
7395
+ field: z5.string().min(1),
7396
+ equals: z5.any().optional(),
7397
+ notEquals: z5.any().optional(),
7398
+ oneOf: z5.array(z5.any()).optional(),
7399
+ notIn: z5.array(z5.any()).optional(),
7400
+ minItems: z5.number().int().nonnegative().optional(),
7401
+ maxItems: z5.number().int().nonnegative().optional()
7402
+ });
7403
+ var visibleWhenSchema = z5.union([
7404
+ visibleWhenPredicateSchema,
7405
+ z5.object({
7406
+ allOf: z5.array(visibleWhenPredicateSchema).min(1)
7407
+ })
7408
+ ]);
7354
7409
  var uiSchema = z5.object({
7355
7410
  widget: z5.string().optional(),
7356
7411
  // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)
@@ -7383,13 +7438,7 @@ var uiSchema = z5.object({
7383
7438
  showValue: z5.boolean().optional(),
7384
7439
  pattern: z5.string().optional(),
7385
7440
  placeholder: z5.string().optional(),
7386
- visibleWhen: z5.object({
7387
- field: z5.string().min(1),
7388
- equals: z5.any().optional(),
7389
- notEquals: z5.any().optional(),
7390
- oneOf: z5.array(z5.any()).optional(),
7391
- notIn: z5.array(z5.any()).optional()
7392
- }).optional(),
7441
+ visibleWhen: visibleWhenSchema.optional(),
7393
7442
  // Modal configuration for modal and group fields
7394
7443
  modalConfig: z5.object({
7395
7444
  buttonLabel: z5.string().optional(),
@@ -10303,6 +10352,7 @@ var eventListTreatmentValues = [
10303
10352
  ];
10304
10353
  var eyebrowTreatmentValues = [
10305
10354
  "plain",
10355
+ "accent",
10306
10356
  "pill",
10307
10357
  "accent-pill",
10308
10358
  "pill-bounce",
@@ -12160,9 +12210,9 @@ var _Vibrant = class _Vibrant2 {
12160
12210
  }
12161
12211
  image.remove();
12162
12212
  return res;
12163
- } catch (err2) {
12213
+ } catch (err3) {
12164
12214
  image.remove();
12165
- return Promise.reject(err2);
12215
+ return Promise.reject(err3);
12166
12216
  }
12167
12217
  }
12168
12218
  async getPalettes() {
@@ -12176,9 +12226,9 @@ var _Vibrant = class _Vibrant2 {
12176
12226
  const res = result1.palettes;
12177
12227
  image.remove();
12178
12228
  return res;
12179
- } catch (err2) {
12229
+ } catch (err3) {
12180
12230
  image.remove();
12181
- return Promise.reject(err2);
12231
+ return Promise.reject(err3);
12182
12232
  }
12183
12233
  }
12184
12234
  };
@@ -14641,7 +14691,8 @@ var STRUCTURAL_DECLARATIONS = [
14641
14691
  ["transition", "all 200ms ease-in-out"],
14642
14692
  ["display", "inline-flex"],
14643
14693
  ["align-items", "center"],
14644
- ["justify-content", "center"]
14694
+ ["justify-content", "center"],
14695
+ ["outline", "none"]
14645
14696
  ];
14646
14697
  function generateButtonCss(options) {
14647
14698
  const { themeId, theme, buttonSystem: providedButtonSystem } = options;
@@ -14671,6 +14722,7 @@ function variantChunks(variant, global, themeSizes, themeId, tokens, theme) {
14671
14722
  out.push(variantBaseRule(variant, variantId, global, themeId, tokens, theme));
14672
14723
  const hoverBg = variantHoverBackgroundRule(variant, variantId, global, themeId, tokens);
14673
14724
  if (hoverBg) out.push(hoverBg);
14725
+ out.push(variantFocusVisibleRule(variantId, themeId));
14674
14726
  const effects = variantEffectsCss(variant, themeId, tokens, theme);
14675
14727
  if (effects) out.push({ raw: effects });
14676
14728
  out.push(...variantDisabledRules(variantId, themeId));
@@ -14728,6 +14780,12 @@ function variantHoverBackgroundRule(variant, variantId, global, themeId, tokens)
14728
14780
  ["background-color", tokens.getColor(hoverToken)]
14729
14781
  ]);
14730
14782
  }
14783
+ function variantFocusVisibleRule(variantId, themeId) {
14784
+ return rule(`:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}:focus-visible`, [
14785
+ ["outline", "2px solid currentColor"],
14786
+ ["outline-offset", "3px"]
14787
+ ]);
14788
+ }
14731
14789
  function variantEffectsCss(variant, themeId, tokens, theme) {
14732
14790
  if (!variant.effects) return "";
14733
14791
  const elementConfig = {
@@ -15359,6 +15417,95 @@ var joyStamp = defineButtonPersonality({
15359
15417
  }
15360
15418
  });
15361
15419
 
15420
+ // ../theme-core/src/buttons/personalities/ornate-ritual.ts
15421
+ var ornateRitual = defineButtonPersonality({
15422
+ id: "ornate-ritual",
15423
+ name: "Ornate Ritual",
15424
+ description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
15425
+ tags: { tone: "classic", energy: "vibrant", motion: "subtle", era: "organic" },
15426
+ buttonSystem: {
15427
+ global: {
15428
+ cornerStyle: "rounded",
15429
+ shadow: "none",
15430
+ textTransform: "uppercase",
15431
+ fontWeight: 600,
15432
+ borderWidth: 1,
15433
+ hoverTransform: "none",
15434
+ hoverColor: "none",
15435
+ letterSpacing: "loose"
15436
+ },
15437
+ sizes: {
15438
+ sm: { padding: "0.5625rem 1.25rem", fontSize: "text-xs" },
15439
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-xs" },
15440
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-sm" },
15441
+ xl: { padding: "1rem 2.75rem", fontSize: "text-base" }
15442
+ },
15443
+ variants: [
15444
+ {
15445
+ id: "primary",
15446
+ name: "Primary",
15447
+ enabled: true,
15448
+ priority: 1,
15449
+ background: { type: "solid", colorToken: "primary" },
15450
+ textColorToken: "primaryForeground",
15451
+ borderRadius: "rounded-md",
15452
+ border: { widthClass: "border", colorToken: "primary" },
15453
+ shadow: { elevation: "none", softness: null, position: "bottom" },
15454
+ effects: {
15455
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "primary-100" } }],
15456
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
15457
+ }
15458
+ },
15459
+ {
15460
+ id: "secondary",
15461
+ name: "Secondary",
15462
+ enabled: true,
15463
+ priority: 2,
15464
+ background: { type: "solid", colorToken: "secondary" },
15465
+ textColorToken: "primaryForeground",
15466
+ borderRadius: "rounded-md",
15467
+ border: { widthClass: "border", colorToken: "primary" },
15468
+ shadow: { elevation: "none", softness: null, position: "bottom" },
15469
+ effects: {
15470
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
15471
+ }
15472
+ },
15473
+ {
15474
+ id: "outline",
15475
+ name: "Outline",
15476
+ enabled: true,
15477
+ priority: 3,
15478
+ background: { type: "transparent" },
15479
+ textColorToken: "primary",
15480
+ borderRadius: "rounded-md",
15481
+ border: { widthClass: "border", colorToken: "primary" },
15482
+ shadow: { elevation: "none", softness: null, position: "bottom" },
15483
+ effects: {
15484
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
15485
+ }
15486
+ },
15487
+ {
15488
+ id: "ghost",
15489
+ name: "Ghost",
15490
+ enabled: true,
15491
+ priority: 3,
15492
+ background: { type: "transparent" },
15493
+ textColorToken: "accent",
15494
+ borderRadius: "rounded-none",
15495
+ sizes: {
15496
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
15497
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
15498
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
15499
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
15500
+ },
15501
+ effects: {
15502
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
15503
+ }
15504
+ }
15505
+ ]
15506
+ }
15507
+ });
15508
+
15362
15509
  // ../theme-core/src/buttons/personalities/pebble.ts
15363
15510
  var pebble = defineButtonPersonality({
15364
15511
  id: "pebble",
@@ -15632,7 +15779,8 @@ var buttonPersonalities = [
15632
15779
  inkStamp,
15633
15780
  brushedWash,
15634
15781
  showtimePill,
15635
- joyStamp
15782
+ joyStamp,
15783
+ ornateRitual
15636
15784
  ];
15637
15785
  var personalitiesById = new Map(
15638
15786
  buttonPersonalities.map((p) => [p.id, p])
@@ -16627,7 +16775,7 @@ function rgbColorValue(token) {
16627
16775
  if (alpha === void 0) {
16628
16776
  return `rgb(var(${cssVar}))`;
16629
16777
  }
16630
- return `rgba(var(${cssVar}), ${alpha})`;
16778
+ return `rgb(var(${cssVar}) / ${alpha})`;
16631
16779
  }
16632
16780
  function backgroundColorStyle(token) {
16633
16781
  return { backgroundColor: rgbColorValue(token) };
@@ -17756,6 +17904,28 @@ var warmDarkEmber = definePaletteVariant({
17756
17904
  { name: "border", hex: "#894e31" }
17757
17905
  ]
17758
17906
  });
17907
+ var warmDarkKirtanGold = definePaletteVariant({
17908
+ id: "warm-dark-kirtan-gold",
17909
+ name: "Warm Dark \u2014 Kirtan Gold",
17910
+ description: "Deep plum ground with pale gold primary, rose accent, and soft devotional text.",
17911
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
17912
+ mode: "dark",
17913
+ colors: [
17914
+ { name: "primary", hex: "#ffcdb2" },
17915
+ { name: "secondary", hex: "#b5838d" },
17916
+ { name: "accent", hex: "#e5989b" },
17917
+ { name: "success", hex: "#8fbf8f" },
17918
+ { name: "warning", hex: "#f2b86b" },
17919
+ { name: "destructive", hex: "#d96b6b" },
17920
+ { name: "background", hex: "#403944" },
17921
+ { name: "surface", hex: "#403944" },
17922
+ { name: "surfaceAlt", hex: "#372f3b" },
17923
+ { name: "muted", hex: "#4d4550" },
17924
+ { name: "text", hex: "#e6d2d5" },
17925
+ { name: "primaryForeground", hex: "#403944" },
17926
+ { name: "border", hex: "#8d747a" }
17927
+ ]
17928
+ });
17759
17929
 
17760
17930
  // ../theme-core/src/palette/variants/index.ts
17761
17931
  var paletteVariants = [
@@ -17779,7 +17949,8 @@ var paletteVariants = [
17779
17949
  softNaturalWatercolor,
17780
17950
  softNaturalLilac,
17781
17951
  // Warm-dark family (dark mode)
17782
- warmDarkEmber
17952
+ warmDarkEmber,
17953
+ warmDarkKirtanGold
17783
17954
  ];
17784
17955
  var paletteVariantsById = new Map(
17785
17956
  paletteVariants.map((v) => [v.id, v])
@@ -19348,9 +19519,125 @@ function headerConfigurationKey(configuration) {
19348
19519
  function asFooterLookId(value) {
19349
19520
  return value;
19350
19521
  }
19351
- var guaranteedFallbackFooterLookId = asFooterLookId("footer-muted-grounding");
19522
+ function asFooterLayoutId(value) {
19523
+ return value;
19524
+ }
19525
+ function asFooterStyleId(value) {
19526
+ return value;
19527
+ }
19528
+ var guaranteedFallbackFooterLookId = asFooterLookId("footer-identity-quiet");
19529
+ var footerLayoutCatalog = defineExactCatalog()([
19530
+ {
19531
+ id: asFooterLayoutId("identity"),
19532
+ label: "Identity",
19533
+ description: "Logo, site text, address, and legal copy without relying on footer navigation."
19534
+ },
19535
+ {
19536
+ id: asFooterLayoutId("centered"),
19537
+ label: "Centered",
19538
+ description: "A calm centered stack for identity, short copy, and optional compact navigation.",
19539
+ maxRecommendedNavDensity: "sparse"
19540
+ },
19541
+ {
19542
+ id: asFooterLayoutId("split"),
19543
+ label: "Split",
19544
+ description: "Navigation and brand signoff separated into a wider split footer.",
19545
+ requiresFooterNav: true,
19546
+ maxRecommendedNavDensity: "balanced"
19547
+ },
19548
+ {
19549
+ id: asFooterLayoutId("columns"),
19550
+ label: "Columns",
19551
+ description: "Grouped footer navigation columns with a supporting bottom line.",
19552
+ requiresFooterNav: true,
19553
+ requiresFooterNavGroups: true
19554
+ }
19555
+ ]);
19556
+ var footerStyleCatalog = defineExactCatalog()([
19557
+ {
19558
+ id: asFooterStyleId("quiet"),
19559
+ label: "Quiet",
19560
+ description: "Lightweight, practical footer treatment."
19561
+ },
19562
+ {
19563
+ id: asFooterStyleId("calm"),
19564
+ label: "Calm",
19565
+ description: "Soft centered treatment with restrained dividers."
19566
+ },
19567
+ {
19568
+ id: asFooterStyleId("editorial"),
19569
+ label: "Editorial",
19570
+ description: "Text-forward treatment with fine-line structure."
19571
+ },
19572
+ {
19573
+ id: asFooterStyleId("brand-band"),
19574
+ label: "Brand band",
19575
+ description: "High-contrast brand treatment with a stronger bottom bar."
19576
+ }
19577
+ ]);
19578
+ var footerLayoutsById = new Map(
19579
+ footerLayoutCatalog.map((layout) => [layout.id, layout])
19580
+ );
19581
+ var footerStylesById = new Map(
19582
+ footerStyleCatalog.map((style) => [style.id, style])
19583
+ );
19584
+ function identityQuietFooter(theme) {
19585
+ return {
19586
+ ...theme.footer,
19587
+ variant: "simple",
19588
+ maxWidth: "container",
19589
+ background: {
19590
+ type: "color",
19591
+ color: "surface"
19592
+ },
19593
+ navStyle: "minimal",
19594
+ navWeight: "regular",
19595
+ navColor: "text",
19596
+ navLinkStyle: {
19597
+ typography: "body",
19598
+ fontWeight: "regular",
19599
+ textTransform: "none",
19600
+ italic: false,
19601
+ colorToken: "text",
19602
+ hoverColorToken: "primary",
19603
+ padding: "none",
19604
+ borderRadius: "none"
19605
+ },
19606
+ navLayout: {
19607
+ layout: "inline-wrap",
19608
+ align: "start",
19609
+ gapX: "default",
19610
+ gapY: "tight"
19611
+ },
19612
+ logo: {
19613
+ showLogo: true,
19614
+ showLogoText: true,
19615
+ placement: "left",
19616
+ size: "sm",
19617
+ align: "start"
19618
+ },
19619
+ bottomBar: {
19620
+ enabled: false,
19621
+ fullBleed: false,
19622
+ textAlign: "left",
19623
+ paddingX: "default",
19624
+ paddingY: "compact",
19625
+ borderTop: {
19626
+ width: "none"
19627
+ }
19628
+ }
19629
+ };
19630
+ }
19352
19631
  function mutedGroundingFooter(theme) {
19353
- return theme.footer;
19632
+ return {
19633
+ ...identityQuietFooter(theme),
19634
+ background: theme.footer.background,
19635
+ navStyle: theme.footer.navStyle,
19636
+ navColor: theme.footer.navColor,
19637
+ navWeight: theme.footer.navWeight,
19638
+ navLinkStyle: theme.footer.navLinkStyle,
19639
+ bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
19640
+ };
19354
19641
  }
19355
19642
  function brandTwoBandFooter(theme) {
19356
19643
  return {
@@ -19455,6 +19742,53 @@ function centeredCalmFooter(theme) {
19455
19742
  }
19456
19743
  };
19457
19744
  }
19745
+ function splitEditorialFooter(theme) {
19746
+ return {
19747
+ ...theme.footer,
19748
+ variant: "split",
19749
+ maxWidth: "container",
19750
+ background: {
19751
+ type: "color",
19752
+ color: "surface"
19753
+ },
19754
+ navStyle: "minimal",
19755
+ navWeight: "regular",
19756
+ navColor: "text",
19757
+ navLinkStyle: {
19758
+ typography: "body",
19759
+ fontWeight: "regular",
19760
+ textTransform: "none",
19761
+ italic: false,
19762
+ colorToken: "text",
19763
+ hoverColorToken: "primary",
19764
+ padding: "none",
19765
+ borderRadius: "none"
19766
+ },
19767
+ navLayout: {
19768
+ layout: "inline-wrap",
19769
+ align: "start",
19770
+ gapX: "relaxed",
19771
+ gapY: "tight"
19772
+ },
19773
+ logo: {
19774
+ showLogo: true,
19775
+ showLogoText: true,
19776
+ placement: "right",
19777
+ size: "sm",
19778
+ align: "end"
19779
+ },
19780
+ bottomBar: {
19781
+ enabled: true,
19782
+ fullBleed: false,
19783
+ textAlign: "left",
19784
+ paddingX: "default",
19785
+ paddingY: "compact",
19786
+ borderTop: {
19787
+ width: "thin"
19788
+ }
19789
+ }
19790
+ };
19791
+ }
19458
19792
  function editorialColumnsFooter(theme) {
19459
19793
  return {
19460
19794
  ...theme.footer,
@@ -19497,25 +19831,47 @@ function editorialColumnsFooter(theme) {
19497
19831
  };
19498
19832
  }
19499
19833
  var footerLookCatalog = defineExactCatalog()([
19834
+ {
19835
+ id: asFooterLookId("footer-identity-quiet"),
19836
+ label: "Identity footer",
19837
+ layoutId: asFooterLayoutId("identity"),
19838
+ styleId: asFooterStyleId("quiet"),
19839
+ compile: identityQuietFooter
19840
+ },
19500
19841
  {
19501
19842
  id: asFooterLookId("footer-muted-grounding"),
19502
19843
  label: "Muted grounding footer",
19844
+ layoutId: asFooterLayoutId("identity"),
19845
+ styleId: asFooterStyleId("quiet"),
19846
+ hiddenFromLayoutStyleControls: true,
19503
19847
  compile: mutedGroundingFooter
19504
19848
  },
19505
19849
  {
19506
19850
  id: asFooterLookId("footer-centered-calm"),
19507
19851
  label: "Centered calm footer",
19852
+ layoutId: asFooterLayoutId("centered"),
19853
+ styleId: asFooterStyleId("calm"),
19508
19854
  compile: centeredCalmFooter
19509
19855
  },
19856
+ {
19857
+ id: asFooterLookId("footer-split-editorial"),
19858
+ label: "Split editorial footer",
19859
+ layoutId: asFooterLayoutId("split"),
19860
+ styleId: asFooterStyleId("editorial"),
19861
+ compile: splitEditorialFooter
19862
+ },
19510
19863
  {
19511
19864
  id: asFooterLookId("footer-editorial-columns"),
19512
19865
  label: "Editorial columns footer",
19866
+ layoutId: asFooterLayoutId("columns"),
19867
+ styleId: asFooterStyleId("editorial"),
19513
19868
  compile: editorialColumnsFooter
19514
19869
  },
19515
19870
  {
19516
19871
  id: asFooterLookId("site-footer-brand-two-band"),
19517
19872
  label: "Two-band brand footer",
19518
- maxRecommendedNavDensity: "balanced",
19873
+ layoutId: asFooterLayoutId("split"),
19874
+ styleId: asFooterStyleId("brand-band"),
19519
19875
  allowedContentPresence: ["default-footer", "default-and-blocks"],
19520
19876
  compile: brandTwoBandFooter
19521
19877
  }
@@ -19718,6 +20074,30 @@ var luxeContrastTypography = {
19718
20074
  },
19719
20075
  scale: "spacious"
19720
20076
  };
20077
+ var kirtanOrnateTypography = {
20078
+ body: {
20079
+ family: "Jost, system-ui, sans-serif",
20080
+ size: "md",
20081
+ weight: "regular",
20082
+ lineHeight: "relaxed",
20083
+ letterSpacing: "normal"
20084
+ },
20085
+ headings: {
20086
+ default: {
20087
+ family: "Marcellus, Georgia, serif",
20088
+ weight: "regular",
20089
+ lineHeight: "normal",
20090
+ letterSpacing: "normal",
20091
+ colorToken: "primary",
20092
+ italic: null,
20093
+ case: null
20094
+ },
20095
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
20096
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
20097
+ h3: { size: "md", weight: "regular", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
20098
+ },
20099
+ scale: "spacious"
20100
+ };
19721
20101
  var boldDisplayTypography = {
19722
20102
  body: {
19723
20103
  family: "Manrope, system-ui, sans-serif",
@@ -19752,16 +20132,16 @@ var originalJoyTypography = {
19752
20132
  },
19753
20133
  headings: {
19754
20134
  default: {
19755
- family: "Bricolage Grotesque, system-ui, sans-serif",
19756
- weight: "bold",
20135
+ family: "Lobster, cursive",
20136
+ weight: "regular",
19757
20137
  lineHeight: "normal",
19758
- letterSpacing: "tight",
20138
+ letterSpacing: "normal",
19759
20139
  italic: null,
19760
20140
  case: null
19761
20141
  },
19762
- h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
19763
- h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
19764
- h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
20142
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
20143
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
20144
+ h3: { size: "lg", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null }
19765
20145
  },
19766
20146
  scale: "balanced"
19767
20147
  };
@@ -19826,6 +20206,32 @@ var typographyPresets = [
19826
20206
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
19827
20207
  typography: luxeContrastTypography
19828
20208
  }),
20209
+ defineTypographyPreset({
20210
+ id: "typography-preset:kirtan-ornate",
20211
+ name: "Kirtan Ornate",
20212
+ description: "Marcellus devotional headings over a refined Jost body, matching dark ceremonial layouts.",
20213
+ defaultFonts: { body: "Jost, system-ui, sans-serif", heading: "Marcellus, Georgia, serif" },
20214
+ recommendedFonts: {
20215
+ body: ["Jost", "Manrope", "Inter"],
20216
+ heading: ["Marcellus", "Cormorant Garamond", "Playfair Display"]
20217
+ },
20218
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
20219
+ typography: kirtanOrnateTypography,
20220
+ heroTypography: {
20221
+ headlineSize: "6xl",
20222
+ headlineLineHeight: "normal",
20223
+ subheadlineSize: "xl",
20224
+ subheadlineLineHeight: "relaxed",
20225
+ microHeadlineSize: "5xl",
20226
+ microHeadlineLineHeight: "normal",
20227
+ microSubheadlineSize: "lg",
20228
+ microSubheadlineLineHeight: "relaxed",
20229
+ responsive: {
20230
+ tablet: { headlineSize: "5xl" },
20231
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
20232
+ }
20233
+ }
20234
+ }),
19829
20235
  defineTypographyPreset({
19830
20236
  id: "typography-preset:bold-display",
19831
20237
  name: "Bold Display",
@@ -19855,11 +20261,11 @@ var typographyPresets = [
19855
20261
  defineTypographyPreset({
19856
20262
  id: "typography-preset:original-joy",
19857
20263
  name: "Original Joy",
19858
- description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
19859
- defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
20264
+ description: "Lobster display headings over a clean DM Sans body, expressive and warm.",
20265
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Lobster, cursive" },
19860
20266
  recommendedFonts: {
19861
20267
  body: ["DM Sans", "Inter", "Manrope"],
19862
- heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
20268
+ heading: ["Lobster", "Bricolage Grotesque", "Space Grotesk"]
19863
20269
  },
19864
20270
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
19865
20271
  typography: originalJoyTypography,
@@ -19883,6 +20289,319 @@ var typographyPresetsById = new Map(
19883
20289
  typographyPresets.map((preset2) => [preset2.id, preset2])
19884
20290
  );
19885
20291
 
20292
+ // ../theme-core/src/site-styles/designState.ts
20293
+ import { z as z27 } from "zod";
20294
+ var themeV2DesignStateSchemaVersion = 1;
20295
+ var designResolutionPolicySchema = z27.enum(["generated", "user", "admin", "sdk"]);
20296
+ var runtimeStyleFieldNameSchema = z27.enum(themeV2RuntimeStyleFieldNames);
20297
+ var nonEmptyRuntimeStyleFieldNamesSchema = z27.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
20298
+ fields3[0],
20299
+ ...fields3.slice(1)
20300
+ ]);
20301
+ var heroLegibilityStrategySchema = z27.enum([
20302
+ "none",
20303
+ "scrim-gradient",
20304
+ "solid-panel"
20305
+ ]);
20306
+ var heroCompositionIntentSchema = z27.enum([
20307
+ "center",
20308
+ "bottom-left"
20309
+ ]);
20310
+ var heroTypographyScaleIntentSchema = z27.enum([
20311
+ "quiet",
20312
+ "editorial",
20313
+ "display",
20314
+ "poster"
20315
+ ]);
20316
+ var sectionHeightIntentSchema = z27.enum([
20317
+ "default",
20318
+ "banner",
20319
+ "hero",
20320
+ "immersive"
20321
+ ]);
20322
+ var imageSurfaceTreatmentIntensitySchema = z27.enum(["soft", "balanced", "strong"]);
20323
+ var imageSurfaceMotionSchema = z27.enum(["static", "fixed-frame"]);
20324
+ var imageSurfaceTreatmentSchema = z27.discriminatedUnion("kind", [
20325
+ z27.object({ kind: z27.literal("none") }).strict(),
20326
+ z27.object({
20327
+ kind: z27.literal("brand-scrim"),
20328
+ token: z27.enum(["primary", "secondary", "accent"]),
20329
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
20330
+ }).strict(),
20331
+ z27.object({
20332
+ kind: z27.literal("brand-wash"),
20333
+ token: z27.enum(["primary", "secondary", "accent"]),
20334
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
20335
+ }).strict(),
20336
+ z27.object({
20337
+ kind: z27.literal("neutral-scrim"),
20338
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
20339
+ }).strict(),
20340
+ z27.object({
20341
+ kind: z27.literal("neutral-wash"),
20342
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
20343
+ }).strict(),
20344
+ z27.object({
20345
+ kind: z27.literal("solid-panel"),
20346
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
20347
+ }).strict()
20348
+ ]);
20349
+ var testimonialCardTreatmentSchema = z27.enum(["default", "accent-quote"]);
20350
+ var tileTreatmentSchema = z27.enum(tileTreatmentValues);
20351
+ var eventListTreatmentSchema = z27.enum(eventListTreatmentValues);
20352
+ var eyebrowTreatmentSchema = z27.enum(eyebrowTreatmentValues);
20353
+ function uniqueNonEmpty(values) {
20354
+ const uniqueValues = [...new Set(values)];
20355
+ const firstValue = uniqueValues[0];
20356
+ if (!firstValue) {
20357
+ throw new Error("Expected at least one Theme V2 design state option.");
20358
+ }
20359
+ return [firstValue, ...uniqueValues.slice(1)];
20360
+ }
20361
+ var userPanelTreatments = uniqueNonEmpty(
20362
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
20363
+ );
20364
+ var userFlushTreatments = uniqueNonEmpty(
20365
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
20366
+ );
20367
+ var userFlushBleeds = uniqueNonEmpty(
20368
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
20369
+ );
20370
+ var contentFrameIntentSchema = z27.discriminatedUnion("kind", [
20371
+ z27.object({ kind: z27.literal("plain") }).strict(),
20372
+ z27.object({
20373
+ kind: z27.literal("panel"),
20374
+ treatment: z27.enum(userPanelTreatments)
20375
+ }).strict(),
20376
+ z27.object({
20377
+ kind: z27.literal("flush-panel"),
20378
+ treatment: z27.enum(userFlushTreatments),
20379
+ bleed: z27.enum(userFlushBleeds)
20380
+ }).strict()
20381
+ ]);
20382
+ var blockDesignPlanSchema = z27.object({
20383
+ blockId: z27.string().min(1).transform(asDesignBlockId),
20384
+ blockKind: z27.string().min(1),
20385
+ purpose: z27.string().min(1),
20386
+ sectionSurface: z27.enum(userDesignOptionCatalog.sectionSurfaces),
20387
+ contentFrame: contentFrameIntentSchema,
20388
+ itemSurface: z27.enum(userDesignOptionCatalog.itemSurfaces),
20389
+ transitionAfter: z27.enum(userDesignOptionCatalog.transitions),
20390
+ emphasis: z27.enum(userDesignOptionCatalog.emphases),
20391
+ sectionHeight: sectionHeightIntentSchema.optional(),
20392
+ heroLegibility: heroLegibilityStrategySchema.optional(),
20393
+ heroComposition: heroCompositionIntentSchema.optional(),
20394
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
20395
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
20396
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
20397
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
20398
+ tileTreatment: tileTreatmentSchema.optional(),
20399
+ eventListTreatment: eventListTreatmentSchema.optional(),
20400
+ eyebrowTreatment: eyebrowTreatmentSchema.optional()
20401
+ }).strict();
20402
+ var styleAuthoritySchema = z27.discriminatedUnion("kind", [
20403
+ z27.object({
20404
+ kind: z27.literal("theme-v2"),
20405
+ source: designResolutionPolicySchema,
20406
+ siteStyleId: z27.string().min(1).transform(asSiteStyleId),
20407
+ templateId: z27.string().min(1).transform(asDesignSystemTemplateId),
20408
+ templateVersion: z27.number().int().nonnegative(),
20409
+ resolverVersion: z27.number().int().nonnegative()
20410
+ }).strict(),
20411
+ z27.object({
20412
+ kind: z27.literal("legacy-raw"),
20413
+ reason: z27.enum(["pre-theme-v2", "manual-runtime-fields"])
20414
+ }).strict(),
20415
+ z27.object({
20416
+ kind: z27.literal("advanced-detached"),
20417
+ reason: z27.literal("detached-custom-runtime-fields")
20418
+ }).strict()
20419
+ ]);
20420
+ var blockRuntimeStyleAuthoritySchema = z27.object({
20421
+ unit: z27.literal("block-runtime-fields"),
20422
+ blockId: z27.string().min(1).transform(asDesignBlockId),
20423
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
20424
+ authority: styleAuthoritySchema
20425
+ }).strict();
20426
+ var persistedPageDesignStateV1Schema = z27.object({
20427
+ schemaVersion: z27.literal(themeV2DesignStateSchemaVersion),
20428
+ siteStyleId: z27.string().min(1).transform(asSiteStyleId),
20429
+ templateId: z27.string().min(1).transform(asDesignSystemTemplateId),
20430
+ templateVersion: z27.number().int().nonnegative(),
20431
+ resolverVersion: z27.number().int().nonnegative(),
20432
+ rhythmPresetId: z27.string().min(1),
20433
+ blocks: z27.array(blockDesignPlanSchema),
20434
+ styleAuthorities: z27.array(blockRuntimeStyleAuthoritySchema)
20435
+ }).strict();
20436
+
20437
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
20438
+ function defineDesignRuntimeRules(rules) {
20439
+ return rules;
20440
+ }
20441
+ function defineComponentRuntimeRules(rules) {
20442
+ return rules;
20443
+ }
20444
+ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
20445
+ sectionSurfaces: {
20446
+ base: {},
20447
+ "muted-band": {
20448
+ background: {
20449
+ type: "color",
20450
+ color: "muted"
20451
+ }
20452
+ },
20453
+ "accent-band": {
20454
+ background: {
20455
+ type: "color",
20456
+ color: "primary"
20457
+ }
20458
+ },
20459
+ "brand-depth-band": {
20460
+ background: {
20461
+ type: "color",
20462
+ color: "primary-800"
20463
+ }
20464
+ },
20465
+ "hero-image": {
20466
+ background: {
20467
+ type: "image",
20468
+ opacity: 1,
20469
+ position: "center center",
20470
+ ...uniformSectionForeground("text")
20471
+ }
20472
+ }
20473
+ },
20474
+ heroLegibility: {
20475
+ "scrim-gradient": {
20476
+ type: "gradient",
20477
+ gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
20478
+ opacity: 1
20479
+ },
20480
+ "solid-panel": {
20481
+ type: "color",
20482
+ color: "surface",
20483
+ opacity: 0.88
20484
+ }
20485
+ },
20486
+ transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
20487
+ });
20488
+ var defaultComponentRuntimeRules = defineComponentRuntimeRules({
20489
+ panelFrames: {
20490
+ inset: {
20491
+ spacing: "comfortable",
20492
+ rounded: "xl",
20493
+ raised: false,
20494
+ background: {
20495
+ type: "color",
20496
+ color: "surfaceAlt",
20497
+ textColor: "text"
20498
+ }
20499
+ },
20500
+ raised: {
20501
+ spacing: "comfortable",
20502
+ rounded: "xl",
20503
+ raised: true,
20504
+ background: {
20505
+ type: "color",
20506
+ color: "surfaceAlt",
20507
+ textColor: "text"
20508
+ }
20509
+ },
20510
+ editorial: {
20511
+ spacing: "medium",
20512
+ rounded: "xl",
20513
+ raised: false,
20514
+ background: {
20515
+ type: "color",
20516
+ color: "surface",
20517
+ textColor: "text"
20518
+ }
20519
+ }
20520
+ },
20521
+ flushFrames: {
20522
+ "media-panel": {
20523
+ fullWidth: true,
20524
+ spacing: "none",
20525
+ rounded: "none",
20526
+ raised: false
20527
+ }
20528
+ },
20529
+ itemSurfaces: {
20530
+ none: null,
20531
+ default: {
20532
+ spacing: "medium",
20533
+ rounded: "lg",
20534
+ raised: false
20535
+ },
20536
+ flat: {
20537
+ spacing: "medium",
20538
+ rounded: "lg",
20539
+ raised: false
20540
+ },
20541
+ outlined: {
20542
+ spacing: "medium",
20543
+ rounded: "lg",
20544
+ raised: false,
20545
+ border: {
20546
+ enabled: true,
20547
+ width: "1",
20548
+ colorToken: "border"
20549
+ }
20550
+ },
20551
+ raised: {
20552
+ spacing: "medium",
20553
+ rounded: "xl",
20554
+ raised: true
20555
+ },
20556
+ inset: {
20557
+ treatment: "soft-panel",
20558
+ spacing: "comfortable",
20559
+ rounded: "xl",
20560
+ raised: false,
20561
+ border: {
20562
+ enabled: false
20563
+ },
20564
+ background: {
20565
+ type: "color",
20566
+ color: "surfaceAlt",
20567
+ textColor: "text"
20568
+ }
20569
+ },
20570
+ editorial: {
20571
+ // Boxless open column with a short rule on top; the visual treatment
20572
+ // lives in blocks-static/card-treatments.css.
20573
+ treatment: "editorial-rule",
20574
+ spacing: "none",
20575
+ rounded: "none",
20576
+ raised: false,
20577
+ border: {
20578
+ enabled: false
20579
+ }
20580
+ },
20581
+ "color-blocked": {
20582
+ // Bold, flat colour-blocked cards. The per-card background colour cycle
20583
+ // (by position) and staggered offset live in
20584
+ // blocks-static/card-treatments.css; here we set the shared shape:
20585
+ // generous padding, large radius, no border, flat (no shadow).
20586
+ treatment: "color-blocked",
20587
+ spacing: "spacious",
20588
+ rounded: "2xl",
20589
+ raised: false,
20590
+ border: {
20591
+ enabled: false
20592
+ }
20593
+ }
20594
+ }
20595
+ });
20596
+ function uniformSectionForeground(token) {
20597
+ return {
20598
+ textColor: token,
20599
+ headingColor: token,
20600
+ linkColor: token,
20601
+ supportingColor: token
20602
+ };
20603
+ }
20604
+
19886
20605
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
19887
20606
  var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
19888
20607
  var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
@@ -19901,6 +20620,7 @@ var curatedSiteStyleIdValues = [
19901
20620
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
19902
20621
  "site-style:bold-launch",
19903
20622
  "site-style:south-west-twerk-school",
20623
+ "site-style:kirtan-ornate",
19904
20624
  "site-style:original-joy"
19905
20625
  ];
19906
20626
  var quietBudget = {
@@ -19927,6 +20647,50 @@ var expressiveBudget = {
19927
20647
  mediaDensity: "high",
19928
20648
  decorativeRepetition: "medium"
19929
20649
  };
20650
+ var kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
20651
+ ...defaultDesignRuntimeRules,
20652
+ defaultEyebrowTreatment: "accent",
20653
+ sectionSurfaces: {
20654
+ ...defaultDesignRuntimeRules.sectionSurfaces,
20655
+ "muted-band": {
20656
+ background: {
20657
+ type: "color",
20658
+ color: "muted"
20659
+ },
20660
+ foreground: {
20661
+ textColor: "text",
20662
+ headingColor: "primary",
20663
+ linkColor: "primary",
20664
+ supportingColor: "text"
20665
+ }
20666
+ },
20667
+ "brand-depth-band": {
20668
+ background: {
20669
+ type: "color",
20670
+ color: "primary-800"
20671
+ },
20672
+ foreground: {
20673
+ textColor: "text",
20674
+ headingColor: "primary",
20675
+ linkColor: "primary",
20676
+ supportingColor: "text"
20677
+ }
20678
+ },
20679
+ "hero-image": {
20680
+ background: {
20681
+ type: "image",
20682
+ opacity: 1,
20683
+ position: "center center"
20684
+ },
20685
+ foreground: {
20686
+ textColor: "text",
20687
+ headingColor: "primary",
20688
+ linkColor: "primary",
20689
+ supportingColor: "text"
20690
+ }
20691
+ }
20692
+ }
20693
+ });
19930
20694
  var expressiveUnderlineInputs = {
19931
20695
  base: {
19932
20696
  background: { type: "transparent" },
@@ -19964,6 +20728,43 @@ var expressiveUnderlineInputs = {
19964
20728
  opacity: 0.6
19965
20729
  }
19966
20730
  };
20731
+ var ornateDarkInputs = {
20732
+ base: {
20733
+ background: { type: "solid", colorToken: "surfaceAlt" },
20734
+ textColorToken: "text",
20735
+ border: {
20736
+ widthClass: "border",
20737
+ colorToken: "primary/45",
20738
+ style: "all"
20739
+ },
20740
+ corners: "square",
20741
+ shadow: null,
20742
+ spacing: "medium",
20743
+ fontSize: "base"
20744
+ },
20745
+ label: {
20746
+ textColorToken: "primary",
20747
+ fontWeight: "semibold",
20748
+ fontSize: "xs",
20749
+ textTransform: "uppercase",
20750
+ letterSpacing: "wider",
20751
+ opacity: 1
20752
+ },
20753
+ focus: {
20754
+ ringColorToken: "primary/18",
20755
+ ringWidth: "2",
20756
+ borderColorToken: "primary/70"
20757
+ },
20758
+ error: {
20759
+ borderColorToken: "destructive",
20760
+ textColorToken: "destructive"
20761
+ },
20762
+ disabled: {
20763
+ backgroundColorToken: "muted",
20764
+ textColorToken: "mutedText",
20765
+ opacity: 0.6
20766
+ }
20767
+ };
19967
20768
  function uniqueContentFrameKinds() {
19968
20769
  const kinds = [
19969
20770
  ...new Set(
@@ -20021,6 +20822,7 @@ function defineCuratedSiteStyle(input) {
20021
20822
  // clean/minimal styles default to none.
20022
20823
  headingDecoration: input.headingDecoration ?? noHeadingDecoration,
20023
20824
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
20825
+ ...input.designRuntimeRules ? { designRuntimeRules: input.designRuntimeRules } : {},
20024
20826
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
20025
20827
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
20026
20828
  defaultHeaderSelection: input.defaultHeaderSelection ? {
@@ -20971,6 +21773,80 @@ var curatedSiteStyles = [
20971
21773
  paletteChoice("high-contrast-ink")
20972
21774
  ]
20973
21775
  }),
21776
+ defineCuratedSiteStyle({
21777
+ id: "site-style:kirtan-ornate",
21778
+ name: "Kirtan Ornate",
21779
+ headingDecoration: { family: "short-center-rule", colorToken: "accent" },
21780
+ description: "Ceremonial, jewel-toned, and devotional: ornate frames, warm contrast, and composed rhythm for intimate music gatherings.",
21781
+ 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.",
21782
+ selectionKeywordRules: [
21783
+ { kind: "word", value: "kirtan" },
21784
+ { kind: "word", value: "chanting" },
21785
+ { kind: "word", value: "ceremony" },
21786
+ { kind: "word", value: "devotional" }
21787
+ ],
21788
+ tokenRecipes: {
21789
+ palette: "brand-led",
21790
+ contrast: "strong",
21791
+ radius: "soft",
21792
+ shadow: "subtle",
21793
+ typography: "serif-editorial",
21794
+ spacing: "airy",
21795
+ motion: "subtle"
21796
+ },
21797
+ compositionBudget: expressiveBudget,
21798
+ typographyPresetChoices: [
21799
+ typographyChoice("typography-preset:kirtan-ornate"),
21800
+ typographyChoice("typography-preset:luxe-contrast"),
21801
+ typographyChoice("typography-preset:editorial-serif")
21802
+ ],
21803
+ defaultTypographyPresetId: "typography-preset:kirtan-ornate",
21804
+ themeOverrides: {
21805
+ accordions: warmInsetAccordionSystem,
21806
+ cards: originalJoyCardSystem,
21807
+ testimonialQuote: serifDisplayQuote,
21808
+ bodyText: {
21809
+ intro: {
21810
+ paragraphSize: "editorial",
21811
+ headingSize: "editorial"
21812
+ }
21813
+ },
21814
+ inputs: ornateDarkInputs
21815
+ },
21816
+ designRuntimeRules: kirtanOrnateDesignRuntimeRules,
21817
+ recommendedAppearancePresetIds: [
21818
+ "hero-brand-scrim-fixed-frame",
21819
+ "media-text-quiet-story",
21820
+ "events-lined-panel",
21821
+ "schedule-details-brand-depth",
21822
+ "testimonials-statement-cards",
21823
+ "contact-form-panel"
21824
+ ],
21825
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
21826
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
21827
+ recommendedHeaderStyleChoicesByLayout: {
21828
+ floating: [
21829
+ headerStyleChoice("minimal-surface"),
21830
+ headerStyleChoice("split-glass"),
21831
+ headerStyleChoice("glass")
21832
+ ]
21833
+ },
21834
+ recommendedHeaderLookIds: ["minimal-transparent"],
21835
+ recommendedFooterLookIds: [
21836
+ "site-footer-brand-two-band",
21837
+ "footer-muted-grounding"
21838
+ ],
21839
+ buttonPersonalityChoices: [
21840
+ buttonChoice("ornate-ritual"),
21841
+ buttonChoice("joy-stamp"),
21842
+ buttonChoice("ink-stamp")
21843
+ ],
21844
+ paletteVariantChoices: [
21845
+ paletteChoice("warm-dark-kirtan-gold"),
21846
+ paletteChoice("warm-dark-ember"),
21847
+ paletteChoice("brand-led-burgundy-gold")
21848
+ ]
21849
+ }),
20974
21850
  defineCuratedSiteStyle({
20975
21851
  id: "site-style:original-joy",
20976
21852
  name: "Original Joy",
@@ -21077,319 +21953,6 @@ var pageFlowPresets = [
21077
21953
  }
21078
21954
  ];
21079
21955
 
21080
- // ../theme-core/src/site-styles/designState.ts
21081
- import { z as z27 } from "zod";
21082
- var themeV2DesignStateSchemaVersion = 1;
21083
- var designResolutionPolicySchema = z27.enum(["generated", "user", "admin", "sdk"]);
21084
- var runtimeStyleFieldNameSchema = z27.enum(themeV2RuntimeStyleFieldNames);
21085
- var nonEmptyRuntimeStyleFieldNamesSchema = z27.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
21086
- fields3[0],
21087
- ...fields3.slice(1)
21088
- ]);
21089
- var heroLegibilityStrategySchema = z27.enum([
21090
- "none",
21091
- "scrim-gradient",
21092
- "solid-panel"
21093
- ]);
21094
- var heroCompositionIntentSchema = z27.enum([
21095
- "center",
21096
- "bottom-left"
21097
- ]);
21098
- var heroTypographyScaleIntentSchema = z27.enum([
21099
- "quiet",
21100
- "editorial",
21101
- "display",
21102
- "poster"
21103
- ]);
21104
- var sectionHeightIntentSchema = z27.enum([
21105
- "default",
21106
- "banner",
21107
- "hero",
21108
- "immersive"
21109
- ]);
21110
- var imageSurfaceTreatmentIntensitySchema = z27.enum(["soft", "balanced", "strong"]);
21111
- var imageSurfaceMotionSchema = z27.enum(["static", "fixed-frame"]);
21112
- var imageSurfaceTreatmentSchema = z27.discriminatedUnion("kind", [
21113
- z27.object({ kind: z27.literal("none") }).strict(),
21114
- z27.object({
21115
- kind: z27.literal("brand-scrim"),
21116
- token: z27.enum(["primary", "secondary", "accent"]),
21117
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
21118
- }).strict(),
21119
- z27.object({
21120
- kind: z27.literal("brand-wash"),
21121
- token: z27.enum(["primary", "secondary", "accent"]),
21122
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
21123
- }).strict(),
21124
- z27.object({
21125
- kind: z27.literal("neutral-scrim"),
21126
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
21127
- }).strict(),
21128
- z27.object({
21129
- kind: z27.literal("neutral-wash"),
21130
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
21131
- }).strict(),
21132
- z27.object({
21133
- kind: z27.literal("solid-panel"),
21134
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
21135
- }).strict()
21136
- ]);
21137
- var testimonialCardTreatmentSchema = z27.enum(["default", "accent-quote"]);
21138
- var tileTreatmentSchema = z27.enum(tileTreatmentValues);
21139
- var eventListTreatmentSchema = z27.enum(eventListTreatmentValues);
21140
- var eyebrowTreatmentSchema = z27.enum(eyebrowTreatmentValues);
21141
- function uniqueNonEmpty(values) {
21142
- const uniqueValues = [...new Set(values)];
21143
- const firstValue = uniqueValues[0];
21144
- if (!firstValue) {
21145
- throw new Error("Expected at least one Theme V2 design state option.");
21146
- }
21147
- return [firstValue, ...uniqueValues.slice(1)];
21148
- }
21149
- var userPanelTreatments = uniqueNonEmpty(
21150
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
21151
- );
21152
- var userFlushTreatments = uniqueNonEmpty(
21153
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
21154
- );
21155
- var userFlushBleeds = uniqueNonEmpty(
21156
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
21157
- );
21158
- var contentFrameIntentSchema = z27.discriminatedUnion("kind", [
21159
- z27.object({ kind: z27.literal("plain") }).strict(),
21160
- z27.object({
21161
- kind: z27.literal("panel"),
21162
- treatment: z27.enum(userPanelTreatments)
21163
- }).strict(),
21164
- z27.object({
21165
- kind: z27.literal("flush-panel"),
21166
- treatment: z27.enum(userFlushTreatments),
21167
- bleed: z27.enum(userFlushBleeds)
21168
- }).strict()
21169
- ]);
21170
- var blockDesignPlanSchema = z27.object({
21171
- blockId: z27.string().min(1).transform(asDesignBlockId),
21172
- blockKind: z27.string().min(1),
21173
- purpose: z27.string().min(1),
21174
- sectionSurface: z27.enum(userDesignOptionCatalog.sectionSurfaces),
21175
- contentFrame: contentFrameIntentSchema,
21176
- itemSurface: z27.enum(userDesignOptionCatalog.itemSurfaces),
21177
- transitionAfter: z27.enum(userDesignOptionCatalog.transitions),
21178
- emphasis: z27.enum(userDesignOptionCatalog.emphases),
21179
- sectionHeight: sectionHeightIntentSchema.optional(),
21180
- heroLegibility: heroLegibilityStrategySchema.optional(),
21181
- heroComposition: heroCompositionIntentSchema.optional(),
21182
- heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
21183
- imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
21184
- imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
21185
- testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
21186
- tileTreatment: tileTreatmentSchema.optional(),
21187
- eventListTreatment: eventListTreatmentSchema.optional(),
21188
- eyebrowTreatment: eyebrowTreatmentSchema.optional()
21189
- }).strict();
21190
- var styleAuthoritySchema = z27.discriminatedUnion("kind", [
21191
- z27.object({
21192
- kind: z27.literal("theme-v2"),
21193
- source: designResolutionPolicySchema,
21194
- siteStyleId: z27.string().min(1).transform(asSiteStyleId),
21195
- templateId: z27.string().min(1).transform(asDesignSystemTemplateId),
21196
- templateVersion: z27.number().int().nonnegative(),
21197
- resolverVersion: z27.number().int().nonnegative()
21198
- }).strict(),
21199
- z27.object({
21200
- kind: z27.literal("legacy-raw"),
21201
- reason: z27.enum(["pre-theme-v2", "manual-runtime-fields"])
21202
- }).strict(),
21203
- z27.object({
21204
- kind: z27.literal("advanced-detached"),
21205
- reason: z27.literal("detached-custom-runtime-fields")
21206
- }).strict()
21207
- ]);
21208
- var blockRuntimeStyleAuthoritySchema = z27.object({
21209
- unit: z27.literal("block-runtime-fields"),
21210
- blockId: z27.string().min(1).transform(asDesignBlockId),
21211
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
21212
- authority: styleAuthoritySchema
21213
- }).strict();
21214
- var persistedPageDesignStateV1Schema = z27.object({
21215
- schemaVersion: z27.literal(themeV2DesignStateSchemaVersion),
21216
- siteStyleId: z27.string().min(1).transform(asSiteStyleId),
21217
- templateId: z27.string().min(1).transform(asDesignSystemTemplateId),
21218
- templateVersion: z27.number().int().nonnegative(),
21219
- resolverVersion: z27.number().int().nonnegative(),
21220
- rhythmPresetId: z27.string().min(1),
21221
- blocks: z27.array(blockDesignPlanSchema),
21222
- styleAuthorities: z27.array(blockRuntimeStyleAuthoritySchema)
21223
- }).strict();
21224
-
21225
- // ../theme-core/src/site-styles/runtimeCompiler.ts
21226
- function defineDesignRuntimeRules(rules) {
21227
- return rules;
21228
- }
21229
- function defineComponentRuntimeRules(rules) {
21230
- return rules;
21231
- }
21232
- var defaultDesignRuntimeRules = defineDesignRuntimeRules({
21233
- sectionSurfaces: {
21234
- base: {},
21235
- "muted-band": {
21236
- background: {
21237
- type: "color",
21238
- color: "muted"
21239
- }
21240
- },
21241
- "accent-band": {
21242
- background: {
21243
- type: "color",
21244
- color: "primary"
21245
- }
21246
- },
21247
- "brand-depth-band": {
21248
- background: {
21249
- type: "color",
21250
- color: "primary-800"
21251
- }
21252
- },
21253
- "hero-image": {
21254
- background: {
21255
- type: "image",
21256
- opacity: 1,
21257
- position: "center center",
21258
- ...uniformSectionForeground("text")
21259
- }
21260
- }
21261
- },
21262
- heroLegibility: {
21263
- "scrim-gradient": {
21264
- type: "gradient",
21265
- gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
21266
- opacity: 1
21267
- },
21268
- "solid-panel": {
21269
- type: "color",
21270
- color: "surface",
21271
- opacity: 0.88
21272
- }
21273
- },
21274
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
21275
- });
21276
- var defaultComponentRuntimeRules = defineComponentRuntimeRules({
21277
- panelFrames: {
21278
- inset: {
21279
- spacing: "comfortable",
21280
- rounded: "xl",
21281
- raised: false,
21282
- background: {
21283
- type: "color",
21284
- color: "surfaceAlt",
21285
- textColor: "text"
21286
- }
21287
- },
21288
- raised: {
21289
- spacing: "comfortable",
21290
- rounded: "xl",
21291
- raised: true,
21292
- background: {
21293
- type: "color",
21294
- color: "surfaceAlt",
21295
- textColor: "text"
21296
- }
21297
- },
21298
- editorial: {
21299
- spacing: "medium",
21300
- rounded: "xl",
21301
- raised: false,
21302
- background: {
21303
- type: "color",
21304
- color: "surface",
21305
- textColor: "text"
21306
- }
21307
- }
21308
- },
21309
- flushFrames: {
21310
- "media-panel": {
21311
- fullWidth: true,
21312
- spacing: "none",
21313
- rounded: "none",
21314
- raised: false
21315
- }
21316
- },
21317
- itemSurfaces: {
21318
- none: null,
21319
- default: {
21320
- spacing: "medium",
21321
- rounded: "lg",
21322
- raised: false
21323
- },
21324
- flat: {
21325
- spacing: "medium",
21326
- rounded: "lg",
21327
- raised: false
21328
- },
21329
- outlined: {
21330
- spacing: "medium",
21331
- rounded: "lg",
21332
- raised: false,
21333
- border: {
21334
- enabled: true,
21335
- width: "1",
21336
- colorToken: "border"
21337
- }
21338
- },
21339
- raised: {
21340
- spacing: "medium",
21341
- rounded: "xl",
21342
- raised: true
21343
- },
21344
- inset: {
21345
- treatment: "soft-panel",
21346
- spacing: "comfortable",
21347
- rounded: "xl",
21348
- raised: false,
21349
- border: {
21350
- enabled: false
21351
- },
21352
- background: {
21353
- type: "color",
21354
- color: "surfaceAlt",
21355
- textColor: "text"
21356
- }
21357
- },
21358
- editorial: {
21359
- // Boxless open column with a short rule on top; the visual treatment
21360
- // lives in blocks-static/card-treatments.css.
21361
- treatment: "editorial-rule",
21362
- spacing: "none",
21363
- rounded: "none",
21364
- raised: false,
21365
- border: {
21366
- enabled: false
21367
- }
21368
- },
21369
- "color-blocked": {
21370
- // Bold, flat colour-blocked cards. The per-card background colour cycle
21371
- // (by position) and staggered offset live in
21372
- // blocks-static/card-treatments.css; here we set the shared shape:
21373
- // generous padding, large radius, no border, flat (no shadow).
21374
- treatment: "color-blocked",
21375
- spacing: "spacious",
21376
- rounded: "2xl",
21377
- raised: false,
21378
- border: {
21379
- enabled: false
21380
- }
21381
- }
21382
- }
21383
- });
21384
- function uniformSectionForeground(token) {
21385
- return {
21386
- textColor: token,
21387
- headingColor: token,
21388
- linkColor: token,
21389
- supportingColor: token
21390
- };
21391
- }
21392
-
21393
21956
  // ../theme-core/src/site-styles/generatedSchemas.ts
21394
21957
  import { z as z28 } from "zod";
21395
21958
  function uniqueNonEmpty2(values) {
@@ -22201,6 +22764,31 @@ function cardStylesField(options = {}) {
22201
22764
  return createBoxStylesFieldWithDepth("card", options);
22202
22765
  }
22203
22766
 
22767
+ // ../blocks/src/system/fields/imageShape.ts
22768
+ var standardImageShapeOptions = [
22769
+ { value: "default", label: "Default" },
22770
+ { value: "square", label: "Square corners" },
22771
+ { value: "rounded", label: "Rounded corners" },
22772
+ { value: "circle", label: "Circle" },
22773
+ { value: "arch", label: "Arch" }
22774
+ ];
22775
+ function createImageShapeField(options = {}) {
22776
+ return {
22777
+ id: options.id ?? "imageShape",
22778
+ type: "select",
22779
+ label: options.label ?? "Image shape",
22780
+ ...options.description ? { description: options.description } : {},
22781
+ required: false,
22782
+ defaultValue: options.defaultValue ?? "default",
22783
+ multiple: false,
22784
+ options: [...standardImageShapeOptions],
22785
+ ui: {
22786
+ intent: options.uiIntent ?? "display",
22787
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
22788
+ }
22789
+ };
22790
+ }
22791
+
22204
22792
  // ../blocks/src/utils/env.ts
22205
22793
  function isDevEnvironment() {
22206
22794
  try {
@@ -23015,7 +23603,7 @@ function buildFooterNavAll(common) {
23015
23603
  return stack(
23016
23604
  { className: common.className, gap: common.gap, align: "stretch" },
23017
23605
  [item],
23018
- when(collectionPath)
23606
+ whenCollectionHasItems(collectionPath)
23019
23607
  );
23020
23608
  }
23021
23609
  function buildFooterNavLinksOnly(common) {
@@ -23048,7 +23636,7 @@ function buildFooterNavLinksOnly(common) {
23048
23636
  return stack(
23049
23637
  { className: common.className, gap: common.gap, align: "stretch" },
23050
23638
  [item],
23051
- when(collectionPath)
23639
+ whenCollectionHasItems(collectionPath)
23052
23640
  );
23053
23641
  }
23054
23642
  function buildFooterNavFlatten(common) {
@@ -23097,9 +23685,20 @@ function buildFooterNavFlatten(common) {
23097
23685
  return stack(
23098
23686
  { className: common.className, gap: common.gap, align: "stretch" },
23099
23687
  [item],
23100
- when(collectionPath)
23688
+ whenCollectionHasItems(collectionPath)
23101
23689
  );
23102
23690
  }
23691
+ var whenCollectionHasItems = (collectionPath) => (node) => ({
23692
+ ...node,
23693
+ $when: {
23694
+ when: {
23695
+ from: collectionPath,
23696
+ transforms: [{ id: "array.length" }]
23697
+ },
23698
+ equals: 0,
23699
+ not: true
23700
+ }
23701
+ });
23103
23702
  function footerNav(opts) {
23104
23703
  const mode = opts?.mode ?? "all";
23105
23704
  const collectionPath = opts?.collectionPath ?? "footerMenu.items";
@@ -25814,8 +26413,23 @@ function fragmentsToRepeaterField(id, label, fragments, options = {}) {
25814
26413
  var heroLayoutControlsFragment = defineFragment({
25815
26414
  id: "heroLayoutControls",
25816
26415
  title: "Hero Layout",
25817
- description: "Alignment and content width controls for hero layouts.",
26416
+ description: "Title scale, alignment, and content width controls for hero layouts.",
25818
26417
  fields: [
26418
+ {
26419
+ id: "titleSize",
26420
+ type: "select",
26421
+ label: "Title size",
26422
+ description: "Adjust the visual scale of the hero title.",
26423
+ required: false,
26424
+ ui: { intent: "display" },
26425
+ options: [
26426
+ { value: "auto", label: "Auto" },
26427
+ { value: "quiet", label: "Normal" },
26428
+ { value: "editorial", label: "Large" },
26429
+ { value: "display", label: "Huge" },
26430
+ { value: "poster", label: "Poster" }
26431
+ ]
26432
+ },
25819
26433
  {
25820
26434
  id: "contentAlignment",
25821
26435
  type: "select",
@@ -26610,7 +27224,18 @@ function heroSplitImagePane() {
26610
27224
  return stack(
26611
27225
  {
26612
27226
  gap: "none",
26613
- className: "rb-relative rb-overflow-hidden rb-rounded-3xl",
27227
+ className: {
27228
+ $bind: {
27229
+ from: "content.imageShape",
27230
+ transforms: [
27231
+ {
27232
+ id: "ui.imageShapeClassName",
27233
+ options: { baseClass: "rb-relative rb-overflow-hidden rb-rounded-3xl" }
27234
+ }
27235
+ ],
27236
+ fallback: "rb-relative rb-overflow-hidden rb-rounded-3xl"
27237
+ }
27238
+ },
26614
27239
  style: {
26615
27240
  minHeight: "clamp(18rem, 36vw, 34rem)"
26616
27241
  }
@@ -26728,6 +27353,12 @@ var heroConfig = {
26728
27353
  label: "Content card",
26729
27354
  renderInHeader: true,
26730
27355
  intent: "style"
27356
+ }),
27357
+ createImageShapeField({
27358
+ id: "imageShape",
27359
+ label: "Image shape",
27360
+ defaultValue: "default",
27361
+ uiIntent: "display"
26731
27362
  })
26732
27363
  ],
26733
27364
  layout: classicLayout,
@@ -26742,6 +27373,15 @@ var heroConfig = {
26742
27373
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
26743
27374
  tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
26744
27375
  icon: "Sparkles",
27376
+ previewCustomize: {
27377
+ quickFieldPriority: [
27378
+ "titleSize",
27379
+ "contentAlignment",
27380
+ "contentMaxWidth",
27381
+ "verticalAlignment",
27382
+ "imageShape"
27383
+ ]
27384
+ },
26745
27385
  styleTokens: {
26746
27386
  typography: "display",
26747
27387
  spacing: "xl"
@@ -26758,7 +27398,8 @@ var standardAspectRatioOptions = [
26758
27398
  { value: "16/9", label: "16:9 (Landscape)" },
26759
27399
  { value: "4/3", label: "4:3 (Standard)" },
26760
27400
  { value: "1/1", label: "1:1 (Square)" },
26761
- { value: "3/4", label: "3:4 (Portrait)" }
27401
+ { value: "3/4", label: "3:4 (Portrait)" },
27402
+ { value: "9/16", label: "9:16 (Tall portrait)" }
26762
27403
  ];
26763
27404
  function createAspectRatioField(options = {}) {
26764
27405
  return {
@@ -28000,6 +28641,258 @@ var formBlockDefinition = {
28000
28641
  runtime: formBlockRuntime
28001
28642
  };
28002
28643
 
28644
+ // ../blocks/src/system/blocks/contact-newsletter.ts
28645
+ var contactNewsletterLayout = styledSection({
28646
+ children: sectionContainer([
28647
+ el(
28648
+ "div",
28649
+ { className: "contact-newsletter-grid" },
28650
+ [
28651
+ el(
28652
+ "div",
28653
+ { className: "contact-newsletter-column contact-newsletter-contact" },
28654
+ [
28655
+ el(
28656
+ "div",
28657
+ { className: "contact-newsletter-copy" },
28658
+ [
28659
+ text(
28660
+ {
28661
+ as: "h2",
28662
+ className: "form-copy-title"
28663
+ },
28664
+ when("contactTitle"),
28665
+ bind("contactTitle")
28666
+ ),
28667
+ richText(
28668
+ {
28669
+ className: "form-copy-intro rb-prose rb-max-w-none"
28670
+ },
28671
+ when("contactIntro"),
28672
+ bind("contactIntro")
28673
+ )
28674
+ ]
28675
+ ),
28676
+ el(
28677
+ "form",
28678
+ withApiBindings({
28679
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
28680
+ submitLabel: { $bind: { from: "contactSubmitLabel" } },
28681
+ successMessage: { $bind: { from: "contactSuccessMessage" } }
28682
+ }),
28683
+ [],
28684
+ bind("data.form")
28685
+ )
28686
+ ]
28687
+ ),
28688
+ el(
28689
+ "div",
28690
+ { className: "contact-newsletter-column contact-newsletter-info contact-newsletter-newsletter" },
28691
+ [
28692
+ el(
28693
+ "div",
28694
+ { className: "contact-newsletter-copy" },
28695
+ [
28696
+ text(
28697
+ {
28698
+ as: "h2",
28699
+ className: "newsletter-copy-title"
28700
+ },
28701
+ when("newsletterTitle"),
28702
+ bind("newsletterTitle")
28703
+ ),
28704
+ richText(
28705
+ {
28706
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none"
28707
+ },
28708
+ when("newsletterSubtitle"),
28709
+ bind("newsletterSubtitle")
28710
+ )
28711
+ ]
28712
+ ),
28713
+ el(
28714
+ "newsletter-form",
28715
+ withApiBindings({
28716
+ listId: { $bind: { from: "listId" } },
28717
+ preset: { $bind: { from: "preset" } },
28718
+ includePhone: { $bind: { from: "includePhone" } },
28719
+ buttonLabel: { $bind: { from: "newsletterButtonLabel" } },
28720
+ successMessage: { $bind: { from: "newsletterSuccessMessage" } },
28721
+ privacyNote: { $bind: { from: "newsletterPrivacyNote" } },
28722
+ tags: { $bind: { from: "newsletterTags" } },
28723
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } }
28724
+ }),
28725
+ []
28726
+ )
28727
+ ]
28728
+ )
28729
+ ]
28730
+ )
28731
+ ], {
28732
+ className: "contact-newsletter-container"
28733
+ }),
28734
+ baseClass: "",
28735
+ spacing: "medium",
28736
+ background: "surface"
28737
+ });
28738
+ var contactNewsletterManifest = createBlockManifest({
28739
+ id: "block.contact-newsletter",
28740
+ title: "Contact + Newsletter",
28741
+ titleSource: "contactTitle",
28742
+ description: "Two-column newsletter signup and contact form section.",
28743
+ category: "interactive",
28744
+ layout: contactNewsletterLayout,
28745
+ defaultVariant: "default",
28746
+ variants: {
28747
+ default: contactNewsletterLayout
28748
+ },
28749
+ variantOptions: {
28750
+ default: {
28751
+ label: "Two column",
28752
+ description: "Newsletter and contact form side by side.",
28753
+ icon: "Columns2"
28754
+ }
28755
+ },
28756
+ additionalFields: [
28757
+ {
28758
+ id: "newsletterTitle",
28759
+ type: "text",
28760
+ label: "Newsletter title",
28761
+ defaultValue: "Stay connected"
28762
+ },
28763
+ {
28764
+ id: "newsletterSubtitle",
28765
+ type: "richText",
28766
+ label: "Newsletter intro"
28767
+ },
28768
+ {
28769
+ id: "listId",
28770
+ type: "reference",
28771
+ label: "Newsletter list",
28772
+ description: "Select the list new subscribers should be added to.",
28773
+ required: true,
28774
+ referenceKind: "newsletterList",
28775
+ allowManualEntry: false,
28776
+ ui: { intent: "behavior" }
28777
+ },
28778
+ {
28779
+ id: "preset",
28780
+ type: "select",
28781
+ label: "Newsletter fields",
28782
+ defaultValue: "emailOnly",
28783
+ ui: { intent: "display" },
28784
+ options: [
28785
+ { value: "emailOnly", label: "Email only" },
28786
+ { value: "emailName", label: "Email + Name" },
28787
+ { value: "emailFirstLast", label: "Email + First/Last Name" },
28788
+ { value: "emailNameCompany", label: "Email + Name + Company (B2B)" }
28789
+ ]
28790
+ },
28791
+ {
28792
+ id: "includePhone",
28793
+ type: "boolean",
28794
+ label: "Include phone field",
28795
+ defaultValue: false,
28796
+ ui: { intent: "display" }
28797
+ },
28798
+ {
28799
+ id: "newsletterButtonLabel",
28800
+ type: "text",
28801
+ label: "Newsletter button label",
28802
+ defaultValue: "Subscribe",
28803
+ ui: { intent: "display" }
28804
+ },
28805
+ {
28806
+ id: "newsletterSuccessMessage",
28807
+ type: "text",
28808
+ label: "Newsletter success message",
28809
+ defaultValue: "Thanks for subscribing!",
28810
+ ui: { intent: "behavior" }
28811
+ },
28812
+ {
28813
+ id: "newsletterPrivacyNote",
28814
+ type: "text",
28815
+ label: "Privacy note",
28816
+ ui: { intent: "display" }
28817
+ },
28818
+ {
28819
+ id: "newsletterTags",
28820
+ type: "text",
28821
+ label: "Newsletter tags",
28822
+ description: "Optional tags to apply on subscribe, separated by comma or semicolon.",
28823
+ ui: { intent: "behavior" }
28824
+ },
28825
+ {
28826
+ id: "contactTitle",
28827
+ type: "text",
28828
+ label: "Contact title",
28829
+ defaultValue: "Get in touch"
28830
+ },
28831
+ {
28832
+ id: "contactIntro",
28833
+ type: "richText",
28834
+ label: "Contact intro"
28835
+ },
28836
+ {
28837
+ id: "formSlug",
28838
+ type: "reference",
28839
+ label: "Contact form",
28840
+ description: "Pick a saved form to render.",
28841
+ required: true,
28842
+ referenceKind: "form",
28843
+ allowManualEntry: false,
28844
+ ui: { intent: "behavior" }
28845
+ },
28846
+ {
28847
+ id: "contactSubmitLabel",
28848
+ type: "text",
28849
+ label: "Contact button label",
28850
+ defaultValue: "Send message",
28851
+ ui: { intent: "display" }
28852
+ },
28853
+ {
28854
+ id: "contactSuccessMessage",
28855
+ type: "text",
28856
+ label: "Contact success message",
28857
+ defaultValue: "Thanks - we received your message.",
28858
+ ui: { intent: "behavior" }
28859
+ }
28860
+ ],
28861
+ styleTokens: {
28862
+ background: "surface",
28863
+ typography: "body",
28864
+ spacing: "md"
28865
+ },
28866
+ behaviours: {
28867
+ supportsThemeSwitching: true,
28868
+ inlineEditing: true,
28869
+ animation: false,
28870
+ paletteHidden: false
28871
+ },
28872
+ tags: [
28873
+ "contact",
28874
+ "newsletter",
28875
+ "signup",
28876
+ "email",
28877
+ "form",
28878
+ "lead-capture"
28879
+ ],
28880
+ icon: "MailPlus"
28881
+ });
28882
+ var contactNewsletterBlockDefinition = {
28883
+ manifest: contactNewsletterManifest,
28884
+ dataSchemas: { form: formDataSchema.optional() },
28885
+ dataLoaders: {
28886
+ form: {
28887
+ endpoint: "getPublicFormById",
28888
+ params: {
28889
+ formSlug: { $bind: { from: "formSlug" } }
28890
+ },
28891
+ mode: "server"
28892
+ }
28893
+ }
28894
+ };
28895
+
28003
28896
  // ../blocks/src/system/blocks/faq.ts
28004
28897
  function fragmentLayoutNode2(layout) {
28005
28898
  return isNodeDefinitionArray2(layout) ? el("div", {}, [...layout]) : layout;
@@ -28228,6 +29121,7 @@ var joinClasses3 = (parts) => parts.filter(
28228
29121
  ).join(" ").replace(/\s+/g, " ").trim();
28229
29122
  var eyebrowTreatmentClassMap = {
28230
29123
  plain: "",
29124
+ accent: "rb-eyebrow-treatment-accent",
28231
29125
  pill: "rb-eyebrow-treatment-pill",
28232
29126
  "accent-pill": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent",
28233
29127
  "pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-pill-bounce",
@@ -28254,6 +29148,13 @@ var imageGalleryCornerClassMap = {
28254
29148
  "2xl": "rb-rounded-2xl",
28255
29149
  "3xl": "rb-rounded-3xl"
28256
29150
  };
29151
+ var imageShapeClassMap = {
29152
+ default: "",
29153
+ square: "rb-media-shape-square",
29154
+ rounded: "rb-media-shape-rounded",
29155
+ circle: "rb-media-shape-circle",
29156
+ arch: "rb-media-shape-arch"
29157
+ };
28257
29158
  var parseRatio = (raw) => {
28258
29159
  if (typeof raw !== "string") return null;
28259
29160
  const value = raw.trim();
@@ -28398,6 +29299,10 @@ function resolveHeroContentMaxWidth(content) {
28398
29299
  return "default";
28399
29300
  }
28400
29301
  function resolveHeroTypographyScale(content) {
29302
+ const titleSize = readString(content, "titleSize");
29303
+ if (titleSize === "quiet" || titleSize === "editorial" || titleSize === "display" || titleSize === "poster") {
29304
+ return titleSize;
29305
+ }
28401
29306
  const raw = readHeroLayoutString(
28402
29307
  content,
28403
29308
  "typographyScale",
@@ -28639,6 +29544,16 @@ var uiTransforms = [
28639
29544
  heroGridClassFromVerticalAlignmentTransform,
28640
29545
  imageFragmentClassTransform,
28641
29546
  imageFragmentSizeTransform,
29547
+ {
29548
+ id: "ui.imageShapeClassName",
29549
+ kind: "string",
29550
+ summary: "Apply a constrained media shape class",
29551
+ run: (value, options) => {
29552
+ const baseClass = typeof options?.baseClass === "string" ? options.baseClass : "";
29553
+ const shape = typeof value === "string" ? value.trim() : "default";
29554
+ return joinClasses3([baseClass, imageShapeClassMap[shape] ?? ""]);
29555
+ }
29556
+ },
28642
29557
  conditionalClassTransform,
28643
29558
  twoColumnContainerClassTransform,
28644
29559
  twoColumnFlexBasisTransform,
@@ -30032,6 +30947,21 @@ var siteHeaderManifest = createBlockManifest({
30032
30947
  id: "block.site-header",
30033
30948
  title: "Site Header",
30034
30949
  category: "layout",
30950
+ additionalFields: [
30951
+ {
30952
+ id: "mode",
30953
+ type: "select",
30954
+ label: "Header display",
30955
+ required: false,
30956
+ multiple: false,
30957
+ defaultValue: "default",
30958
+ options: [
30959
+ { value: "default", label: "Show header" },
30960
+ { value: "hidden", label: "Hide header" }
30961
+ ],
30962
+ ui: { intent: "display" }
30963
+ }
30964
+ ],
30035
30965
  // Skip section styles - this block uses theme-based styling
30036
30966
  skipSectionStyles: true,
30037
30967
  // Block manages its own wrapper - enables sticky positioning
@@ -31444,6 +32374,9 @@ var mediaTextManifest = createBlockManifest({
31444
32374
  category: "layout",
31445
32375
  includeContainerStyles: true,
31446
32376
  titleSource: "title",
32377
+ previewCustomize: {
32378
+ quickFieldPriority: ["imagePosition", "ratio", "imageShape", "titleAlignment", "aspectRatio"]
32379
+ },
31447
32380
  additionalFields: [
31448
32381
  {
31449
32382
  id: "images",
@@ -31482,7 +32415,7 @@ var mediaTextManifest = createBlockManifest({
31482
32415
  {
31483
32416
  id: "titleAlignment",
31484
32417
  type: "select",
31485
- label: "Title alignment",
32418
+ label: "Content alignment",
31486
32419
  required: false,
31487
32420
  defaultValue: "left",
31488
32421
  multiple: false,
@@ -31540,7 +32473,18 @@ var mediaTextManifest = createBlockManifest({
31540
32473
  transition: "slide"
31541
32474
  },
31542
32475
  ui: { intent: "behavior" }
31543
- }),
32476
+ }).map((field) => ({
32477
+ ...field,
32478
+ ui: {
32479
+ ...field.ui ?? {},
32480
+ visibleWhen: field.id === "carouselAutoplayDelay" ? {
32481
+ allOf: [
32482
+ { field: "images", minItems: 2 },
32483
+ { field: "carouselAutoplay", equals: true }
32484
+ ]
32485
+ } : { field: "images", minItems: 2 }
32486
+ }
32487
+ })),
31544
32488
  createAspectRatioField({
31545
32489
  id: "aspectRatio",
31546
32490
  label: "Media aspect ratio",
@@ -31548,6 +32492,12 @@ var mediaTextManifest = createBlockManifest({
31548
32492
  defaultValue: "auto",
31549
32493
  visibleWhen: { field: "images", notEquals: null }
31550
32494
  }),
32495
+ createImageShapeField({
32496
+ id: "imageShape",
32497
+ label: "Media shape",
32498
+ defaultValue: "default",
32499
+ visibleWhen: { field: "images", notEquals: null }
32500
+ }),
31551
32501
  {
31552
32502
  id: "text",
31553
32503
  type: "richText",
@@ -31581,6 +32531,30 @@ var mediaTextManifest = createBlockManifest({
31581
32531
  ...options?.not ? { not: true } : {}
31582
32532
  }
31583
32533
  });
32534
+ const bodyClassNameFromAlignment = {
32535
+ $bind: {
32536
+ from: "content.titleAlignment",
32537
+ transforms: [
32538
+ {
32539
+ id: "ui.bodyClassFromAlignment",
32540
+ options: { base: "rb-prose rb-max-w-none" }
32541
+ }
32542
+ ],
32543
+ fallback: "rb-prose rb-max-w-none"
32544
+ }
32545
+ };
32546
+ const titleClassNameFromAlignment = {
32547
+ $bind: {
32548
+ from: "content.titleAlignment",
32549
+ transforms: [
32550
+ {
32551
+ id: "ui.headingClassFromAlignment",
32552
+ options: { base: "" }
32553
+ }
32554
+ ],
32555
+ fallback: ""
32556
+ }
32557
+ };
31584
32558
  const defaultTextColumn = el("div", {}, [
31585
32559
  styledCard(
31586
32560
  [
@@ -31605,8 +32579,55 @@ var mediaTextManifest = createBlockManifest({
31605
32579
  bind("content.text")
31606
32580
  )
31607
32581
  ]);
32582
+ const bioTextColumn = el(
32583
+ "div",
32584
+ { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" },
32585
+ [
32586
+ text(
32587
+ {
32588
+ as: "h2",
32589
+ className: titleClassNameFromAlignment
32590
+ },
32591
+ when("content.title"),
32592
+ bind("content.title")
32593
+ ),
32594
+ styledCard(
32595
+ [
32596
+ richText(
32597
+ {
32598
+ className: bodyClassNameFromAlignment
32599
+ },
32600
+ bind("content.text")
32601
+ )
32602
+ ],
32603
+ {
32604
+ stylesFrom: "content._textCardStyles",
32605
+ backgroundFrom: "content._textCardStyles.background"
32606
+ },
32607
+ when("content.wrapTextInCard")
32608
+ ),
32609
+ richText(
32610
+ {
32611
+ className: bodyClassNameFromAlignment
32612
+ },
32613
+ when("content.wrapTextInCard", { not: true }),
32614
+ bind("content.text")
32615
+ )
32616
+ ]
32617
+ );
31608
32618
  const defaultImageCommonProps = {
31609
- className: "rb-w-full rb-h-auto rb-object-cover",
32619
+ className: {
32620
+ $bind: {
32621
+ from: "content.imageShape",
32622
+ transforms: [
32623
+ {
32624
+ id: "ui.imageShapeClassName",
32625
+ options: { baseClass: "rb-w-full rb-h-auto rb-object-cover" }
32626
+ }
32627
+ ],
32628
+ fallback: "rb-w-full rb-h-auto rb-object-cover"
32629
+ }
32630
+ },
31610
32631
  style: {
31611
32632
  aspectRatio: { $bind: { from: "content.aspectRatio" } }
31612
32633
  }
@@ -31647,6 +32668,27 @@ var mediaTextManifest = createBlockManifest({
31647
32668
  ],
31648
32669
  whenImagesLength(0, { not: true })
31649
32670
  );
32671
+ const bioImagesLayout = el(
32672
+ "div",
32673
+ {},
32674
+ [
32675
+ responsiveTwoColumn({
32676
+ image: el("div", {}, [
32677
+ el("div", {}, [defaultSingleImage], whenImagesLength(1)),
32678
+ el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))
32679
+ ]),
32680
+ text: bioTextColumn,
32681
+ ratioFrom: "content.ratio",
32682
+ imagePositionFrom: "content.imagePosition",
32683
+ containerClassName: "rb-flex rb-flex-col rb-md-flex-row rb-md-items-center",
32684
+ gapFrom: "content.gap",
32685
+ gapFallback: "comfortable",
32686
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
32687
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
32688
+ })
32689
+ ],
32690
+ whenImagesLength(0, { not: true })
32691
+ );
31650
32692
  const defaultTextOnlyLayout = el(
31651
32693
  "div",
31652
32694
  {},
@@ -31676,7 +32718,45 @@ var mediaTextManifest = createBlockManifest({
31676
32718
  ],
31677
32719
  whenImagesLength(0)
31678
32720
  );
32721
+ const bioTextOnlyLayout = el(
32722
+ "div",
32723
+ { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" },
32724
+ [
32725
+ text(
32726
+ {
32727
+ as: "h2",
32728
+ className: titleClassNameFromAlignment
32729
+ },
32730
+ when("content.title"),
32731
+ bind("content.title")
32732
+ ),
32733
+ styledCard(
32734
+ [
32735
+ richText(
32736
+ {
32737
+ className: bodyClassNameFromAlignment
32738
+ },
32739
+ bind("content.text")
32740
+ )
32741
+ ],
32742
+ {
32743
+ stylesFrom: "content._textCardStyles",
32744
+ backgroundFrom: "content._textCardStyles.background"
32745
+ },
32746
+ when("content.wrapTextInCard")
32747
+ ),
32748
+ richText(
32749
+ {
32750
+ className: bodyClassNameFromAlignment
32751
+ },
32752
+ when("content.wrapTextInCard", { not: true }),
32753
+ bind("content.text")
32754
+ )
32755
+ ],
32756
+ whenImagesLength(0)
32757
+ );
31679
32758
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
32759
+ const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
31680
32760
  const defaultLayout2 = styledSection({
31681
32761
  children: styledContainer({
31682
32762
  rootType: "stack",
@@ -31685,18 +32765,7 @@ var mediaTextManifest = createBlockManifest({
31685
32765
  text(
31686
32766
  {
31687
32767
  as: "h2",
31688
- className: {
31689
- $bind: {
31690
- from: "content.titleAlignment",
31691
- transforms: [
31692
- {
31693
- id: "ui.headingClassFromAlignment",
31694
- options: { base: "" }
31695
- }
31696
- ],
31697
- fallback: ""
31698
- }
31699
- }
32768
+ className: titleClassNameFromAlignment
31700
32769
  },
31701
32770
  when("content.title"),
31702
32771
  bind("content.title")
@@ -31708,14 +32777,28 @@ var mediaTextManifest = createBlockManifest({
31708
32777
  baseClass: "",
31709
32778
  spacing: "medium"
31710
32779
  });
32780
+ const bioLayout = styledSection({
32781
+ children: styledContainer({
32782
+ rootType: "stack",
32783
+ rootProps: { gap: "lg" },
32784
+ children: [bioInner]
32785
+ }),
32786
+ baseClass: "",
32787
+ spacing: "medium"
32788
+ });
31711
32789
  return {
31712
32790
  layout: defaultLayout2,
31713
32791
  variants: {
31714
- default: defaultLayout2
32792
+ default: defaultLayout2,
32793
+ bio: bioLayout
31715
32794
  },
31716
32795
  defaultVariant: "default",
31717
32796
  variantOptions: {
31718
- default: { label: "Default" }
32797
+ default: { label: "Default" },
32798
+ bio: {
32799
+ label: "Bio",
32800
+ description: "Vertically centered title and copy beside media."
32801
+ }
31719
32802
  }
31720
32803
  };
31721
32804
  })(),
@@ -32421,10 +33504,8 @@ var occurrenceContextSchema = z46.object({
32421
33504
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
32422
33505
  import { z as z48 } from "zod";
32423
33506
 
32424
- // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
32425
- import { z as z47 } from "zod";
32426
-
32427
33507
  // ../blocks/src/system/constants/events.ts
33508
+ var EVENT_CONTENT_TYPE_SLUGS = ["event", "events"];
32428
33509
  var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
32429
33510
  var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
32430
33511
  var eventCalendarListLayoutOptions = [
@@ -32438,8 +33519,133 @@ function isEventCalendarDisplayMode(value) {
32438
33519
  function isEventCalendarListLayout(value) {
32439
33520
  return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
32440
33521
  }
33522
+ function isEventContentType(slug) {
33523
+ if (!slug) return false;
33524
+ return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
33525
+ }
33526
+
33527
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
33528
+ var DEFAULT_EVENT_CURRENCY = "USD";
33529
+ function resolveRuntimeEventPricing(event) {
33530
+ if (isPublicEventPricing(event.pricing)) {
33531
+ return event.pricing;
33532
+ }
33533
+ const legacy = event;
33534
+ const currency = readCurrency(legacy.currency);
33535
+ if (event.requiresRegistration === false) {
33536
+ return {
33537
+ kind: "drop_in",
33538
+ currency,
33539
+ display: { kind: "free", currency }
33540
+ };
33541
+ }
33542
+ if (legacy.pricingMode === "ticket_types") {
33543
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
33544
+ return {
33545
+ kind: "ticket_types",
33546
+ currency,
33547
+ ticketTypes,
33548
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
33549
+ };
33550
+ }
33551
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
33552
+ if (legacy.pricingType === "paid" && amount > 0) {
33553
+ return {
33554
+ kind: "single_paid",
33555
+ amount,
33556
+ currency,
33557
+ display: { kind: "exact", amount, currency }
33558
+ };
33559
+ }
33560
+ return {
33561
+ kind: "free_registration",
33562
+ currency,
33563
+ display: { kind: "free", currency }
33564
+ };
33565
+ }
33566
+ function readCurrency(value) {
33567
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
33568
+ }
33569
+ function isRecord5(value) {
33570
+ return typeof value === "object" && value !== null && !Array.isArray(value);
33571
+ }
33572
+ function isPublicEventPricing(value) {
33573
+ if (!isRecord5(value) || typeof value.kind !== "string") return false;
33574
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
33575
+ }
33576
+ function isPublicEventTicketType(value) {
33577
+ return isRecord5(value) && typeof value.id === "string";
33578
+ }
33579
+ function readTicketTypePriceDisplay(value, currency) {
33580
+ const display = readLegacyPriceDisplay(value, currency);
33581
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
33582
+ }
33583
+ function readLegacyPriceDisplay(value, currency) {
33584
+ if (!isRecord5(value) || typeof value.kind !== "string") {
33585
+ return { kind: "unavailable", currency };
33586
+ }
33587
+ const displayCurrency = readCurrency(value.currency);
33588
+ switch (value.kind) {
33589
+ case "free":
33590
+ return { kind: "free", currency: displayCurrency };
33591
+ case "exact":
33592
+ return readAmount(value.amount) !== null ? {
33593
+ kind: "exact",
33594
+ amount: readAmount(value.amount) ?? 0,
33595
+ currency: displayCurrency
33596
+ } : { kind: "unavailable", currency };
33597
+ case "from":
33598
+ return readAmount(value.amount) !== null ? {
33599
+ kind: "from",
33600
+ amount: readAmount(value.amount) ?? 0,
33601
+ currency: displayCurrency
33602
+ } : { kind: "unavailable", currency };
33603
+ case "mixed":
33604
+ return readAmount(value.paidFromAmount) !== null ? {
33605
+ kind: "mixed",
33606
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
33607
+ currency: displayCurrency
33608
+ } : { kind: "unavailable", currency };
33609
+ case "unavailable":
33610
+ return { kind: "unavailable", currency: displayCurrency };
33611
+ case "course":
33612
+ return isRecord5(value.display) ? {
33613
+ kind: "course",
33614
+ display: readCoursePriceDisplay(value.display, displayCurrency)
33615
+ } : {
33616
+ kind: "course",
33617
+ display: { kind: "unavailable", currency: displayCurrency }
33618
+ };
33619
+ default:
33620
+ return { kind: "unavailable", currency };
33621
+ }
33622
+ }
33623
+ function readCoursePriceDisplay(value, currency) {
33624
+ switch (value.kind) {
33625
+ case "free":
33626
+ return { kind: "free", currency: readCurrency(value.currency) };
33627
+ case "exact":
33628
+ return readAmount(value.amount) !== null ? {
33629
+ kind: "exact",
33630
+ amount: readAmount(value.amount) ?? 0,
33631
+ currency: readCurrency(value.currency)
33632
+ } : { kind: "unavailable", currency };
33633
+ case "from":
33634
+ return readAmount(value.amount) !== null ? {
33635
+ kind: "from",
33636
+ amount: readAmount(value.amount) ?? 0,
33637
+ currency: readCurrency(value.currency)
33638
+ } : { kind: "unavailable", currency };
33639
+ default:
33640
+ return { kind: "unavailable", currency };
33641
+ }
33642
+ }
33643
+ function readAmount(value) {
33644
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
33645
+ }
32441
33646
 
32442
33647
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
33648
+ import { z as z47 } from "zod";
32443
33649
  var previewStageSchema = z47.enum(["preview", "published"]);
32444
33650
  var registrationButtonVariantSchema = z47.enum(["primary", "secondary", "outline"]);
32445
33651
  var eventButtonVariantSchema = z47.enum(["primary", "secondary", "outline", "link"]);
@@ -32450,12 +33656,73 @@ var weekStartSchema = z47.enum(["sunday", "monday"]);
32450
33656
  var filterAutoShowSchema = z47.enum(["auto", "always", "never"]);
32451
33657
  var calendarTabViewsSchema = z47.enum(["both", "month", "week"]);
32452
33658
 
33659
+ // ../blocks/src/system/runtime/nodes/event-registration/wizardSteps.ts
33660
+ function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep) {
33661
+ const baseSteps = hasPreSelectedContext ? ["select-tickets", "enter-details"] : ["select-event", "select-tickets", "enter-details"];
33662
+ if (!needsPaymentStep) {
33663
+ return baseSteps;
33664
+ }
33665
+ return [...baseSteps, "select-payment"];
33666
+ }
33667
+
33668
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationDerivations.ts
33669
+ function eventMatchesOccurrenceId(event, occurrenceId) {
33670
+ return event.registrationOccurrenceId === occurrenceId || event.publicEventId === occurrenceId;
33671
+ }
33672
+ function findPreSelectedEvent(input) {
33673
+ const occurrenceContext = input.occurrenceContext;
33674
+ if (!occurrenceContext) {
33675
+ return null;
33676
+ }
33677
+ const contextDate = getBookingLocalDateKey(toScheduledBookingDateTime({
33678
+ startsAt: occurrenceContext.startsAt,
33679
+ timeZone: occurrenceContext.timeZone
33680
+ }));
33681
+ return input.scopedEvents.find(
33682
+ (event) => eventMatchesOccurrenceId(event, occurrenceContext.id) || getBookingLocalDateKey(toScheduledBookingDateTime({
33683
+ startsAt: event.startsAt,
33684
+ timeZone: event.timeZone
33685
+ })) === contextDate
33686
+ ) ?? null;
33687
+ }
33688
+ function resolveEventRequiresPayment(input) {
33689
+ if (input.eligibility) {
33690
+ return input.eligibility.requiresPayment;
33691
+ }
33692
+ if (input.selectedTicketType) {
33693
+ return input.selectedTicketType.priceAmount > 0;
33694
+ }
33695
+ if (!input.event) {
33696
+ return false;
33697
+ }
33698
+ return publicEventPricingType(resolveRuntimeEventPricing(input.event)) !== "free";
33699
+ }
33700
+
33701
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.ts
33702
+ function toRegistrationEvent(event) {
33703
+ return {
33704
+ ...event,
33705
+ pricing: resolveRuntimeEventPricing(event),
33706
+ publicEventId: event.id,
33707
+ registrationOccurrenceId: event.occurrenceId
33708
+ };
33709
+ }
33710
+ function toRegistrationEvents(events) {
33711
+ return events.map(toRegistrationEvent);
33712
+ }
33713
+
32453
33714
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
33715
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
33716
+ var EVENT_REGISTRATION_SHELL_STEP_LABELS = ["Event", "Date", "Tickets", "Details", "Payment"];
32454
33717
  var contentEntrySchema = z48.object({
32455
33718
  id: z48.string(),
32456
33719
  slug: z48.string(),
32457
33720
  contentTypeSlug: z48.string()
32458
33721
  });
33722
+ var eventRegistrationPublicEventSchema = z48.preprocess(
33723
+ normalizeEventRegistrationEventInput,
33724
+ publicEventSchema
33725
+ );
32459
33726
  var eventRegistrationSourceSchema = z48.object({
32460
33727
  siteId: z48.string().optional(),
32461
33728
  apiBaseUrl: z48.string().optional(),
@@ -32463,7 +33730,7 @@ var eventRegistrationSourceSchema = z48.object({
32463
33730
  previewToken: z48.string().nullable().optional(),
32464
33731
  occurrenceContext: occurrenceContextSchema.optional(),
32465
33732
  contentEntry: contentEntrySchema.nullable().optional(),
32466
- events: z48.array(publicEventSchema).nullable().optional(),
33733
+ events: z48.array(eventRegistrationPublicEventSchema).nullable().optional(),
32467
33734
  className: z48.string().nullable().optional(),
32468
33735
  buttonText: z48.string().nullable().optional(),
32469
33736
  maxTickets: z48.string().nullable().optional(),
@@ -32478,14 +33745,17 @@ var eventRegistrationSourceSchema = z48.object({
32478
33745
  });
32479
33746
  var eventRegistrationDisplaySchema = z48.object({
32480
33747
  kind: z48.literal("event-registration"),
32481
- state: z48.literal("shell"),
33748
+ state: z48.literal("generic-shell"),
32482
33749
  className: z48.string().nullable(),
33750
+ titleText: z48.string(),
33751
+ bodyText: z48.string(),
33752
+ stepLabels: z48.array(z48.enum(EVENT_REGISTRATION_SHELL_STEP_LABELS)).min(1),
32483
33753
  summaryButtonText: z48.string()
32484
33754
  });
32485
33755
  var eventRegistrationHydrationSchema = z48.object({
32486
33756
  occurrenceContext: occurrenceContextSchema.optional(),
32487
33757
  contentEntry: contentEntrySchema.nullable().optional(),
32488
- events: z48.array(publicEventSchema).nullable().optional(),
33758
+ events: z48.array(eventRegistrationPublicEventSchema).nullable().optional(),
32489
33759
  maxTickets: z48.string().optional(),
32490
33760
  showVenue: z48.boolean().optional(),
32491
33761
  showCapacity: z48.boolean().optional(),
@@ -32514,13 +33784,81 @@ var eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys(
32514
33784
  "stage"
32515
33785
  );
32516
33786
  function buildEventRegistrationDisplay(source) {
33787
+ const stepLabels = buildEventRegistrationShellStepLabels(source);
32517
33788
  return {
32518
33789
  kind: "event-registration",
32519
- state: "shell",
33790
+ state: "generic-shell",
32520
33791
  className: source.className ?? null,
33792
+ titleText: "Event registration",
33793
+ bodyText: buildEventRegistrationShellBodyText(stepLabels),
33794
+ stepLabels,
32521
33795
  summaryButtonText: source.buttonText?.trim() || "Register"
32522
33796
  };
32523
33797
  }
33798
+ function buildEventRegistrationShellStepLabels(source) {
33799
+ const scopedEvents = scopeEventRegistrationEvents(source);
33800
+ if (scopedEvents.length === 0) {
33801
+ return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
33802
+ }
33803
+ const preSelectedEvent = findPreSelectedEvent({
33804
+ scopedEvents,
33805
+ occurrenceContext: source.occurrenceContext
33806
+ });
33807
+ const hasPreSelectedContext = Boolean(source.occurrenceContext || preSelectedEvent);
33808
+ const needsPaymentStep = hasPreSelectedContext && preSelectedEvent ? resolveEventRequiresPayment({
33809
+ eligibility: null,
33810
+ selectedTicketType: null,
33811
+ event: preSelectedEvent
33812
+ }) : false;
33813
+ return getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
33814
+ }
33815
+ function scopeEventRegistrationEvents(source) {
33816
+ const events = toRegistrationEvents(source.events ?? []);
33817
+ if (source.occurrenceContext?.seriesId) {
33818
+ return events.filter((event) => event.seriesId === source.occurrenceContext?.seriesId);
33819
+ }
33820
+ const entrySlug = source.contentEntry?.slug;
33821
+ const entryContentType = source.contentEntry?.contentTypeSlug;
33822
+ if (entrySlug && entryContentType && isEventContentType(entryContentType)) {
33823
+ return events.filter((event) => event.slug === entrySlug);
33824
+ }
33825
+ return events;
33826
+ }
33827
+ function shellLabelForRegistrationStep(step, events) {
33828
+ switch (step) {
33829
+ case "select-event":
33830
+ return isDateSelection(events) ? "Date" : "Event";
33831
+ case "select-tickets":
33832
+ return "Tickets";
33833
+ case "enter-details":
33834
+ return "Details";
33835
+ case "select-payment":
33836
+ return "Payment";
33837
+ case "error":
33838
+ case "success":
33839
+ case "submitting":
33840
+ case "redirecting":
33841
+ case "verifying-payment":
33842
+ case "verifying-timeout":
33843
+ case "payment-failed":
33844
+ return "Details";
33845
+ }
33846
+ }
33847
+ function isDateSelection(events) {
33848
+ const firstSeriesId = events[0]?.seriesId;
33849
+ return Boolean(
33850
+ events.length > 1 && firstSeriesId && events.every((event) => event.seriesId === firstSeriesId)
33851
+ );
33852
+ }
33853
+ function buildEventRegistrationShellBodyText(stepLabels) {
33854
+ if (stepLabels.includes("Payment")) {
33855
+ return "Preparing tickets, details, and payment options.";
33856
+ }
33857
+ if (stepLabels[0] === "Tickets") {
33858
+ return "Preparing tickets and booking details.";
33859
+ }
33860
+ return "Preparing dates, tickets, and booking details.";
33861
+ }
32524
33862
  var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
32525
33863
  kind: "client-owned",
32526
33864
  contracts: {
@@ -32544,6 +33882,18 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
32544
33882
  }
32545
33883
  })
32546
33884
  });
33885
+ function normalizeEventRegistrationEventInput(value) {
33886
+ if (!isRecord6(value)) {
33887
+ return value;
33888
+ }
33889
+ return {
33890
+ ...value,
33891
+ pricing: resolveRuntimeEventPricing(value)
33892
+ };
33893
+ }
33894
+ function isRecord6(value) {
33895
+ return typeof value === "object" && value !== null && !Array.isArray(value);
33896
+ }
32547
33897
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
32548
33898
  runtime: eventRegistrationBlockRuntime,
32549
33899
  mode: "event-registration",
@@ -34393,7 +35743,9 @@ function formatPublicEventPriceDisplay(display) {
34393
35743
  }
34394
35744
  }
34395
35745
  function formatEventPrice(event) {
34396
- return formatPublicEventPriceDisplay(publicEventPricingDisplay(event.pricing));
35746
+ return formatPublicEventPriceDisplay(
35747
+ publicEventPricingDisplay(resolveRuntimeEventPricing(event))
35748
+ );
34397
35749
  }
34398
35750
  function resolveEventCta(event, buttonText) {
34399
35751
  const { isFull: isSoldOut } = getEventAvailability(event);
@@ -37456,7 +38808,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
37456
38808
  return keys.length >= 2 ? keys : [];
37457
38809
  }
37458
38810
  function normalizeOfferingsPreviewContentForWrite(value) {
37459
- if (!isRecord5(value)) return null;
38811
+ if (!isRecord7(value)) return null;
37460
38812
  const groupOrderValue = value.groupOrder;
37461
38813
  if (Array.isArray(groupOrderValue)) {
37462
38814
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -37469,7 +38821,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
37469
38821
  return { ...value, groupOrder: [] };
37470
38822
  }
37471
38823
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
37472
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord5) : []
38824
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord7) : []
37473
38825
  );
37474
38826
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
37475
38827
  }
@@ -37523,7 +38875,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
37523
38875
  }
37524
38876
  return keys;
37525
38877
  }
37526
- function isRecord5(value) {
38878
+ function isRecord7(value) {
37527
38879
  return typeof value === "object" && value !== null && !Array.isArray(value);
37528
38880
  }
37529
38881
  function mergeOrderedKeysWithDefaults(orderedKeys, defaultKeys) {
@@ -37985,7 +39337,7 @@ function isOfferingsPreviewItemLimit(value) {
37985
39337
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
37986
39338
  }
37987
39339
  function normalizeOfferingsPreviewGroupOverride(value) {
37988
- if (!isRecord6(value)) return [];
39340
+ if (!isRecord8(value)) return [];
37989
39341
  const override = {};
37990
39342
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
37991
39343
  override.sourceKey = value.sourceKey;
@@ -38017,12 +39369,12 @@ function isButtonVariant(value) {
38017
39369
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
38018
39370
  }
38019
39371
  function normalizeCardStylesContent(value) {
38020
- return isRecord6(value) || value === null ? value : void 0;
39372
+ return isRecord8(value) || value === null ? value : void 0;
38021
39373
  }
38022
39374
  function normalizeSectionStylesContent(value) {
38023
- return isRecord6(value) || value === null ? value : void 0;
39375
+ return isRecord8(value) || value === null ? value : void 0;
38024
39376
  }
38025
- function isRecord6(value) {
39377
+ function isRecord8(value) {
38026
39378
  return typeof value === "object" && value !== null && !Array.isArray(value);
38027
39379
  }
38028
39380
 
@@ -42101,11 +43453,13 @@ var heroImageSurfaceMotions = [
42101
43453
  ];
42102
43454
  var standardEyebrowTreatments = [
42103
43455
  "plain",
43456
+ "accent",
42104
43457
  "pill",
42105
43458
  "accent-pill"
42106
43459
  ];
42107
43460
  var animatedEyebrowTreatments = [
42108
43461
  "plain",
43462
+ "accent",
42109
43463
  "pill",
42110
43464
  "accent-pill",
42111
43465
  "pill-bounce",
@@ -42406,6 +43760,17 @@ var systemBlockDefinitionsRaw = [
42406
43760
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
42407
43761
  ]
42408
43762
  })),
43763
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
43764
+ flow: conversionFlow,
43765
+ layoutProfiles: [
43766
+ layoutProfile({
43767
+ variantKey: "default",
43768
+ family: "split",
43769
+ weight: "featured",
43770
+ bias: "soft"
43771
+ })
43772
+ ]
43773
+ })),
42409
43774
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
42410
43775
  sectionSurfaces: "supported",
42411
43776
  contentFrames: ["plain", "panel"],
@@ -42497,6 +43862,12 @@ var systemBlockDefinitionsRaw = [
42497
43862
  family: "media-text",
42498
43863
  weight: "featured",
42499
43864
  bias: "soft"
43865
+ }),
43866
+ layoutProfile({
43867
+ variantKey: "bio",
43868
+ family: "media-text",
43869
+ weight: "featured",
43870
+ bias: "soft"
42500
43871
  })
42501
43872
  ]
42502
43873
  })),
@@ -43304,7 +44675,7 @@ import React4 from "react";
43304
44675
  // ../blocks/src/system/data/linkedContentEntries.ts
43305
44676
  var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
43306
44677
  function coerceLinkedContentEntriesPayload(payload) {
43307
- if (!isRecord7(payload)) return payload;
44678
+ if (!isRecord9(payload)) return payload;
43308
44679
  const response = payload;
43309
44680
  if (!Array.isArray(response.entries)) return payload;
43310
44681
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -43312,16 +44683,16 @@ function coerceLinkedContentEntriesPayload(payload) {
43312
44683
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
43313
44684
  }
43314
44685
  function getLinkedContentEntryMeta(value) {
43315
- if (!isRecord7(value)) return null;
44686
+ if (!isRecord9(value)) return null;
43316
44687
  const candidate = value[LINKED_CONTENT_ENTRY_META_KEY];
43317
44688
  return isLinkedContentEntryMeta(candidate) ? candidate : null;
43318
44689
  }
43319
44690
  function buildLinkedContentEditTarget(input) {
43320
44691
  const { entry, sourceBlockId, sourceBlockKind, itemIndex } = input;
43321
- if (!isRecord7(entry)) return null;
44692
+ if (!isRecord9(entry)) return null;
43322
44693
  const meta = getLinkedContentEntryMeta(entry);
43323
44694
  if (!meta || meta.support.kind !== "supported") return null;
43324
- const content = isRecord7(entry.content) ? entry.content : {};
44695
+ const content = isRecord9(entry.content) ? entry.content : {};
43325
44696
  return {
43326
44697
  kind: "linked-content-entry",
43327
44698
  entryId: meta.entryId,
@@ -43371,12 +44742,12 @@ function resolveLinkedEntryInlineFieldEligibility(input) {
43371
44742
  };
43372
44743
  }
43373
44744
  function enrichLinkedContentEntry(entry, contentType) {
43374
- if (!isRecord7(entry)) return entry;
44745
+ if (!isRecord9(entry)) return entry;
43375
44746
  const entryId = typeof entry.id === "string" ? entry.id : null;
43376
44747
  if (!entryId) return entry;
43377
44748
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
43378
44749
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
43379
- const content = isRecord7(entry.content) ? entry.content : {};
44750
+ const content = isRecord9(entry.content) ? entry.content : {};
43380
44751
  const meta = {
43381
44752
  kind: "linked-content-entry",
43382
44753
  entryId,
@@ -43472,7 +44843,7 @@ function capitalize(value) {
43472
44843
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
43473
44844
  }
43474
44845
  function parsePublicContentTypeMeta(value) {
43475
- if (!isRecord7(value)) return null;
44846
+ if (!isRecord9(value)) return null;
43476
44847
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
43477
44848
  return {
43478
44849
  key: value.key,
@@ -43482,7 +44853,7 @@ function parsePublicContentTypeMeta(value) {
43482
44853
  };
43483
44854
  }
43484
44855
  function parsePublicContentTypeLinkedEntryEditing(value) {
43485
- if (!isRecord7(value) || typeof value.kind !== "string") return null;
44856
+ if (!isRecord9(value) || typeof value.kind !== "string") return null;
43486
44857
  switch (value.kind) {
43487
44858
  case "generic":
43488
44859
  return { kind: "generic" };
@@ -43496,7 +44867,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
43496
44867
  }
43497
44868
  }
43498
44869
  function parsePublicContentTypeFieldMeta(value) {
43499
- if (!isRecord7(value)) return [];
44870
+ if (!isRecord9(value)) return [];
43500
44871
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
43501
44872
  return [{
43502
44873
  id: value.id,
@@ -43511,14 +44882,14 @@ function parseStringArray(value) {
43511
44882
  return value.filter((item) => typeof item === "string");
43512
44883
  }
43513
44884
  function isLinkedContentEntryMeta(value) {
43514
- if (!isRecord7(value)) return false;
44885
+ if (!isRecord9(value)) return false;
43515
44886
  if (value.kind !== "linked-content-entry") return false;
43516
44887
  if (typeof value.entryId !== "string") return false;
43517
44888
  if (typeof value.contentTypeKey !== "string") return false;
43518
44889
  if (typeof value.contentTypeLabel !== "string") return false;
43519
44890
  if (typeof value.title !== "string") return false;
43520
44891
  if (!(value.optimisticHash === null || typeof value.optimisticHash === "string")) return false;
43521
- if (!isRecord7(value.contentType)) return false;
44892
+ if (!isRecord9(value.contentType)) return false;
43522
44893
  if (!isLinkedEntryFieldSourceArray(value.fieldSources)) return false;
43523
44894
  return isLinkedContentEditSupport(value.support);
43524
44895
  }
@@ -43526,7 +44897,7 @@ function isLinkedEntryFieldSourceArray(value) {
43526
44897
  return Array.isArray(value) && value.every(isLinkedEntryFieldSource);
43527
44898
  }
43528
44899
  function isLinkedEntryFieldSource(value) {
43529
- if (!isRecord7(value)) return false;
44900
+ if (!isRecord9(value)) return false;
43530
44901
  if (typeof value.displayPath !== "string") return false;
43531
44902
  switch (value.kind) {
43532
44903
  case "content-field":
@@ -43552,7 +44923,7 @@ function isLinkedEntryInlineFieldReadOnlyReason(value) {
43552
44923
  }
43553
44924
  }
43554
44925
  function isLinkedContentEditSupport(value) {
43555
- if (!isRecord7(value) || typeof value.kind !== "string") return false;
44926
+ if (!isRecord9(value) || typeof value.kind !== "string") return false;
43556
44927
  switch (value.kind) {
43557
44928
  case "supported":
43558
44929
  return true;
@@ -43564,7 +44935,7 @@ function isLinkedContentEditSupport(value) {
43564
44935
  return false;
43565
44936
  }
43566
44937
  }
43567
- function isRecord7(value) {
44938
+ function isRecord9(value) {
43568
44939
  return typeof value === "object" && value !== null && !Array.isArray(value);
43569
44940
  }
43570
44941
 
@@ -45091,12 +46462,12 @@ function toTrimmedString(value) {
45091
46462
  return trimmed ? trimmed : void 0;
45092
46463
  }
45093
46464
  function normalizeBookingFormConfig(form2) {
45094
- if (!isRecord8(form2)) return null;
46465
+ if (!isRecord10(form2)) return null;
45095
46466
  const id = readNonEmptyString(form2.id);
45096
46467
  const name = readNonEmptyString(form2.name);
45097
46468
  if (!id || !name) return null;
45098
- const schemaSource = isRecord8(form2.schema) ? form2.schema : isRecord8(form2.schemaJson) ? form2.schemaJson : null;
45099
- const settingsSource = isRecord8(form2.settings) ? form2.settings : isRecord8(form2.settingsJson) ? form2.settingsJson : null;
46469
+ const schemaSource = isRecord10(form2.schema) ? form2.schema : isRecord10(form2.schemaJson) ? form2.schemaJson : null;
46470
+ const settingsSource = isRecord10(form2.settings) ? form2.settings : isRecord10(form2.settingsJson) ? form2.settingsJson : null;
45100
46471
  return {
45101
46472
  id,
45102
46473
  name,
@@ -45120,10 +46491,10 @@ function normalizeBookingServices(services) {
45120
46491
  if (Array.isArray(services)) {
45121
46492
  return services.filter(isBookingFormService).map(normalizeService);
45122
46493
  }
45123
- if (isRecord8(services) && "services" in services) {
46494
+ if (isRecord10(services) && "services" in services) {
45124
46495
  return Array.isArray(services.services) ? services.services.filter(isBookingFormService).map(normalizeService) : [];
45125
46496
  }
45126
- return isRecord8(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
46497
+ return isRecord10(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
45127
46498
  }
45128
46499
  function normalizeBookingSchema(value) {
45129
46500
  if (!value) return void 0;
@@ -45135,7 +46506,7 @@ function normalizeBookingSchema(value) {
45135
46506
  };
45136
46507
  }
45137
46508
  function readBookingFormField(value) {
45138
- if (!isRecord8(value)) return null;
46509
+ if (!isRecord10(value)) return null;
45139
46510
  const id = readNonEmptyString(value.id);
45140
46511
  const label = readNonEmptyString(value.label);
45141
46512
  const type = readBookingFieldType(value.type);
@@ -45181,7 +46552,7 @@ function readBookingFieldOptions(value) {
45181
46552
  return options.length > 0 ? options : void 0;
45182
46553
  }
45183
46554
  function readBookingFieldOption(value) {
45184
- if (!isRecord8(value)) return null;
46555
+ if (!isRecord10(value)) return null;
45185
46556
  const optionValue = readNonEmptyString(value.value);
45186
46557
  const label = readNonEmptyString(value.label);
45187
46558
  return optionValue && label ? { value: optionValue, label } : null;
@@ -45198,7 +46569,7 @@ function normalizeBookingSettings(value) {
45198
46569
  };
45199
46570
  }
45200
46571
  function isBookingFormService(value) {
45201
- return isRecord8(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
46572
+ return isRecord10(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
45202
46573
  }
45203
46574
  function readNonEmptyString(value) {
45204
46575
  if (typeof value !== "string") return null;
@@ -45216,7 +46587,7 @@ function readStringArray(value) {
45216
46587
  const strings = value.filter((item) => typeof item === "string");
45217
46588
  return strings.length > 0 ? strings : void 0;
45218
46589
  }
45219
- function isRecord8(value) {
46590
+ function isRecord10(value) {
45220
46591
  return typeof value === "object" && value !== null;
45221
46592
  }
45222
46593
 
@@ -45664,8 +47035,9 @@ function EventDetailsView({
45664
47035
  priceCents: selected.course.priceCents,
45665
47036
  currency: selected.course.currency
45666
47037
  }) : null;
45667
- const eventPricingType = publicEventPricingType(selected.pricing);
45668
- const eventPricingCurrency = publicEventPricingCurrency(selected.pricing) ?? "USD";
47038
+ const eventPricing = resolveRuntimeEventPricing(selected);
47039
+ const eventPricingType = publicEventPricingType(eventPricing);
47040
+ const eventPricingCurrency = publicEventPricingCurrency(eventPricing) ?? "USD";
45669
47041
  const isPaid = eventPricingType === "paid";
45670
47042
  const shouldShowCoursePricing = showCost && !isDropIn && coursePricing !== null;
45671
47043
  const shouldShowEventCost = showCost && isPaid && !isDropIn && coursePricing === null;
@@ -47831,8 +49203,14 @@ var EventListingSSR = (props2) => {
47831
49203
  ] });
47832
49204
  };
47833
49205
 
49206
+ // ../blocks/src/system/runtime/nodes/event-registration/constants.ts
49207
+ var EVENT_REGISTRATION_ANCHOR_ID = "event-registration";
49208
+
47834
49209
  // ../blocks/src/system/runtime/nodes/event-registration.server.tsx
47835
49210
  import { jsx as jsx48, jsxs as jsxs34 } from "react/jsx-runtime";
49211
+ function cx(...classes) {
49212
+ return classes.filter((className) => Boolean(className)).join(" ");
49213
+ }
47836
49214
  function EventRegistrationSSR({
47837
49215
  blockId,
47838
49216
  siteId,
@@ -47875,6 +49253,7 @@ function EventRegistrationSSR({
47875
49253
  stage,
47876
49254
  supportEmail
47877
49255
  });
49256
+ const display = islandProps.render.display;
47878
49257
  return /* @__PURE__ */ jsxs34(
47879
49258
  "div",
47880
49259
  {
@@ -47886,12 +49265,61 @@ function EventRegistrationSSR({
47886
49265
  ...getIslandRootProps("event-registration", blockId),
47887
49266
  children: [
47888
49267
  /* @__PURE__ */ jsx48(IslandPropsScript, { value: islandProps }),
47889
- /* @__PURE__ */ jsx48("div", { className: "event-registration__summary", children: /* @__PURE__ */ jsx48("strong", { children: "Loading booking options..." }) }),
49268
+ /* @__PURE__ */ jsx48(EventRegistrationShell, { display }),
47890
49269
  children
47891
49270
  ]
47892
49271
  }
47893
49272
  );
47894
49273
  }
49274
+ function EventRegistrationShell({
49275
+ display
49276
+ }) {
49277
+ return /* @__PURE__ */ jsx48(
49278
+ "div",
49279
+ {
49280
+ id: EVENT_REGISTRATION_ANCHOR_ID,
49281
+ className: "er-container er-registration-shell",
49282
+ "aria-busy": "true",
49283
+ role: "status",
49284
+ children: /* @__PURE__ */ jsxs34("div", { className: "er-payment-layout er-payment-layout--no-sidebar", children: [
49285
+ /* @__PURE__ */ jsxs34("div", { className: "er-payment-layout-main", children: [
49286
+ /* @__PURE__ */ jsx48("div", { className: "er-steps-nav er-registration-shell__steps", "aria-hidden": "true", children: /* @__PURE__ */ jsx48("ol", { className: "er-steps", children: display.stepLabels.map((label, index) => {
49287
+ const isActive = index === 0;
49288
+ return /* @__PURE__ */ jsxs34("li", { className: "er-step", children: [
49289
+ /* @__PURE__ */ jsx48("span", { className: cx("er-step-circle", isActive && "er-step-circle--active"), children: index + 1 }),
49290
+ /* @__PURE__ */ jsx48("span", { className: cx("er-step-label", isActive && "er-step-label--active"), children: label }),
49291
+ index < display.stepLabels.length - 1 ? /* @__PURE__ */ jsx48("span", { className: "er-step-connector" }) : null
49292
+ ] }, label);
49293
+ }) }) }),
49294
+ /* @__PURE__ */ jsxs34("div", { className: "er-stack", children: [
49295
+ /* @__PURE__ */ jsxs34("div", { children: [
49296
+ /* @__PURE__ */ jsx48("p", { className: "er-registration-shell__eyebrow", children: "Registration" }),
49297
+ /* @__PURE__ */ jsx48("h3", { className: "er-title er-registration-shell__title", children: display.titleText }),
49298
+ /* @__PURE__ */ jsx48("p", { className: "er-text er-text--muted er-registration-shell__copy", children: display.bodyText })
49299
+ ] }),
49300
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-grid er-registration-shell__cards", "aria-hidden": "true", children: [
49301
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-card er-registration-shell__card", children: [
49302
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--lg" }),
49303
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--sm" })
49304
+ ] }),
49305
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-card er-registration-shell__card", children: [
49306
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--md" }),
49307
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--xs" })
49308
+ ] })
49309
+ ] })
49310
+ ] })
49311
+ ] }),
49312
+ /* @__PURE__ */ jsx48("div", { className: "er-payment-layout-footer", children: /* @__PURE__ */ jsxs34("div", { className: "er-summary-bar er-registration-shell__summary", "aria-hidden": "true", children: [
49313
+ /* @__PURE__ */ jsxs34("div", { className: "er-summary-bar-info", children: [
49314
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--md" }),
49315
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--xs" })
49316
+ ] }),
49317
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__button-placeholder", children: display.summaryButtonText })
49318
+ ] }) })
49319
+ ] })
49320
+ }
49321
+ );
49322
+ }
47895
49323
  var event_registration_server_default = EventRegistrationSSR;
47896
49324
 
47897
49325
  // ../blocks/src/system/runtime/shared/components/FeedbackMessage.tsx
@@ -48477,14 +49905,14 @@ function isDecoratedHeadingBlockKind(blockKind) {
48477
49905
  return blockKind === "block.intro" || blockKind === "block.feature-cards" || blockKind === "block.testimonials" || blockKind === "block.faq";
48478
49906
  }
48479
49907
  function readVariant(blockContent) {
48480
- if (!isRecord9(blockContent)) return void 0;
49908
+ if (!isRecord11(blockContent)) return void 0;
48481
49909
  const variant = blockContent.variant;
48482
49910
  return typeof variant === "string" ? variant : void 0;
48483
49911
  }
48484
49912
  function isFaqDecoratedVariant(variant) {
48485
49913
  return variant === "default" || variant === "question-columns";
48486
49914
  }
48487
- function isRecord9(value) {
49915
+ function isRecord11(value) {
48488
49916
  return typeof value === "object" && value !== null && !Array.isArray(value);
48489
49917
  }
48490
49918
  function buildHeadingDecorationWrapperClassName(className) {
@@ -49949,20 +51377,20 @@ function generateInputCss({
49949
51377
  baseInputRules.push("background-color: transparent");
49950
51378
  } else {
49951
51379
  baseInputRules.push(
49952
- `background-color: rgb(var(--tb-${inputSystem.base.background.colorToken}))`
51380
+ `background-color: ${rgbColorValue(inputSystem.base.background.colorToken)}`
49953
51381
  );
49954
51382
  }
49955
- baseInputRules.push(`color: rgb(var(--tb-${inputSystem.base.textColorToken}))`);
51383
+ baseInputRules.push(`color: ${rgbColorValue(inputSystem.base.textColorToken)}`);
49956
51384
  const borderPx = parseBorderWidth(inputSystem.base.border.widthClass);
49957
51385
  const borderStyle = inputSystem.base.border.style ?? "all";
49958
51386
  if (borderStyle === "underline") {
49959
51387
  baseInputRules.push("border: none");
49960
51388
  baseInputRules.push(
49961
- `border-bottom: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`
51389
+ `border-bottom: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`
49962
51390
  );
49963
51391
  } else {
49964
51392
  baseInputRules.push(
49965
- `border: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`
51393
+ `border: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`
49966
51394
  );
49967
51395
  }
49968
51396
  if (borderStyle === "underline") {
@@ -49989,7 +51417,7 @@ function generateInputCss({
49989
51417
  baseInputRules.push("transition: border-color 0.2s ease, box-shadow 0.2s ease");
49990
51418
  const labelSelector = `${rootSelector} .form-label`;
49991
51419
  const labelRules = [];
49992
- labelRules.push(`color: rgb(var(--tb-${inputSystem.label.textColorToken}))`);
51420
+ labelRules.push(`color: ${rgbColorValue(inputSystem.label.textColorToken)}`);
49993
51421
  labelRules.push(`font-weight: ${FONT_WEIGHT_MAP[inputSystem.label.fontWeight]}`);
49994
51422
  labelRules.push(`font-size: ${LABEL_FONT_SIZE_MAP[inputSystem.label.fontSize]}`);
49995
51423
  if (inputSystem.label.textTransform && inputSystem.label.textTransform !== "none") {
@@ -50030,9 +51458,9 @@ function generateInputCss({
50030
51458
  ];
50031
51459
  const focusRules = [];
50032
51460
  focusRules.push("outline: none");
50033
- focusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
51461
+ focusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
50034
51462
  if (inputSystem.focus.borderColorToken) {
50035
- focusRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.borderColorToken}))`);
51463
+ focusRules.push(`border-color: ${rgbColorValue(inputSystem.focus.borderColorToken)}`);
50036
51464
  }
50037
51465
  const errorSelectors = [
50038
51466
  `${inputSelector}[aria-invalid="true"]`,
@@ -50040,16 +51468,16 @@ function generateInputCss({
50040
51468
  `${selectSelector}[aria-invalid="true"]`
50041
51469
  ];
50042
51470
  const errorRules = [];
50043
- errorRules.push(`border-color: rgb(var(--tb-${inputSystem.error.borderColorToken}))`);
50044
- errorRules.push(`color: rgb(var(--tb-${inputSystem.error.textColorToken}))`);
51471
+ errorRules.push(`border-color: ${rgbColorValue(inputSystem.error.borderColorToken)}`);
51472
+ errorRules.push(`color: ${rgbColorValue(inputSystem.error.textColorToken)}`);
50045
51473
  const disabledSelectors = [
50046
51474
  `${inputSelector}:disabled`,
50047
51475
  `${textareaSelector}:disabled`,
50048
51476
  `${selectSelector}:disabled`
50049
51477
  ];
50050
51478
  const disabledRules = [];
50051
- disabledRules.push(`background-color: rgb(var(--tb-${inputSystem.disabled.backgroundColorToken}))`);
50052
- disabledRules.push(`color: rgb(var(--tb-${inputSystem.disabled.textColorToken}))`);
51479
+ disabledRules.push(`background-color: ${rgbColorValue(inputSystem.disabled.backgroundColorToken)}`);
51480
+ disabledRules.push(`color: ${rgbColorValue(inputSystem.disabled.textColorToken)}`);
50053
51481
  disabledRules.push(`opacity: ${inputSystem.disabled.opacity}`);
50054
51482
  disabledRules.push("cursor: not-allowed");
50055
51483
  const checkboxSelector = `${rootSelector} .form-checkbox`;
@@ -50059,12 +51487,12 @@ function generateInputCss({
50059
51487
  checkableRules.push("width: 1rem");
50060
51488
  checkableRules.push("height: 1rem");
50061
51489
  checkableRules.push("flex-shrink: 0");
50062
- checkableRules.push(`border: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`);
51490
+ checkableRules.push(`border: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`);
50063
51491
  if (inputSystem.base.background.type === "transparent") {
50064
51492
  checkableRules.push("background-color: transparent");
50065
51493
  } else {
50066
51494
  checkableRules.push(
50067
- `background-color: rgb(var(--tb-${inputSystem.base.background.colorToken}))`
51495
+ `background-color: ${rgbColorValue(inputSystem.base.background.colorToken)}`
50068
51496
  );
50069
51497
  }
50070
51498
  checkableRules.push("cursor: pointer");
@@ -50075,22 +51503,22 @@ function generateInputCss({
50075
51503
  radioSpecificRules.push("border-radius: 9999px");
50076
51504
  const checkboxCheckedSelector = `${checkboxSelector}:checked`;
50077
51505
  const checkboxCheckedRules = [];
50078
- checkboxCheckedRules.push(`background-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
50079
- checkboxCheckedRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
51506
+ checkboxCheckedRules.push(`background-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
51507
+ checkboxCheckedRules.push(`border-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
50080
51508
  checkboxCheckedRules.push(`background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")`);
50081
51509
  checkboxCheckedRules.push("background-size: 100% 100%");
50082
51510
  checkboxCheckedRules.push("background-position: center");
50083
51511
  checkboxCheckedRules.push("background-repeat: no-repeat");
50084
51512
  const radioCheckedSelector = `${radioSelector}:checked`;
50085
51513
  const radioCheckedRules = [];
50086
- radioCheckedRules.push(`background-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
50087
- radioCheckedRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
51514
+ radioCheckedRules.push(`background-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
51515
+ radioCheckedRules.push(`border-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
50088
51516
  radioCheckedRules.push("background-image: radial-gradient(circle, white 40%, transparent 40%)");
50089
51517
  const checkboxFocusSelector = `${checkboxSelector}:focus-visible`;
50090
51518
  const radioFocusSelector = `${radioSelector}:focus-visible`;
50091
51519
  const checkableFocusRules = [];
50092
51520
  checkableFocusRules.push("outline: none");
50093
- checkableFocusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
51521
+ checkableFocusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
50094
51522
  const cssBlocks = [];
50095
51523
  cssBlocks.push(`${labelSelector} {
50096
51524
  ${labelRules.join(";\n ")};
@@ -51938,6 +53366,11 @@ ${root} {
51938
53366
  --er-event-card-bg: rgb(var(--tb-surface));
51939
53367
  --er-event-card-border-width: var(--rb-border-width, 1px);
51940
53368
  --er-event-card-hover-opacity: 1;
53369
+ --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
53370
+ --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
53371
+ --er-radius: var(--rb-block-radius);
53372
+ --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
53373
+ --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
51941
53374
 
51942
53375
  /* Step indicator */
51943
53376
  --er-step-active: rgb(var(--tb-primary));
@@ -52938,7 +54371,7 @@ function buildThemeCssVars(theme) {
52938
54371
  // These expose inputStyle/InputSystem values for blocks that can't use .form-* classes
52939
54372
  [THEME_RADIUS_CSS_VARS.input]: inputRadius,
52940
54373
  ["--rb-input-focus-width"]: `${inputSystem.focus.ringWidth}px`,
52941
- ["--rb-input-focus-color"]: `rgb(var(--tb-${inputSystem.focus.ringColorToken}))`,
54374
+ ["--rb-input-focus-color"]: rgbColorValue(inputSystem.focus.ringColorToken),
52942
54375
  // Deprecated compatibility aliases for pre-v2 block/custom CSS. New CSS should
52943
54376
  // consume the semantic --rb-* primitives above.
52944
54377
  [THEME_RADIUS_CSS_VARS.legacyCard]: blockRadius,
@@ -53264,8 +54697,8 @@ function hydrateValue(value, context) {
53264
54697
  return isUnchanged ? value : Object.fromEntries(resolvedEntries);
53265
54698
  }
53266
54699
  return value;
53267
- } catch (err2) {
53268
- console.error("[hydrateLinks] Error hydrating value:", err2, value);
54700
+ } catch (err3) {
54701
+ console.error("[hydrateLinks] Error hydrating value:", err3, value);
53269
54702
  return value;
53270
54703
  }
53271
54704
  }
@@ -53705,6 +55138,11 @@ var MemoBlockSection = React6.memo(
53705
55138
  siteId: dataContext?.siteId,
53706
55139
  apiBaseUrl: dataContext?.apiBaseUrl,
53707
55140
  portalToken: dataContext?.portalToken ?? null,
55141
+ previewToken: dataContext?.previewToken ?? null,
55142
+ stage: dataContext?.previewStage,
55143
+ occurrenceContext: dataContext?.occurrenceContext ?? null,
55144
+ entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
55145
+ contentEntry: dataContext?.contentEntry ?? null,
53708
55146
  supabaseUrl: dataContext?.supabaseUrl,
53709
55147
  imageResolveContext: resolvedImageResolveContext,
53710
55148
  blockId: block.id ?? null,
@@ -53828,6 +55266,11 @@ var MemoBlockSection = React6.memo(
53828
55266
  siteId: dataContext?.siteId,
53829
55267
  apiBaseUrl: dataContext?.apiBaseUrl,
53830
55268
  portalToken: dataContext?.portalToken ?? null,
55269
+ previewToken: dataContext?.previewToken ?? null,
55270
+ stage: dataContext?.previewStage,
55271
+ occurrenceContext: dataContext?.occurrenceContext ?? null,
55272
+ entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
55273
+ contentEntry: dataContext?.contentEntry ?? null,
53831
55274
  supabaseUrl: dataContext?.supabaseUrl,
53832
55275
  imageResolveContext: resolvedImageResolveContext,
53833
55276
  blockId: block.id ?? null,
@@ -54014,6 +55457,9 @@ var containerResponsiveThemeCss = `/*
54014
55457
  letter-spacing: 0.025em;
54015
55458
  text-transform: uppercase;
54016
55459
  }
55460
+ .rb-eyebrow-treatment-accent {
55461
+ color: rgb(var(--tb-accent));
55462
+ }
54017
55463
  .rb-eyebrow-treatment-pill {
54018
55464
  align-self: center;
54019
55465
  display: inline-flex;
@@ -54068,6 +55514,27 @@ var containerResponsiveThemeCss = `/*
54068
55514
  font-weight: 400;
54069
55515
  }
54070
55516
 
55517
+ /* Media shape treatments */
55518
+ .rb-media-shape-square,
55519
+ .rb-media-shape-rounded,
55520
+ .rb-media-shape-circle,
55521
+ .rb-media-shape-arch {
55522
+ overflow: hidden;
55523
+ }
55524
+ .rb-media-shape-square {
55525
+ border-radius: 0;
55526
+ }
55527
+ .rb-media-shape-rounded {
55528
+ border-radius: var(--rb-media-shape-radius, 1rem);
55529
+ }
55530
+ .rb-media-shape-circle {
55531
+ border-radius: 9999px;
55532
+ }
55533
+ .rb-media-shape-arch {
55534
+ border-radius: 9999px 9999px var(--rb-media-shape-arch-base-radius, 0.125rem)
55535
+ var(--rb-media-shape-arch-base-radius, 0.125rem);
55536
+ }
55537
+
54071
55538
  /* Navigation typography */
54072
55539
  .rb-nav-text {
54073
55540
  font-size: 0.875rem;
@@ -57222,7 +58689,7 @@ var containerResponsiveThemeCss = `/*
57222
58689
  :where(.theme-scope) :where([data-block="event-registration"]) .er-container {
57223
58690
  border-radius: var(--rb-block-radius);
57224
58691
  border: 1px solid var(--er-border);
57225
- padding: 1.5rem;
58692
+ padding: clamp(1rem, 2vw, 1.5rem);
57226
58693
  background: rgb(var(--tb-surface));
57227
58694
  color: var(--er-on-surface);
57228
58695
  transition: border-color var(--rb-block-transition) ease;
@@ -57231,6 +58698,109 @@ var containerResponsiveThemeCss = `/*
57231
58698
  margin-inline: 0;
57232
58699
  }
57233
58700
 
58701
+ /* SSR shell / required-island fallback */
58702
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell {
58703
+ min-height: 24rem;
58704
+ }
58705
+
58706
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__steps {
58707
+ margin-bottom: 1.25rem;
58708
+ }
58709
+
58710
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__eyebrow {
58711
+ margin: 0 0 0.35rem;
58712
+ color: var(--er-on-surface-subtle);
58713
+ font-size: 0.75rem;
58714
+ font-weight: 700;
58715
+ letter-spacing: 0.04em;
58716
+ line-height: 1.2;
58717
+ text-transform: uppercase;
58718
+ }
58719
+
58720
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__title {
58721
+ margin: 0;
58722
+ }
58723
+
58724
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__copy {
58725
+ margin: 0.35rem 0 0;
58726
+ max-width: 36rem;
58727
+ line-height: 1.45;
58728
+ }
58729
+
58730
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__cards {
58731
+ margin-top: 0.25rem;
58732
+ overflow: hidden;
58733
+ border: 1px solid var(--er-border);
58734
+ border-radius: var(--rb-block-radius);
58735
+ background: var(--er-control-bg);
58736
+ }
58737
+
58738
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__card {
58739
+ display: grid;
58740
+ gap: 0.5rem;
58741
+ padding: 1rem;
58742
+ }
58743
+
58744
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line {
58745
+ height: 0.75rem;
58746
+ border-radius: 9999px;
58747
+ background: linear-gradient(
58748
+ 90deg,
58749
+ var(--er-shell-line),
58750
+ rgba(var(--tb-primary), 0.12),
58751
+ var(--er-shell-line)
58752
+ );
58753
+ }
58754
+
58755
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--lg {
58756
+ width: min(26rem, 82%);
58757
+ }
58758
+
58759
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--md {
58760
+ width: min(19rem, 68%);
58761
+ }
58762
+
58763
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--sm {
58764
+ width: min(14rem, 52%);
58765
+ }
58766
+
58767
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--xs {
58768
+ width: min(10rem, 42%);
58769
+ }
58770
+
58771
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__summary {
58772
+ align-items: center;
58773
+ border-radius: calc(var(--rb-block-radius) * 0.75);
58774
+ border: 1px solid var(--er-summary-border);
58775
+ padding: 0.875rem 1rem;
58776
+ }
58777
+
58778
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__button-placeholder {
58779
+ display: inline-flex;
58780
+ min-height: 2.5rem;
58781
+ align-items: center;
58782
+ justify-content: center;
58783
+ border-radius: calc(var(--rb-block-radius) * 0.6);
58784
+ background: rgb(var(--tb-primary));
58785
+ color: rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255)));
58786
+ padding: 0.625rem 1rem;
58787
+ font-size: 0.875rem;
58788
+ font-weight: 600;
58789
+ line-height: 1.2;
58790
+ text-align: center;
58791
+ white-space: nowrap;
58792
+ }
58793
+
58794
+ :where(.theme-scope) :where([data-block="event-registration"]) .event-registration__hydration-error {
58795
+ border-radius: var(--rb-block-radius);
58796
+ border: 1px solid var(--er-border-error);
58797
+ background: var(--er-error-bg);
58798
+ color: var(--er-error-text);
58799
+ padding: 1rem;
58800
+ font-size: 0.9375rem;
58801
+ line-height: 1.45;
58802
+ }
58803
+
57234
58804
  :where(.theme-scope) :where([data-block="event-registration"].event-registration--embedded) .er-container {
57235
58805
  max-width: none;
57236
58806
  padding: 0;
@@ -57278,6 +58848,7 @@ var containerResponsiveThemeCss = `/*
57278
58848
  padding: 1rem;
57279
58849
  border-radius: calc(var(--rb-block-radius) * 0.75);
57280
58850
  border: 1px solid var(--er-border);
58851
+ background: var(--er-surface-muted);
57281
58852
  }
57282
58853
 
57283
58854
  /* Ticket counter */
@@ -57323,14 +58894,23 @@ var containerResponsiveThemeCss = `/*
57323
58894
  /* Form inputs */
57324
58895
  :where(.theme-scope) :where([data-block="event-registration"]) .er-input {
57325
58896
  width: 100%;
57326
- padding: 0.5rem 0.75rem;
58897
+ min-height: 2.75rem;
58898
+ padding: 0.625rem 0.75rem;
57327
58899
  border-radius: calc(var(--rb-block-radius) * 0.5);
57328
58900
  border: 1px solid var(--er-border);
57329
- background: transparent;
58901
+ background: var(--er-control-bg);
58902
+ color: var(--er-control-text);
58903
+ font: inherit;
58904
+ line-height: 1.4;
57330
58905
  transition: border-color var(--rb-block-transition) ease,
58906
+ background-color var(--rb-block-transition) ease,
57331
58907
  box-shadow var(--rb-block-transition) ease;
57332
58908
  }
57333
58909
 
58910
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-input::placeholder {
58911
+ color: var(--er-on-surface-faint);
58912
+ }
58913
+
57334
58914
  :where(.theme-scope) :where([data-block="event-registration"]) .er-input:focus {
57335
58915
  outline: none;
57336
58916
  border-color: var(--er-border-selected);
@@ -57452,7 +59032,7 @@ var containerResponsiveThemeCss = `/*
57452
59032
  }
57453
59033
 
57454
59034
  :where(.theme-scope) :where([data-block="event-registration"]) .er-event-grid .er-event-card {
57455
- padding: 0.75rem 0;
59035
+ padding: 0.875rem 0;
57456
59036
  border-width: 0 0 var(--rb-event-tile-border-width, var(--rb-border-width, 1px)) 0;
57457
59037
  border-style: solid;
57458
59038
  border-radius: 0;
@@ -57684,21 +59264,24 @@ var containerResponsiveThemeCss = `/*
57684
59264
  align-items: flex-start;
57685
59265
  gap: 0.75rem;
57686
59266
  padding: 1rem;
57687
- border: 2px solid var(--er-payment-border);
59267
+ border: 1px solid var(--er-payment-border);
57688
59268
  border-radius: var(--rb-block-radius);
57689
- background: transparent;
59269
+ background: var(--er-control-bg);
57690
59270
  cursor: pointer;
57691
59271
  transition: border-color var(--rb-block-transition) ease,
59272
+ box-shadow var(--rb-block-transition) ease,
57692
59273
  background-color var(--rb-block-transition) ease;
57693
59274
  }
57694
59275
 
57695
59276
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-option:hover {
57696
59277
  border-color: var(--er-payment-border-hover);
59278
+ box-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
57697
59279
  }
57698
59280
 
57699
59281
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-option--selected {
57700
59282
  border-color: var(--er-payment-border-selected);
57701
59283
  background-color: var(--er-payment-bg-selected);
59284
+ box-shadow: 0 0 0 1px var(--er-payment-border-selected);
57702
59285
  }
57703
59286
 
57704
59287
  /* Discount code entry */
@@ -58386,22 +59969,25 @@ var containerResponsiveThemeCss = `/*
58386
59969
  justify-content: center;
58387
59970
  gap: 0.25rem;
58388
59971
  padding: 0.75rem 0.625rem;
58389
- border: 2px solid var(--er-payment-border);
59972
+ border: 1px solid var(--er-payment-border);
58390
59973
  border-radius: var(--rb-block-radius);
58391
- background: transparent;
59974
+ background: var(--er-control-bg);
58392
59975
  cursor: pointer;
58393
59976
  text-align: center;
58394
59977
  transition: border-color var(--rb-block-transition) ease,
59978
+ box-shadow var(--rb-block-transition) ease,
58395
59979
  background-color var(--rb-block-transition) ease;
58396
59980
  }
58397
59981
 
58398
59982
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile:hover:not([aria-disabled="true"]) {
58399
59983
  border-color: var(--er-payment-border-hover);
59984
+ box-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
58400
59985
  }
58401
59986
 
58402
59987
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile--selected {
58403
59988
  border-color: var(--er-payment-border-selected);
58404
59989
  background-color: var(--er-payment-bg-selected);
59990
+ box-shadow: 0 0 0 1px var(--er-payment-border-selected);
58405
59991
  }
58406
59992
 
58407
59993
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile--disabled {
@@ -58504,11 +60090,10 @@ var containerResponsiveThemeCss = `/*
58504
60090
  justify-content: space-between;
58505
60091
  align-items: flex-start;
58506
60092
  gap: 1rem;
58507
- padding: 0.875rem 0;
58508
- background: transparent;
58509
- border-top: 1px solid var(--er-summary-border);
58510
- border-bottom: 1px solid var(--er-summary-border);
58511
- border-radius: 0;
60093
+ padding: 0.875rem 1rem;
60094
+ background: var(--er-surface-muted);
60095
+ border: 1px solid var(--er-summary-border);
60096
+ border-radius: calc(var(--rb-block-radius) * 0.75);
58512
60097
  }
58513
60098
 
58514
60099
  :where(.theme-scope) :where([data-block="event-registration"]) .er-summary-bar-info {
@@ -60280,18 +61865,10 @@ var containerResponsiveThemeCss = `/*
60280
61865
  /* Two-column row (opt-in per field via schema layout) */
60281
61866
  :where(.theme-scope) :where([data-block="form"]) .fb-row-2 {
60282
61867
  display: grid;
60283
- grid-template-columns: 1fr;
61868
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
60284
61869
  gap: 1rem;
60285
61870
  }
60286
61871
 
60287
- @container rb-site (min-width: 768px) {
60288
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
60289
- :where(.theme-scope) :where([data-block="form"]) .fb-row-2 {
60290
- grid-template-columns: 1fr 1fr;
60291
- }
60292
- }
60293
- }
60294
-
60295
61872
  /* Field wrapper */
60296
61873
  :where(.theme-scope) :where([data-block="form"]) .fb-field {
60297
61874
  display: flex;
@@ -60365,6 +61942,10 @@ var containerResponsiveThemeCss = `/*
60365
61942
  }
60366
61943
 
60367
61944
  /* Subheadline - supporting text below headline */
61945
+ :where(.theme-scope) :where([data-block="hero"]) .hero-headline {
61946
+ text-wrap: balance;
61947
+ }
61948
+
60368
61949
  :where(.theme-scope) :where([data-block="hero"]) .hero-subheadline {
60369
61950
  font-size: 1.125rem;
60370
61951
  color: var(--section-supporting-color, var(--section-text-color, rgb(var(--tb-text))));
@@ -60390,8 +61971,8 @@ var containerResponsiveThemeCss = `/*
60390
61971
  }
60391
61972
 
60392
61973
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-editorial .hero-headline {
60393
- font-size: clamp(2.5rem, 5vw, 4rem);
60394
- line-height: 1.08;
61974
+ font-size: clamp(2.75rem, 5.6vw, 4.75rem);
61975
+ line-height: 1.06;
60395
61976
  }
60396
61977
 
60397
61978
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-editorial .hero-subheadline {
@@ -60400,8 +61981,8 @@ var containerResponsiveThemeCss = `/*
60400
61981
  }
60401
61982
 
60402
61983
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-headline {
60403
- font-size: clamp(3rem, 6vw, 5rem);
60404
- line-height: 1.04;
61984
+ font-size: clamp(3.5rem, 7.2vw, 6.25rem);
61985
+ line-height: 1;
60405
61986
  }
60406
61987
 
60407
61988
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-subheadline {
@@ -60410,8 +61991,8 @@ var containerResponsiveThemeCss = `/*
60410
61991
  }
60411
61992
 
60412
61993
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-headline {
60413
- font-size: clamp(3.5rem, 8vw, 6.5rem);
60414
- line-height: 0.98;
61994
+ font-size: clamp(4.25rem, 10vw, 8.5rem);
61995
+ line-height: 0.94;
60415
61996
  }
60416
61997
 
60417
61998
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-subheadline {
@@ -60420,13 +62001,13 @@ var containerResponsiveThemeCss = `/*
60420
62001
  }
60421
62002
 
60422
62003
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-medium.rb-hero-typography-poster .hero-headline {
60423
- font-size: clamp(3rem, 6.5vw, 5rem);
62004
+ font-size: clamp(3.5rem, 7.5vw, 6.5rem);
60424
62005
  }
60425
62006
 
60426
62007
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-poster .hero-headline,
60427
62008
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-display .hero-headline {
60428
- font-size: clamp(2.75rem, 5.5vw, 4.5rem);
60429
- line-height: 1.05;
62009
+ font-size: clamp(3rem, 6vw, 5.25rem);
62010
+ line-height: 1.02;
60430
62011
  }
60431
62012
 
60432
62013
  @container rb-site (max-width: 639px) {
@@ -63148,8 +64729,9 @@ var containerResponsiveThemeCss = `/*
63148
64729
  /* Privacy note */
63149
64730
  :where(.theme-scope) .newsletter-privacy-note {
63150
64731
  margin-top: 0.75rem;
63151
- font-size: 0.75rem;
63152
- color: var(--section-supporting-color, rgb(var(--tb-mutedText)));
64732
+ font-size: 1rem;
64733
+ line-height: 1.6;
64734
+ color: var(--section-text-color, rgb(var(--tb-text)));
63153
64735
  text-align: center;
63154
64736
  }
63155
64737
 
@@ -63204,6 +64786,116 @@ var containerResponsiveThemeCss = `/*
63204
64786
  color: rgb(var(--tb-text));
63205
64787
  }
63206
64788
 
64789
+ /* =============================================================================
64790
+ * Block: Contact + Newsletter
64791
+ * =============================================================================
64792
+ */
64793
+
64794
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-grid {
64795
+ display: grid;
64796
+ grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
64797
+ gap: clamp(2.5rem, 6vw, 4rem);
64798
+ align-items: start;
64799
+ }
64800
+
64801
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-column {
64802
+ min-width: 0;
64803
+ }
64804
+
64805
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-copy {
64806
+ margin-bottom: 1.5rem;
64807
+ }
64808
+
64809
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-title,
64810
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-title {
64811
+ margin: 0 0 0.75rem;
64812
+ }
64813
+
64814
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-intro,
64815
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-subtitle {
64816
+ color: var(--section-text-color, rgb(var(--tb-text)));
64817
+ }
64818
+
64819
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-info {
64820
+ display: flex;
64821
+ flex-direction: column;
64822
+ align-items: flex-start;
64823
+ }
64824
+
64825
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-form {
64826
+ max-width: none;
64827
+ margin-left: 0;
64828
+ margin-right: 0;
64829
+ }
64830
+
64831
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-privacy-note {
64832
+ text-align: left;
64833
+ }
64834
+
64835
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-form {
64836
+ display: flex;
64837
+ flex-direction: column;
64838
+ gap: 1rem;
64839
+ }
64840
+
64841
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-row-2 {
64842
+ display: grid;
64843
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
64844
+ gap: 1rem;
64845
+ }
64846
+
64847
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-field {
64848
+ display: flex;
64849
+ flex-direction: column;
64850
+ gap: 0.25rem;
64851
+ }
64852
+
64853
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-fieldset {
64854
+ display: flex;
64855
+ flex-direction: column;
64856
+ gap: 0.5rem;
64857
+ border: none;
64858
+ padding: 0;
64859
+ margin: 0;
64860
+ }
64861
+
64862
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-inline {
64863
+ display: flex;
64864
+ align-items: center;
64865
+ gap: 0.5rem;
64866
+ }
64867
+
64868
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success,
64869
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error,
64870
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
64871
+ border-radius: var(--rb-block-radius);
64872
+ padding: 1rem;
64873
+ font-size: 0.875rem;
64874
+ }
64875
+
64876
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success {
64877
+ background-color: var(--fb-success-bg);
64878
+ color: var(--fb-success-text);
64879
+ border: 1px solid var(--fb-success-border);
64880
+ }
64881
+
64882
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error {
64883
+ background-color: var(--fb-error-bg);
64884
+ color: var(--fb-error-text);
64885
+ border: 1px solid var(--fb-error-border);
64886
+ }
64887
+
64888
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
64889
+ background-color: var(--fb-empty-bg);
64890
+ color: var(--fb-empty-text);
64891
+ border: 1px dashed var(--fb-empty-border);
64892
+ text-align: center;
64893
+ }
64894
+
64895
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-actions {
64896
+ margin-top: 0.5rem;
64897
+ }
64898
+
63207
64899
  /* =============================================================================
63208
64900
  * Block: Team Members
63209
64901
  * =============================================================================
@@ -63428,8 +65120,8 @@ var containerResponsiveThemeCss = `/*
63428
65120
  container: event-compact-list / inline-size;
63429
65121
  border: 1px solid var(--event-compact-divider-color);
63430
65122
  border-radius: 1rem;
63431
- background: rgb(var(--tb-background, 255 255 255));
63432
- box-shadow: 0 1.25rem 3.5rem rgba(var(--tb-shadow), 0.08);
65123
+ background: rgb(var(--tb-surface, 255 255 255));
65124
+ box-shadow: none;
63433
65125
  }
63434
65126
 
63435
65127
  :where(.theme-scope) .rb-event-list-treatment-lined-panel .event-listing-compact-container {
@@ -63438,6 +65130,12 @@ var containerResponsiveThemeCss = `/*
63438
65130
  rgb(var(--tb-border, 229 231 235)),
63439
65131
  rgb(var(--tb-text, 17 24 39)) 8%
63440
65132
  );
65133
+ background: rgb(var(--tb-surface, 255 255 255));
65134
+ border-color: color-mix(
65135
+ in oklab,
65136
+ rgb(var(--tb-primary, 0 0 0)),
65137
+ rgb(var(--tb-border, 229 231 235)) 72%
65138
+ );
63441
65139
  }
63442
65140
 
63443
65141
  :where(.theme-scope) .event-compact-row {
@@ -63513,7 +65211,7 @@ var containerResponsiveThemeCss = `/*
63513
65211
 
63514
65212
  :where(.theme-scope) .event-compact-row-title {
63515
65213
  margin: 0;
63516
- color: rgb(var(--tb-text, 17 24 39));
65214
+ color: var(--section-heading-color, rgb(var(--tb-primary, 0 0 0)));
63517
65215
  font-family: var(--font-heading, var(--font-body, inherit));
63518
65216
  font-size: clamp(1.05rem, 1rem + 0.35vw, 1.3rem);
63519
65217
  font-weight: 400;
@@ -63606,8 +65304,6 @@ var containerResponsiveThemeCss = `/*
63606
65304
  min-height: 2.7rem;
63607
65305
  justify-content: space-between;
63608
65306
  gap: 1rem;
63609
- border-radius: 9999px;
63610
- padding-inline: 1.25rem 1rem;
63611
65307
  white-space: nowrap;
63612
65308
  }
63613
65309
 
@@ -64554,11 +66250,11 @@ function resolveParamsBindings(input, vm, meta) {
64554
66250
  return binding.fallback;
64555
66251
  }
64556
66252
  return resolved;
64557
- } catch (err2) {
66253
+ } catch (err3) {
64558
66254
  if (shouldLogWarnings) {
64559
66255
  console.warn(
64560
66256
  `bindings: failed to parse loader param binding for block "${meta?.blockKind ?? "unknown"}"`,
64561
- err2
66257
+ err3
64562
66258
  );
64563
66259
  }
64564
66260
  return void 0;
@@ -65931,7 +67627,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
65931
67627
  }
65932
67628
 
65933
67629
  // ../api/src/utils/isRecord.ts
65934
- function isRecord10(value) {
67630
+ function isRecord12(value) {
65935
67631
  return typeof value === "object" && value !== null && !Array.isArray(value);
65936
67632
  }
65937
67633
 
@@ -66238,7 +67934,7 @@ function sanitizeMarks(marks) {
66238
67934
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
66239
67935
  return [{ type: mark.type }];
66240
67936
  }
66241
- if (mark.type === "link" && isRecord10(mark.attrs) && typeof mark.attrs.href === "string") {
67937
+ if (mark.type === "link" && isRecord12(mark.attrs) && typeof mark.attrs.href === "string") {
66242
67938
  const attrs = { href: mark.attrs.href };
66243
67939
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
66244
67940
  attrs.target = mark.attrs.target;
@@ -66253,10 +67949,10 @@ function sanitizeMarks(marks) {
66253
67949
  return sanitized.length > 0 ? sanitized : void 0;
66254
67950
  }
66255
67951
  function unwrapRichTextValue(value) {
66256
- if (isRecord10(value) && isRecord10(value.doc)) {
67952
+ if (isRecord12(value) && isRecord12(value.doc)) {
66257
67953
  return unwrapRichTextValue(value.doc);
66258
67954
  }
66259
- if (isRecord10(value) && value.type === "doc") {
67955
+ if (isRecord12(value) && value.type === "doc") {
66260
67956
  return {
66261
67957
  type: "doc",
66262
67958
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -66265,7 +67961,7 @@ function unwrapRichTextValue(value) {
66265
67961
  return EMPTY_SITE_BANNER_BODY;
66266
67962
  }
66267
67963
  function isTipTapNodeLike(value) {
66268
- return isRecord10(value) && typeof value.type === "string";
67964
+ return isRecord12(value) && typeof value.type === "string";
66269
67965
  }
66270
67966
  function coerceTipTapNode(value) {
66271
67967
  return {
@@ -66273,9 +67969,9 @@ function coerceTipTapNode(value) {
66273
67969
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
66274
67970
  ...typeof value.text === "string" ? { text: value.text } : {},
66275
67971
  ...Array.isArray(value.marks) ? {
66276
- marks: value.marks.filter((mark) => isRecord10(mark) && typeof mark.type === "string").map((mark) => ({
67972
+ marks: value.marks.filter((mark) => isRecord12(mark) && typeof mark.type === "string").map((mark) => ({
66277
67973
  type: mark.type,
66278
- ...isRecord10(mark.attrs) ? { attrs: mark.attrs } : {}
67974
+ ...isRecord12(mark.attrs) ? { attrs: mark.attrs } : {}
66279
67975
  }))
66280
67976
  } : {}
66281
67977
  };
@@ -66478,7 +68174,7 @@ var ENTRY_REF_KEYS = [
66478
68174
  "entryId",
66479
68175
  "slug"
66480
68176
  ];
66481
- function isRecord11(value) {
68177
+ function isRecord13(value) {
66482
68178
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
66483
68179
  }
66484
68180
  function extractManualEntryRef(item) {
@@ -66486,7 +68182,7 @@ function extractManualEntryRef(item) {
66486
68182
  const trimmed = item.trim();
66487
68183
  return trimmed.length > 0 ? trimmed : null;
66488
68184
  }
66489
- if (!isRecord11(item)) return null;
68185
+ if (!isRecord13(item)) return null;
66490
68186
  for (const key of ENTRY_REF_KEYS) {
66491
68187
  const raw = item[key];
66492
68188
  if (typeof raw === "string" && raw.trim().length > 0) {
@@ -66981,6 +68677,122 @@ function resolveSiteCustomBlocks(site) {
66981
68677
  return void 0;
66982
68678
  }
66983
68679
 
68680
+ // ../content-model/src/routeTemplate.ts
68681
+ var ROUTE_TEMPLATE_SLUG_SEGMENT = "{slug}";
68682
+ var InvalidRouteTemplateError = class extends Error {
68683
+ constructor(error) {
68684
+ super(describeRouteTemplateParseError(error));
68685
+ this.name = "InvalidRouteTemplateError";
68686
+ this.error = error;
68687
+ }
68688
+ };
68689
+ function safeParseRouteTemplate(routePattern) {
68690
+ if (routePattern === null || routePattern === "") {
68691
+ return {
68692
+ success: true,
68693
+ routeTemplate: { kind: "fallback-slug" }
68694
+ };
68695
+ }
68696
+ const segments = splitRouteSegments(routePattern);
68697
+ const slugSegmentIndices = segments.flatMap(
68698
+ (segment, index) => segment === ROUTE_TEMPLATE_SLUG_SEGMENT ? [index] : []
68699
+ );
68700
+ if (slugSegmentIndices.length > 1) {
68701
+ return {
68702
+ success: false,
68703
+ error: {
68704
+ code: "multiple-slug-segments",
68705
+ routePattern,
68706
+ segment: ROUTE_TEMPLATE_SLUG_SEGMENT
68707
+ }
68708
+ };
68709
+ }
68710
+ const invalidSegment = segments.find(
68711
+ (segment) => segment !== ROUTE_TEMPLATE_SLUG_SEGMENT && isUnsupportedDynamicSegment(segment)
68712
+ );
68713
+ if (invalidSegment) {
68714
+ return {
68715
+ success: false,
68716
+ error: {
68717
+ code: invalidSegment.startsWith(":") ? "legacy-dynamic-segment" : "unsupported-dynamic-segment",
68718
+ routePattern,
68719
+ segment: invalidSegment
68720
+ }
68721
+ };
68722
+ }
68723
+ if (slugSegmentIndices.length === 1) {
68724
+ const [prefix = "", suffix = ""] = routePattern.split(ROUTE_TEMPLATE_SLUG_SEGMENT);
68725
+ const slugIndex = slugSegmentIndices[0] ?? 0;
68726
+ return {
68727
+ success: true,
68728
+ routeTemplate: {
68729
+ kind: "slug-template",
68730
+ routePattern,
68731
+ prefix,
68732
+ suffix,
68733
+ prefixSegments: segments.slice(0, slugIndex),
68734
+ suffixSegments: segments.slice(slugIndex + 1)
68735
+ }
68736
+ };
68737
+ }
68738
+ return {
68739
+ success: true,
68740
+ routeTemplate: {
68741
+ kind: "fixed-path",
68742
+ routePattern,
68743
+ path: routePattern
68744
+ }
68745
+ };
68746
+ }
68747
+ function parseRouteTemplate(routePattern) {
68748
+ const result = safeParseRouteTemplate(routePattern);
68749
+ if (result.success) {
68750
+ return result.routeTemplate;
68751
+ }
68752
+ throw new InvalidRouteTemplateError(result.error);
68753
+ }
68754
+ function describeRouteTemplateParseError(error) {
68755
+ switch (error.code) {
68756
+ case "legacy-dynamic-segment":
68757
+ return `Route pattern "${error.routePattern}" uses unsupported dynamic segment "${error.segment ?? ":slug"}". Use "${ROUTE_TEMPLATE_SLUG_SEGMENT}" as a full path segment.`;
68758
+ case "multiple-slug-segments":
68759
+ return `Route pattern "${error.routePattern}" must not contain "${ROUTE_TEMPLATE_SLUG_SEGMENT}" more than once.`;
68760
+ case "unsupported-dynamic-segment":
68761
+ return `Route pattern "${error.routePattern}" contains unsupported dynamic segment "${error.segment ?? ""}". Route patterns may only use "${ROUTE_TEMPLATE_SLUG_SEGMENT}" as a full path segment.`;
68762
+ }
68763
+ }
68764
+ function splitRouteSegments(routePattern) {
68765
+ return routePattern.split("/").filter((segment) => segment.length > 0);
68766
+ }
68767
+ function isUnsupportedDynamicSegment(segment) {
68768
+ return segment.startsWith(":") || segment.includes("{") || segment.includes("}");
68769
+ }
68770
+
68771
+ // ../content-model/src/entry-slots/types.ts
68772
+ function ok2(value) {
68773
+ return { ok: true, value };
68774
+ }
68775
+ function err2(error) {
68776
+ return { ok: false, error };
68777
+ }
68778
+ var SLOT_KEY_PATTERN = /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/;
68779
+ function unsafeAsSlotKey(value) {
68780
+ return value;
68781
+ }
68782
+ function parseSlotKey(value) {
68783
+ if (typeof value !== "string") return err2({ kind: "not-string" });
68784
+ const normalized = value.trim();
68785
+ if (!normalized) return err2({ kind: "empty" });
68786
+ if (!SLOT_KEY_PATTERN.test(normalized)) {
68787
+ return err2({ kind: "invalid-format", value: normalized });
68788
+ }
68789
+ return ok2(unsafeAsSlotKey(normalized));
68790
+ }
68791
+ var SYSTEM_ENTRY_SLOT_BLOCK_KIND = "system.entry-slot";
68792
+ function selectBlocksForDeclaredEntrySlot(input) {
68793
+ return input.entrySlots.find((slot) => slot.slotKey === input.declaredSlotKey)?.blocks ?? [];
68794
+ }
68795
+
66984
68796
  // src/rendering/helpers/loadContent.ts
66985
68797
  function isPageContent(result) {
66986
68798
  return result.type === "page";
@@ -67033,6 +68845,7 @@ async function loadContent(params) {
67033
68845
  };
67034
68846
  const { templatePage, resolvedData: resolvedData2 } = await processEntryTemplate(
67035
68847
  contentResponse.templates,
68848
+ contentResponse.entrySlots,
67036
68849
  entry,
67037
68850
  { siteId, preview },
67038
68851
  client,
@@ -67156,7 +68969,7 @@ function validateAndConvertBlock(block, source) {
67156
68969
  content
67157
68970
  };
67158
68971
  }
67159
- async function processEntryTemplate(templates, entry, context, client, options) {
68972
+ async function processEntryTemplate(templates, entrySlots, entry, context, client, options) {
67160
68973
  const template = templates?.[0];
67161
68974
  if (!template || !template.blocks?.length) {
67162
68975
  return { templatePage: null, resolvedData: {} };
@@ -67174,7 +68987,12 @@ async function processEntryTemplate(templates, entry, context, client, options)
67174
68987
  updatedAt: entry.updatedAt
67175
68988
  }
67176
68989
  };
67177
- const blocks = template.blocks.map((block) => resolveTemplateBlock(block, bindingContext));
68990
+ const blocks = template.blocks.flatMap(
68991
+ (block) => resolveTemplateBlockSequence(block, bindingContext, entrySlots)
68992
+ );
68993
+ if (blocks.length === 0) {
68994
+ return { templatePage: null, resolvedData: {} };
68995
+ }
67178
68996
  const templatePage = {
67179
68997
  name: template.name || "Entry Template",
67180
68998
  path: entry.path || "/",
@@ -67214,6 +69032,48 @@ function resolveTemplateBlock(block, bindingContext) {
67214
69032
  content: resolvedContent
67215
69033
  };
67216
69034
  }
69035
+ function resolveTemplateBlockSequence(block, bindingContext, entrySlots) {
69036
+ const slotKey = readEntrySlotKey(block);
69037
+ if (slotKey) {
69038
+ return selectBlocksForDeclaredEntrySlot({
69039
+ declaredSlotKey: slotKey,
69040
+ entrySlots: entrySlots ?? []
69041
+ }).map(mapEntrySlotBlock);
69042
+ }
69043
+ if (block.blockKind === SYSTEM_ENTRY_SLOT_BLOCK_KIND) {
69044
+ return [];
69045
+ }
69046
+ return [resolveTemplateBlock(block, bindingContext)];
69047
+ }
69048
+ function readEntrySlotKey(block) {
69049
+ if (block.blockKind !== SYSTEM_ENTRY_SLOT_BLOCK_KIND) return null;
69050
+ if (block.scope !== "template") return null;
69051
+ const content = block.content;
69052
+ const slotKey = content?.slotKey;
69053
+ const parsed = parseSlotKey(slotKey);
69054
+ return parsed.ok ? parsed.value : null;
69055
+ }
69056
+ function mapEntrySlotBlock(block) {
69057
+ const mapped = {
69058
+ id: block.id ?? block.blockId ?? null,
69059
+ kind: block.kind,
69060
+ purpose: block.purpose,
69061
+ orderIndex: block.orderIndex ?? null,
69062
+ content: normalizeBindingOutput2(block.content ?? {}),
69063
+ draftContent: normalizeNullableEntrySlotContent(block.draftContent),
69064
+ publishedContent: normalizeNullableEntrySlotContent(block.publishedContent)
69065
+ };
69066
+ if (block.bindings == null) {
69067
+ return mapped;
69068
+ }
69069
+ return {
69070
+ ...mapped,
69071
+ bindings: block.bindings
69072
+ };
69073
+ }
69074
+ function normalizeNullableEntrySlotContent(content) {
69075
+ return content == null ? null : normalizeBindingOutput2(content);
69076
+ }
67217
69077
 
67218
69078
  // src/rendering/blocks-page-renderer.ts
67219
69079
  import * as React8 from "react";
@@ -67368,6 +69228,7 @@ function PageContent({
67368
69228
  mediaAssets,
67369
69229
  apiBaseUrl,
67370
69230
  portalToken,
69231
+ previewToken,
67371
69232
  dataContext,
67372
69233
  useThemeScope = false
67373
69234
  }) {
@@ -67384,6 +69245,7 @@ function PageContent({
67384
69245
  siteId,
67385
69246
  apiBaseUrl,
67386
69247
  portalToken,
69248
+ previewToken,
67387
69249
  resolvedData,
67388
69250
  routes: routeMap,
67389
69251
  pagesByIdentifier,
@@ -67422,15 +69284,15 @@ function Page(props2) {
67422
69284
  var lazyBlockOverrideSymbol = /* @__PURE__ */ Symbol.for("riverbankcms.sdk.lazyBlockOverride");
67423
69285
 
67424
69286
  // src/rendering/overrideResolution.ts
67425
- function isRecord12(value) {
69287
+ function isRecord14(value) {
67426
69288
  return typeof value === "object" && value !== null;
67427
69289
  }
67428
69290
  function isBlockOutlineLike(value) {
67429
69291
  const id = value.id;
67430
- return typeof value.kind === "string" && (typeof id === "string" || id === null) && (typeof value.purpose === "string" || isRecord12(value.content) || isRecord12(value.draftContent) || isRecord12(value.bindings));
69292
+ return typeof value.kind === "string" && (typeof id === "string" || id === null) && (typeof value.purpose === "string" || isRecord14(value.content) || isRecord14(value.draftContent) || isRecord14(value.bindings));
67431
69293
  }
67432
69294
  function collectBlockKindsFromValue(value, usedKinds, seen) {
67433
- if (!isRecord12(value)) return;
69295
+ if (!isRecord14(value)) return;
67434
69296
  if (seen.has(value)) return;
67435
69297
  seen.add(value);
67436
69298
  if (isBlockOutlineLike(value)) {
@@ -67479,7 +69341,7 @@ function selectOverrideKeysForUsedKinds(usedKinds, entries) {
67479
69341
  return selectedKeys;
67480
69342
  }
67481
69343
  function isLazyRegistration(registration) {
67482
- return isRecord12(registration) && registration[lazyBlockOverrideSymbol] === true;
69344
+ return isRecord14(registration) && registration[lazyBlockOverrideSymbol] === true;
67483
69345
  }
67484
69346
  async function resolveOverrideComponent(registration) {
67485
69347
  if (isLazyRegistration(registration)) {
@@ -67568,97 +69430,6 @@ function generatePreviewMetadata(input) {
67568
69430
  });
67569
69431
  }
67570
69432
 
67571
- // ../content-model/src/routeTemplate.ts
67572
- var ROUTE_TEMPLATE_SLUG_SEGMENT = "{slug}";
67573
- var InvalidRouteTemplateError = class extends Error {
67574
- constructor(error) {
67575
- super(describeRouteTemplateParseError(error));
67576
- this.name = "InvalidRouteTemplateError";
67577
- this.error = error;
67578
- }
67579
- };
67580
- function safeParseRouteTemplate(routePattern) {
67581
- if (routePattern === null || routePattern === "") {
67582
- return {
67583
- success: true,
67584
- routeTemplate: { kind: "fallback-slug" }
67585
- };
67586
- }
67587
- const segments = splitRouteSegments(routePattern);
67588
- const slugSegmentIndices = segments.flatMap(
67589
- (segment, index) => segment === ROUTE_TEMPLATE_SLUG_SEGMENT ? [index] : []
67590
- );
67591
- if (slugSegmentIndices.length > 1) {
67592
- return {
67593
- success: false,
67594
- error: {
67595
- code: "multiple-slug-segments",
67596
- routePattern,
67597
- segment: ROUTE_TEMPLATE_SLUG_SEGMENT
67598
- }
67599
- };
67600
- }
67601
- const invalidSegment = segments.find(
67602
- (segment) => segment !== ROUTE_TEMPLATE_SLUG_SEGMENT && isUnsupportedDynamicSegment(segment)
67603
- );
67604
- if (invalidSegment) {
67605
- return {
67606
- success: false,
67607
- error: {
67608
- code: invalidSegment.startsWith(":") ? "legacy-dynamic-segment" : "unsupported-dynamic-segment",
67609
- routePattern,
67610
- segment: invalidSegment
67611
- }
67612
- };
67613
- }
67614
- if (slugSegmentIndices.length === 1) {
67615
- const [prefix = "", suffix = ""] = routePattern.split(ROUTE_TEMPLATE_SLUG_SEGMENT);
67616
- const slugIndex = slugSegmentIndices[0] ?? 0;
67617
- return {
67618
- success: true,
67619
- routeTemplate: {
67620
- kind: "slug-template",
67621
- routePattern,
67622
- prefix,
67623
- suffix,
67624
- prefixSegments: segments.slice(0, slugIndex),
67625
- suffixSegments: segments.slice(slugIndex + 1)
67626
- }
67627
- };
67628
- }
67629
- return {
67630
- success: true,
67631
- routeTemplate: {
67632
- kind: "fixed-path",
67633
- routePattern,
67634
- path: routePattern
67635
- }
67636
- };
67637
- }
67638
- function parseRouteTemplate(routePattern) {
67639
- const result = safeParseRouteTemplate(routePattern);
67640
- if (result.success) {
67641
- return result.routeTemplate;
67642
- }
67643
- throw new InvalidRouteTemplateError(result.error);
67644
- }
67645
- function describeRouteTemplateParseError(error) {
67646
- switch (error.code) {
67647
- case "legacy-dynamic-segment":
67648
- return `Route pattern "${error.routePattern}" uses unsupported dynamic segment "${error.segment ?? ":slug"}". Use "${ROUTE_TEMPLATE_SLUG_SEGMENT}" as a full path segment.`;
67649
- case "multiple-slug-segments":
67650
- return `Route pattern "${error.routePattern}" must not contain "${ROUTE_TEMPLATE_SLUG_SEGMENT}" more than once.`;
67651
- case "unsupported-dynamic-segment":
67652
- return `Route pattern "${error.routePattern}" contains unsupported dynamic segment "${error.segment ?? ""}". Route patterns may only use "${ROUTE_TEMPLATE_SLUG_SEGMENT}" as a full path segment.`;
67653
- }
67654
- }
67655
- function splitRouteSegments(routePattern) {
67656
- return routePattern.split("/").filter((segment) => segment.length > 0);
67657
- }
67658
- function isUnsupportedDynamicSegment(segment) {
67659
- return segment.startsWith(":") || segment.includes("{") || segment.includes("}");
67660
- }
67661
-
67662
69433
  // src/routing/contentTypeResolver.ts
67663
69434
  function toRoutingInfo(ct) {
67664
69435
  return {
@@ -68572,7 +70343,7 @@ var CircuitOpenError = class extends Error {
68572
70343
  };
68573
70344
 
68574
70345
  // src/version.ts
68575
- var SDK_VERSION = "0.82.0";
70346
+ var SDK_VERSION = "0.84.1";
68576
70347
 
68577
70348
  // src/next/content-load-failure.ts
68578
70349
  var SdkContentLoadError = RiverbankContentLoadError;