@riverbankcms/sdk 0.82.0 → 0.84.0

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 (194) hide show
  1. package/README.md +16 -0
  2. package/dist/{PreviewEditorSidebar-LHGK6RIO.mjs → PreviewEditorSidebar-HML67UDA.mjs} +330 -11
  3. package/dist/{PreviewEditorUI-AXZG2SDC.mjs → PreviewEditorUI-I4BQUU6K.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-MCKMVDTK.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/event-registration.headless.state.d.ts +303 -0
  51. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +20 -1
  52. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +4 -3
  53. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +1 -1
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +26 -6
  55. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/pricing.d.ts +14 -0
  56. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +1 -1
  57. package/dist/_dts/content-editor/src/controller/buildBlockPublishedBaselines.d.ts +1 -1
  58. package/dist/_dts/content-editor/src/controller/seedDraftBaselinesFromBlocks.d.ts +1 -1
  59. package/dist/_dts/content-editor/src/controller/useBlocksList.d.ts +1 -1
  60. package/dist/_dts/content-editor/src/controller/useInvalidBlockRecovery.d.ts +1 -1
  61. package/dist/_dts/content-editor/src/primitives/PreviewRichTextEditor.d.ts +2 -1
  62. package/dist/_dts/content-editor/src/primitives/PreviewTextEditor.d.ts +1 -0
  63. package/dist/_dts/content-model/src/entry-slots/index.d.ts +1 -0
  64. package/dist/_dts/content-model/src/entry-slots/types.d.ts +356 -0
  65. package/dist/_dts/content-model/src/index.d.ts +1 -0
  66. package/dist/_dts/content-model/src/templates/defaults.d.ts +7 -0
  67. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +100 -5
  68. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +6 -1
  69. package/dist/_dts/editor-blocks/src/BlockForm.d.ts +1 -1
  70. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockCreation.d.ts +3 -2
  71. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockDuplication.d.ts +3 -2
  72. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockReorder.d.ts +3 -2
  73. package/dist/_dts/editor-blocks/src/block-editor/owner.d.ts +27 -0
  74. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  75. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +8 -0
  76. package/dist/_dts/media-core/src/mediaUsageProjection.d.ts +37 -3
  77. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +4 -2
  78. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  79. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +3 -1
  80. package/dist/_dts/preview-next/src/client/preview/EntrySlotBlockEditorPanel.d.ts +19 -0
  81. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +8 -0
  82. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -1
  83. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +1 -1
  84. package/dist/_dts/preview-next/src/client/preview/linkedEntryEditEvents.d.ts +9 -0
  85. package/dist/_dts/preview-next/src/client/preview/previewCustomizeControls.d.ts +9 -8
  86. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +10 -1
  87. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +5 -1
  88. package/dist/_dts/sdk/src/bookings/index.d.ts +5 -4
  89. package/dist/_dts/sdk/src/bookings/types.d.ts +2 -2
  90. package/dist/_dts/sdk/src/cli/content/reader.d.ts +9 -8
  91. package/dist/_dts/sdk/src/cli/content/writer.d.ts +6 -1
  92. package/dist/_dts/sdk/src/cli/helpers.d.ts +10 -5
  93. package/dist/_dts/sdk/src/cli/merge-remote/entryLocal.d.ts +2 -2
  94. package/dist/_dts/sdk/src/cli/merge-remote/entryMerge.d.ts +2 -1
  95. package/dist/_dts/sdk/src/cli/merge-remote/entrySnapshots.d.ts +2 -2
  96. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -1
  97. package/dist/_dts/sdk/src/client/management/types.d.ts +40 -10
  98. package/dist/_dts/sdk/src/config/field-definitions.d.ts +13 -7
  99. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +26 -3
  100. package/dist/_dts/sdk/src/public-api/contracts.d.ts +13 -0
  101. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +1 -0
  102. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +6 -1
  103. package/dist/_dts/sdk/src/rendering/overrides.d.ts +6 -1
  104. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  105. package/dist/_dts/sdk/src/version.d.ts +1 -1
  106. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  107. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  108. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  109. package/dist/_dts/theme-core/src/buttons/personalities/ornate-ritual.d.ts +16 -0
  110. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +1 -1
  111. package/dist/_dts/theme-core/src/buttons/types.d.ts +3 -3
  112. package/dist/_dts/theme-core/src/cards/types.d.ts +15 -15
  113. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  114. package/dist/_dts/theme-core/src/inputs/types.d.ts +1 -1
  115. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +33 -33
  116. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  117. package/dist/_dts/theme-core/src/palette/variants/warm-dark.d.ts +16 -0
  118. package/dist/_dts/theme-core/src/schema.d.ts +30 -25
  119. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  120. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +141 -1
  121. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -0
  122. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +110 -5
  123. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  124. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  125. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +5 -1
  126. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +1 -1
  127. package/dist/_dts/theme-core/src/site-styles/types.d.ts +1 -1
  128. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +16 -1
  129. package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +1 -0
  130. package/dist/_dts/theme-core/src/utils/colorStyles.d.ts +6 -6
  131. package/dist/{chunk-2BUMISSH.mjs → chunk-3LXFQS7T.mjs} +1 -1
  132. package/dist/{chunk-G35HOQEN.mjs → chunk-5E33VO6J.mjs} +132 -46
  133. package/dist/{chunk-HKB6XVIP.mjs → chunk-6X2OVO3S.mjs} +2 -2
  134. package/dist/{chunk-6FWNF3DJ.mjs → chunk-HFMGVJCE.mjs} +158 -20
  135. package/dist/{chunk-FIREV57T.mjs → chunk-LBBPD2IW.mjs} +40 -0
  136. package/dist/{chunk-XQR6THQJ.mjs → chunk-MSHZO4SL.mjs} +3193 -1216
  137. package/dist/cli/index.mjs +2635 -575
  138. package/dist/cli/init-docs/content/getting-started.md +2 -0
  139. package/dist/cli/init-docs/content/workflow-templates.md +93 -2
  140. package/dist/client/{accordion-G34C45TW.mjs → accordion-ESY65T56.mjs} +2 -2
  141. package/dist/client/{bookingForm-BLBVKSAQ.mjs → bookingForm-JRFNZUHD.mjs} +5 -5
  142. package/dist/client/bookings.mjs +3539 -269
  143. package/dist/client/{carousel-7ZVTBRMD.mjs → carousel-CPR5VWIP.mjs} +3 -3
  144. package/dist/client/{cart-Q6S6LZUO.mjs → cart-ZUX5BA7O.mjs} +6 -6
  145. package/dist/client/{checkout-5QJLDE4I.mjs → checkout-RULGBADZ.mjs} +6 -6
  146. package/dist/client/{chunk-CHAB5ACD.mjs → chunk-52I7BGEK.mjs} +2 -2
  147. package/dist/client/{chunk-CSZGLBYR.mjs → chunk-5ZEAZ33K.mjs} +1 -1
  148. package/dist/client/{chunk-ZF4XEWDM.mjs → chunk-BT6AEIKN.mjs} +1 -1
  149. package/dist/client/{chunk-RJHTCTCZ.mjs → chunk-HXPWP5EN.mjs} +268 -15
  150. package/dist/client/{chunk-5PQH4Y75.mjs → chunk-JWEYB4V6.mjs} +2 -2
  151. package/dist/client/{chunk-EQKYMX4N.mjs → chunk-RDJFCPY3.mjs} +158 -51
  152. package/dist/client/{chunk-SBBSMFFG.mjs → chunk-SYIJ5JO2.mjs} +1 -1
  153. package/dist/client/{chunk-WJFHDTYF.mjs → chunk-URQCZD5W.mjs} +5 -5
  154. package/dist/client/{chunk-U2EW7RSR.mjs → chunk-Z5OBQ5I4.mjs} +1 -1
  155. package/dist/client/{chunk-S3MKFGOG.mjs → chunk-ZE5G642V.mjs} +1 -1
  156. package/dist/client/client.mjs +2391 -673
  157. package/dist/client/{courseRegistration-VUG2JJDB.mjs → courseRegistration-QTUDC35T.mjs} +5 -5
  158. package/dist/client/{eventCalendar-E7D2LD4N.mjs → eventCalendar-Q7NS4XLD.mjs} +7 -7
  159. package/dist/client/{eventCombined-FUZ2Z3CS.mjs → eventCombined-QAO7VUO5.mjs} +7 -7
  160. package/dist/client/{eventDetails-QRITJAOW.mjs → eventDetails-WTNNU6Q3.mjs} +7 -7
  161. package/dist/client/{eventListing-INMQMJZ5.mjs → eventListing-5TA2ELDT.mjs} +7 -7
  162. package/dist/client/{eventRegistration-TOOJD4WU.mjs → eventRegistration-M6USZGRF.mjs} +7 -7
  163. package/dist/client/{form-BOWN7ZNQ.mjs → form-DGVGXLMH.mjs} +2 -2
  164. package/dist/client/{headerSection-HFQNZOUU.mjs → headerSection-O2AGMPCU.mjs} +3 -3
  165. package/dist/client/hooks.mjs +1636 -385
  166. package/dist/client/{locationMap-VUZGC7Y5.mjs → locationMap-EJRNRIKJ.mjs} +2 -2
  167. package/dist/client/{newsletterForm-X2XQTPCB.mjs → newsletterForm-7NTC2DTR.mjs} +2 -2
  168. package/dist/client/{productDetail-TA7D2G2B.mjs → productDetail-HH4LP53D.mjs} +6 -6
  169. package/dist/client/{productList-AZOLOZKM.mjs → productList-YVHYM2AF.mjs} +6 -6
  170. package/dist/client/rendering/client.mjs +2303 -1068
  171. package/dist/client/rendering/islands.mjs +19 -19
  172. package/dist/client/rendering.mjs +2587 -796
  173. package/dist/client/{shop-ZDLO7IIG.mjs → shop-UIFX7XRK.mjs} +6 -6
  174. package/dist/preview-next/before-render.mjs +40 -0
  175. package/dist/preview-next/client/runtime.mjs +5 -5
  176. package/dist/preview-next/middleware.mjs +40 -0
  177. package/dist/{sdk-runtime-CTWKNBDQ.mjs → sdk-runtime-ZENAOYMN.mjs} +6 -6
  178. package/dist/server/components.mjs +2028 -457
  179. package/dist/server/config-validation.mjs +1629 -377
  180. package/dist/server/config.mjs +1629 -377
  181. package/dist/server/data.mjs +1636 -385
  182. package/dist/server/index.mjs +42 -1
  183. package/dist/server/next.mjs +2215 -571
  184. package/dist/server/page-converter.mjs +2068 -884
  185. package/dist/server/prebuild.mjs +1 -1
  186. package/dist/server/rendering/server.mjs +2040 -469
  187. package/dist/server/rendering.mjs +2119 -475
  188. package/dist/server/routing.mjs +1711 -419
  189. package/dist/server/server.mjs +1718 -394
  190. package/dist/server/theme-bridge.mjs +1180 -101
  191. package/dist/server/theme.mjs +92 -1
  192. package/dist/styles/index.css +292 -36
  193. package/package.json +1 -1
  194. package/dist/SdkPreviewModeRuntime-RNVRHFFR.mjs +0 -8
@@ -3298,6 +3298,46 @@ var ENDPOINT_DEFINITIONS = {
3298
3298
  auth: "user",
3299
3299
  responseKind: "json"
3300
3300
  },
3301
+ listEntrySlotBlocks: {
3302
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3303
+ method: "GET",
3304
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3305
+ auth: "user",
3306
+ responseKind: "json",
3307
+ errors: ["resource:not_found"]
3308
+ },
3309
+ listEntryPageContentSlots: {
3310
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots",
3311
+ method: "GET",
3312
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slots", "blocks"],
3313
+ auth: "user",
3314
+ responseKind: "json",
3315
+ errors: ["resource:not_found"]
3316
+ },
3317
+ createEntrySlotBlock: {
3318
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3319
+ method: "POST",
3320
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3321
+ auth: "user",
3322
+ responseKind: "json",
3323
+ errors: ["validation:invalid_input", "resource:not_found"]
3324
+ },
3325
+ reorderEntrySlotBlocks: {
3326
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/reorder",
3327
+ method: "POST",
3328
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3329
+ auth: "user",
3330
+ responseKind: "json",
3331
+ errors: ["validation:invalid_input", "resource:not_found"]
3332
+ },
3333
+ deleteEntrySlotBlock: {
3334
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/{blockId}",
3335
+ method: "DELETE",
3336
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3337
+ auth: "user",
3338
+ responseKind: "json",
3339
+ errors: ["resource:not_found"]
3340
+ },
3301
3341
  createBlock: {
3302
3342
  path: "/sites/{siteId}/pages/{pageId}/blocks",
3303
3343
  method: "POST",
@@ -6959,7 +6999,7 @@ var SimpleCache = class {
6959
6999
  };
6960
7000
 
6961
7001
  // src/version.ts
6962
- var SDK_VERSION = "0.82.0";
7002
+ var SDK_VERSION = "0.84.0";
6963
7003
 
6964
7004
  // src/client/error.ts
6965
7005
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -8882,6 +8922,21 @@ var selectSourceSchema = z4.discriminatedUnion("kind", [
8882
8922
  function assertNeverSelectSource(value) {
8883
8923
  throw new Error(`Unhandled select source: ${JSON.stringify(value)}`);
8884
8924
  }
8925
+ var visibleWhenPredicateSchema = z4.object({
8926
+ field: z4.string().min(1),
8927
+ equals: z4.any().optional(),
8928
+ notEquals: z4.any().optional(),
8929
+ oneOf: z4.array(z4.any()).optional(),
8930
+ notIn: z4.array(z4.any()).optional(),
8931
+ minItems: z4.number().int().nonnegative().optional(),
8932
+ maxItems: z4.number().int().nonnegative().optional()
8933
+ });
8934
+ var visibleWhenSchema = z4.union([
8935
+ visibleWhenPredicateSchema,
8936
+ z4.object({
8937
+ allOf: z4.array(visibleWhenPredicateSchema).min(1)
8938
+ })
8939
+ ]);
8885
8940
  var uiSchema = z4.object({
8886
8941
  widget: z4.string().optional(),
8887
8942
  // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)
@@ -8914,13 +8969,7 @@ var uiSchema = z4.object({
8914
8969
  showValue: z4.boolean().optional(),
8915
8970
  pattern: z4.string().optional(),
8916
8971
  placeholder: z4.string().optional(),
8917
- visibleWhen: z4.object({
8918
- field: z4.string().min(1),
8919
- equals: z4.any().optional(),
8920
- notEquals: z4.any().optional(),
8921
- oneOf: z4.array(z4.any()).optional(),
8922
- notIn: z4.array(z4.any()).optional()
8923
- }).optional(),
8972
+ visibleWhen: visibleWhenSchema.optional(),
8924
8973
  // Modal configuration for modal and group fields
8925
8974
  modalConfig: z4.object({
8926
8975
  buttonLabel: z4.string().optional(),
@@ -9687,6 +9736,7 @@ var eventListTreatmentValues = [
9687
9736
  ];
9688
9737
  var eyebrowTreatmentValues = [
9689
9738
  "plain",
9739
+ "accent",
9690
9740
  "pill",
9691
9741
  "accent-pill",
9692
9742
  "pill-bounce",
@@ -11278,9 +11328,9 @@ var _Vibrant = class _Vibrant2 {
11278
11328
  }
11279
11329
  image.remove();
11280
11330
  return res;
11281
- } catch (err) {
11331
+ } catch (err2) {
11282
11332
  image.remove();
11283
- return Promise.reject(err);
11333
+ return Promise.reject(err2);
11284
11334
  }
11285
11335
  }
11286
11336
  async getPalettes() {
@@ -11294,9 +11344,9 @@ var _Vibrant = class _Vibrant2 {
11294
11344
  const res = result1.palettes;
11295
11345
  image.remove();
11296
11346
  return res;
11297
- } catch (err) {
11347
+ } catch (err2) {
11298
11348
  image.remove();
11299
- return Promise.reject(err);
11349
+ return Promise.reject(err2);
11300
11350
  }
11301
11351
  }
11302
11352
  };
@@ -12701,6 +12751,95 @@ var joyStamp = defineButtonPersonality({
12701
12751
  }
12702
12752
  });
12703
12753
 
12754
+ // ../theme-core/src/buttons/personalities/ornate-ritual.ts
12755
+ var ornateRitual = defineButtonPersonality({
12756
+ id: "ornate-ritual",
12757
+ name: "Ornate Ritual",
12758
+ description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
12759
+ tags: { tone: "classic", energy: "vibrant", motion: "subtle", era: "organic" },
12760
+ buttonSystem: {
12761
+ global: {
12762
+ cornerStyle: "rounded",
12763
+ shadow: "none",
12764
+ textTransform: "uppercase",
12765
+ fontWeight: 600,
12766
+ borderWidth: 1,
12767
+ hoverTransform: "none",
12768
+ hoverColor: "none",
12769
+ letterSpacing: "loose"
12770
+ },
12771
+ sizes: {
12772
+ sm: { padding: "0.5625rem 1.25rem", fontSize: "text-xs" },
12773
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-xs" },
12774
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-sm" },
12775
+ xl: { padding: "1rem 2.75rem", fontSize: "text-base" }
12776
+ },
12777
+ variants: [
12778
+ {
12779
+ id: "primary",
12780
+ name: "Primary",
12781
+ enabled: true,
12782
+ priority: 1,
12783
+ background: { type: "solid", colorToken: "primary" },
12784
+ textColorToken: "primaryForeground",
12785
+ borderRadius: "rounded-md",
12786
+ border: { widthClass: "border", colorToken: "primary" },
12787
+ shadow: { elevation: "none", softness: null, position: "bottom" },
12788
+ effects: {
12789
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "primary-100" } }],
12790
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
12791
+ }
12792
+ },
12793
+ {
12794
+ id: "secondary",
12795
+ name: "Secondary",
12796
+ enabled: true,
12797
+ priority: 2,
12798
+ background: { type: "solid", colorToken: "secondary" },
12799
+ textColorToken: "primaryForeground",
12800
+ borderRadius: "rounded-md",
12801
+ border: { widthClass: "border", colorToken: "primary" },
12802
+ shadow: { elevation: "none", softness: null, position: "bottom" },
12803
+ effects: {
12804
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
12805
+ }
12806
+ },
12807
+ {
12808
+ id: "outline",
12809
+ name: "Outline",
12810
+ enabled: true,
12811
+ priority: 3,
12812
+ background: { type: "transparent" },
12813
+ textColorToken: "primary",
12814
+ borderRadius: "rounded-md",
12815
+ border: { widthClass: "border", colorToken: "primary" },
12816
+ shadow: { elevation: "none", softness: null, position: "bottom" },
12817
+ effects: {
12818
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
12819
+ }
12820
+ },
12821
+ {
12822
+ id: "ghost",
12823
+ name: "Ghost",
12824
+ enabled: true,
12825
+ priority: 3,
12826
+ background: { type: "transparent" },
12827
+ textColorToken: "accent",
12828
+ borderRadius: "rounded-none",
12829
+ sizes: {
12830
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
12831
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
12832
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
12833
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
12834
+ },
12835
+ effects: {
12836
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
12837
+ }
12838
+ }
12839
+ ]
12840
+ }
12841
+ });
12842
+
12704
12843
  // ../theme-core/src/buttons/personalities/pebble.ts
12705
12844
  var pebble = defineButtonPersonality({
12706
12845
  id: "pebble",
@@ -12974,7 +13113,8 @@ var buttonPersonalities = [
12974
13113
  inkStamp,
12975
13114
  brushedWash,
12976
13115
  showtimePill,
12977
- joyStamp
13116
+ joyStamp,
13117
+ ornateRitual
12978
13118
  ];
12979
13119
  var personalitiesById = new Map(
12980
13120
  buttonPersonalities.map((p) => [p.id, p])
@@ -13604,7 +13744,7 @@ function rgbColorValue(token) {
13604
13744
  if (alpha === void 0) {
13605
13745
  return `rgb(var(${cssVar}))`;
13606
13746
  }
13607
- return `rgba(var(${cssVar}), ${alpha})`;
13747
+ return `rgb(var(${cssVar}) / ${alpha})`;
13608
13748
  }
13609
13749
  function backgroundColorStyle(token) {
13610
13750
  return { backgroundColor: rgbColorValue(token) };
@@ -14709,6 +14849,28 @@ var warmDarkEmber = definePaletteVariant({
14709
14849
  { name: "border", hex: "#894e31" }
14710
14850
  ]
14711
14851
  });
14852
+ var warmDarkKirtanGold = definePaletteVariant({
14853
+ id: "warm-dark-kirtan-gold",
14854
+ name: "Warm Dark \u2014 Kirtan Gold",
14855
+ description: "Deep plum ground with pale gold primary, rose accent, and soft devotional text.",
14856
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
14857
+ mode: "dark",
14858
+ colors: [
14859
+ { name: "primary", hex: "#ffcdb2" },
14860
+ { name: "secondary", hex: "#b5838d" },
14861
+ { name: "accent", hex: "#e5989b" },
14862
+ { name: "success", hex: "#8fbf8f" },
14863
+ { name: "warning", hex: "#f2b86b" },
14864
+ { name: "destructive", hex: "#d96b6b" },
14865
+ { name: "background", hex: "#403944" },
14866
+ { name: "surface", hex: "#403944" },
14867
+ { name: "surfaceAlt", hex: "#372f3b" },
14868
+ { name: "muted", hex: "#4d4550" },
14869
+ { name: "text", hex: "#e6d2d5" },
14870
+ { name: "primaryForeground", hex: "#403944" },
14871
+ { name: "border", hex: "#8d747a" }
14872
+ ]
14873
+ });
14712
14874
 
14713
14875
  // ../theme-core/src/palette/variants/index.ts
14714
14876
  var paletteVariants = [
@@ -14732,7 +14894,8 @@ var paletteVariants = [
14732
14894
  softNaturalWatercolor,
14733
14895
  softNaturalLilac,
14734
14896
  // Warm-dark family (dark mode)
14735
- warmDarkEmber
14897
+ warmDarkEmber,
14898
+ warmDarkKirtanGold
14736
14899
  ];
14737
14900
  var paletteVariantsById = new Map(
14738
14901
  paletteVariants.map((v) => [v.id, v])
@@ -16301,9 +16464,125 @@ function headerConfigurationKey(configuration) {
16301
16464
  function asFooterLookId(value) {
16302
16465
  return value;
16303
16466
  }
16304
- var guaranteedFallbackFooterLookId = asFooterLookId("footer-muted-grounding");
16467
+ function asFooterLayoutId(value) {
16468
+ return value;
16469
+ }
16470
+ function asFooterStyleId(value) {
16471
+ return value;
16472
+ }
16473
+ var guaranteedFallbackFooterLookId = asFooterLookId("footer-identity-quiet");
16474
+ var footerLayoutCatalog = defineExactCatalog()([
16475
+ {
16476
+ id: asFooterLayoutId("identity"),
16477
+ label: "Identity",
16478
+ description: "Logo, site text, address, and legal copy without relying on footer navigation."
16479
+ },
16480
+ {
16481
+ id: asFooterLayoutId("centered"),
16482
+ label: "Centered",
16483
+ description: "A calm centered stack for identity, short copy, and optional compact navigation.",
16484
+ maxRecommendedNavDensity: "sparse"
16485
+ },
16486
+ {
16487
+ id: asFooterLayoutId("split"),
16488
+ label: "Split",
16489
+ description: "Navigation and brand signoff separated into a wider split footer.",
16490
+ requiresFooterNav: true,
16491
+ maxRecommendedNavDensity: "balanced"
16492
+ },
16493
+ {
16494
+ id: asFooterLayoutId("columns"),
16495
+ label: "Columns",
16496
+ description: "Grouped footer navigation columns with a supporting bottom line.",
16497
+ requiresFooterNav: true,
16498
+ requiresFooterNavGroups: true
16499
+ }
16500
+ ]);
16501
+ var footerStyleCatalog = defineExactCatalog()([
16502
+ {
16503
+ id: asFooterStyleId("quiet"),
16504
+ label: "Quiet",
16505
+ description: "Lightweight, practical footer treatment."
16506
+ },
16507
+ {
16508
+ id: asFooterStyleId("calm"),
16509
+ label: "Calm",
16510
+ description: "Soft centered treatment with restrained dividers."
16511
+ },
16512
+ {
16513
+ id: asFooterStyleId("editorial"),
16514
+ label: "Editorial",
16515
+ description: "Text-forward treatment with fine-line structure."
16516
+ },
16517
+ {
16518
+ id: asFooterStyleId("brand-band"),
16519
+ label: "Brand band",
16520
+ description: "High-contrast brand treatment with a stronger bottom bar."
16521
+ }
16522
+ ]);
16523
+ var footerLayoutsById = new Map(
16524
+ footerLayoutCatalog.map((layout) => [layout.id, layout])
16525
+ );
16526
+ var footerStylesById = new Map(
16527
+ footerStyleCatalog.map((style) => [style.id, style])
16528
+ );
16529
+ function identityQuietFooter(theme) {
16530
+ return {
16531
+ ...theme.footer,
16532
+ variant: "simple",
16533
+ maxWidth: "container",
16534
+ background: {
16535
+ type: "color",
16536
+ color: "surface"
16537
+ },
16538
+ navStyle: "minimal",
16539
+ navWeight: "regular",
16540
+ navColor: "text",
16541
+ navLinkStyle: {
16542
+ typography: "body",
16543
+ fontWeight: "regular",
16544
+ textTransform: "none",
16545
+ italic: false,
16546
+ colorToken: "text",
16547
+ hoverColorToken: "primary",
16548
+ padding: "none",
16549
+ borderRadius: "none"
16550
+ },
16551
+ navLayout: {
16552
+ layout: "inline-wrap",
16553
+ align: "start",
16554
+ gapX: "default",
16555
+ gapY: "tight"
16556
+ },
16557
+ logo: {
16558
+ showLogo: true,
16559
+ showLogoText: true,
16560
+ placement: "left",
16561
+ size: "sm",
16562
+ align: "start"
16563
+ },
16564
+ bottomBar: {
16565
+ enabled: false,
16566
+ fullBleed: false,
16567
+ textAlign: "left",
16568
+ paddingX: "default",
16569
+ paddingY: "compact",
16570
+ borderTop: {
16571
+ width: "none"
16572
+ }
16573
+ }
16574
+ };
16575
+ }
16305
16576
  function mutedGroundingFooter(theme) {
16306
- return theme.footer;
16577
+ return {
16578
+ ...identityQuietFooter(theme),
16579
+ background: theme.footer.background,
16580
+ navStyle: theme.footer.navStyle,
16581
+ navColor: theme.footer.navColor,
16582
+ navWeight: theme.footer.navWeight,
16583
+ navLinkStyle: theme.footer.navLinkStyle,
16584
+ bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
16585
+ };
16307
16586
  }
16308
16587
  function brandTwoBandFooter(theme) {
16309
16588
  return {
@@ -16408,6 +16687,53 @@ function centeredCalmFooter(theme) {
16408
16687
  }
16409
16688
  };
16410
16689
  }
16690
+ function splitEditorialFooter(theme) {
16691
+ return {
16692
+ ...theme.footer,
16693
+ variant: "split",
16694
+ maxWidth: "container",
16695
+ background: {
16696
+ type: "color",
16697
+ color: "surface"
16698
+ },
16699
+ navStyle: "minimal",
16700
+ navWeight: "regular",
16701
+ navColor: "text",
16702
+ navLinkStyle: {
16703
+ typography: "body",
16704
+ fontWeight: "regular",
16705
+ textTransform: "none",
16706
+ italic: false,
16707
+ colorToken: "text",
16708
+ hoverColorToken: "primary",
16709
+ padding: "none",
16710
+ borderRadius: "none"
16711
+ },
16712
+ navLayout: {
16713
+ layout: "inline-wrap",
16714
+ align: "start",
16715
+ gapX: "relaxed",
16716
+ gapY: "tight"
16717
+ },
16718
+ logo: {
16719
+ showLogo: true,
16720
+ showLogoText: true,
16721
+ placement: "right",
16722
+ size: "sm",
16723
+ align: "end"
16724
+ },
16725
+ bottomBar: {
16726
+ enabled: true,
16727
+ fullBleed: false,
16728
+ textAlign: "left",
16729
+ paddingX: "default",
16730
+ paddingY: "compact",
16731
+ borderTop: {
16732
+ width: "thin"
16733
+ }
16734
+ }
16735
+ };
16736
+ }
16411
16737
  function editorialColumnsFooter(theme) {
16412
16738
  return {
16413
16739
  ...theme.footer,
@@ -16450,25 +16776,47 @@ function editorialColumnsFooter(theme) {
16450
16776
  };
16451
16777
  }
16452
16778
  var footerLookCatalog = defineExactCatalog()([
16779
+ {
16780
+ id: asFooterLookId("footer-identity-quiet"),
16781
+ label: "Identity footer",
16782
+ layoutId: asFooterLayoutId("identity"),
16783
+ styleId: asFooterStyleId("quiet"),
16784
+ compile: identityQuietFooter
16785
+ },
16453
16786
  {
16454
16787
  id: asFooterLookId("footer-muted-grounding"),
16455
16788
  label: "Muted grounding footer",
16789
+ layoutId: asFooterLayoutId("identity"),
16790
+ styleId: asFooterStyleId("quiet"),
16791
+ hiddenFromLayoutStyleControls: true,
16456
16792
  compile: mutedGroundingFooter
16457
16793
  },
16458
16794
  {
16459
16795
  id: asFooterLookId("footer-centered-calm"),
16460
16796
  label: "Centered calm footer",
16797
+ layoutId: asFooterLayoutId("centered"),
16798
+ styleId: asFooterStyleId("calm"),
16461
16799
  compile: centeredCalmFooter
16462
16800
  },
16801
+ {
16802
+ id: asFooterLookId("footer-split-editorial"),
16803
+ label: "Split editorial footer",
16804
+ layoutId: asFooterLayoutId("split"),
16805
+ styleId: asFooterStyleId("editorial"),
16806
+ compile: splitEditorialFooter
16807
+ },
16463
16808
  {
16464
16809
  id: asFooterLookId("footer-editorial-columns"),
16465
16810
  label: "Editorial columns footer",
16811
+ layoutId: asFooterLayoutId("columns"),
16812
+ styleId: asFooterStyleId("editorial"),
16466
16813
  compile: editorialColumnsFooter
16467
16814
  },
16468
16815
  {
16469
16816
  id: asFooterLookId("site-footer-brand-two-band"),
16470
16817
  label: "Two-band brand footer",
16471
- maxRecommendedNavDensity: "balanced",
16818
+ layoutId: asFooterLayoutId("split"),
16819
+ styleId: asFooterStyleId("brand-band"),
16472
16820
  allowedContentPresence: ["default-footer", "default-and-blocks"],
16473
16821
  compile: brandTwoBandFooter
16474
16822
  }
@@ -16671,6 +17019,30 @@ var luxeContrastTypography = {
16671
17019
  },
16672
17020
  scale: "spacious"
16673
17021
  };
17022
+ var kirtanOrnateTypography = {
17023
+ body: {
17024
+ family: "Jost, system-ui, sans-serif",
17025
+ size: "md",
17026
+ weight: "regular",
17027
+ lineHeight: "relaxed",
17028
+ letterSpacing: "normal"
17029
+ },
17030
+ headings: {
17031
+ default: {
17032
+ family: "Marcellus, Georgia, serif",
17033
+ weight: "regular",
17034
+ lineHeight: "normal",
17035
+ letterSpacing: "normal",
17036
+ colorToken: "primary",
17037
+ italic: null,
17038
+ case: null
17039
+ },
17040
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
17041
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
17042
+ h3: { size: "md", weight: "regular", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
17043
+ },
17044
+ scale: "spacious"
17045
+ };
16674
17046
  var boldDisplayTypography = {
16675
17047
  body: {
16676
17048
  family: "Manrope, system-ui, sans-serif",
@@ -16705,16 +17077,16 @@ var originalJoyTypography = {
16705
17077
  },
16706
17078
  headings: {
16707
17079
  default: {
16708
- family: "Bricolage Grotesque, system-ui, sans-serif",
16709
- weight: "bold",
17080
+ family: "Lobster, cursive",
17081
+ weight: "regular",
16710
17082
  lineHeight: "normal",
16711
- letterSpacing: "tight",
17083
+ letterSpacing: "normal",
16712
17084
  italic: null,
16713
17085
  case: null
16714
17086
  },
16715
- h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
16716
- h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
16717
- h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
17087
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
17088
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
17089
+ h3: { size: "lg", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null }
16718
17090
  },
16719
17091
  scale: "balanced"
16720
17092
  };
@@ -16779,6 +17151,32 @@ var typographyPresets = [
16779
17151
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
16780
17152
  typography: luxeContrastTypography
16781
17153
  }),
17154
+ defineTypographyPreset({
17155
+ id: "typography-preset:kirtan-ornate",
17156
+ name: "Kirtan Ornate",
17157
+ description: "Marcellus devotional headings over a refined Jost body, matching dark ceremonial layouts.",
17158
+ defaultFonts: { body: "Jost, system-ui, sans-serif", heading: "Marcellus, Georgia, serif" },
17159
+ recommendedFonts: {
17160
+ body: ["Jost", "Manrope", "Inter"],
17161
+ heading: ["Marcellus", "Cormorant Garamond", "Playfair Display"]
17162
+ },
17163
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
17164
+ typography: kirtanOrnateTypography,
17165
+ heroTypography: {
17166
+ headlineSize: "6xl",
17167
+ headlineLineHeight: "normal",
17168
+ subheadlineSize: "xl",
17169
+ subheadlineLineHeight: "relaxed",
17170
+ microHeadlineSize: "5xl",
17171
+ microHeadlineLineHeight: "normal",
17172
+ microSubheadlineSize: "lg",
17173
+ microSubheadlineLineHeight: "relaxed",
17174
+ responsive: {
17175
+ tablet: { headlineSize: "5xl" },
17176
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
17177
+ }
17178
+ }
17179
+ }),
16782
17180
  defineTypographyPreset({
16783
17181
  id: "typography-preset:bold-display",
16784
17182
  name: "Bold Display",
@@ -16808,11 +17206,11 @@ var typographyPresets = [
16808
17206
  defineTypographyPreset({
16809
17207
  id: "typography-preset:original-joy",
16810
17208
  name: "Original Joy",
16811
- description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
16812
- defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
17209
+ description: "Lobster display headings over a clean DM Sans body, expressive and warm.",
17210
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Lobster, cursive" },
16813
17211
  recommendedFonts: {
16814
17212
  body: ["DM Sans", "Inter", "Manrope"],
16815
- heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
17213
+ heading: ["Lobster", "Bricolage Grotesque", "Space Grotesk"]
16816
17214
  },
16817
17215
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
16818
17216
  typography: originalJoyTypography,
@@ -16836,6 +17234,319 @@ var typographyPresetsById = new Map(
16836
17234
  typographyPresets.map((preset2) => [preset2.id, preset2])
16837
17235
  );
16838
17236
 
17237
+ // ../theme-core/src/site-styles/designState.ts
17238
+ import { z as z24 } from "zod";
17239
+ var themeV2DesignStateSchemaVersion = 1;
17240
+ var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
17241
+ var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
17242
+ var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
17243
+ fields3[0],
17244
+ ...fields3.slice(1)
17245
+ ]);
17246
+ var heroLegibilityStrategySchema = z24.enum([
17247
+ "none",
17248
+ "scrim-gradient",
17249
+ "solid-panel"
17250
+ ]);
17251
+ var heroCompositionIntentSchema = z24.enum([
17252
+ "center",
17253
+ "bottom-left"
17254
+ ]);
17255
+ var heroTypographyScaleIntentSchema = z24.enum([
17256
+ "quiet",
17257
+ "editorial",
17258
+ "display",
17259
+ "poster"
17260
+ ]);
17261
+ var sectionHeightIntentSchema = z24.enum([
17262
+ "default",
17263
+ "banner",
17264
+ "hero",
17265
+ "immersive"
17266
+ ]);
17267
+ var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
17268
+ var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
17269
+ var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
17270
+ z24.object({ kind: z24.literal("none") }).strict(),
17271
+ z24.object({
17272
+ kind: z24.literal("brand-scrim"),
17273
+ token: z24.enum(["primary", "secondary", "accent"]),
17274
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
17275
+ }).strict(),
17276
+ z24.object({
17277
+ kind: z24.literal("brand-wash"),
17278
+ token: z24.enum(["primary", "secondary", "accent"]),
17279
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
17280
+ }).strict(),
17281
+ z24.object({
17282
+ kind: z24.literal("neutral-scrim"),
17283
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
17284
+ }).strict(),
17285
+ z24.object({
17286
+ kind: z24.literal("neutral-wash"),
17287
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
17288
+ }).strict(),
17289
+ z24.object({
17290
+ kind: z24.literal("solid-panel"),
17291
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
17292
+ }).strict()
17293
+ ]);
17294
+ var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
17295
+ var tileTreatmentSchema = z24.enum(tileTreatmentValues);
17296
+ var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
17297
+ var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
17298
+ function uniqueNonEmpty(values) {
17299
+ const uniqueValues = [...new Set(values)];
17300
+ const firstValue = uniqueValues[0];
17301
+ if (!firstValue) {
17302
+ throw new Error("Expected at least one Theme V2 design state option.");
17303
+ }
17304
+ return [firstValue, ...uniqueValues.slice(1)];
17305
+ }
17306
+ var userPanelTreatments = uniqueNonEmpty(
17307
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
17308
+ );
17309
+ var userFlushTreatments = uniqueNonEmpty(
17310
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
17311
+ );
17312
+ var userFlushBleeds = uniqueNonEmpty(
17313
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
17314
+ );
17315
+ var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
17316
+ z24.object({ kind: z24.literal("plain") }).strict(),
17317
+ z24.object({
17318
+ kind: z24.literal("panel"),
17319
+ treatment: z24.enum(userPanelTreatments)
17320
+ }).strict(),
17321
+ z24.object({
17322
+ kind: z24.literal("flush-panel"),
17323
+ treatment: z24.enum(userFlushTreatments),
17324
+ bleed: z24.enum(userFlushBleeds)
17325
+ }).strict()
17326
+ ]);
17327
+ var blockDesignPlanSchema = z24.object({
17328
+ blockId: z24.string().min(1).transform(asDesignBlockId),
17329
+ blockKind: z24.string().min(1),
17330
+ purpose: z24.string().min(1),
17331
+ sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
17332
+ contentFrame: contentFrameIntentSchema,
17333
+ itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
17334
+ transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
17335
+ emphasis: z24.enum(userDesignOptionCatalog.emphases),
17336
+ sectionHeight: sectionHeightIntentSchema.optional(),
17337
+ heroLegibility: heroLegibilityStrategySchema.optional(),
17338
+ heroComposition: heroCompositionIntentSchema.optional(),
17339
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
17340
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
17341
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
17342
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
17343
+ tileTreatment: tileTreatmentSchema.optional(),
17344
+ eventListTreatment: eventListTreatmentSchema.optional(),
17345
+ eyebrowTreatment: eyebrowTreatmentSchema.optional()
17346
+ }).strict();
17347
+ var styleAuthoritySchema = z24.discriminatedUnion("kind", [
17348
+ z24.object({
17349
+ kind: z24.literal("theme-v2"),
17350
+ source: designResolutionPolicySchema,
17351
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
17352
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
17353
+ templateVersion: z24.number().int().nonnegative(),
17354
+ resolverVersion: z24.number().int().nonnegative()
17355
+ }).strict(),
17356
+ z24.object({
17357
+ kind: z24.literal("legacy-raw"),
17358
+ reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
17359
+ }).strict(),
17360
+ z24.object({
17361
+ kind: z24.literal("advanced-detached"),
17362
+ reason: z24.literal("detached-custom-runtime-fields")
17363
+ }).strict()
17364
+ ]);
17365
+ var blockRuntimeStyleAuthoritySchema = z24.object({
17366
+ unit: z24.literal("block-runtime-fields"),
17367
+ blockId: z24.string().min(1).transform(asDesignBlockId),
17368
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
17369
+ authority: styleAuthoritySchema
17370
+ }).strict();
17371
+ var persistedPageDesignStateV1Schema = z24.object({
17372
+ schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
17373
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
17374
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
17375
+ templateVersion: z24.number().int().nonnegative(),
17376
+ resolverVersion: z24.number().int().nonnegative(),
17377
+ rhythmPresetId: z24.string().min(1),
17378
+ blocks: z24.array(blockDesignPlanSchema),
17379
+ styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
17380
+ }).strict();
17381
+
17382
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
17383
+ function defineDesignRuntimeRules(rules) {
17384
+ return rules;
17385
+ }
17386
+ function defineComponentRuntimeRules(rules) {
17387
+ return rules;
17388
+ }
17389
+ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
17390
+ sectionSurfaces: {
17391
+ base: {},
17392
+ "muted-band": {
17393
+ background: {
17394
+ type: "color",
17395
+ color: "muted"
17396
+ }
17397
+ },
17398
+ "accent-band": {
17399
+ background: {
17400
+ type: "color",
17401
+ color: "primary"
17402
+ }
17403
+ },
17404
+ "brand-depth-band": {
17405
+ background: {
17406
+ type: "color",
17407
+ color: "primary-800"
17408
+ }
17409
+ },
17410
+ "hero-image": {
17411
+ background: {
17412
+ type: "image",
17413
+ opacity: 1,
17414
+ position: "center center",
17415
+ ...uniformSectionForeground("text")
17416
+ }
17417
+ }
17418
+ },
17419
+ heroLegibility: {
17420
+ "scrim-gradient": {
17421
+ type: "gradient",
17422
+ gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
17423
+ opacity: 1
17424
+ },
17425
+ "solid-panel": {
17426
+ type: "color",
17427
+ color: "surface",
17428
+ opacity: 0.88
17429
+ }
17430
+ },
17431
+ transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
17432
+ });
17433
+ var defaultComponentRuntimeRules = defineComponentRuntimeRules({
17434
+ panelFrames: {
17435
+ inset: {
17436
+ spacing: "comfortable",
17437
+ rounded: "xl",
17438
+ raised: false,
17439
+ background: {
17440
+ type: "color",
17441
+ color: "surfaceAlt",
17442
+ textColor: "text"
17443
+ }
17444
+ },
17445
+ raised: {
17446
+ spacing: "comfortable",
17447
+ rounded: "xl",
17448
+ raised: true,
17449
+ background: {
17450
+ type: "color",
17451
+ color: "surfaceAlt",
17452
+ textColor: "text"
17453
+ }
17454
+ },
17455
+ editorial: {
17456
+ spacing: "medium",
17457
+ rounded: "xl",
17458
+ raised: false,
17459
+ background: {
17460
+ type: "color",
17461
+ color: "surface",
17462
+ textColor: "text"
17463
+ }
17464
+ }
17465
+ },
17466
+ flushFrames: {
17467
+ "media-panel": {
17468
+ fullWidth: true,
17469
+ spacing: "none",
17470
+ rounded: "none",
17471
+ raised: false
17472
+ }
17473
+ },
17474
+ itemSurfaces: {
17475
+ none: null,
17476
+ default: {
17477
+ spacing: "medium",
17478
+ rounded: "lg",
17479
+ raised: false
17480
+ },
17481
+ flat: {
17482
+ spacing: "medium",
17483
+ rounded: "lg",
17484
+ raised: false
17485
+ },
17486
+ outlined: {
17487
+ spacing: "medium",
17488
+ rounded: "lg",
17489
+ raised: false,
17490
+ border: {
17491
+ enabled: true,
17492
+ width: "1",
17493
+ colorToken: "border"
17494
+ }
17495
+ },
17496
+ raised: {
17497
+ spacing: "medium",
17498
+ rounded: "xl",
17499
+ raised: true
17500
+ },
17501
+ inset: {
17502
+ treatment: "soft-panel",
17503
+ spacing: "comfortable",
17504
+ rounded: "xl",
17505
+ raised: false,
17506
+ border: {
17507
+ enabled: false
17508
+ },
17509
+ background: {
17510
+ type: "color",
17511
+ color: "surfaceAlt",
17512
+ textColor: "text"
17513
+ }
17514
+ },
17515
+ editorial: {
17516
+ // Boxless open column with a short rule on top; the visual treatment
17517
+ // lives in blocks-static/card-treatments.css.
17518
+ treatment: "editorial-rule",
17519
+ spacing: "none",
17520
+ rounded: "none",
17521
+ raised: false,
17522
+ border: {
17523
+ enabled: false
17524
+ }
17525
+ },
17526
+ "color-blocked": {
17527
+ // Bold, flat colour-blocked cards. The per-card background colour cycle
17528
+ // (by position) and staggered offset live in
17529
+ // blocks-static/card-treatments.css; here we set the shared shape:
17530
+ // generous padding, large radius, no border, flat (no shadow).
17531
+ treatment: "color-blocked",
17532
+ spacing: "spacious",
17533
+ rounded: "2xl",
17534
+ raised: false,
17535
+ border: {
17536
+ enabled: false
17537
+ }
17538
+ }
17539
+ }
17540
+ });
17541
+ function uniformSectionForeground(token) {
17542
+ return {
17543
+ textColor: token,
17544
+ headingColor: token,
17545
+ linkColor: token,
17546
+ supportingColor: token
17547
+ };
17548
+ }
17549
+
16839
17550
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
16840
17551
  var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
16841
17552
  var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
@@ -16854,6 +17565,7 @@ var curatedSiteStyleIdValues = [
16854
17565
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
16855
17566
  "site-style:bold-launch",
16856
17567
  "site-style:south-west-twerk-school",
17568
+ "site-style:kirtan-ornate",
16857
17569
  "site-style:original-joy"
16858
17570
  ];
16859
17571
  var quietBudget = {
@@ -16880,6 +17592,50 @@ var expressiveBudget = {
16880
17592
  mediaDensity: "high",
16881
17593
  decorativeRepetition: "medium"
16882
17594
  };
17595
+ var kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
17596
+ ...defaultDesignRuntimeRules,
17597
+ defaultEyebrowTreatment: "accent",
17598
+ sectionSurfaces: {
17599
+ ...defaultDesignRuntimeRules.sectionSurfaces,
17600
+ "muted-band": {
17601
+ background: {
17602
+ type: "color",
17603
+ color: "muted"
17604
+ },
17605
+ foreground: {
17606
+ textColor: "text",
17607
+ headingColor: "primary",
17608
+ linkColor: "primary",
17609
+ supportingColor: "text"
17610
+ }
17611
+ },
17612
+ "brand-depth-band": {
17613
+ background: {
17614
+ type: "color",
17615
+ color: "primary-800"
17616
+ },
17617
+ foreground: {
17618
+ textColor: "text",
17619
+ headingColor: "primary",
17620
+ linkColor: "primary",
17621
+ supportingColor: "text"
17622
+ }
17623
+ },
17624
+ "hero-image": {
17625
+ background: {
17626
+ type: "image",
17627
+ opacity: 1,
17628
+ position: "center center"
17629
+ },
17630
+ foreground: {
17631
+ textColor: "text",
17632
+ headingColor: "primary",
17633
+ linkColor: "primary",
17634
+ supportingColor: "text"
17635
+ }
17636
+ }
17637
+ }
17638
+ });
16883
17639
  var expressiveUnderlineInputs = {
16884
17640
  base: {
16885
17641
  background: { type: "transparent" },
@@ -16917,6 +17673,43 @@ var expressiveUnderlineInputs = {
16917
17673
  opacity: 0.6
16918
17674
  }
16919
17675
  };
17676
+ var ornateDarkInputs = {
17677
+ base: {
17678
+ background: { type: "solid", colorToken: "surfaceAlt" },
17679
+ textColorToken: "text",
17680
+ border: {
17681
+ widthClass: "border",
17682
+ colorToken: "primary/45",
17683
+ style: "all"
17684
+ },
17685
+ corners: "square",
17686
+ shadow: null,
17687
+ spacing: "medium",
17688
+ fontSize: "base"
17689
+ },
17690
+ label: {
17691
+ textColorToken: "primary",
17692
+ fontWeight: "semibold",
17693
+ fontSize: "xs",
17694
+ textTransform: "uppercase",
17695
+ letterSpacing: "wider",
17696
+ opacity: 1
17697
+ },
17698
+ focus: {
17699
+ ringColorToken: "primary/18",
17700
+ ringWidth: "2",
17701
+ borderColorToken: "primary/70"
17702
+ },
17703
+ error: {
17704
+ borderColorToken: "destructive",
17705
+ textColorToken: "destructive"
17706
+ },
17707
+ disabled: {
17708
+ backgroundColorToken: "muted",
17709
+ textColorToken: "mutedText",
17710
+ opacity: 0.6
17711
+ }
17712
+ };
16920
17713
  function uniqueContentFrameKinds() {
16921
17714
  const kinds = [
16922
17715
  ...new Set(
@@ -16974,6 +17767,7 @@ function defineCuratedSiteStyle(input) {
16974
17767
  // clean/minimal styles default to none.
16975
17768
  headingDecoration: input.headingDecoration ?? noHeadingDecoration,
16976
17769
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
17770
+ ...input.designRuntimeRules ? { designRuntimeRules: input.designRuntimeRules } : {},
16977
17771
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
16978
17772
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
16979
17773
  defaultHeaderSelection: input.defaultHeaderSelection ? {
@@ -17924,6 +18718,80 @@ var curatedSiteStyles = [
17924
18718
  paletteChoice("high-contrast-ink")
17925
18719
  ]
17926
18720
  }),
18721
+ defineCuratedSiteStyle({
18722
+ id: "site-style:kirtan-ornate",
18723
+ name: "Kirtan Ornate",
18724
+ headingDecoration: { family: "short-center-rule", colorToken: "accent" },
18725
+ description: "Ceremonial, jewel-toned, and devotional: ornate frames, warm contrast, and composed rhythm for intimate music gatherings.",
18726
+ 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.",
18727
+ selectionKeywordRules: [
18728
+ { kind: "word", value: "kirtan" },
18729
+ { kind: "word", value: "chanting" },
18730
+ { kind: "word", value: "ceremony" },
18731
+ { kind: "word", value: "devotional" }
18732
+ ],
18733
+ tokenRecipes: {
18734
+ palette: "brand-led",
18735
+ contrast: "strong",
18736
+ radius: "soft",
18737
+ shadow: "subtle",
18738
+ typography: "serif-editorial",
18739
+ spacing: "airy",
18740
+ motion: "subtle"
18741
+ },
18742
+ compositionBudget: expressiveBudget,
18743
+ typographyPresetChoices: [
18744
+ typographyChoice("typography-preset:kirtan-ornate"),
18745
+ typographyChoice("typography-preset:luxe-contrast"),
18746
+ typographyChoice("typography-preset:editorial-serif")
18747
+ ],
18748
+ defaultTypographyPresetId: "typography-preset:kirtan-ornate",
18749
+ themeOverrides: {
18750
+ accordions: warmInsetAccordionSystem,
18751
+ cards: originalJoyCardSystem,
18752
+ testimonialQuote: serifDisplayQuote,
18753
+ bodyText: {
18754
+ intro: {
18755
+ paragraphSize: "editorial",
18756
+ headingSize: "editorial"
18757
+ }
18758
+ },
18759
+ inputs: ornateDarkInputs
18760
+ },
18761
+ designRuntimeRules: kirtanOrnateDesignRuntimeRules,
18762
+ recommendedAppearancePresetIds: [
18763
+ "hero-brand-scrim-fixed-frame",
18764
+ "media-text-quiet-story",
18765
+ "events-lined-panel",
18766
+ "schedule-details-brand-depth",
18767
+ "testimonials-statement-cards",
18768
+ "contact-form-panel"
18769
+ ],
18770
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
18771
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
18772
+ recommendedHeaderStyleChoicesByLayout: {
18773
+ floating: [
18774
+ headerStyleChoice("minimal-surface"),
18775
+ headerStyleChoice("split-glass"),
18776
+ headerStyleChoice("glass")
18777
+ ]
18778
+ },
18779
+ recommendedHeaderLookIds: ["minimal-transparent"],
18780
+ recommendedFooterLookIds: [
18781
+ "site-footer-brand-two-band",
18782
+ "footer-muted-grounding"
18783
+ ],
18784
+ buttonPersonalityChoices: [
18785
+ buttonChoice("ornate-ritual"),
18786
+ buttonChoice("joy-stamp"),
18787
+ buttonChoice("ink-stamp")
18788
+ ],
18789
+ paletteVariantChoices: [
18790
+ paletteChoice("warm-dark-kirtan-gold"),
18791
+ paletteChoice("warm-dark-ember"),
18792
+ paletteChoice("brand-led-burgundy-gold")
18793
+ ]
18794
+ }),
17927
18795
  defineCuratedSiteStyle({
17928
18796
  id: "site-style:original-joy",
17929
18797
  name: "Original Joy",
@@ -18027,319 +18895,6 @@ var pageFlowPresets = [
18027
18895
  }
18028
18896
  ];
18029
18897
 
18030
- // ../theme-core/src/site-styles/designState.ts
18031
- import { z as z24 } from "zod";
18032
- var themeV2DesignStateSchemaVersion = 1;
18033
- var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
18034
- var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
18035
- var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
18036
- fields3[0],
18037
- ...fields3.slice(1)
18038
- ]);
18039
- var heroLegibilityStrategySchema = z24.enum([
18040
- "none",
18041
- "scrim-gradient",
18042
- "solid-panel"
18043
- ]);
18044
- var heroCompositionIntentSchema = z24.enum([
18045
- "center",
18046
- "bottom-left"
18047
- ]);
18048
- var heroTypographyScaleIntentSchema = z24.enum([
18049
- "quiet",
18050
- "editorial",
18051
- "display",
18052
- "poster"
18053
- ]);
18054
- var sectionHeightIntentSchema = z24.enum([
18055
- "default",
18056
- "banner",
18057
- "hero",
18058
- "immersive"
18059
- ]);
18060
- var imageSurfaceTreatmentIntensitySchema = z24.enum(["soft", "balanced", "strong"]);
18061
- var imageSurfaceMotionSchema = z24.enum(["static", "fixed-frame"]);
18062
- var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
18063
- z24.object({ kind: z24.literal("none") }).strict(),
18064
- z24.object({
18065
- kind: z24.literal("brand-scrim"),
18066
- token: z24.enum(["primary", "secondary", "accent"]),
18067
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
18068
- }).strict(),
18069
- z24.object({
18070
- kind: z24.literal("brand-wash"),
18071
- token: z24.enum(["primary", "secondary", "accent"]),
18072
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
18073
- }).strict(),
18074
- z24.object({
18075
- kind: z24.literal("neutral-scrim"),
18076
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
18077
- }).strict(),
18078
- z24.object({
18079
- kind: z24.literal("neutral-wash"),
18080
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
18081
- }).strict(),
18082
- z24.object({
18083
- kind: z24.literal("solid-panel"),
18084
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
18085
- }).strict()
18086
- ]);
18087
- var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
18088
- var tileTreatmentSchema = z24.enum(tileTreatmentValues);
18089
- var eventListTreatmentSchema = z24.enum(eventListTreatmentValues);
18090
- var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
18091
- function uniqueNonEmpty(values) {
18092
- const uniqueValues = [...new Set(values)];
18093
- const firstValue = uniqueValues[0];
18094
- if (!firstValue) {
18095
- throw new Error("Expected at least one Theme V2 design state option.");
18096
- }
18097
- return [firstValue, ...uniqueValues.slice(1)];
18098
- }
18099
- var userPanelTreatments = uniqueNonEmpty(
18100
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
18101
- );
18102
- var userFlushTreatments = uniqueNonEmpty(
18103
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
18104
- );
18105
- var userFlushBleeds = uniqueNonEmpty(
18106
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
18107
- );
18108
- var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
18109
- z24.object({ kind: z24.literal("plain") }).strict(),
18110
- z24.object({
18111
- kind: z24.literal("panel"),
18112
- treatment: z24.enum(userPanelTreatments)
18113
- }).strict(),
18114
- z24.object({
18115
- kind: z24.literal("flush-panel"),
18116
- treatment: z24.enum(userFlushTreatments),
18117
- bleed: z24.enum(userFlushBleeds)
18118
- }).strict()
18119
- ]);
18120
- var blockDesignPlanSchema = z24.object({
18121
- blockId: z24.string().min(1).transform(asDesignBlockId),
18122
- blockKind: z24.string().min(1),
18123
- purpose: z24.string().min(1),
18124
- sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
18125
- contentFrame: contentFrameIntentSchema,
18126
- itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
18127
- transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
18128
- emphasis: z24.enum(userDesignOptionCatalog.emphases),
18129
- sectionHeight: sectionHeightIntentSchema.optional(),
18130
- heroLegibility: heroLegibilityStrategySchema.optional(),
18131
- heroComposition: heroCompositionIntentSchema.optional(),
18132
- heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
18133
- imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
18134
- imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
18135
- testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
18136
- tileTreatment: tileTreatmentSchema.optional(),
18137
- eventListTreatment: eventListTreatmentSchema.optional(),
18138
- eyebrowTreatment: eyebrowTreatmentSchema.optional()
18139
- }).strict();
18140
- var styleAuthoritySchema = z24.discriminatedUnion("kind", [
18141
- z24.object({
18142
- kind: z24.literal("theme-v2"),
18143
- source: designResolutionPolicySchema,
18144
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
18145
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
18146
- templateVersion: z24.number().int().nonnegative(),
18147
- resolverVersion: z24.number().int().nonnegative()
18148
- }).strict(),
18149
- z24.object({
18150
- kind: z24.literal("legacy-raw"),
18151
- reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
18152
- }).strict(),
18153
- z24.object({
18154
- kind: z24.literal("advanced-detached"),
18155
- reason: z24.literal("detached-custom-runtime-fields")
18156
- }).strict()
18157
- ]);
18158
- var blockRuntimeStyleAuthoritySchema = z24.object({
18159
- unit: z24.literal("block-runtime-fields"),
18160
- blockId: z24.string().min(1).transform(asDesignBlockId),
18161
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
18162
- authority: styleAuthoritySchema
18163
- }).strict();
18164
- var persistedPageDesignStateV1Schema = z24.object({
18165
- schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
18166
- siteStyleId: z24.string().min(1).transform(asSiteStyleId),
18167
- templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
18168
- templateVersion: z24.number().int().nonnegative(),
18169
- resolverVersion: z24.number().int().nonnegative(),
18170
- rhythmPresetId: z24.string().min(1),
18171
- blocks: z24.array(blockDesignPlanSchema),
18172
- styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
18173
- }).strict();
18174
-
18175
- // ../theme-core/src/site-styles/runtimeCompiler.ts
18176
- function defineDesignRuntimeRules(rules) {
18177
- return rules;
18178
- }
18179
- function defineComponentRuntimeRules(rules) {
18180
- return rules;
18181
- }
18182
- var defaultDesignRuntimeRules = defineDesignRuntimeRules({
18183
- sectionSurfaces: {
18184
- base: {},
18185
- "muted-band": {
18186
- background: {
18187
- type: "color",
18188
- color: "muted"
18189
- }
18190
- },
18191
- "accent-band": {
18192
- background: {
18193
- type: "color",
18194
- color: "primary"
18195
- }
18196
- },
18197
- "brand-depth-band": {
18198
- background: {
18199
- type: "color",
18200
- color: "primary-800"
18201
- }
18202
- },
18203
- "hero-image": {
18204
- background: {
18205
- type: "image",
18206
- opacity: 1,
18207
- position: "center center",
18208
- ...uniformSectionForeground("text")
18209
- }
18210
- }
18211
- },
18212
- heroLegibility: {
18213
- "scrim-gradient": {
18214
- type: "gradient",
18215
- gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
18216
- opacity: 1
18217
- },
18218
- "solid-panel": {
18219
- type: "color",
18220
- color: "surface",
18221
- opacity: 0.88
18222
- }
18223
- },
18224
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
18225
- });
18226
- var defaultComponentRuntimeRules = defineComponentRuntimeRules({
18227
- panelFrames: {
18228
- inset: {
18229
- spacing: "comfortable",
18230
- rounded: "xl",
18231
- raised: false,
18232
- background: {
18233
- type: "color",
18234
- color: "surfaceAlt",
18235
- textColor: "text"
18236
- }
18237
- },
18238
- raised: {
18239
- spacing: "comfortable",
18240
- rounded: "xl",
18241
- raised: true,
18242
- background: {
18243
- type: "color",
18244
- color: "surfaceAlt",
18245
- textColor: "text"
18246
- }
18247
- },
18248
- editorial: {
18249
- spacing: "medium",
18250
- rounded: "xl",
18251
- raised: false,
18252
- background: {
18253
- type: "color",
18254
- color: "surface",
18255
- textColor: "text"
18256
- }
18257
- }
18258
- },
18259
- flushFrames: {
18260
- "media-panel": {
18261
- fullWidth: true,
18262
- spacing: "none",
18263
- rounded: "none",
18264
- raised: false
18265
- }
18266
- },
18267
- itemSurfaces: {
18268
- none: null,
18269
- default: {
18270
- spacing: "medium",
18271
- rounded: "lg",
18272
- raised: false
18273
- },
18274
- flat: {
18275
- spacing: "medium",
18276
- rounded: "lg",
18277
- raised: false
18278
- },
18279
- outlined: {
18280
- spacing: "medium",
18281
- rounded: "lg",
18282
- raised: false,
18283
- border: {
18284
- enabled: true,
18285
- width: "1",
18286
- colorToken: "border"
18287
- }
18288
- },
18289
- raised: {
18290
- spacing: "medium",
18291
- rounded: "xl",
18292
- raised: true
18293
- },
18294
- inset: {
18295
- treatment: "soft-panel",
18296
- spacing: "comfortable",
18297
- rounded: "xl",
18298
- raised: false,
18299
- border: {
18300
- enabled: false
18301
- },
18302
- background: {
18303
- type: "color",
18304
- color: "surfaceAlt",
18305
- textColor: "text"
18306
- }
18307
- },
18308
- editorial: {
18309
- // Boxless open column with a short rule on top; the visual treatment
18310
- // lives in blocks-static/card-treatments.css.
18311
- treatment: "editorial-rule",
18312
- spacing: "none",
18313
- rounded: "none",
18314
- raised: false,
18315
- border: {
18316
- enabled: false
18317
- }
18318
- },
18319
- "color-blocked": {
18320
- // Bold, flat colour-blocked cards. The per-card background colour cycle
18321
- // (by position) and staggered offset live in
18322
- // blocks-static/card-treatments.css; here we set the shared shape:
18323
- // generous padding, large radius, no border, flat (no shadow).
18324
- treatment: "color-blocked",
18325
- spacing: "spacious",
18326
- rounded: "2xl",
18327
- raised: false,
18328
- border: {
18329
- enabled: false
18330
- }
18331
- }
18332
- }
18333
- });
18334
- function uniformSectionForeground(token) {
18335
- return {
18336
- textColor: token,
18337
- headingColor: token,
18338
- linkColor: token,
18339
- supportingColor: token
18340
- };
18341
- }
18342
-
18343
18898
  // ../theme-core/src/site-styles/generatedSchemas.ts
18344
18899
  import { z as z25 } from "zod";
18345
18900
  function uniqueNonEmpty2(values) {
@@ -19151,6 +19706,31 @@ function cardStylesField(options = {}) {
19151
19706
  return createBoxStylesFieldWithDepth("card", options);
19152
19707
  }
19153
19708
 
19709
+ // ../blocks/src/system/fields/imageShape.ts
19710
+ var standardImageShapeOptions = [
19711
+ { value: "default", label: "Default" },
19712
+ { value: "square", label: "Square corners" },
19713
+ { value: "rounded", label: "Rounded corners" },
19714
+ { value: "circle", label: "Circle" },
19715
+ { value: "arch", label: "Arch" }
19716
+ ];
19717
+ function createImageShapeField(options = {}) {
19718
+ return {
19719
+ id: options.id ?? "imageShape",
19720
+ type: "select",
19721
+ label: options.label ?? "Image shape",
19722
+ ...options.description ? { description: options.description } : {},
19723
+ required: false,
19724
+ defaultValue: options.defaultValue ?? "default",
19725
+ multiple: false,
19726
+ options: [...standardImageShapeOptions],
19727
+ ui: {
19728
+ intent: options.uiIntent ?? "display",
19729
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
19730
+ }
19731
+ };
19732
+ }
19733
+
19154
19734
  // ../blocks/src/utils/env.ts
19155
19735
  function isDevEnvironment() {
19156
19736
  try {
@@ -19965,7 +20545,7 @@ function buildFooterNavAll(common) {
19965
20545
  return stack(
19966
20546
  { className: common.className, gap: common.gap, align: "stretch" },
19967
20547
  [item],
19968
- when(collectionPath)
20548
+ whenCollectionHasItems(collectionPath)
19969
20549
  );
19970
20550
  }
19971
20551
  function buildFooterNavLinksOnly(common) {
@@ -19998,7 +20578,7 @@ function buildFooterNavLinksOnly(common) {
19998
20578
  return stack(
19999
20579
  { className: common.className, gap: common.gap, align: "stretch" },
20000
20580
  [item],
20001
- when(collectionPath)
20581
+ whenCollectionHasItems(collectionPath)
20002
20582
  );
20003
20583
  }
20004
20584
  function buildFooterNavFlatten(common) {
@@ -20047,9 +20627,20 @@ function buildFooterNavFlatten(common) {
20047
20627
  return stack(
20048
20628
  { className: common.className, gap: common.gap, align: "stretch" },
20049
20629
  [item],
20050
- when(collectionPath)
20630
+ whenCollectionHasItems(collectionPath)
20051
20631
  );
20052
20632
  }
20633
+ var whenCollectionHasItems = (collectionPath) => (node) => ({
20634
+ ...node,
20635
+ $when: {
20636
+ when: {
20637
+ from: collectionPath,
20638
+ transforms: [{ id: "array.length" }]
20639
+ },
20640
+ equals: 0,
20641
+ not: true
20642
+ }
20643
+ });
20053
20644
  function footerNav(opts) {
20054
20645
  const mode = opts?.mode ?? "all";
20055
20646
  const collectionPath = opts?.collectionPath ?? "footerMenu.items";
@@ -22632,8 +23223,23 @@ function fragmentsToRepeaterField(id, label, fragments, options = {}) {
22632
23223
  var heroLayoutControlsFragment = defineFragment({
22633
23224
  id: "heroLayoutControls",
22634
23225
  title: "Hero Layout",
22635
- description: "Alignment and content width controls for hero layouts.",
23226
+ description: "Title scale, alignment, and content width controls for hero layouts.",
22636
23227
  fields: [
23228
+ {
23229
+ id: "titleSize",
23230
+ type: "select",
23231
+ label: "Title size",
23232
+ description: "Adjust the visual scale of the hero title.",
23233
+ required: false,
23234
+ ui: { intent: "display" },
23235
+ options: [
23236
+ { value: "auto", label: "Auto" },
23237
+ { value: "quiet", label: "Normal" },
23238
+ { value: "editorial", label: "Large" },
23239
+ { value: "display", label: "Huge" },
23240
+ { value: "poster", label: "Poster" }
23241
+ ]
23242
+ },
22637
23243
  {
22638
23244
  id: "contentAlignment",
22639
23245
  type: "select",
@@ -23428,7 +24034,18 @@ function heroSplitImagePane() {
23428
24034
  return stack(
23429
24035
  {
23430
24036
  gap: "none",
23431
- className: "rb-relative rb-overflow-hidden rb-rounded-3xl",
24037
+ className: {
24038
+ $bind: {
24039
+ from: "content.imageShape",
24040
+ transforms: [
24041
+ {
24042
+ id: "ui.imageShapeClassName",
24043
+ options: { baseClass: "rb-relative rb-overflow-hidden rb-rounded-3xl" }
24044
+ }
24045
+ ],
24046
+ fallback: "rb-relative rb-overflow-hidden rb-rounded-3xl"
24047
+ }
24048
+ },
23432
24049
  style: {
23433
24050
  minHeight: "clamp(18rem, 36vw, 34rem)"
23434
24051
  }
@@ -23546,6 +24163,12 @@ var heroConfig = {
23546
24163
  label: "Content card",
23547
24164
  renderInHeader: true,
23548
24165
  intent: "style"
24166
+ }),
24167
+ createImageShapeField({
24168
+ id: "imageShape",
24169
+ label: "Image shape",
24170
+ defaultValue: "default",
24171
+ uiIntent: "display"
23549
24172
  })
23550
24173
  ],
23551
24174
  layout: classicLayout,
@@ -23560,6 +24183,15 @@ var heroConfig = {
23560
24183
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
23561
24184
  tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
23562
24185
  icon: "Sparkles",
24186
+ previewCustomize: {
24187
+ quickFieldPriority: [
24188
+ "titleSize",
24189
+ "contentAlignment",
24190
+ "contentMaxWidth",
24191
+ "verticalAlignment",
24192
+ "imageShape"
24193
+ ]
24194
+ },
23563
24195
  styleTokens: {
23564
24196
  typography: "display",
23565
24197
  spacing: "xl"
@@ -23576,7 +24208,8 @@ var standardAspectRatioOptions = [
23576
24208
  { value: "16/9", label: "16:9 (Landscape)" },
23577
24209
  { value: "4/3", label: "4:3 (Standard)" },
23578
24210
  { value: "1/1", label: "1:1 (Square)" },
23579
- { value: "3/4", label: "3:4 (Portrait)" }
24211
+ { value: "3/4", label: "3:4 (Portrait)" },
24212
+ { value: "9/16", label: "9:16 (Tall portrait)" }
23580
24213
  ];
23581
24214
  function createAspectRatioField(options = {}) {
23582
24215
  return {
@@ -24796,6 +25429,258 @@ var formBlockDefinition = {
24796
25429
  runtime: formBlockRuntime
24797
25430
  };
24798
25431
 
25432
+ // ../blocks/src/system/blocks/contact-newsletter.ts
25433
+ var contactNewsletterLayout = styledSection({
25434
+ children: sectionContainer([
25435
+ el(
25436
+ "div",
25437
+ { className: "contact-newsletter-grid" },
25438
+ [
25439
+ el(
25440
+ "div",
25441
+ { className: "contact-newsletter-column contact-newsletter-contact" },
25442
+ [
25443
+ el(
25444
+ "div",
25445
+ { className: "contact-newsletter-copy" },
25446
+ [
25447
+ text(
25448
+ {
25449
+ as: "h2",
25450
+ className: "form-copy-title"
25451
+ },
25452
+ when("contactTitle"),
25453
+ bind("contactTitle")
25454
+ ),
25455
+ richText(
25456
+ {
25457
+ className: "form-copy-intro rb-prose rb-max-w-none"
25458
+ },
25459
+ when("contactIntro"),
25460
+ bind("contactIntro")
25461
+ )
25462
+ ]
25463
+ ),
25464
+ el(
25465
+ "form",
25466
+ withApiBindings({
25467
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
25468
+ submitLabel: { $bind: { from: "contactSubmitLabel" } },
25469
+ successMessage: { $bind: { from: "contactSuccessMessage" } }
25470
+ }),
25471
+ [],
25472
+ bind("data.form")
25473
+ )
25474
+ ]
25475
+ ),
25476
+ el(
25477
+ "div",
25478
+ { className: "contact-newsletter-column contact-newsletter-info contact-newsletter-newsletter" },
25479
+ [
25480
+ el(
25481
+ "div",
25482
+ { className: "contact-newsletter-copy" },
25483
+ [
25484
+ text(
25485
+ {
25486
+ as: "h2",
25487
+ className: "newsletter-copy-title"
25488
+ },
25489
+ when("newsletterTitle"),
25490
+ bind("newsletterTitle")
25491
+ ),
25492
+ richText(
25493
+ {
25494
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none"
25495
+ },
25496
+ when("newsletterSubtitle"),
25497
+ bind("newsletterSubtitle")
25498
+ )
25499
+ ]
25500
+ ),
25501
+ el(
25502
+ "newsletter-form",
25503
+ withApiBindings({
25504
+ listId: { $bind: { from: "listId" } },
25505
+ preset: { $bind: { from: "preset" } },
25506
+ includePhone: { $bind: { from: "includePhone" } },
25507
+ buttonLabel: { $bind: { from: "newsletterButtonLabel" } },
25508
+ successMessage: { $bind: { from: "newsletterSuccessMessage" } },
25509
+ privacyNote: { $bind: { from: "newsletterPrivacyNote" } },
25510
+ tags: { $bind: { from: "newsletterTags" } },
25511
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } }
25512
+ }),
25513
+ []
25514
+ )
25515
+ ]
25516
+ )
25517
+ ]
25518
+ )
25519
+ ], {
25520
+ className: "contact-newsletter-container"
25521
+ }),
25522
+ baseClass: "",
25523
+ spacing: "medium",
25524
+ background: "surface"
25525
+ });
25526
+ var contactNewsletterManifest = createBlockManifest({
25527
+ id: "block.contact-newsletter",
25528
+ title: "Contact + Newsletter",
25529
+ titleSource: "contactTitle",
25530
+ description: "Two-column newsletter signup and contact form section.",
25531
+ category: "interactive",
25532
+ layout: contactNewsletterLayout,
25533
+ defaultVariant: "default",
25534
+ variants: {
25535
+ default: contactNewsletterLayout
25536
+ },
25537
+ variantOptions: {
25538
+ default: {
25539
+ label: "Two column",
25540
+ description: "Newsletter and contact form side by side.",
25541
+ icon: "Columns2"
25542
+ }
25543
+ },
25544
+ additionalFields: [
25545
+ {
25546
+ id: "newsletterTitle",
25547
+ type: "text",
25548
+ label: "Newsletter title",
25549
+ defaultValue: "Stay connected"
25550
+ },
25551
+ {
25552
+ id: "newsletterSubtitle",
25553
+ type: "richText",
25554
+ label: "Newsletter intro"
25555
+ },
25556
+ {
25557
+ id: "listId",
25558
+ type: "reference",
25559
+ label: "Newsletter list",
25560
+ description: "Select the list new subscribers should be added to.",
25561
+ required: true,
25562
+ referenceKind: "newsletterList",
25563
+ allowManualEntry: false,
25564
+ ui: { intent: "behavior" }
25565
+ },
25566
+ {
25567
+ id: "preset",
25568
+ type: "select",
25569
+ label: "Newsletter fields",
25570
+ defaultValue: "emailOnly",
25571
+ ui: { intent: "display" },
25572
+ options: [
25573
+ { value: "emailOnly", label: "Email only" },
25574
+ { value: "emailName", label: "Email + Name" },
25575
+ { value: "emailFirstLast", label: "Email + First/Last Name" },
25576
+ { value: "emailNameCompany", label: "Email + Name + Company (B2B)" }
25577
+ ]
25578
+ },
25579
+ {
25580
+ id: "includePhone",
25581
+ type: "boolean",
25582
+ label: "Include phone field",
25583
+ defaultValue: false,
25584
+ ui: { intent: "display" }
25585
+ },
25586
+ {
25587
+ id: "newsletterButtonLabel",
25588
+ type: "text",
25589
+ label: "Newsletter button label",
25590
+ defaultValue: "Subscribe",
25591
+ ui: { intent: "display" }
25592
+ },
25593
+ {
25594
+ id: "newsletterSuccessMessage",
25595
+ type: "text",
25596
+ label: "Newsletter success message",
25597
+ defaultValue: "Thanks for subscribing!",
25598
+ ui: { intent: "behavior" }
25599
+ },
25600
+ {
25601
+ id: "newsletterPrivacyNote",
25602
+ type: "text",
25603
+ label: "Privacy note",
25604
+ ui: { intent: "display" }
25605
+ },
25606
+ {
25607
+ id: "newsletterTags",
25608
+ type: "text",
25609
+ label: "Newsletter tags",
25610
+ description: "Optional tags to apply on subscribe, separated by comma or semicolon.",
25611
+ ui: { intent: "behavior" }
25612
+ },
25613
+ {
25614
+ id: "contactTitle",
25615
+ type: "text",
25616
+ label: "Contact title",
25617
+ defaultValue: "Get in touch"
25618
+ },
25619
+ {
25620
+ id: "contactIntro",
25621
+ type: "richText",
25622
+ label: "Contact intro"
25623
+ },
25624
+ {
25625
+ id: "formSlug",
25626
+ type: "reference",
25627
+ label: "Contact form",
25628
+ description: "Pick a saved form to render.",
25629
+ required: true,
25630
+ referenceKind: "form",
25631
+ allowManualEntry: false,
25632
+ ui: { intent: "behavior" }
25633
+ },
25634
+ {
25635
+ id: "contactSubmitLabel",
25636
+ type: "text",
25637
+ label: "Contact button label",
25638
+ defaultValue: "Send message",
25639
+ ui: { intent: "display" }
25640
+ },
25641
+ {
25642
+ id: "contactSuccessMessage",
25643
+ type: "text",
25644
+ label: "Contact success message",
25645
+ defaultValue: "Thanks - we received your message.",
25646
+ ui: { intent: "behavior" }
25647
+ }
25648
+ ],
25649
+ styleTokens: {
25650
+ background: "surface",
25651
+ typography: "body",
25652
+ spacing: "md"
25653
+ },
25654
+ behaviours: {
25655
+ supportsThemeSwitching: true,
25656
+ inlineEditing: true,
25657
+ animation: false,
25658
+ paletteHidden: false
25659
+ },
25660
+ tags: [
25661
+ "contact",
25662
+ "newsletter",
25663
+ "signup",
25664
+ "email",
25665
+ "form",
25666
+ "lead-capture"
25667
+ ],
25668
+ icon: "MailPlus"
25669
+ });
25670
+ var contactNewsletterBlockDefinition = {
25671
+ manifest: contactNewsletterManifest,
25672
+ dataSchemas: { form: formDataSchema.optional() },
25673
+ dataLoaders: {
25674
+ form: {
25675
+ endpoint: "getPublicFormById",
25676
+ params: {
25677
+ formSlug: { $bind: { from: "formSlug" } }
25678
+ },
25679
+ mode: "server"
25680
+ }
25681
+ }
25682
+ };
25683
+
24799
25684
  // ../blocks/src/system/blocks/faq.ts
24800
25685
  function fragmentLayoutNode2(layout) {
24801
25686
  return isNodeDefinitionArray2(layout) ? el("div", {}, [...layout]) : layout;
@@ -25024,6 +25909,7 @@ var joinClasses3 = (parts) => parts.filter(
25024
25909
  ).join(" ").replace(/\s+/g, " ").trim();
25025
25910
  var eyebrowTreatmentClassMap = {
25026
25911
  plain: "",
25912
+ accent: "rb-eyebrow-treatment-accent",
25027
25913
  pill: "rb-eyebrow-treatment-pill",
25028
25914
  "accent-pill": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent",
25029
25915
  "pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-pill-bounce",
@@ -25050,6 +25936,13 @@ var imageGalleryCornerClassMap = {
25050
25936
  "2xl": "rb-rounded-2xl",
25051
25937
  "3xl": "rb-rounded-3xl"
25052
25938
  };
25939
+ var imageShapeClassMap = {
25940
+ default: "",
25941
+ square: "rb-media-shape-square",
25942
+ rounded: "rb-media-shape-rounded",
25943
+ circle: "rb-media-shape-circle",
25944
+ arch: "rb-media-shape-arch"
25945
+ };
25053
25946
  var parseRatio = (raw) => {
25054
25947
  if (typeof raw !== "string") return null;
25055
25948
  const value = raw.trim();
@@ -25194,6 +26087,10 @@ function resolveHeroContentMaxWidth(content) {
25194
26087
  return "default";
25195
26088
  }
25196
26089
  function resolveHeroTypographyScale(content) {
26090
+ const titleSize = readString(content, "titleSize");
26091
+ if (titleSize === "quiet" || titleSize === "editorial" || titleSize === "display" || titleSize === "poster") {
26092
+ return titleSize;
26093
+ }
25197
26094
  const raw = readHeroLayoutString(
25198
26095
  content,
25199
26096
  "typographyScale",
@@ -25435,6 +26332,16 @@ var uiTransforms = [
25435
26332
  heroGridClassFromVerticalAlignmentTransform,
25436
26333
  imageFragmentClassTransform,
25437
26334
  imageFragmentSizeTransform,
26335
+ {
26336
+ id: "ui.imageShapeClassName",
26337
+ kind: "string",
26338
+ summary: "Apply a constrained media shape class",
26339
+ run: (value, options) => {
26340
+ const baseClass = typeof options?.baseClass === "string" ? options.baseClass : "";
26341
+ const shape = typeof value === "string" ? value.trim() : "default";
26342
+ return joinClasses3([baseClass, imageShapeClassMap[shape] ?? ""]);
26343
+ }
26344
+ },
25438
26345
  conditionalClassTransform,
25439
26346
  twoColumnContainerClassTransform,
25440
26347
  twoColumnFlexBasisTransform,
@@ -26781,6 +27688,21 @@ var siteHeaderManifest = createBlockManifest({
26781
27688
  id: "block.site-header",
26782
27689
  title: "Site Header",
26783
27690
  category: "layout",
27691
+ additionalFields: [
27692
+ {
27693
+ id: "mode",
27694
+ type: "select",
27695
+ label: "Header display",
27696
+ required: false,
27697
+ multiple: false,
27698
+ defaultValue: "default",
27699
+ options: [
27700
+ { value: "default", label: "Show header" },
27701
+ { value: "hidden", label: "Hide header" }
27702
+ ],
27703
+ ui: { intent: "display" }
27704
+ }
27705
+ ],
26784
27706
  // Skip section styles - this block uses theme-based styling
26785
27707
  skipSectionStyles: true,
26786
27708
  // Block manages its own wrapper - enables sticky positioning
@@ -28183,6 +29105,9 @@ var mediaTextManifest = createBlockManifest({
28183
29105
  category: "layout",
28184
29106
  includeContainerStyles: true,
28185
29107
  titleSource: "title",
29108
+ previewCustomize: {
29109
+ quickFieldPriority: ["imagePosition", "ratio", "imageShape", "titleAlignment", "aspectRatio"]
29110
+ },
28186
29111
  additionalFields: [
28187
29112
  {
28188
29113
  id: "images",
@@ -28221,7 +29146,7 @@ var mediaTextManifest = createBlockManifest({
28221
29146
  {
28222
29147
  id: "titleAlignment",
28223
29148
  type: "select",
28224
- label: "Title alignment",
29149
+ label: "Content alignment",
28225
29150
  required: false,
28226
29151
  defaultValue: "left",
28227
29152
  multiple: false,
@@ -28279,7 +29204,18 @@ var mediaTextManifest = createBlockManifest({
28279
29204
  transition: "slide"
28280
29205
  },
28281
29206
  ui: { intent: "behavior" }
28282
- }),
29207
+ }).map((field) => ({
29208
+ ...field,
29209
+ ui: {
29210
+ ...field.ui ?? {},
29211
+ visibleWhen: field.id === "carouselAutoplayDelay" ? {
29212
+ allOf: [
29213
+ { field: "images", minItems: 2 },
29214
+ { field: "carouselAutoplay", equals: true }
29215
+ ]
29216
+ } : { field: "images", minItems: 2 }
29217
+ }
29218
+ })),
28283
29219
  createAspectRatioField({
28284
29220
  id: "aspectRatio",
28285
29221
  label: "Media aspect ratio",
@@ -28287,6 +29223,12 @@ var mediaTextManifest = createBlockManifest({
28287
29223
  defaultValue: "auto",
28288
29224
  visibleWhen: { field: "images", notEquals: null }
28289
29225
  }),
29226
+ createImageShapeField({
29227
+ id: "imageShape",
29228
+ label: "Media shape",
29229
+ defaultValue: "default",
29230
+ visibleWhen: { field: "images", notEquals: null }
29231
+ }),
28290
29232
  {
28291
29233
  id: "text",
28292
29234
  type: "richText",
@@ -28320,6 +29262,30 @@ var mediaTextManifest = createBlockManifest({
28320
29262
  ...options?.not ? { not: true } : {}
28321
29263
  }
28322
29264
  });
29265
+ const bodyClassNameFromAlignment = {
29266
+ $bind: {
29267
+ from: "content.titleAlignment",
29268
+ transforms: [
29269
+ {
29270
+ id: "ui.bodyClassFromAlignment",
29271
+ options: { base: "rb-prose rb-max-w-none" }
29272
+ }
29273
+ ],
29274
+ fallback: "rb-prose rb-max-w-none"
29275
+ }
29276
+ };
29277
+ const titleClassNameFromAlignment = {
29278
+ $bind: {
29279
+ from: "content.titleAlignment",
29280
+ transforms: [
29281
+ {
29282
+ id: "ui.headingClassFromAlignment",
29283
+ options: { base: "" }
29284
+ }
29285
+ ],
29286
+ fallback: ""
29287
+ }
29288
+ };
28323
29289
  const defaultTextColumn = el("div", {}, [
28324
29290
  styledCard(
28325
29291
  [
@@ -28344,8 +29310,55 @@ var mediaTextManifest = createBlockManifest({
28344
29310
  bind("content.text")
28345
29311
  )
28346
29312
  ]);
29313
+ const bioTextColumn = el(
29314
+ "div",
29315
+ { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" },
29316
+ [
29317
+ text(
29318
+ {
29319
+ as: "h2",
29320
+ className: titleClassNameFromAlignment
29321
+ },
29322
+ when("content.title"),
29323
+ bind("content.title")
29324
+ ),
29325
+ styledCard(
29326
+ [
29327
+ richText(
29328
+ {
29329
+ className: bodyClassNameFromAlignment
29330
+ },
29331
+ bind("content.text")
29332
+ )
29333
+ ],
29334
+ {
29335
+ stylesFrom: "content._textCardStyles",
29336
+ backgroundFrom: "content._textCardStyles.background"
29337
+ },
29338
+ when("content.wrapTextInCard")
29339
+ ),
29340
+ richText(
29341
+ {
29342
+ className: bodyClassNameFromAlignment
29343
+ },
29344
+ when("content.wrapTextInCard", { not: true }),
29345
+ bind("content.text")
29346
+ )
29347
+ ]
29348
+ );
28347
29349
  const defaultImageCommonProps = {
28348
- className: "rb-w-full rb-h-auto rb-object-cover",
29350
+ className: {
29351
+ $bind: {
29352
+ from: "content.imageShape",
29353
+ transforms: [
29354
+ {
29355
+ id: "ui.imageShapeClassName",
29356
+ options: { baseClass: "rb-w-full rb-h-auto rb-object-cover" }
29357
+ }
29358
+ ],
29359
+ fallback: "rb-w-full rb-h-auto rb-object-cover"
29360
+ }
29361
+ },
28349
29362
  style: {
28350
29363
  aspectRatio: { $bind: { from: "content.aspectRatio" } }
28351
29364
  }
@@ -28386,6 +29399,27 @@ var mediaTextManifest = createBlockManifest({
28386
29399
  ],
28387
29400
  whenImagesLength(0, { not: true })
28388
29401
  );
29402
+ const bioImagesLayout = el(
29403
+ "div",
29404
+ {},
29405
+ [
29406
+ responsiveTwoColumn({
29407
+ image: el("div", {}, [
29408
+ el("div", {}, [defaultSingleImage], whenImagesLength(1)),
29409
+ el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))
29410
+ ]),
29411
+ text: bioTextColumn,
29412
+ ratioFrom: "content.ratio",
29413
+ imagePositionFrom: "content.imagePosition",
29414
+ containerClassName: "rb-flex rb-flex-col rb-md-flex-row rb-md-items-center",
29415
+ gapFrom: "content.gap",
29416
+ gapFallback: "comfortable",
29417
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
29418
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
29419
+ })
29420
+ ],
29421
+ whenImagesLength(0, { not: true })
29422
+ );
28389
29423
  const defaultTextOnlyLayout = el(
28390
29424
  "div",
28391
29425
  {},
@@ -28415,7 +29449,45 @@ var mediaTextManifest = createBlockManifest({
28415
29449
  ],
28416
29450
  whenImagesLength(0)
28417
29451
  );
29452
+ const bioTextOnlyLayout = el(
29453
+ "div",
29454
+ { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" },
29455
+ [
29456
+ text(
29457
+ {
29458
+ as: "h2",
29459
+ className: titleClassNameFromAlignment
29460
+ },
29461
+ when("content.title"),
29462
+ bind("content.title")
29463
+ ),
29464
+ styledCard(
29465
+ [
29466
+ richText(
29467
+ {
29468
+ className: bodyClassNameFromAlignment
29469
+ },
29470
+ bind("content.text")
29471
+ )
29472
+ ],
29473
+ {
29474
+ stylesFrom: "content._textCardStyles",
29475
+ backgroundFrom: "content._textCardStyles.background"
29476
+ },
29477
+ when("content.wrapTextInCard")
29478
+ ),
29479
+ richText(
29480
+ {
29481
+ className: bodyClassNameFromAlignment
29482
+ },
29483
+ when("content.wrapTextInCard", { not: true }),
29484
+ bind("content.text")
29485
+ )
29486
+ ],
29487
+ whenImagesLength(0)
29488
+ );
28418
29489
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
29490
+ const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
28419
29491
  const defaultLayout2 = styledSection({
28420
29492
  children: styledContainer({
28421
29493
  rootType: "stack",
@@ -28424,18 +29496,7 @@ var mediaTextManifest = createBlockManifest({
28424
29496
  text(
28425
29497
  {
28426
29498
  as: "h2",
28427
- className: {
28428
- $bind: {
28429
- from: "content.titleAlignment",
28430
- transforms: [
28431
- {
28432
- id: "ui.headingClassFromAlignment",
28433
- options: { base: "" }
28434
- }
28435
- ],
28436
- fallback: ""
28437
- }
28438
- }
29499
+ className: titleClassNameFromAlignment
28439
29500
  },
28440
29501
  when("content.title"),
28441
29502
  bind("content.title")
@@ -28447,14 +29508,28 @@ var mediaTextManifest = createBlockManifest({
28447
29508
  baseClass: "",
28448
29509
  spacing: "medium"
28449
29510
  });
29511
+ const bioLayout = styledSection({
29512
+ children: styledContainer({
29513
+ rootType: "stack",
29514
+ rootProps: { gap: "lg" },
29515
+ children: [bioInner]
29516
+ }),
29517
+ baseClass: "",
29518
+ spacing: "medium"
29519
+ });
28450
29520
  return {
28451
29521
  layout: defaultLayout2,
28452
29522
  variants: {
28453
- default: defaultLayout2
29523
+ default: defaultLayout2,
29524
+ bio: bioLayout
28454
29525
  },
28455
29526
  defaultVariant: "default",
28456
29527
  variantOptions: {
28457
- default: { label: "Default" }
29528
+ default: { label: "Default" },
29529
+ bio: {
29530
+ label: "Bio",
29531
+ description: "Vertically centered title and copy beside media."
29532
+ }
28458
29533
  }
28459
29534
  };
28460
29535
  })(),
@@ -29160,6 +30235,126 @@ var occurrenceContextSchema = z43.object({
29160
30235
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
29161
30236
  import { z as z45 } from "zod";
29162
30237
 
30238
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
30239
+ var DEFAULT_EVENT_CURRENCY = "USD";
30240
+ function resolveRuntimeEventPricing(event) {
30241
+ if (isPublicEventPricing(event.pricing)) {
30242
+ return event.pricing;
30243
+ }
30244
+ const legacy = event;
30245
+ const currency = readCurrency(legacy.currency);
30246
+ if (event.requiresRegistration === false) {
30247
+ return {
30248
+ kind: "drop_in",
30249
+ currency,
30250
+ display: { kind: "free", currency }
30251
+ };
30252
+ }
30253
+ if (legacy.pricingMode === "ticket_types") {
30254
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
30255
+ return {
30256
+ kind: "ticket_types",
30257
+ currency,
30258
+ ticketTypes,
30259
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
30260
+ };
30261
+ }
30262
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
30263
+ if (legacy.pricingType === "paid" && amount > 0) {
30264
+ return {
30265
+ kind: "single_paid",
30266
+ amount,
30267
+ currency,
30268
+ display: { kind: "exact", amount, currency }
30269
+ };
30270
+ }
30271
+ return {
30272
+ kind: "free_registration",
30273
+ currency,
30274
+ display: { kind: "free", currency }
30275
+ };
30276
+ }
30277
+ function readCurrency(value) {
30278
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
30279
+ }
30280
+ function isRecord3(value) {
30281
+ return typeof value === "object" && value !== null && !Array.isArray(value);
30282
+ }
30283
+ function isPublicEventPricing(value) {
30284
+ if (!isRecord3(value) || typeof value.kind !== "string") return false;
30285
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
30286
+ }
30287
+ function isPublicEventTicketType(value) {
30288
+ return isRecord3(value) && typeof value.id === "string";
30289
+ }
30290
+ function readTicketTypePriceDisplay(value, currency) {
30291
+ const display = readLegacyPriceDisplay(value, currency);
30292
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
30293
+ }
30294
+ function readLegacyPriceDisplay(value, currency) {
30295
+ if (!isRecord3(value) || typeof value.kind !== "string") {
30296
+ return { kind: "unavailable", currency };
30297
+ }
30298
+ const displayCurrency = readCurrency(value.currency);
30299
+ switch (value.kind) {
30300
+ case "free":
30301
+ return { kind: "free", currency: displayCurrency };
30302
+ case "exact":
30303
+ return readAmount(value.amount) !== null ? {
30304
+ kind: "exact",
30305
+ amount: readAmount(value.amount) ?? 0,
30306
+ currency: displayCurrency
30307
+ } : { kind: "unavailable", currency };
30308
+ case "from":
30309
+ return readAmount(value.amount) !== null ? {
30310
+ kind: "from",
30311
+ amount: readAmount(value.amount) ?? 0,
30312
+ currency: displayCurrency
30313
+ } : { kind: "unavailable", currency };
30314
+ case "mixed":
30315
+ return readAmount(value.paidFromAmount) !== null ? {
30316
+ kind: "mixed",
30317
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
30318
+ currency: displayCurrency
30319
+ } : { kind: "unavailable", currency };
30320
+ case "unavailable":
30321
+ return { kind: "unavailable", currency: displayCurrency };
30322
+ case "course":
30323
+ return isRecord3(value.display) ? {
30324
+ kind: "course",
30325
+ display: readCoursePriceDisplay(value.display, displayCurrency)
30326
+ } : {
30327
+ kind: "course",
30328
+ display: { kind: "unavailable", currency: displayCurrency }
30329
+ };
30330
+ default:
30331
+ return { kind: "unavailable", currency };
30332
+ }
30333
+ }
30334
+ function readCoursePriceDisplay(value, currency) {
30335
+ switch (value.kind) {
30336
+ case "free":
30337
+ return { kind: "free", currency: readCurrency(value.currency) };
30338
+ case "exact":
30339
+ return readAmount(value.amount) !== null ? {
30340
+ kind: "exact",
30341
+ amount: readAmount(value.amount) ?? 0,
30342
+ currency: readCurrency(value.currency)
30343
+ } : { kind: "unavailable", currency };
30344
+ case "from":
30345
+ return readAmount(value.amount) !== null ? {
30346
+ kind: "from",
30347
+ amount: readAmount(value.amount) ?? 0,
30348
+ currency: readCurrency(value.currency)
30349
+ } : { kind: "unavailable", currency };
30350
+ default:
30351
+ return { kind: "unavailable", currency };
30352
+ }
30353
+ }
30354
+ function readAmount(value) {
30355
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
30356
+ }
30357
+
29163
30358
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
29164
30359
  import { z as z44 } from "zod";
29165
30360
 
@@ -29190,11 +30385,21 @@ var filterAutoShowSchema = z44.enum(["auto", "always", "never"]);
29190
30385
  var calendarTabViewsSchema = z44.enum(["both", "month", "week"]);
29191
30386
 
29192
30387
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
30388
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
30389
+ var [
30390
+ eventRegistrationGenericDateStepLabel,
30391
+ eventRegistrationGenericTicketsStepLabel,
30392
+ eventRegistrationGenericDetailsStepLabel
30393
+ ] = EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
29193
30394
  var contentEntrySchema = z45.object({
29194
30395
  id: z45.string(),
29195
30396
  slug: z45.string(),
29196
30397
  contentTypeSlug: z45.string()
29197
30398
  });
30399
+ var eventRegistrationPublicEventSchema = z45.preprocess(
30400
+ normalizeEventRegistrationEventInput,
30401
+ publicEventSchema
30402
+ );
29198
30403
  var eventRegistrationSourceSchema = z45.object({
29199
30404
  siteId: z45.string().optional(),
29200
30405
  apiBaseUrl: z45.string().optional(),
@@ -29202,7 +30407,7 @@ var eventRegistrationSourceSchema = z45.object({
29202
30407
  previewToken: z45.string().nullable().optional(),
29203
30408
  occurrenceContext: occurrenceContextSchema.optional(),
29204
30409
  contentEntry: contentEntrySchema.nullable().optional(),
29205
- events: z45.array(publicEventSchema).nullable().optional(),
30410
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
29206
30411
  className: z45.string().nullable().optional(),
29207
30412
  buttonText: z45.string().nullable().optional(),
29208
30413
  maxTickets: z45.string().nullable().optional(),
@@ -29217,14 +30422,21 @@ var eventRegistrationSourceSchema = z45.object({
29217
30422
  });
29218
30423
  var eventRegistrationDisplaySchema = z45.object({
29219
30424
  kind: z45.literal("event-registration"),
29220
- state: z45.literal("shell"),
30425
+ state: z45.literal("generic-shell"),
29221
30426
  className: z45.string().nullable(),
30427
+ titleText: z45.string(),
30428
+ bodyText: z45.string(),
30429
+ stepLabels: z45.tuple([
30430
+ z45.literal(eventRegistrationGenericDateStepLabel),
30431
+ z45.literal(eventRegistrationGenericTicketsStepLabel),
30432
+ z45.literal(eventRegistrationGenericDetailsStepLabel)
30433
+ ]),
29222
30434
  summaryButtonText: z45.string()
29223
30435
  });
29224
30436
  var eventRegistrationHydrationSchema = z45.object({
29225
30437
  occurrenceContext: occurrenceContextSchema.optional(),
29226
30438
  contentEntry: contentEntrySchema.nullable().optional(),
29227
- events: z45.array(publicEventSchema).nullable().optional(),
30439
+ events: z45.array(eventRegistrationPublicEventSchema).nullable().optional(),
29228
30440
  maxTickets: z45.string().optional(),
29229
30441
  showVenue: z45.boolean().optional(),
29230
30442
  showCapacity: z45.boolean().optional(),
@@ -29255,8 +30467,11 @@ var eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys(
29255
30467
  function buildEventRegistrationDisplay(source) {
29256
30468
  return {
29257
30469
  kind: "event-registration",
29258
- state: "shell",
30470
+ state: "generic-shell",
29259
30471
  className: source.className ?? null,
30472
+ titleText: "Event registration",
30473
+ bodyText: "Preparing dates, tickets, and booking details.",
30474
+ stepLabels: EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS,
29260
30475
  summaryButtonText: source.buttonText?.trim() || "Register"
29261
30476
  };
29262
30477
  }
@@ -29283,6 +30498,18 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
29283
30498
  }
29284
30499
  })
29285
30500
  });
30501
+ function normalizeEventRegistrationEventInput(value) {
30502
+ if (!isRecord4(value)) {
30503
+ return value;
30504
+ }
30505
+ return {
30506
+ ...value,
30507
+ pricing: resolveRuntimeEventPricing(value)
30508
+ };
30509
+ }
30510
+ function isRecord4(value) {
30511
+ return typeof value === "object" && value !== null && !Array.isArray(value);
30512
+ }
29286
30513
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
29287
30514
  runtime: eventRegistrationBlockRuntime,
29288
30515
  mode: "event-registration",
@@ -31781,7 +33008,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
31781
33008
  return keys.length >= 2 ? keys : [];
31782
33009
  }
31783
33010
  function normalizeOfferingsPreviewContentForWrite(value) {
31784
- if (!isRecord3(value)) return null;
33011
+ if (!isRecord5(value)) return null;
31785
33012
  const groupOrderValue = value.groupOrder;
31786
33013
  if (Array.isArray(groupOrderValue)) {
31787
33014
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -31794,7 +33021,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
31794
33021
  return { ...value, groupOrder: [] };
31795
33022
  }
31796
33023
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
31797
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord3) : []
33024
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord5) : []
31798
33025
  );
31799
33026
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
31800
33027
  }
@@ -31808,7 +33035,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
31808
33035
  }
31809
33036
  return keys;
31810
33037
  }
31811
- function isRecord3(value) {
33038
+ function isRecord5(value) {
31812
33039
  return typeof value === "object" && value !== null && !Array.isArray(value);
31813
33040
  }
31814
33041
 
@@ -32175,7 +33402,7 @@ function isOfferingsPreviewItemLimit(value) {
32175
33402
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
32176
33403
  }
32177
33404
  function normalizeOfferingsPreviewGroupOverride(value) {
32178
- if (!isRecord4(value)) return [];
33405
+ if (!isRecord6(value)) return [];
32179
33406
  const override = {};
32180
33407
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
32181
33408
  override.sourceKey = value.sourceKey;
@@ -32207,12 +33434,12 @@ function isButtonVariant(value) {
32207
33434
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
32208
33435
  }
32209
33436
  function normalizeCardStylesContent(value) {
32210
- return isRecord4(value) || value === null ? value : void 0;
33437
+ return isRecord6(value) || value === null ? value : void 0;
32211
33438
  }
32212
33439
  function normalizeSectionStylesContent(value) {
32213
- return isRecord4(value) || value === null ? value : void 0;
33440
+ return isRecord6(value) || value === null ? value : void 0;
32214
33441
  }
32215
- function isRecord4(value) {
33442
+ function isRecord6(value) {
32216
33443
  return typeof value === "object" && value !== null && !Array.isArray(value);
32217
33444
  }
32218
33445
 
@@ -36172,11 +37399,13 @@ var heroImageSurfaceMotions = [
36172
37399
  ];
36173
37400
  var standardEyebrowTreatments = [
36174
37401
  "plain",
37402
+ "accent",
36175
37403
  "pill",
36176
37404
  "accent-pill"
36177
37405
  ];
36178
37406
  var animatedEyebrowTreatments = [
36179
37407
  "plain",
37408
+ "accent",
36180
37409
  "pill",
36181
37410
  "accent-pill",
36182
37411
  "pill-bounce",
@@ -36477,6 +37706,17 @@ var systemBlockDefinitionsRaw = [
36477
37706
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
36478
37707
  ]
36479
37708
  })),
37709
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
37710
+ flow: conversionFlow,
37711
+ layoutProfiles: [
37712
+ layoutProfile({
37713
+ variantKey: "default",
37714
+ family: "split",
37715
+ weight: "featured",
37716
+ bias: "soft"
37717
+ })
37718
+ ]
37719
+ })),
36480
37720
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
36481
37721
  sectionSurfaces: "supported",
36482
37722
  contentFrames: ["plain", "panel"],
@@ -36568,6 +37808,12 @@ var systemBlockDefinitionsRaw = [
36568
37808
  family: "media-text",
36569
37809
  weight: "featured",
36570
37810
  bias: "soft"
37811
+ }),
37812
+ layoutProfile({
37813
+ variantKey: "bio",
37814
+ family: "media-text",
37815
+ weight: "featured",
37816
+ bias: "soft"
36571
37817
  })
36572
37818
  ]
36573
37819
  })),
@@ -37369,7 +38615,7 @@ var defaultTransforms = createTransformRegistry(builtinTransformDefinitions);
37369
38615
  // ../blocks/src/system/data/linkedContentEntries.ts
37370
38616
  var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
37371
38617
  function coerceLinkedContentEntriesPayload(payload) {
37372
- if (!isRecord5(payload)) return payload;
38618
+ if (!isRecord7(payload)) return payload;
37373
38619
  const response = payload;
37374
38620
  if (!Array.isArray(response.entries)) return payload;
37375
38621
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -37377,12 +38623,12 @@ function coerceLinkedContentEntriesPayload(payload) {
37377
38623
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
37378
38624
  }
37379
38625
  function enrichLinkedContentEntry(entry, contentType) {
37380
- if (!isRecord5(entry)) return entry;
38626
+ if (!isRecord7(entry)) return entry;
37381
38627
  const entryId = typeof entry.id === "string" ? entry.id : null;
37382
38628
  if (!entryId) return entry;
37383
38629
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
37384
38630
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
37385
- const content = isRecord5(entry.content) ? entry.content : {};
38631
+ const content = isRecord7(entry.content) ? entry.content : {};
37386
38632
  const meta = {
37387
38633
  kind: "linked-content-entry",
37388
38634
  entryId,
@@ -37475,7 +38721,7 @@ function capitalize(value) {
37475
38721
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
37476
38722
  }
37477
38723
  function parsePublicContentTypeMeta(value) {
37478
- if (!isRecord5(value)) return null;
38724
+ if (!isRecord7(value)) return null;
37479
38725
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
37480
38726
  return {
37481
38727
  key: value.key,
@@ -37485,7 +38731,7 @@ function parsePublicContentTypeMeta(value) {
37485
38731
  };
37486
38732
  }
37487
38733
  function parsePublicContentTypeLinkedEntryEditing(value) {
37488
- if (!isRecord5(value) || typeof value.kind !== "string") return null;
38734
+ if (!isRecord7(value) || typeof value.kind !== "string") return null;
37489
38735
  switch (value.kind) {
37490
38736
  case "generic":
37491
38737
  return { kind: "generic" };
@@ -37499,7 +38745,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
37499
38745
  }
37500
38746
  }
37501
38747
  function parsePublicContentTypeFieldMeta(value) {
37502
- if (!isRecord5(value)) return [];
38748
+ if (!isRecord7(value)) return [];
37503
38749
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
37504
38750
  return [{
37505
38751
  id: value.id,
@@ -37513,7 +38759,7 @@ function parseStringArray(value) {
37513
38759
  if (!Array.isArray(value)) return null;
37514
38760
  return value.filter((item) => typeof item === "string");
37515
38761
  }
37516
- function isRecord5(value) {
38762
+ function isRecord7(value) {
37517
38763
  return typeof value === "object" && value !== null && !Array.isArray(value);
37518
38764
  }
37519
38765
 
@@ -37741,6 +38987,11 @@ ${root} {
37741
38987
  --er-event-card-bg: rgb(var(--tb-surface));
37742
38988
  --er-event-card-border-width: var(--rb-border-width, 1px);
37743
38989
  --er-event-card-hover-opacity: 1;
38990
+ --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
38991
+ --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
38992
+ --er-radius: var(--rb-block-radius);
38993
+ --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
38994
+ --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
37744
38995
 
37745
38996
  /* Step indicator */
37746
38997
  --er-step-active: rgb(var(--tb-primary));
@@ -38383,11 +39634,11 @@ function resolveParamsBindings(input, vm, meta) {
38383
39634
  return binding.fallback;
38384
39635
  }
38385
39636
  return resolved;
38386
- } catch (err) {
39637
+ } catch (err2) {
38387
39638
  if (shouldLogWarnings) {
38388
39639
  console.warn(
38389
39640
  `bindings: failed to parse loader param binding for block "${meta?.blockKind ?? "unknown"}"`,
38390
- err
39641
+ err2
38391
39642
  );
38392
39643
  }
38393
39644
  return void 0;
@@ -39308,7 +40559,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
39308
40559
  }
39309
40560
 
39310
40561
  // ../api/src/utils/isRecord.ts
39311
- function isRecord6(value) {
40562
+ function isRecord8(value) {
39312
40563
  return typeof value === "object" && value !== null && !Array.isArray(value);
39313
40564
  }
39314
40565
 
@@ -39615,7 +40866,7 @@ function sanitizeMarks(marks) {
39615
40866
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
39616
40867
  return [{ type: mark.type }];
39617
40868
  }
39618
- if (mark.type === "link" && isRecord6(mark.attrs) && typeof mark.attrs.href === "string") {
40869
+ if (mark.type === "link" && isRecord8(mark.attrs) && typeof mark.attrs.href === "string") {
39619
40870
  const attrs = { href: mark.attrs.href };
39620
40871
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
39621
40872
  attrs.target = mark.attrs.target;
@@ -39630,10 +40881,10 @@ function sanitizeMarks(marks) {
39630
40881
  return sanitized.length > 0 ? sanitized : void 0;
39631
40882
  }
39632
40883
  function unwrapRichTextValue(value) {
39633
- if (isRecord6(value) && isRecord6(value.doc)) {
40884
+ if (isRecord8(value) && isRecord8(value.doc)) {
39634
40885
  return unwrapRichTextValue(value.doc);
39635
40886
  }
39636
- if (isRecord6(value) && value.type === "doc") {
40887
+ if (isRecord8(value) && value.type === "doc") {
39637
40888
  return {
39638
40889
  type: "doc",
39639
40890
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -39642,7 +40893,7 @@ function unwrapRichTextValue(value) {
39642
40893
  return EMPTY_SITE_BANNER_BODY;
39643
40894
  }
39644
40895
  function isTipTapNodeLike(value) {
39645
- return isRecord6(value) && typeof value.type === "string";
40896
+ return isRecord8(value) && typeof value.type === "string";
39646
40897
  }
39647
40898
  function coerceTipTapNode(value) {
39648
40899
  return {
@@ -39650,9 +40901,9 @@ function coerceTipTapNode(value) {
39650
40901
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
39651
40902
  ...typeof value.text === "string" ? { text: value.text } : {},
39652
40903
  ...Array.isArray(value.marks) ? {
39653
- marks: value.marks.filter((mark) => isRecord6(mark) && typeof mark.type === "string").map((mark) => ({
40904
+ marks: value.marks.filter((mark) => isRecord8(mark) && typeof mark.type === "string").map((mark) => ({
39654
40905
  type: mark.type,
39655
- ...isRecord6(mark.attrs) ? { attrs: mark.attrs } : {}
40906
+ ...isRecord8(mark.attrs) ? { attrs: mark.attrs } : {}
39656
40907
  }))
39657
40908
  } : {}
39658
40909
  };
@@ -39800,7 +41051,7 @@ var ENTRY_REF_KEYS = [
39800
41051
  "entryId",
39801
41052
  "slug"
39802
41053
  ];
39803
- function isRecord7(value) {
41054
+ function isRecord9(value) {
39804
41055
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
39805
41056
  }
39806
41057
  function extractManualEntryRef(item) {
@@ -39808,7 +41059,7 @@ function extractManualEntryRef(item) {
39808
41059
  const trimmed = item.trim();
39809
41060
  return trimmed.length > 0 ? trimmed : null;
39810
41061
  }
39811
- if (!isRecord7(item)) return null;
41062
+ if (!isRecord9(item)) return null;
39812
41063
  for (const key of ENTRY_REF_KEYS) {
39813
41064
  const raw = item[key];
39814
41065
  if (typeof raw === "string" && raw.trim().length > 0) {
@@ -40439,6 +41690,31 @@ function isDocWrapper(value) {
40439
41690
  var normalizeBindingOutput2 = normalizeBindingOutput;
40440
41691
  var applyBindingsToContent2 = applyBindingsToContent;
40441
41692
 
41693
+ // ../content-model/src/entry-slots/types.ts
41694
+ function ok(value) {
41695
+ return { ok: true, value };
41696
+ }
41697
+ function err(error) {
41698
+ return { ok: false, error };
41699
+ }
41700
+ var SLOT_KEY_PATTERN = /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/;
41701
+ function unsafeAsSlotKey(value) {
41702
+ return value;
41703
+ }
41704
+ function parseSlotKey(value) {
41705
+ if (typeof value !== "string") return err({ kind: "not-string" });
41706
+ const normalized = value.trim();
41707
+ if (!normalized) return err({ kind: "empty" });
41708
+ if (!SLOT_KEY_PATTERN.test(normalized)) {
41709
+ return err({ kind: "invalid-format", value: normalized });
41710
+ }
41711
+ return ok(unsafeAsSlotKey(normalized));
41712
+ }
41713
+ var SYSTEM_ENTRY_SLOT_BLOCK_KIND = "system.entry-slot";
41714
+ function selectBlocksForDeclaredEntrySlot(input) {
41715
+ return input.entrySlots.find((slot) => slot.slotKey === input.declaredSlotKey)?.blocks ?? [];
41716
+ }
41717
+
40442
41718
  // src/rendering/helpers/loadContent.ts
40443
41719
  function isPageContent(result) {
40444
41720
  return result.type === "page";
@@ -40491,6 +41767,7 @@ async function loadContent(params) {
40491
41767
  };
40492
41768
  const { templatePage, resolvedData: resolvedData2 } = await processEntryTemplate(
40493
41769
  contentResponse.templates,
41770
+ contentResponse.entrySlots,
40494
41771
  entry,
40495
41772
  { siteId, preview },
40496
41773
  client,
@@ -40614,7 +41891,7 @@ function validateAndConvertBlock(block, source) {
40614
41891
  content
40615
41892
  };
40616
41893
  }
40617
- async function processEntryTemplate(templates, entry, context, client, options) {
41894
+ async function processEntryTemplate(templates, entrySlots, entry, context, client, options) {
40618
41895
  const template = templates?.[0];
40619
41896
  if (!template || !template.blocks?.length) {
40620
41897
  return { templatePage: null, resolvedData: {} };
@@ -40632,7 +41909,12 @@ async function processEntryTemplate(templates, entry, context, client, options)
40632
41909
  updatedAt: entry.updatedAt
40633
41910
  }
40634
41911
  };
40635
- const blocks = template.blocks.map((block) => resolveTemplateBlock(block, bindingContext));
41912
+ const blocks = template.blocks.flatMap(
41913
+ (block) => resolveTemplateBlockSequence(block, bindingContext, entrySlots)
41914
+ );
41915
+ if (blocks.length === 0) {
41916
+ return { templatePage: null, resolvedData: {} };
41917
+ }
40636
41918
  const templatePage = {
40637
41919
  name: template.name || "Entry Template",
40638
41920
  path: entry.path || "/",
@@ -40672,6 +41954,48 @@ function resolveTemplateBlock(block, bindingContext) {
40672
41954
  content: resolvedContent
40673
41955
  };
40674
41956
  }
41957
+ function resolveTemplateBlockSequence(block, bindingContext, entrySlots) {
41958
+ const slotKey = readEntrySlotKey(block);
41959
+ if (slotKey) {
41960
+ return selectBlocksForDeclaredEntrySlot({
41961
+ declaredSlotKey: slotKey,
41962
+ entrySlots: entrySlots ?? []
41963
+ }).map(mapEntrySlotBlock);
41964
+ }
41965
+ if (block.blockKind === SYSTEM_ENTRY_SLOT_BLOCK_KIND) {
41966
+ return [];
41967
+ }
41968
+ return [resolveTemplateBlock(block, bindingContext)];
41969
+ }
41970
+ function readEntrySlotKey(block) {
41971
+ if (block.blockKind !== SYSTEM_ENTRY_SLOT_BLOCK_KIND) return null;
41972
+ if (block.scope !== "template") return null;
41973
+ const content = block.content;
41974
+ const slotKey = content?.slotKey;
41975
+ const parsed = parseSlotKey(slotKey);
41976
+ return parsed.ok ? parsed.value : null;
41977
+ }
41978
+ function mapEntrySlotBlock(block) {
41979
+ const mapped = {
41980
+ id: block.id ?? block.blockId ?? null,
41981
+ kind: block.kind,
41982
+ purpose: block.purpose,
41983
+ orderIndex: block.orderIndex ?? null,
41984
+ content: normalizeBindingOutput2(block.content ?? {}),
41985
+ draftContent: normalizeNullableEntrySlotContent(block.draftContent),
41986
+ publishedContent: normalizeNullableEntrySlotContent(block.publishedContent)
41987
+ };
41988
+ if (block.bindings == null) {
41989
+ return mapped;
41990
+ }
41991
+ return {
41992
+ ...mapped,
41993
+ bindings: block.bindings
41994
+ };
41995
+ }
41996
+ function normalizeNullableEntrySlotContent(content) {
41997
+ return content == null ? null : normalizeBindingOutput2(content);
41998
+ }
40675
41999
  export {
40676
42000
  createRiverbankClient,
40677
42001
  isEntryContent,