@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
@@ -1279,7 +1279,7 @@ function createSdkSelectField(input) {
1279
1279
  })
1280
1280
  );
1281
1281
  }
1282
- var visibilityLevels, MEDIA_KINDS, DISPLAY_MEDIA_KINDS, PUBLIC_FILE_FIELD_KINDS, siteOptionSources, mediaDeliverySchema, selectOptionSchema, selectSourceSchema, uiSchema, baseFieldSchema, textFieldSchema, richTextFieldSchema, mediaFieldSchema, fileFieldSchema, booleanFieldSchema, dateFieldSchema, timeFieldSchema, dateTimeFieldSchema, slugFieldSchema, urlFieldSchema, linkFieldSchema, selectFieldSchema, referenceFieldSchema, itemTypeSchema, repeaterFieldSchema, groupFieldSchema, modalFieldSchema, numberFieldSchema, tabDefinitionSchema, tabGroupFieldSchema, presetOptionSchema, presetOrCustomFieldSchema, contentTypeSelectFieldSchema, entryPickerFieldSchema, _fieldSchemaInternal, fieldSchema, slotSchema, typographyTokens, colorTokens, spacingTokens, radiusTokens, styleTokenSchema, behaviourSchema, quickFieldPrioritySchema, previewCustomizeManifestCurationSchema, blockCategoryEnum;
1282
+ var visibilityLevels, MEDIA_KINDS, DISPLAY_MEDIA_KINDS, PUBLIC_FILE_FIELD_KINDS, siteOptionSources, mediaDeliverySchema, selectOptionSchema, selectSourceSchema, visibleWhenPredicateSchema, visibleWhenSchema, uiSchema, baseFieldSchema, textFieldSchema, richTextFieldSchema, mediaFieldSchema, fileFieldSchema, booleanFieldSchema, dateFieldSchema, timeFieldSchema, dateTimeFieldSchema, slugFieldSchema, urlFieldSchema, linkFieldSchema, selectFieldSchema, referenceFieldSchema, itemTypeSchema, repeaterFieldSchema, groupFieldSchema, modalFieldSchema, numberFieldSchema, tabDefinitionSchema, tabGroupFieldSchema, presetOptionSchema, presetOrCustomFieldSchema, contentTypeSelectFieldSchema, entryPickerFieldSchema, _fieldSchemaInternal, fieldSchema, slotSchema, typographyTokens, colorTokens, spacingTokens, radiusTokens, styleTokenSchema, behaviourSchema, quickFieldPrioritySchema, previewCustomizeManifestCurationSchema, blockCategoryEnum;
1283
1283
  var init_schema2 = __esm({
1284
1284
  "../blocks/src/system/manifest/schema.ts"() {
1285
1285
  init_src2();
@@ -1337,6 +1337,21 @@ var init_schema2 = __esm({
1337
1337
  kind: z.literal("sdk")
1338
1338
  })
1339
1339
  ]);
1340
+ visibleWhenPredicateSchema = z.object({
1341
+ field: z.string().min(1),
1342
+ equals: z.any().optional(),
1343
+ notEquals: z.any().optional(),
1344
+ oneOf: z.array(z.any()).optional(),
1345
+ notIn: z.array(z.any()).optional(),
1346
+ minItems: z.number().int().nonnegative().optional(),
1347
+ maxItems: z.number().int().nonnegative().optional()
1348
+ });
1349
+ visibleWhenSchema = z.union([
1350
+ visibleWhenPredicateSchema,
1351
+ z.object({
1352
+ allOf: z.array(visibleWhenPredicateSchema).min(1)
1353
+ })
1354
+ ]);
1340
1355
  uiSchema = z.object({
1341
1356
  widget: z.string().optional(),
1342
1357
  // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)
@@ -1369,13 +1384,7 @@ var init_schema2 = __esm({
1369
1384
  showValue: z.boolean().optional(),
1370
1385
  pattern: z.string().optional(),
1371
1386
  placeholder: z.string().optional(),
1372
- visibleWhen: z.object({
1373
- field: z.string().min(1),
1374
- equals: z.any().optional(),
1375
- notEquals: z.any().optional(),
1376
- oneOf: z.array(z.any()).optional(),
1377
- notIn: z.array(z.any()).optional()
1378
- }).optional(),
1387
+ visibleWhen: visibleWhenSchema.optional(),
1379
1388
  // Modal configuration for modal and group fields
1380
1389
  modalConfig: z.object({
1381
1390
  buttonLabel: z.string().optional(),
@@ -2106,6 +2115,7 @@ var init_types2 = __esm({
2106
2115
  ];
2107
2116
  eyebrowTreatmentValues = [
2108
2117
  "plain",
2118
+ "accent",
2109
2119
  "pill",
2110
2120
  "accent-pill",
2111
2121
  "pill-bounce",
@@ -5735,6 +5745,101 @@ var init_joy_stamp = __esm({
5735
5745
  }
5736
5746
  });
5737
5747
 
5748
+ // ../theme-core/src/buttons/personalities/ornate-ritual.ts
5749
+ var ornateRitual;
5750
+ var init_ornate_ritual = __esm({
5751
+ "../theme-core/src/buttons/personalities/ornate-ritual.ts"() {
5752
+ init_types5();
5753
+ ornateRitual = defineButtonPersonality({
5754
+ id: "ornate-ritual",
5755
+ name: "Ornate Ritual",
5756
+ description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
5757
+ tags: { tone: "classic", energy: "vibrant", motion: "subtle", era: "organic" },
5758
+ buttonSystem: {
5759
+ global: {
5760
+ cornerStyle: "rounded",
5761
+ shadow: "none",
5762
+ textTransform: "uppercase",
5763
+ fontWeight: 600,
5764
+ borderWidth: 1,
5765
+ hoverTransform: "none",
5766
+ hoverColor: "none",
5767
+ letterSpacing: "loose"
5768
+ },
5769
+ sizes: {
5770
+ sm: { padding: "0.5625rem 1.25rem", fontSize: "text-xs" },
5771
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-xs" },
5772
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-sm" },
5773
+ xl: { padding: "1rem 2.75rem", fontSize: "text-base" }
5774
+ },
5775
+ variants: [
5776
+ {
5777
+ id: "primary",
5778
+ name: "Primary",
5779
+ enabled: true,
5780
+ priority: 1,
5781
+ background: { type: "solid", colorToken: "primary" },
5782
+ textColorToken: "primaryForeground",
5783
+ borderRadius: "rounded-md",
5784
+ border: { widthClass: "border", colorToken: "primary" },
5785
+ shadow: { elevation: "none", softness: null, position: "bottom" },
5786
+ effects: {
5787
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "primary-100" } }],
5788
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
5789
+ }
5790
+ },
5791
+ {
5792
+ id: "secondary",
5793
+ name: "Secondary",
5794
+ enabled: true,
5795
+ priority: 2,
5796
+ background: { type: "solid", colorToken: "secondary" },
5797
+ textColorToken: "primaryForeground",
5798
+ borderRadius: "rounded-md",
5799
+ border: { widthClass: "border", colorToken: "primary" },
5800
+ shadow: { elevation: "none", softness: null, position: "bottom" },
5801
+ effects: {
5802
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
5803
+ }
5804
+ },
5805
+ {
5806
+ id: "outline",
5807
+ name: "Outline",
5808
+ enabled: true,
5809
+ priority: 3,
5810
+ background: { type: "transparent" },
5811
+ textColorToken: "primary",
5812
+ borderRadius: "rounded-md",
5813
+ border: { widthClass: "border", colorToken: "primary" },
5814
+ shadow: { elevation: "none", softness: null, position: "bottom" },
5815
+ effects: {
5816
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
5817
+ }
5818
+ },
5819
+ {
5820
+ id: "ghost",
5821
+ name: "Ghost",
5822
+ enabled: true,
5823
+ priority: 3,
5824
+ background: { type: "transparent" },
5825
+ textColorToken: "accent",
5826
+ borderRadius: "rounded-none",
5827
+ sizes: {
5828
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
5829
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
5830
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
5831
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
5832
+ },
5833
+ effects: {
5834
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
5835
+ }
5836
+ }
5837
+ ]
5838
+ }
5839
+ });
5840
+ }
5841
+ });
5842
+
5738
5843
  // ../theme-core/src/buttons/personalities/pebble.ts
5739
5844
  var pebble;
5740
5845
  var init_pebble = __esm({
@@ -6029,6 +6134,7 @@ var init_personalities = __esm({
6029
6134
  init_editorial_link();
6030
6135
  init_ink_stamp();
6031
6136
  init_joy_stamp();
6137
+ init_ornate_ritual();
6032
6138
  init_pebble();
6033
6139
  init_showtime_pill();
6034
6140
  init_soft_pill();
@@ -6042,7 +6148,8 @@ var init_personalities = __esm({
6042
6148
  inkStamp,
6043
6149
  brushedWash,
6044
6150
  showtimePill,
6045
- joyStamp
6151
+ joyStamp,
6152
+ ornateRitual
6046
6153
  ];
6047
6154
  personalitiesById = new Map(
6048
6155
  buttonPersonalities.map((p) => [p.id, p])
@@ -6776,7 +6883,7 @@ function rgbColorValue(token) {
6776
6883
  if (alpha === void 0) {
6777
6884
  return `rgb(var(${cssVar}))`;
6778
6885
  }
6779
- return `rgba(var(${cssVar}), ${alpha})`;
6886
+ return `rgb(var(${cssVar}) / ${alpha})`;
6780
6887
  }
6781
6888
  function backgroundColorStyle(token) {
6782
6889
  return { backgroundColor: rgbColorValue(token) };
@@ -7920,7 +8027,7 @@ var init_warm_neutral = __esm({
7920
8027
  });
7921
8028
 
7922
8029
  // ../theme-core/src/palette/variants/warm-dark.ts
7923
- var warmDarkEmber;
8030
+ var warmDarkEmber, warmDarkKirtanGold;
7924
8031
  var init_warm_dark = __esm({
7925
8032
  "../theme-core/src/palette/variants/warm-dark.ts"() {
7926
8033
  init_types12();
@@ -7946,6 +8053,28 @@ var init_warm_dark = __esm({
7946
8053
  { name: "border", hex: "#894e31" }
7947
8054
  ]
7948
8055
  });
8056
+ warmDarkKirtanGold = definePaletteVariant({
8057
+ id: "warm-dark-kirtan-gold",
8058
+ name: "Warm Dark \u2014 Kirtan Gold",
8059
+ description: "Deep plum ground with pale gold primary, rose accent, and soft devotional text.",
8060
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
8061
+ mode: "dark",
8062
+ colors: [
8063
+ { name: "primary", hex: "#ffcdb2" },
8064
+ { name: "secondary", hex: "#b5838d" },
8065
+ { name: "accent", hex: "#e5989b" },
8066
+ { name: "success", hex: "#8fbf8f" },
8067
+ { name: "warning", hex: "#f2b86b" },
8068
+ { name: "destructive", hex: "#d96b6b" },
8069
+ { name: "background", hex: "#403944" },
8070
+ { name: "surface", hex: "#403944" },
8071
+ { name: "surfaceAlt", hex: "#372f3b" },
8072
+ { name: "muted", hex: "#4d4550" },
8073
+ { name: "text", hex: "#e6d2d5" },
8074
+ { name: "primaryForeground", hex: "#403944" },
8075
+ { name: "border", hex: "#8d747a" }
8076
+ ]
8077
+ });
7949
8078
  }
7950
8079
  });
7951
8080
 
@@ -7983,7 +8112,8 @@ var init_variants = __esm({
7983
8112
  softNaturalWatercolor,
7984
8113
  softNaturalLilac,
7985
8114
  // Warm-dark family (dark mode)
7986
- warmDarkEmber
8115
+ warmDarkEmber,
8116
+ warmDarkKirtanGold
7987
8117
  ];
7988
8118
  paletteVariantsById = new Map(
7989
8119
  paletteVariants.map((v) => [v.id, v])
@@ -9596,8 +9726,69 @@ var init_headerLooks = __esm({
9596
9726
  function asFooterLookId(value) {
9597
9727
  return value;
9598
9728
  }
9729
+ function asFooterLayoutId(value) {
9730
+ return value;
9731
+ }
9732
+ function asFooterStyleId(value) {
9733
+ return value;
9734
+ }
9735
+ function identityQuietFooter(theme) {
9736
+ return {
9737
+ ...theme.footer,
9738
+ variant: "simple",
9739
+ maxWidth: "container",
9740
+ background: {
9741
+ type: "color",
9742
+ color: "surface"
9743
+ },
9744
+ navStyle: "minimal",
9745
+ navWeight: "regular",
9746
+ navColor: "text",
9747
+ navLinkStyle: {
9748
+ typography: "body",
9749
+ fontWeight: "regular",
9750
+ textTransform: "none",
9751
+ italic: false,
9752
+ colorToken: "text",
9753
+ hoverColorToken: "primary",
9754
+ padding: "none",
9755
+ borderRadius: "none"
9756
+ },
9757
+ navLayout: {
9758
+ layout: "inline-wrap",
9759
+ align: "start",
9760
+ gapX: "default",
9761
+ gapY: "tight"
9762
+ },
9763
+ logo: {
9764
+ showLogo: true,
9765
+ showLogoText: true,
9766
+ placement: "left",
9767
+ size: "sm",
9768
+ align: "start"
9769
+ },
9770
+ bottomBar: {
9771
+ enabled: false,
9772
+ fullBleed: false,
9773
+ textAlign: "left",
9774
+ paddingX: "default",
9775
+ paddingY: "compact",
9776
+ borderTop: {
9777
+ width: "none"
9778
+ }
9779
+ }
9780
+ };
9781
+ }
9599
9782
  function mutedGroundingFooter(theme) {
9600
- return theme.footer;
9783
+ return {
9784
+ ...identityQuietFooter(theme),
9785
+ background: theme.footer.background,
9786
+ navStyle: theme.footer.navStyle,
9787
+ navColor: theme.footer.navColor,
9788
+ navWeight: theme.footer.navWeight,
9789
+ navLinkStyle: theme.footer.navLinkStyle,
9790
+ bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
9791
+ };
9601
9792
  }
9602
9793
  function brandTwoBandFooter(theme) {
9603
9794
  return {
@@ -9702,6 +9893,53 @@ function centeredCalmFooter(theme) {
9702
9893
  }
9703
9894
  };
9704
9895
  }
9896
+ function splitEditorialFooter(theme) {
9897
+ return {
9898
+ ...theme.footer,
9899
+ variant: "split",
9900
+ maxWidth: "container",
9901
+ background: {
9902
+ type: "color",
9903
+ color: "surface"
9904
+ },
9905
+ navStyle: "minimal",
9906
+ navWeight: "regular",
9907
+ navColor: "text",
9908
+ navLinkStyle: {
9909
+ typography: "body",
9910
+ fontWeight: "regular",
9911
+ textTransform: "none",
9912
+ italic: false,
9913
+ colorToken: "text",
9914
+ hoverColorToken: "primary",
9915
+ padding: "none",
9916
+ borderRadius: "none"
9917
+ },
9918
+ navLayout: {
9919
+ layout: "inline-wrap",
9920
+ align: "start",
9921
+ gapX: "relaxed",
9922
+ gapY: "tight"
9923
+ },
9924
+ logo: {
9925
+ showLogo: true,
9926
+ showLogoText: true,
9927
+ placement: "right",
9928
+ size: "sm",
9929
+ align: "end"
9930
+ },
9931
+ bottomBar: {
9932
+ enabled: true,
9933
+ fullBleed: false,
9934
+ textAlign: "left",
9935
+ paddingX: "default",
9936
+ paddingY: "compact",
9937
+ borderTop: {
9938
+ width: "thin"
9939
+ }
9940
+ }
9941
+ };
9942
+ }
9705
9943
  function editorialColumnsFooter(theme) {
9706
9944
  return {
9707
9945
  ...theme.footer,
@@ -9746,31 +9984,108 @@ function editorialColumnsFooter(theme) {
9746
9984
  function findFooterLook(id) {
9747
9985
  return footerLooksById.get(id);
9748
9986
  }
9749
- var footerLookCatalog, footerLooksById;
9987
+ var footerLayoutCatalog, footerStyleCatalog, footerLookCatalog, footerLooksById;
9750
9988
  var init_footerLooks = __esm({
9751
9989
  "../theme-core/src/site-styles/footerLooks.ts"() {
9752
9990
  init_customizableSurfaces();
9753
9991
  init_types2();
9992
+ footerLayoutCatalog = defineExactCatalog()([
9993
+ {
9994
+ id: asFooterLayoutId("identity"),
9995
+ label: "Identity",
9996
+ description: "Logo, site text, address, and legal copy without relying on footer navigation."
9997
+ },
9998
+ {
9999
+ id: asFooterLayoutId("centered"),
10000
+ label: "Centered",
10001
+ description: "A calm centered stack for identity, short copy, and optional compact navigation.",
10002
+ maxRecommendedNavDensity: "sparse"
10003
+ },
10004
+ {
10005
+ id: asFooterLayoutId("split"),
10006
+ label: "Split",
10007
+ description: "Navigation and brand signoff separated into a wider split footer.",
10008
+ requiresFooterNav: true,
10009
+ maxRecommendedNavDensity: "balanced"
10010
+ },
10011
+ {
10012
+ id: asFooterLayoutId("columns"),
10013
+ label: "Columns",
10014
+ description: "Grouped footer navigation columns with a supporting bottom line.",
10015
+ requiresFooterNav: true,
10016
+ requiresFooterNavGroups: true
10017
+ }
10018
+ ]);
10019
+ footerStyleCatalog = defineExactCatalog()([
10020
+ {
10021
+ id: asFooterStyleId("quiet"),
10022
+ label: "Quiet",
10023
+ description: "Lightweight, practical footer treatment."
10024
+ },
10025
+ {
10026
+ id: asFooterStyleId("calm"),
10027
+ label: "Calm",
10028
+ description: "Soft centered treatment with restrained dividers."
10029
+ },
10030
+ {
10031
+ id: asFooterStyleId("editorial"),
10032
+ label: "Editorial",
10033
+ description: "Text-forward treatment with fine-line structure."
10034
+ },
10035
+ {
10036
+ id: asFooterStyleId("brand-band"),
10037
+ label: "Brand band",
10038
+ description: "High-contrast brand treatment with a stronger bottom bar."
10039
+ }
10040
+ ]);
10041
+ new Map(
10042
+ footerLayoutCatalog.map((layout) => [layout.id, layout])
10043
+ );
10044
+ new Map(
10045
+ footerStyleCatalog.map((style) => [style.id, style])
10046
+ );
9754
10047
  footerLookCatalog = defineExactCatalog()([
10048
+ {
10049
+ id: asFooterLookId("footer-identity-quiet"),
10050
+ label: "Identity footer",
10051
+ layoutId: asFooterLayoutId("identity"),
10052
+ styleId: asFooterStyleId("quiet"),
10053
+ compile: identityQuietFooter
10054
+ },
9755
10055
  {
9756
10056
  id: asFooterLookId("footer-muted-grounding"),
9757
10057
  label: "Muted grounding footer",
10058
+ layoutId: asFooterLayoutId("identity"),
10059
+ styleId: asFooterStyleId("quiet"),
10060
+ hiddenFromLayoutStyleControls: true,
9758
10061
  compile: mutedGroundingFooter
9759
10062
  },
9760
10063
  {
9761
10064
  id: asFooterLookId("footer-centered-calm"),
9762
10065
  label: "Centered calm footer",
10066
+ layoutId: asFooterLayoutId("centered"),
10067
+ styleId: asFooterStyleId("calm"),
9763
10068
  compile: centeredCalmFooter
9764
10069
  },
10070
+ {
10071
+ id: asFooterLookId("footer-split-editorial"),
10072
+ label: "Split editorial footer",
10073
+ layoutId: asFooterLayoutId("split"),
10074
+ styleId: asFooterStyleId("editorial"),
10075
+ compile: splitEditorialFooter
10076
+ },
9765
10077
  {
9766
10078
  id: asFooterLookId("footer-editorial-columns"),
9767
10079
  label: "Editorial columns footer",
10080
+ layoutId: asFooterLayoutId("columns"),
10081
+ styleId: asFooterStyleId("editorial"),
9768
10082
  compile: editorialColumnsFooter
9769
10083
  },
9770
10084
  {
9771
10085
  id: asFooterLookId("site-footer-brand-two-band"),
9772
10086
  label: "Two-band brand footer",
9773
- maxRecommendedNavDensity: "balanced",
10087
+ layoutId: asFooterLayoutId("split"),
10088
+ styleId: asFooterStyleId("brand-band"),
9774
10089
  allowedContentPresence: ["default-footer", "default-and-blocks"],
9775
10090
  compile: brandTwoBandFooter
9776
10091
  }
@@ -9861,7 +10176,7 @@ function defineTypographyPreset(preset2) {
9861
10176
  function findTypographyPreset(id) {
9862
10177
  return typographyPresetsById.get(id);
9863
10178
  }
9864
- var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, boldDisplayTypography, originalJoyTypography, typographyPresets, typographyPresetsById;
10179
+ var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, kirtanOrnateTypography, boldDisplayTypography, originalJoyTypography, typographyPresets, typographyPresetsById;
9865
10180
  var init_typographyPresets = __esm({
9866
10181
  "../theme-core/src/site-styles/typographyPresets.ts"() {
9867
10182
  bodyReadablePolicy = {
@@ -9993,6 +10308,30 @@ var init_typographyPresets = __esm({
9993
10308
  },
9994
10309
  scale: "spacious"
9995
10310
  };
10311
+ kirtanOrnateTypography = {
10312
+ body: {
10313
+ family: "Jost, system-ui, sans-serif",
10314
+ size: "md",
10315
+ weight: "regular",
10316
+ lineHeight: "relaxed",
10317
+ letterSpacing: "normal"
10318
+ },
10319
+ headings: {
10320
+ default: {
10321
+ family: "Marcellus, Georgia, serif",
10322
+ weight: "regular",
10323
+ lineHeight: "normal",
10324
+ letterSpacing: "normal",
10325
+ colorToken: "primary",
10326
+ italic: null,
10327
+ case: null
10328
+ },
10329
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
10330
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
10331
+ h3: { size: "md", weight: "regular", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
10332
+ },
10333
+ scale: "spacious"
10334
+ };
9996
10335
  boldDisplayTypography = {
9997
10336
  body: {
9998
10337
  family: "Manrope, system-ui, sans-serif",
@@ -10027,16 +10366,16 @@ var init_typographyPresets = __esm({
10027
10366
  },
10028
10367
  headings: {
10029
10368
  default: {
10030
- family: "Bricolage Grotesque, system-ui, sans-serif",
10031
- weight: "bold",
10369
+ family: "Lobster, cursive",
10370
+ weight: "regular",
10032
10371
  lineHeight: "normal",
10033
- letterSpacing: "tight",
10372
+ letterSpacing: "normal",
10034
10373
  italic: null,
10035
10374
  case: null
10036
10375
  },
10037
- h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
10038
- h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
10039
- h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
10376
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
10377
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
10378
+ h3: { size: "lg", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null }
10040
10379
  },
10041
10380
  scale: "balanced"
10042
10381
  };
@@ -10101,6 +10440,32 @@ var init_typographyPresets = __esm({
10101
10440
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
10102
10441
  typography: luxeContrastTypography
10103
10442
  }),
10443
+ defineTypographyPreset({
10444
+ id: "typography-preset:kirtan-ornate",
10445
+ name: "Kirtan Ornate",
10446
+ description: "Marcellus devotional headings over a refined Jost body, matching dark ceremonial layouts.",
10447
+ defaultFonts: { body: "Jost, system-ui, sans-serif", heading: "Marcellus, Georgia, serif" },
10448
+ recommendedFonts: {
10449
+ body: ["Jost", "Manrope", "Inter"],
10450
+ heading: ["Marcellus", "Cormorant Garamond", "Playfair Display"]
10451
+ },
10452
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
10453
+ typography: kirtanOrnateTypography,
10454
+ heroTypography: {
10455
+ headlineSize: "6xl",
10456
+ headlineLineHeight: "normal",
10457
+ subheadlineSize: "xl",
10458
+ subheadlineLineHeight: "relaxed",
10459
+ microHeadlineSize: "5xl",
10460
+ microHeadlineLineHeight: "normal",
10461
+ microSubheadlineSize: "lg",
10462
+ microSubheadlineLineHeight: "relaxed",
10463
+ responsive: {
10464
+ tablet: { headlineSize: "5xl" },
10465
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
10466
+ }
10467
+ }
10468
+ }),
10104
10469
  defineTypographyPreset({
10105
10470
  id: "typography-preset:bold-display",
10106
10471
  name: "Bold Display",
@@ -10130,11 +10495,11 @@ var init_typographyPresets = __esm({
10130
10495
  defineTypographyPreset({
10131
10496
  id: "typography-preset:original-joy",
10132
10497
  name: "Original Joy",
10133
- description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
10134
- defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
10498
+ description: "Lobster display headings over a clean DM Sans body, expressive and warm.",
10499
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Lobster, cursive" },
10135
10500
  recommendedFonts: {
10136
10501
  body: ["DM Sans", "Inter", "Manrope"],
10137
- heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
10502
+ heading: ["Lobster", "Bricolage Grotesque", "Space Grotesk"]
10138
10503
  },
10139
10504
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
10140
10505
  typography: originalJoyTypography,
@@ -10159,6 +10524,228 @@ var init_typographyPresets = __esm({
10159
10524
  );
10160
10525
  }
10161
10526
  });
10527
+ function uniqueNonEmpty(values) {
10528
+ const uniqueValues = [...new Set(values)];
10529
+ const firstValue = uniqueValues[0];
10530
+ if (!firstValue) {
10531
+ throw new Error("Expected at least one Theme V2 design state option.");
10532
+ }
10533
+ return [firstValue, ...uniqueValues.slice(1)];
10534
+ }
10535
+ var themeV2DesignStateSchemaVersion, designResolutionPolicySchema, runtimeStyleFieldNameSchema, nonEmptyRuntimeStyleFieldNamesSchema, heroLegibilityStrategySchema, heroCompositionIntentSchema, heroTypographyScaleIntentSchema, sectionHeightIntentSchema, imageSurfaceTreatmentIntensitySchema, imageSurfaceMotionSchema, imageSurfaceTreatmentSchema, testimonialCardTreatmentSchema, tileTreatmentSchema, eventListTreatmentSchema, eyebrowTreatmentSchema, userPanelTreatments, userFlushTreatments, userFlushBleeds, contentFrameIntentSchema, blockDesignPlanSchema, styleAuthoritySchema, blockRuntimeStyleAuthoritySchema;
10536
+ var init_designState = __esm({
10537
+ "../theme-core/src/site-styles/designState.ts"() {
10538
+ init_sourceCatalogs();
10539
+ init_types2();
10540
+ init_schemaVersionedJson();
10541
+ init_rawStyleFields();
10542
+ init_rawStyleFields();
10543
+ themeV2DesignStateSchemaVersion = 1;
10544
+ designResolutionPolicySchema = z.enum(["generated", "user", "admin", "sdk"]);
10545
+ runtimeStyleFieldNameSchema = z.enum(themeV2RuntimeStyleFieldNames);
10546
+ nonEmptyRuntimeStyleFieldNamesSchema = z.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
10547
+ fields3[0],
10548
+ ...fields3.slice(1)
10549
+ ]);
10550
+ heroLegibilityStrategySchema = z.enum([
10551
+ "none",
10552
+ "scrim-gradient",
10553
+ "solid-panel"
10554
+ ]);
10555
+ heroCompositionIntentSchema = z.enum([
10556
+ "center",
10557
+ "bottom-left"
10558
+ ]);
10559
+ heroTypographyScaleIntentSchema = z.enum([
10560
+ "quiet",
10561
+ "editorial",
10562
+ "display",
10563
+ "poster"
10564
+ ]);
10565
+ sectionHeightIntentSchema = z.enum([
10566
+ "default",
10567
+ "banner",
10568
+ "hero",
10569
+ "immersive"
10570
+ ]);
10571
+ imageSurfaceTreatmentIntensitySchema = z.enum(["soft", "balanced", "strong"]);
10572
+ imageSurfaceMotionSchema = z.enum(["static", "fixed-frame"]);
10573
+ imageSurfaceTreatmentSchema = z.discriminatedUnion("kind", [
10574
+ z.object({ kind: z.literal("none") }).strict(),
10575
+ z.object({
10576
+ kind: z.literal("brand-scrim"),
10577
+ token: z.enum(["primary", "secondary", "accent"]),
10578
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10579
+ }).strict(),
10580
+ z.object({
10581
+ kind: z.literal("brand-wash"),
10582
+ token: z.enum(["primary", "secondary", "accent"]),
10583
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10584
+ }).strict(),
10585
+ z.object({
10586
+ kind: z.literal("neutral-scrim"),
10587
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10588
+ }).strict(),
10589
+ z.object({
10590
+ kind: z.literal("neutral-wash"),
10591
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10592
+ }).strict(),
10593
+ z.object({
10594
+ kind: z.literal("solid-panel"),
10595
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10596
+ }).strict()
10597
+ ]);
10598
+ testimonialCardTreatmentSchema = z.enum(["default", "accent-quote"]);
10599
+ tileTreatmentSchema = z.enum(tileTreatmentValues);
10600
+ eventListTreatmentSchema = z.enum(eventListTreatmentValues);
10601
+ eyebrowTreatmentSchema = z.enum(eyebrowTreatmentValues);
10602
+ userPanelTreatments = uniqueNonEmpty(
10603
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
10604
+ );
10605
+ userFlushTreatments = uniqueNonEmpty(
10606
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
10607
+ );
10608
+ userFlushBleeds = uniqueNonEmpty(
10609
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
10610
+ );
10611
+ contentFrameIntentSchema = z.discriminatedUnion("kind", [
10612
+ z.object({ kind: z.literal("plain") }).strict(),
10613
+ z.object({
10614
+ kind: z.literal("panel"),
10615
+ treatment: z.enum(userPanelTreatments)
10616
+ }).strict(),
10617
+ z.object({
10618
+ kind: z.literal("flush-panel"),
10619
+ treatment: z.enum(userFlushTreatments),
10620
+ bleed: z.enum(userFlushBleeds)
10621
+ }).strict()
10622
+ ]);
10623
+ blockDesignPlanSchema = z.object({
10624
+ blockId: z.string().min(1).transform(asDesignBlockId),
10625
+ blockKind: z.string().min(1),
10626
+ purpose: z.string().min(1),
10627
+ sectionSurface: z.enum(userDesignOptionCatalog.sectionSurfaces),
10628
+ contentFrame: contentFrameIntentSchema,
10629
+ itemSurface: z.enum(userDesignOptionCatalog.itemSurfaces),
10630
+ transitionAfter: z.enum(userDesignOptionCatalog.transitions),
10631
+ emphasis: z.enum(userDesignOptionCatalog.emphases),
10632
+ sectionHeight: sectionHeightIntentSchema.optional(),
10633
+ heroLegibility: heroLegibilityStrategySchema.optional(),
10634
+ heroComposition: heroCompositionIntentSchema.optional(),
10635
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
10636
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
10637
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
10638
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
10639
+ tileTreatment: tileTreatmentSchema.optional(),
10640
+ eventListTreatment: eventListTreatmentSchema.optional(),
10641
+ eyebrowTreatment: eyebrowTreatmentSchema.optional()
10642
+ }).strict();
10643
+ styleAuthoritySchema = z.discriminatedUnion("kind", [
10644
+ z.object({
10645
+ kind: z.literal("theme-v2"),
10646
+ source: designResolutionPolicySchema,
10647
+ siteStyleId: z.string().min(1).transform(asSiteStyleId),
10648
+ templateId: z.string().min(1).transform(asDesignSystemTemplateId),
10649
+ templateVersion: z.number().int().nonnegative(),
10650
+ resolverVersion: z.number().int().nonnegative()
10651
+ }).strict(),
10652
+ z.object({
10653
+ kind: z.literal("legacy-raw"),
10654
+ reason: z.enum(["pre-theme-v2", "manual-runtime-fields"])
10655
+ }).strict(),
10656
+ z.object({
10657
+ kind: z.literal("advanced-detached"),
10658
+ reason: z.literal("detached-custom-runtime-fields")
10659
+ }).strict()
10660
+ ]);
10661
+ blockRuntimeStyleAuthoritySchema = z.object({
10662
+ unit: z.literal("block-runtime-fields"),
10663
+ blockId: z.string().min(1).transform(asDesignBlockId),
10664
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
10665
+ authority: styleAuthoritySchema
10666
+ }).strict();
10667
+ z.object({
10668
+ schemaVersion: z.literal(themeV2DesignStateSchemaVersion),
10669
+ siteStyleId: z.string().min(1).transform(asSiteStyleId),
10670
+ templateId: z.string().min(1).transform(asDesignSystemTemplateId),
10671
+ templateVersion: z.number().int().nonnegative(),
10672
+ resolverVersion: z.number().int().nonnegative(),
10673
+ rhythmPresetId: z.string().min(1),
10674
+ blocks: z.array(blockDesignPlanSchema),
10675
+ styleAuthorities: z.array(blockRuntimeStyleAuthoritySchema)
10676
+ }).strict();
10677
+ }
10678
+ });
10679
+
10680
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
10681
+ function defineDesignRuntimeRules(rules) {
10682
+ return rules;
10683
+ }
10684
+ function uniformSectionForeground(token) {
10685
+ return {
10686
+ textColor: token,
10687
+ headingColor: token,
10688
+ linkColor: token,
10689
+ supportingColor: token
10690
+ };
10691
+ }
10692
+ var defaultDesignRuntimeRules;
10693
+ var init_runtimeCompiler = __esm({
10694
+ "../theme-core/src/site-styles/runtimeCompiler.ts"() {
10695
+ init_schema3();
10696
+ init_modern_minimal();
10697
+ init_expandPalette();
10698
+ init_personalities();
10699
+ init_variants();
10700
+ init_designState();
10701
+ init_types2();
10702
+ init_accessibleSurfaces();
10703
+ defaultDesignRuntimeRules = defineDesignRuntimeRules({
10704
+ sectionSurfaces: {
10705
+ base: {},
10706
+ "muted-band": {
10707
+ background: {
10708
+ type: "color",
10709
+ color: "muted"
10710
+ }
10711
+ },
10712
+ "accent-band": {
10713
+ background: {
10714
+ type: "color",
10715
+ color: "primary"
10716
+ }
10717
+ },
10718
+ "brand-depth-band": {
10719
+ background: {
10720
+ type: "color",
10721
+ color: "primary-800"
10722
+ }
10723
+ },
10724
+ "hero-image": {
10725
+ background: {
10726
+ type: "image",
10727
+ opacity: 1,
10728
+ position: "center center",
10729
+ ...uniformSectionForeground("text")
10730
+ }
10731
+ }
10732
+ },
10733
+ heroLegibility: {
10734
+ "scrim-gradient": {
10735
+ type: "gradient",
10736
+ gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
10737
+ opacity: 1
10738
+ },
10739
+ "solid-panel": {
10740
+ type: "color",
10741
+ color: "surface",
10742
+ opacity: 0.88
10743
+ }
10744
+ },
10745
+ transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
10746
+ });
10747
+ }
10748
+ });
10162
10749
 
10163
10750
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
10164
10751
  function uniqueContentFrameKinds() {
@@ -10217,6 +10804,7 @@ function defineCuratedSiteStyle(input) {
10217
10804
  // clean/minimal styles default to none.
10218
10805
  headingDecoration: input.headingDecoration ?? noHeadingDecoration,
10219
10806
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
10807
+ ...input.designRuntimeRules ? { designRuntimeRules: input.designRuntimeRules } : {},
10220
10808
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
10221
10809
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
10222
10810
  defaultHeaderSelection: input.defaultHeaderSelection ? {
@@ -10401,7 +10989,7 @@ function defaultTypographyPresetChoicesForRecipe(recipe) {
10401
10989
  function getCuratedSiteStyle(id) {
10402
10990
  return curatedSiteStylesById.get(id) ?? null;
10403
10991
  }
10404
- var SOFT_EARTH_SITE_STYLE_ID_VALUE, SOFT_EARTH_SITE_STYLE_ID, curatedSiteStyleIdValues, quietBudget, balancedBudget, expressiveBudget, expressiveUnderlineInputs, generatedContentFrameKinds, curatedSiteStyles, curatedSiteStylesById;
10992
+ var SOFT_EARTH_SITE_STYLE_ID_VALUE, SOFT_EARTH_SITE_STYLE_ID, curatedSiteStyleIdValues, quietBudget, balancedBudget, expressiveBudget, kirtanOrnateDesignRuntimeRules, expressiveUnderlineInputs, ornateDarkInputs, generatedContentFrameKinds, curatedSiteStyles, curatedSiteStylesById;
10405
10993
  var init_curatedSiteStyles = __esm({
10406
10994
  "../theme-core/src/site-styles/curatedSiteStyles.ts"() {
10407
10995
  init_personalities();
@@ -10415,6 +11003,7 @@ var init_curatedSiteStyles = __esm({
10415
11003
  init_sourceCatalogs();
10416
11004
  init_types2();
10417
11005
  init_typographyPresets();
11006
+ init_runtimeCompiler();
10418
11007
  SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
10419
11008
  SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
10420
11009
  curatedSiteStyleIdValues = [
@@ -10432,6 +11021,7 @@ var init_curatedSiteStyles = __esm({
10432
11021
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
10433
11022
  "site-style:bold-launch",
10434
11023
  "site-style:south-west-twerk-school",
11024
+ "site-style:kirtan-ornate",
10435
11025
  "site-style:original-joy"
10436
11026
  ];
10437
11027
  quietBudget = {
@@ -10458,6 +11048,50 @@ var init_curatedSiteStyles = __esm({
10458
11048
  mediaDensity: "high",
10459
11049
  decorativeRepetition: "medium"
10460
11050
  };
11051
+ kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
11052
+ ...defaultDesignRuntimeRules,
11053
+ defaultEyebrowTreatment: "accent",
11054
+ sectionSurfaces: {
11055
+ ...defaultDesignRuntimeRules.sectionSurfaces,
11056
+ "muted-band": {
11057
+ background: {
11058
+ type: "color",
11059
+ color: "muted"
11060
+ },
11061
+ foreground: {
11062
+ textColor: "text",
11063
+ headingColor: "primary",
11064
+ linkColor: "primary",
11065
+ supportingColor: "text"
11066
+ }
11067
+ },
11068
+ "brand-depth-band": {
11069
+ background: {
11070
+ type: "color",
11071
+ color: "primary-800"
11072
+ },
11073
+ foreground: {
11074
+ textColor: "text",
11075
+ headingColor: "primary",
11076
+ linkColor: "primary",
11077
+ supportingColor: "text"
11078
+ }
11079
+ },
11080
+ "hero-image": {
11081
+ background: {
11082
+ type: "image",
11083
+ opacity: 1,
11084
+ position: "center center"
11085
+ },
11086
+ foreground: {
11087
+ textColor: "text",
11088
+ headingColor: "primary",
11089
+ linkColor: "primary",
11090
+ supportingColor: "text"
11091
+ }
11092
+ }
11093
+ }
11094
+ });
10461
11095
  expressiveUnderlineInputs = {
10462
11096
  base: {
10463
11097
  background: { type: "transparent" },
@@ -10495,6 +11129,43 @@ var init_curatedSiteStyles = __esm({
10495
11129
  opacity: 0.6
10496
11130
  }
10497
11131
  };
11132
+ ornateDarkInputs = {
11133
+ base: {
11134
+ background: { type: "solid", colorToken: "surfaceAlt" },
11135
+ textColorToken: "text",
11136
+ border: {
11137
+ widthClass: "border",
11138
+ colorToken: "primary/45",
11139
+ style: "all"
11140
+ },
11141
+ corners: "square",
11142
+ shadow: null,
11143
+ spacing: "medium",
11144
+ fontSize: "base"
11145
+ },
11146
+ label: {
11147
+ textColorToken: "primary",
11148
+ fontWeight: "semibold",
11149
+ fontSize: "xs",
11150
+ textTransform: "uppercase",
11151
+ letterSpacing: "wider",
11152
+ opacity: 1
11153
+ },
11154
+ focus: {
11155
+ ringColorToken: "primary/18",
11156
+ ringWidth: "2",
11157
+ borderColorToken: "primary/70"
11158
+ },
11159
+ error: {
11160
+ borderColorToken: "destructive",
11161
+ textColorToken: "destructive"
11162
+ },
11163
+ disabled: {
11164
+ backgroundColorToken: "muted",
11165
+ textColorToken: "mutedText",
11166
+ opacity: 0.6
11167
+ }
11168
+ };
10498
11169
  generatedContentFrameKinds = uniqueContentFrameKinds();
10499
11170
  curatedSiteStyles = [
10500
11171
  defineCuratedSiteStyle({
@@ -11265,6 +11936,80 @@ var init_curatedSiteStyles = __esm({
11265
11936
  paletteChoice("high-contrast-ink")
11266
11937
  ]
11267
11938
  }),
11939
+ defineCuratedSiteStyle({
11940
+ id: "site-style:kirtan-ornate",
11941
+ name: "Kirtan Ornate",
11942
+ headingDecoration: { family: "short-center-rule", colorToken: "accent" },
11943
+ description: "Ceremonial, jewel-toned, and devotional: ornate frames, warm contrast, and composed rhythm for intimate music gatherings.",
11944
+ 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.",
11945
+ selectionKeywordRules: [
11946
+ { kind: "word", value: "kirtan" },
11947
+ { kind: "word", value: "chanting" },
11948
+ { kind: "word", value: "ceremony" },
11949
+ { kind: "word", value: "devotional" }
11950
+ ],
11951
+ tokenRecipes: {
11952
+ palette: "brand-led",
11953
+ contrast: "strong",
11954
+ radius: "soft",
11955
+ shadow: "subtle",
11956
+ typography: "serif-editorial",
11957
+ spacing: "airy",
11958
+ motion: "subtle"
11959
+ },
11960
+ compositionBudget: expressiveBudget,
11961
+ typographyPresetChoices: [
11962
+ typographyChoice("typography-preset:kirtan-ornate"),
11963
+ typographyChoice("typography-preset:luxe-contrast"),
11964
+ typographyChoice("typography-preset:editorial-serif")
11965
+ ],
11966
+ defaultTypographyPresetId: "typography-preset:kirtan-ornate",
11967
+ themeOverrides: {
11968
+ accordions: warmInsetAccordionSystem,
11969
+ cards: originalJoyCardSystem,
11970
+ testimonialQuote: serifDisplayQuote,
11971
+ bodyText: {
11972
+ intro: {
11973
+ paragraphSize: "editorial",
11974
+ headingSize: "editorial"
11975
+ }
11976
+ },
11977
+ inputs: ornateDarkInputs
11978
+ },
11979
+ designRuntimeRules: kirtanOrnateDesignRuntimeRules,
11980
+ recommendedAppearancePresetIds: [
11981
+ "hero-brand-scrim-fixed-frame",
11982
+ "media-text-quiet-story",
11983
+ "events-lined-panel",
11984
+ "schedule-details-brand-depth",
11985
+ "testimonials-statement-cards",
11986
+ "contact-form-panel"
11987
+ ],
11988
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
11989
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
11990
+ recommendedHeaderStyleChoicesByLayout: {
11991
+ floating: [
11992
+ headerStyleChoice("minimal-surface"),
11993
+ headerStyleChoice("split-glass"),
11994
+ headerStyleChoice("glass")
11995
+ ]
11996
+ },
11997
+ recommendedHeaderLookIds: ["minimal-transparent"],
11998
+ recommendedFooterLookIds: [
11999
+ "site-footer-brand-two-band",
12000
+ "footer-muted-grounding"
12001
+ ],
12002
+ buttonPersonalityChoices: [
12003
+ buttonChoice("ornate-ritual"),
12004
+ buttonChoice("joy-stamp"),
12005
+ buttonChoice("ink-stamp")
12006
+ ],
12007
+ paletteVariantChoices: [
12008
+ paletteChoice("warm-dark-kirtan-gold"),
12009
+ paletteChoice("warm-dark-ember"),
12010
+ paletteChoice("brand-led-burgundy-gold")
12011
+ ]
12012
+ }),
11268
12013
  defineCuratedSiteStyle({
11269
12014
  id: "site-style:original-joy",
11270
12015
  name: "Original Joy",
@@ -11400,170 +12145,6 @@ var init_resolver2 = __esm({
11400
12145
  init_types2();
11401
12146
  }
11402
12147
  });
11403
- function uniqueNonEmpty(values) {
11404
- const uniqueValues = [...new Set(values)];
11405
- const firstValue = uniqueValues[0];
11406
- if (!firstValue) {
11407
- throw new Error("Expected at least one Theme V2 design state option.");
11408
- }
11409
- return [firstValue, ...uniqueValues.slice(1)];
11410
- }
11411
- var themeV2DesignStateSchemaVersion, designResolutionPolicySchema, runtimeStyleFieldNameSchema, nonEmptyRuntimeStyleFieldNamesSchema, heroLegibilityStrategySchema, heroCompositionIntentSchema, heroTypographyScaleIntentSchema, sectionHeightIntentSchema, imageSurfaceTreatmentIntensitySchema, imageSurfaceMotionSchema, imageSurfaceTreatmentSchema, testimonialCardTreatmentSchema, tileTreatmentSchema, eventListTreatmentSchema, eyebrowTreatmentSchema, userPanelTreatments, userFlushTreatments, userFlushBleeds, contentFrameIntentSchema, blockDesignPlanSchema, styleAuthoritySchema, blockRuntimeStyleAuthoritySchema;
11412
- var init_designState = __esm({
11413
- "../theme-core/src/site-styles/designState.ts"() {
11414
- init_sourceCatalogs();
11415
- init_types2();
11416
- init_schemaVersionedJson();
11417
- init_rawStyleFields();
11418
- init_rawStyleFields();
11419
- themeV2DesignStateSchemaVersion = 1;
11420
- designResolutionPolicySchema = z.enum(["generated", "user", "admin", "sdk"]);
11421
- runtimeStyleFieldNameSchema = z.enum(themeV2RuntimeStyleFieldNames);
11422
- nonEmptyRuntimeStyleFieldNamesSchema = z.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
11423
- fields3[0],
11424
- ...fields3.slice(1)
11425
- ]);
11426
- heroLegibilityStrategySchema = z.enum([
11427
- "none",
11428
- "scrim-gradient",
11429
- "solid-panel"
11430
- ]);
11431
- heroCompositionIntentSchema = z.enum([
11432
- "center",
11433
- "bottom-left"
11434
- ]);
11435
- heroTypographyScaleIntentSchema = z.enum([
11436
- "quiet",
11437
- "editorial",
11438
- "display",
11439
- "poster"
11440
- ]);
11441
- sectionHeightIntentSchema = z.enum([
11442
- "default",
11443
- "banner",
11444
- "hero",
11445
- "immersive"
11446
- ]);
11447
- imageSurfaceTreatmentIntensitySchema = z.enum(["soft", "balanced", "strong"]);
11448
- imageSurfaceMotionSchema = z.enum(["static", "fixed-frame"]);
11449
- imageSurfaceTreatmentSchema = z.discriminatedUnion("kind", [
11450
- z.object({ kind: z.literal("none") }).strict(),
11451
- z.object({
11452
- kind: z.literal("brand-scrim"),
11453
- token: z.enum(["primary", "secondary", "accent"]),
11454
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
11455
- }).strict(),
11456
- z.object({
11457
- kind: z.literal("brand-wash"),
11458
- token: z.enum(["primary", "secondary", "accent"]),
11459
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
11460
- }).strict(),
11461
- z.object({
11462
- kind: z.literal("neutral-scrim"),
11463
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
11464
- }).strict(),
11465
- z.object({
11466
- kind: z.literal("neutral-wash"),
11467
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
11468
- }).strict(),
11469
- z.object({
11470
- kind: z.literal("solid-panel"),
11471
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
11472
- }).strict()
11473
- ]);
11474
- testimonialCardTreatmentSchema = z.enum(["default", "accent-quote"]);
11475
- tileTreatmentSchema = z.enum(tileTreatmentValues);
11476
- eventListTreatmentSchema = z.enum(eventListTreatmentValues);
11477
- eyebrowTreatmentSchema = z.enum(eyebrowTreatmentValues);
11478
- userPanelTreatments = uniqueNonEmpty(
11479
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
11480
- );
11481
- userFlushTreatments = uniqueNonEmpty(
11482
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
11483
- );
11484
- userFlushBleeds = uniqueNonEmpty(
11485
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
11486
- );
11487
- contentFrameIntentSchema = z.discriminatedUnion("kind", [
11488
- z.object({ kind: z.literal("plain") }).strict(),
11489
- z.object({
11490
- kind: z.literal("panel"),
11491
- treatment: z.enum(userPanelTreatments)
11492
- }).strict(),
11493
- z.object({
11494
- kind: z.literal("flush-panel"),
11495
- treatment: z.enum(userFlushTreatments),
11496
- bleed: z.enum(userFlushBleeds)
11497
- }).strict()
11498
- ]);
11499
- blockDesignPlanSchema = z.object({
11500
- blockId: z.string().min(1).transform(asDesignBlockId),
11501
- blockKind: z.string().min(1),
11502
- purpose: z.string().min(1),
11503
- sectionSurface: z.enum(userDesignOptionCatalog.sectionSurfaces),
11504
- contentFrame: contentFrameIntentSchema,
11505
- itemSurface: z.enum(userDesignOptionCatalog.itemSurfaces),
11506
- transitionAfter: z.enum(userDesignOptionCatalog.transitions),
11507
- emphasis: z.enum(userDesignOptionCatalog.emphases),
11508
- sectionHeight: sectionHeightIntentSchema.optional(),
11509
- heroLegibility: heroLegibilityStrategySchema.optional(),
11510
- heroComposition: heroCompositionIntentSchema.optional(),
11511
- heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
11512
- imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
11513
- imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
11514
- testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
11515
- tileTreatment: tileTreatmentSchema.optional(),
11516
- eventListTreatment: eventListTreatmentSchema.optional(),
11517
- eyebrowTreatment: eyebrowTreatmentSchema.optional()
11518
- }).strict();
11519
- styleAuthoritySchema = z.discriminatedUnion("kind", [
11520
- z.object({
11521
- kind: z.literal("theme-v2"),
11522
- source: designResolutionPolicySchema,
11523
- siteStyleId: z.string().min(1).transform(asSiteStyleId),
11524
- templateId: z.string().min(1).transform(asDesignSystemTemplateId),
11525
- templateVersion: z.number().int().nonnegative(),
11526
- resolverVersion: z.number().int().nonnegative()
11527
- }).strict(),
11528
- z.object({
11529
- kind: z.literal("legacy-raw"),
11530
- reason: z.enum(["pre-theme-v2", "manual-runtime-fields"])
11531
- }).strict(),
11532
- z.object({
11533
- kind: z.literal("advanced-detached"),
11534
- reason: z.literal("detached-custom-runtime-fields")
11535
- }).strict()
11536
- ]);
11537
- blockRuntimeStyleAuthoritySchema = z.object({
11538
- unit: z.literal("block-runtime-fields"),
11539
- blockId: z.string().min(1).transform(asDesignBlockId),
11540
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
11541
- authority: styleAuthoritySchema
11542
- }).strict();
11543
- z.object({
11544
- schemaVersion: z.literal(themeV2DesignStateSchemaVersion),
11545
- siteStyleId: z.string().min(1).transform(asSiteStyleId),
11546
- templateId: z.string().min(1).transform(asDesignSystemTemplateId),
11547
- templateVersion: z.number().int().nonnegative(),
11548
- resolverVersion: z.number().int().nonnegative(),
11549
- rhythmPresetId: z.string().min(1),
11550
- blocks: z.array(blockDesignPlanSchema),
11551
- styleAuthorities: z.array(blockRuntimeStyleAuthoritySchema)
11552
- }).strict();
11553
- }
11554
- });
11555
- var init_runtimeCompiler = __esm({
11556
- "../theme-core/src/site-styles/runtimeCompiler.ts"() {
11557
- init_schema3();
11558
- init_modern_minimal();
11559
- init_expandPalette();
11560
- init_personalities();
11561
- init_variants();
11562
- init_designState();
11563
- init_types2();
11564
- init_accessibleSurfaces();
11565
- }
11566
- });
11567
12148
 
11568
12149
  // ../theme-core/src/site-styles/siteStyleThemeCompiler.ts
11569
12150
  var init_siteStyleThemeCompiler = __esm({
@@ -11745,6 +12326,7 @@ var init_generatedDesignPipeline = __esm({
11745
12326
  init_designState();
11746
12327
  init_generatedSchemas();
11747
12328
  init_siteStyleBlockPolicies();
12329
+ init_curatedSiteStyles();
11748
12330
  init_lookResolution();
11749
12331
  init_headerOpeningSection();
11750
12332
  init_resolver2();
@@ -11753,8 +12335,8 @@ var init_generatedDesignPipeline = __esm({
11753
12335
  }
11754
12336
  });
11755
12337
  function validateBlockSequence(snapshots, ctx) {
11756
- for (const issue2 of collectBlockSequenceIssues(snapshots)) {
11757
- ctx.addIssue(issue2);
12338
+ for (const issue4 of collectBlockSequenceIssues(snapshots)) {
12339
+ ctx.addIssue(issue4);
11758
12340
  }
11759
12341
  }
11760
12342
  function collectBlockSequenceIssues(snapshots) {
@@ -13428,7 +14010,7 @@ function buildFooterNavAll(common) {
13428
14010
  return stack(
13429
14011
  { className: common.className, gap: common.gap, align: "stretch" },
13430
14012
  [item],
13431
- when(collectionPath)
14013
+ whenCollectionHasItems(collectionPath)
13432
14014
  );
13433
14015
  }
13434
14016
  function buildFooterNavLinksOnly(common) {
@@ -13461,7 +14043,7 @@ function buildFooterNavLinksOnly(common) {
13461
14043
  return stack(
13462
14044
  { className: common.className, gap: common.gap, align: "stretch" },
13463
14045
  [item],
13464
- when(collectionPath)
14046
+ whenCollectionHasItems(collectionPath)
13465
14047
  );
13466
14048
  }
13467
14049
  function buildFooterNavFlatten(common) {
@@ -13510,7 +14092,7 @@ function buildFooterNavFlatten(common) {
13510
14092
  return stack(
13511
14093
  { className: common.className, gap: common.gap, align: "stretch" },
13512
14094
  [item],
13513
- when(collectionPath)
14095
+ whenCollectionHasItems(collectionPath)
13514
14096
  );
13515
14097
  }
13516
14098
  function footerNav(opts) {
@@ -13532,9 +14114,21 @@ function footerNav(opts) {
13532
14114
  if (mode === "flatten") return buildFooterNavFlatten(common);
13533
14115
  return buildFooterNavAll(common);
13534
14116
  }
14117
+ var whenCollectionHasItems;
13535
14118
  var init_footerNav = __esm({
13536
14119
  "../blocks/src/system/node/fragments/footerNav.ts"() {
13537
14120
  init_builder2();
14121
+ whenCollectionHasItems = (collectionPath) => (node) => ({
14122
+ ...node,
14123
+ $when: {
14124
+ when: {
14125
+ from: collectionPath,
14126
+ transforms: [{ id: "array.length" }]
14127
+ },
14128
+ equals: 0,
14129
+ not: true
14130
+ }
14131
+ });
13538
14132
  }
13539
14133
  });
13540
14134
 
@@ -16427,8 +17021,23 @@ var init_heroLayoutControls = __esm({
16427
17021
  heroLayoutControlsFragment = defineFragment({
16428
17022
  id: "heroLayoutControls",
16429
17023
  title: "Hero Layout",
16430
- description: "Alignment and content width controls for hero layouts.",
17024
+ description: "Title scale, alignment, and content width controls for hero layouts.",
16431
17025
  fields: [
17026
+ {
17027
+ id: "titleSize",
17028
+ type: "select",
17029
+ label: "Title size",
17030
+ description: "Adjust the visual scale of the hero title.",
17031
+ required: false,
17032
+ ui: { intent: "display" },
17033
+ options: [
17034
+ { value: "auto", label: "Auto" },
17035
+ { value: "quiet", label: "Normal" },
17036
+ { value: "editorial", label: "Large" },
17037
+ { value: "display", label: "Huge" },
17038
+ { value: "poster", label: "Poster" }
17039
+ ]
17040
+ },
16432
17041
  {
16433
17042
  id: "contentAlignment",
16434
17043
  type: "select",
@@ -17503,9 +18112,9 @@ function createZodCodec(schema) {
17503
18112
  return decodeSuccess(parsed.data);
17504
18113
  }
17505
18114
  return decodeFailure(
17506
- parsed.error.issues.map((issue2) => ({
17507
- path: zodIssuePath(issue2.path),
17508
- message: issue2.message
18115
+ parsed.error.issues.map((issue4) => ({
18116
+ path: zodIssuePath(issue4.path),
18117
+ message: issue4.message
17509
18118
  }))
17510
18119
  );
17511
18120
  }
@@ -18303,6 +18912,131 @@ var init_event_registration_shared = __esm({
18303
18912
  }
18304
18913
  });
18305
18914
 
18915
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
18916
+ function resolveRuntimeEventPricing(event) {
18917
+ if (isPublicEventPricing(event.pricing)) {
18918
+ return event.pricing;
18919
+ }
18920
+ const legacy = event;
18921
+ const currency = readCurrency(legacy.currency);
18922
+ if (event.requiresRegistration === false) {
18923
+ return {
18924
+ kind: "drop_in",
18925
+ currency,
18926
+ display: { kind: "free", currency }
18927
+ };
18928
+ }
18929
+ if (legacy.pricingMode === "ticket_types") {
18930
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
18931
+ return {
18932
+ kind: "ticket_types",
18933
+ currency,
18934
+ ticketTypes,
18935
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
18936
+ };
18937
+ }
18938
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
18939
+ if (legacy.pricingType === "paid" && amount > 0) {
18940
+ return {
18941
+ kind: "single_paid",
18942
+ amount,
18943
+ currency,
18944
+ display: { kind: "exact", amount, currency }
18945
+ };
18946
+ }
18947
+ return {
18948
+ kind: "free_registration",
18949
+ currency,
18950
+ display: { kind: "free", currency }
18951
+ };
18952
+ }
18953
+ function readCurrency(value) {
18954
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
18955
+ }
18956
+ function isRecord4(value) {
18957
+ return typeof value === "object" && value !== null && !Array.isArray(value);
18958
+ }
18959
+ function isPublicEventPricing(value) {
18960
+ if (!isRecord4(value) || typeof value.kind !== "string") return false;
18961
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
18962
+ }
18963
+ function isPublicEventTicketType(value) {
18964
+ return isRecord4(value) && typeof value.id === "string";
18965
+ }
18966
+ function readTicketTypePriceDisplay(value, currency) {
18967
+ const display = readLegacyPriceDisplay(value, currency);
18968
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
18969
+ }
18970
+ function readLegacyPriceDisplay(value, currency) {
18971
+ if (!isRecord4(value) || typeof value.kind !== "string") {
18972
+ return { kind: "unavailable", currency };
18973
+ }
18974
+ const displayCurrency = readCurrency(value.currency);
18975
+ switch (value.kind) {
18976
+ case "free":
18977
+ return { kind: "free", currency: displayCurrency };
18978
+ case "exact":
18979
+ return readAmount(value.amount) !== null ? {
18980
+ kind: "exact",
18981
+ amount: readAmount(value.amount) ?? 0,
18982
+ currency: displayCurrency
18983
+ } : { kind: "unavailable", currency };
18984
+ case "from":
18985
+ return readAmount(value.amount) !== null ? {
18986
+ kind: "from",
18987
+ amount: readAmount(value.amount) ?? 0,
18988
+ currency: displayCurrency
18989
+ } : { kind: "unavailable", currency };
18990
+ case "mixed":
18991
+ return readAmount(value.paidFromAmount) !== null ? {
18992
+ kind: "mixed",
18993
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
18994
+ currency: displayCurrency
18995
+ } : { kind: "unavailable", currency };
18996
+ case "unavailable":
18997
+ return { kind: "unavailable", currency: displayCurrency };
18998
+ case "course":
18999
+ return isRecord4(value.display) ? {
19000
+ kind: "course",
19001
+ display: readCoursePriceDisplay(value.display, displayCurrency)
19002
+ } : {
19003
+ kind: "course",
19004
+ display: { kind: "unavailable", currency: displayCurrency }
19005
+ };
19006
+ default:
19007
+ return { kind: "unavailable", currency };
19008
+ }
19009
+ }
19010
+ function readCoursePriceDisplay(value, currency) {
19011
+ switch (value.kind) {
19012
+ case "free":
19013
+ return { kind: "free", currency: readCurrency(value.currency) };
19014
+ case "exact":
19015
+ return readAmount(value.amount) !== null ? {
19016
+ kind: "exact",
19017
+ amount: readAmount(value.amount) ?? 0,
19018
+ currency: readCurrency(value.currency)
19019
+ } : { kind: "unavailable", currency };
19020
+ case "from":
19021
+ return readAmount(value.amount) !== null ? {
19022
+ kind: "from",
19023
+ amount: readAmount(value.amount) ?? 0,
19024
+ currency: readCurrency(value.currency)
19025
+ } : { kind: "unavailable", currency };
19026
+ default:
19027
+ return { kind: "unavailable", currency };
19028
+ }
19029
+ }
19030
+ function readAmount(value) {
19031
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
19032
+ }
19033
+ var DEFAULT_EVENT_CURRENCY;
19034
+ var init_pricing = __esm({
19035
+ "../blocks/src/system/runtime/nodes/events/shared/pricing.ts"() {
19036
+ DEFAULT_EVENT_CURRENCY = "USD";
19037
+ }
19038
+ });
19039
+
18306
19040
  // ../blocks/src/system/constants/events.ts
18307
19041
  function isEventCalendarDisplayMode(value) {
18308
19042
  return typeof value === "string" && eventCalendarDisplayModeValues.includes(value);
@@ -18340,24 +19074,50 @@ var init_contract_schemas = __esm({
18340
19074
  function buildEventRegistrationDisplay(source) {
18341
19075
  return {
18342
19076
  kind: "event-registration",
18343
- state: "shell",
19077
+ state: "generic-shell",
18344
19078
  className: source.className ?? null,
19079
+ titleText: "Event registration",
19080
+ bodyText: "Preparing dates, tickets, and booking details.",
19081
+ stepLabels: EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS,
18345
19082
  summaryButtonText: source.buttonText?.trim() || "Register"
18346
19083
  };
18347
19084
  }
18348
- var contentEntrySchema, eventRegistrationSourceSchema, eventRegistrationDisplaySchema, eventRegistrationHydrationSchema, eventRegistrationRenderSchema, eventRegistrationBlockRuntime;
19085
+ function normalizeEventRegistrationEventInput(value) {
19086
+ if (!isRecord5(value)) {
19087
+ return value;
19088
+ }
19089
+ return {
19090
+ ...value,
19091
+ pricing: resolveRuntimeEventPricing(value)
19092
+ };
19093
+ }
19094
+ function isRecord5(value) {
19095
+ return typeof value === "object" && value !== null && !Array.isArray(value);
19096
+ }
19097
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS, eventRegistrationGenericDateStepLabel, eventRegistrationGenericTicketsStepLabel, eventRegistrationGenericDetailsStepLabel, contentEntrySchema, eventRegistrationPublicEventSchema, eventRegistrationSourceSchema, eventRegistrationDisplaySchema, eventRegistrationHydrationSchema, eventRegistrationRenderSchema, eventRegistrationBlockRuntime;
18349
19098
  var init_event_registration_interactive = __esm({
18350
19099
  "../blocks/src/system/runtime/nodes/event-registration.interactive.ts"() {
18351
19100
  init_schemas2();
18352
19101
  init_event_registration_shared();
19102
+ init_pricing();
18353
19103
  init_islands();
18354
19104
  init_runtime();
18355
19105
  init_contract_schemas();
19106
+ EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
19107
+ [
19108
+ eventRegistrationGenericDateStepLabel,
19109
+ eventRegistrationGenericTicketsStepLabel,
19110
+ eventRegistrationGenericDetailsStepLabel
19111
+ ] = EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
18356
19112
  contentEntrySchema = z.object({
18357
19113
  id: z.string(),
18358
19114
  slug: z.string(),
18359
19115
  contentTypeSlug: z.string()
18360
19116
  });
19117
+ eventRegistrationPublicEventSchema = z.preprocess(
19118
+ normalizeEventRegistrationEventInput,
19119
+ publicEventSchema
19120
+ );
18361
19121
  eventRegistrationSourceSchema = z.object({
18362
19122
  siteId: z.string().optional(),
18363
19123
  apiBaseUrl: z.string().optional(),
@@ -18365,7 +19125,7 @@ var init_event_registration_interactive = __esm({
18365
19125
  previewToken: z.string().nullable().optional(),
18366
19126
  occurrenceContext: occurrenceContextSchema.optional(),
18367
19127
  contentEntry: contentEntrySchema.nullable().optional(),
18368
- events: z.array(publicEventSchema).nullable().optional(),
19128
+ events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
18369
19129
  className: z.string().nullable().optional(),
18370
19130
  buttonText: z.string().nullable().optional(),
18371
19131
  maxTickets: z.string().nullable().optional(),
@@ -18380,14 +19140,21 @@ var init_event_registration_interactive = __esm({
18380
19140
  });
18381
19141
  eventRegistrationDisplaySchema = z.object({
18382
19142
  kind: z.literal("event-registration"),
18383
- state: z.literal("shell"),
19143
+ state: z.literal("generic-shell"),
18384
19144
  className: z.string().nullable(),
19145
+ titleText: z.string(),
19146
+ bodyText: z.string(),
19147
+ stepLabels: z.tuple([
19148
+ z.literal(eventRegistrationGenericDateStepLabel),
19149
+ z.literal(eventRegistrationGenericTicketsStepLabel),
19150
+ z.literal(eventRegistrationGenericDetailsStepLabel)
19151
+ ]),
18385
19152
  summaryButtonText: z.string()
18386
19153
  });
18387
19154
  eventRegistrationHydrationSchema = z.object({
18388
19155
  occurrenceContext: occurrenceContextSchema.optional(),
18389
19156
  contentEntry: contentEntrySchema.nullable().optional(),
18390
- events: z.array(publicEventSchema).nullable().optional(),
19157
+ events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
18391
19158
  maxTickets: z.string().optional(),
18392
19159
  showVenue: z.boolean().optional(),
18393
19160
  showCapacity: z.boolean().optional(),
@@ -18441,7 +19208,7 @@ var init_types16 = __esm({
18441
19208
  });
18442
19209
 
18443
19210
  // ../blocks/src/system/blocks/courses/shared/pricing.ts
18444
- var init_pricing = __esm({
19211
+ var init_pricing2 = __esm({
18445
19212
  "../blocks/src/system/blocks/courses/shared/pricing.ts"() {
18446
19213
  }
18447
19214
  });
@@ -18451,7 +19218,7 @@ var init_shared3 = __esm({
18451
19218
  "../blocks/src/system/blocks/courses/shared/index.ts"() {
18452
19219
  init_types16();
18453
19220
  init_schemas();
18454
- init_pricing();
19221
+ init_pricing2();
18455
19222
  }
18456
19223
  });
18457
19224
  function buildCourseRegistrationDisplay(source) {
@@ -23747,6 +24514,46 @@ var ENDPOINT_DEFINITIONS = {
23747
24514
  auth: "user",
23748
24515
  responseKind: "json"
23749
24516
  },
24517
+ listEntrySlotBlocks: {
24518
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
24519
+ method: "GET",
24520
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
24521
+ auth: "user",
24522
+ responseKind: "json",
24523
+ errors: ["resource:not_found"]
24524
+ },
24525
+ listEntryPageContentSlots: {
24526
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots",
24527
+ method: "GET",
24528
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slots", "blocks"],
24529
+ auth: "user",
24530
+ responseKind: "json",
24531
+ errors: ["resource:not_found"]
24532
+ },
24533
+ createEntrySlotBlock: {
24534
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
24535
+ method: "POST",
24536
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
24537
+ auth: "user",
24538
+ responseKind: "json",
24539
+ errors: ["validation:invalid_input", "resource:not_found"]
24540
+ },
24541
+ reorderEntrySlotBlocks: {
24542
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/reorder",
24543
+ method: "POST",
24544
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
24545
+ auth: "user",
24546
+ responseKind: "json",
24547
+ errors: ["validation:invalid_input", "resource:not_found"]
24548
+ },
24549
+ deleteEntrySlotBlock: {
24550
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/{blockId}",
24551
+ method: "DELETE",
24552
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
24553
+ auth: "user",
24554
+ responseKind: "json",
24555
+ errors: ["resource:not_found"]
24556
+ },
23750
24557
  createBlock: {
23751
24558
  path: "/sites/{siteId}/pages/{pageId}/blocks",
23752
24559
  method: "POST",
@@ -27501,14 +28308,14 @@ function formatFieldPath(path25) {
27501
28308
  function toZodIssuePath(path25) {
27502
28309
  return [...path25];
27503
28310
  }
27504
- function fieldIssueToMessage(issue2) {
27505
- switch (issue2.kind) {
28311
+ function fieldIssueToMessage(issue4) {
28312
+ switch (issue4.kind) {
27506
28313
  case "required":
27507
28314
  return "This field is required";
27508
28315
  case "wrongType":
27509
- return `${issue2.label} needs ${issue2.expected}`;
28316
+ return `${issue4.label} needs ${issue4.expected}`;
27510
28317
  case "tooLong":
27511
- return `Use ${issue2.maximum} characters or fewer`;
28318
+ return `Use ${issue4.maximum} characters or fewer`;
27512
28319
  case "invalidEmail":
27513
28320
  return "Enter a valid email address";
27514
28321
  case "invalidPhone":
@@ -27524,29 +28331,29 @@ function fieldIssueToMessage(issue2) {
27524
28331
  case "invalidDateTime":
27525
28332
  return "Choose a valid date and time";
27526
28333
  case "invalidNumber":
27527
- return `${issue2.label} needs a number`;
28334
+ return `${issue4.label} needs a number`;
27528
28335
  case "tooSmall":
27529
- return `${issue2.label} must be ${issue2.minimum} or more`;
28336
+ return `${issue4.label} must be ${issue4.minimum} or more`;
27530
28337
  case "tooLarge":
27531
- return `${issue2.label} must be ${issue2.maximum} or less`;
28338
+ return `${issue4.label} must be ${issue4.maximum} or less`;
27532
28339
  case "invalidSlug":
27533
- return `${issue2.label} can only use lowercase letters, numbers, and dashes`;
28340
+ return `${issue4.label} can only use lowercase letters, numbers, and dashes`;
27534
28341
  case "invalidOption":
27535
- return `Choose one of the available options for ${issue2.label}`;
28342
+ return `Choose one of the available options for ${issue4.label}`;
27536
28343
  case "tooFewItems":
27537
- return `${issue2.label} must have at least ${issue2.minimum} ${pluralize(issue2.itemLabel, issue2.minimum)}`;
28344
+ return `${issue4.label} must have at least ${issue4.minimum} ${pluralize(issue4.itemLabel, issue4.minimum)}`;
27538
28345
  case "tooManyItems":
27539
- return `${issue2.label} must have at most ${issue2.maximum} ${pluralize(issue2.itemLabel, issue2.maximum)}`;
28346
+ return `${issue4.label} must have at most ${issue4.maximum} ${pluralize(issue4.itemLabel, issue4.maximum)}`;
27540
28347
  case "invalidRichText":
27541
- return `${issue2.label} must be valid rich text`;
28348
+ return `${issue4.label} must be valid rich text`;
27542
28349
  case "invalidMedia":
27543
- return `${issue2.label} must be a valid media item`;
28350
+ return `${issue4.label} must be a valid media item`;
27544
28351
  case "invalidLink":
27545
- return `${issue2.label} must be a valid link`;
28352
+ return `${issue4.label} must be a valid link`;
27546
28353
  case "invalidReference":
27547
- return `${issue2.label} must reference a valid item`;
28354
+ return `${issue4.label} must reference a valid item`;
27548
28355
  default:
27549
- return assertNever2(issue2);
28356
+ return assertNever2(issue4);
27550
28357
  }
27551
28358
  }
27552
28359
  function pluralize(label, count) {
@@ -28185,8 +28992,8 @@ function isValidTimeString(value) {
28185
28992
  function isValidDateTimeInstantString(value) {
28186
28993
  const match = DATETIME_PATTERN.exec(value);
28187
28994
  if (!match?.groups) return false;
28188
- const datePart = match.groups.date;
28189
- if (!datePart || !isValidDateString(datePart)) return false;
28995
+ const datePart2 = match.groups.date;
28996
+ if (!datePart2 || !isValidDateString(datePart2)) return false;
28190
28997
  return !Number.isNaN(Date.parse(value));
28191
28998
  }
28192
28999
  function isValidCalendarDate(year, month, day) {
@@ -28333,6 +29140,33 @@ function declareNoBlockDesignCapability(reason) {
28333
29140
 
28334
29141
  // ../blocks/src/system/blocks/hero.ts
28335
29142
  init_boxStyles();
29143
+
29144
+ // ../blocks/src/system/fields/imageShape.ts
29145
+ var standardImageShapeOptions = [
29146
+ { value: "default", label: "Default" },
29147
+ { value: "square", label: "Square corners" },
29148
+ { value: "rounded", label: "Rounded corners" },
29149
+ { value: "circle", label: "Circle" },
29150
+ { value: "arch", label: "Arch" }
29151
+ ];
29152
+ function createImageShapeField(options = {}) {
29153
+ return {
29154
+ id: options.id ?? "imageShape",
29155
+ type: "select",
29156
+ label: options.label ?? "Image shape",
29157
+ ...options.description ? { description: options.description } : {},
29158
+ required: false,
29159
+ defaultValue: options.defaultValue ?? "default",
29160
+ multiple: false,
29161
+ options: [...standardImageShapeOptions],
29162
+ ui: {
29163
+ intent: options.uiIntent ?? "display",
29164
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
29165
+ }
29166
+ };
29167
+ }
29168
+
29169
+ // ../blocks/src/system/blocks/hero.ts
28336
29170
  init_fragments();
28337
29171
  init_styledSection();
28338
29172
  init_defineBlock();
@@ -28400,7 +29234,18 @@ function heroSplitImagePane() {
28400
29234
  return stack(
28401
29235
  {
28402
29236
  gap: "none",
28403
- className: "rb-relative rb-overflow-hidden rb-rounded-3xl",
29237
+ className: {
29238
+ $bind: {
29239
+ from: "content.imageShape",
29240
+ transforms: [
29241
+ {
29242
+ id: "ui.imageShapeClassName",
29243
+ options: { baseClass: "rb-relative rb-overflow-hidden rb-rounded-3xl" }
29244
+ }
29245
+ ],
29246
+ fallback: "rb-relative rb-overflow-hidden rb-rounded-3xl"
29247
+ }
29248
+ },
28404
29249
  style: {
28405
29250
  minHeight: "clamp(18rem, 36vw, 34rem)"
28406
29251
  }
@@ -28518,6 +29363,12 @@ var heroConfig = {
28518
29363
  label: "Content card",
28519
29364
  renderInHeader: true,
28520
29365
  intent: "style"
29366
+ }),
29367
+ createImageShapeField({
29368
+ id: "imageShape",
29369
+ label: "Image shape",
29370
+ defaultValue: "default",
29371
+ uiIntent: "display"
28521
29372
  })
28522
29373
  ],
28523
29374
  layout: classicLayout,
@@ -28532,6 +29383,15 @@ var heroConfig = {
28532
29383
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
28533
29384
  tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
28534
29385
  icon: "Sparkles",
29386
+ previewCustomize: {
29387
+ quickFieldPriority: [
29388
+ "titleSize",
29389
+ "contentAlignment",
29390
+ "contentMaxWidth",
29391
+ "verticalAlignment",
29392
+ "imageShape"
29393
+ ]
29394
+ },
28535
29395
  styleTokens: {
28536
29396
  typography: "display",
28537
29397
  spacing: "xl"
@@ -28551,7 +29411,8 @@ var standardAspectRatioOptions = [
28551
29411
  { value: "16/9", label: "16:9 (Landscape)" },
28552
29412
  { value: "4/3", label: "4:3 (Standard)" },
28553
29413
  { value: "1/1", label: "1:1 (Square)" },
28554
- { value: "3/4", label: "3:4 (Portrait)" }
29414
+ { value: "3/4", label: "3:4 (Portrait)" },
29415
+ { value: "9/16", label: "9:16 (Tall portrait)" }
28555
29416
  ];
28556
29417
  function createAspectRatioField(options = {}) {
28557
29418
  return {
@@ -29522,6 +30383,263 @@ var formBlockDefinition = {
29522
30383
  runtime: formBlockRuntime
29523
30384
  };
29524
30385
 
30386
+ // ../blocks/src/system/blocks/contact-newsletter.ts
30387
+ init_fragments();
30388
+ init_styledSection();
30389
+ init_builder2();
30390
+ init_defineBlock();
30391
+ init_api_bindings();
30392
+ var contactNewsletterLayout = styledSection({
30393
+ children: sectionContainer([
30394
+ el(
30395
+ "div",
30396
+ { className: "contact-newsletter-grid" },
30397
+ [
30398
+ el(
30399
+ "div",
30400
+ { className: "contact-newsletter-column contact-newsletter-contact" },
30401
+ [
30402
+ el(
30403
+ "div",
30404
+ { className: "contact-newsletter-copy" },
30405
+ [
30406
+ text(
30407
+ {
30408
+ as: "h2",
30409
+ className: "form-copy-title"
30410
+ },
30411
+ when("contactTitle"),
30412
+ bind("contactTitle")
30413
+ ),
30414
+ richText(
30415
+ {
30416
+ className: "form-copy-intro rb-prose rb-max-w-none"
30417
+ },
30418
+ when("contactIntro"),
30419
+ bind("contactIntro")
30420
+ )
30421
+ ]
30422
+ ),
30423
+ el(
30424
+ "form",
30425
+ withApiBindings({
30426
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
30427
+ submitLabel: { $bind: { from: "contactSubmitLabel" } },
30428
+ successMessage: { $bind: { from: "contactSuccessMessage" } }
30429
+ }),
30430
+ [],
30431
+ bind("data.form")
30432
+ )
30433
+ ]
30434
+ ),
30435
+ el(
30436
+ "div",
30437
+ { className: "contact-newsletter-column contact-newsletter-info contact-newsletter-newsletter" },
30438
+ [
30439
+ el(
30440
+ "div",
30441
+ { className: "contact-newsletter-copy" },
30442
+ [
30443
+ text(
30444
+ {
30445
+ as: "h2",
30446
+ className: "newsletter-copy-title"
30447
+ },
30448
+ when("newsletterTitle"),
30449
+ bind("newsletterTitle")
30450
+ ),
30451
+ richText(
30452
+ {
30453
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none"
30454
+ },
30455
+ when("newsletterSubtitle"),
30456
+ bind("newsletterSubtitle")
30457
+ )
30458
+ ]
30459
+ ),
30460
+ el(
30461
+ "newsletter-form",
30462
+ withApiBindings({
30463
+ listId: { $bind: { from: "listId" } },
30464
+ preset: { $bind: { from: "preset" } },
30465
+ includePhone: { $bind: { from: "includePhone" } },
30466
+ buttonLabel: { $bind: { from: "newsletterButtonLabel" } },
30467
+ successMessage: { $bind: { from: "newsletterSuccessMessage" } },
30468
+ privacyNote: { $bind: { from: "newsletterPrivacyNote" } },
30469
+ tags: { $bind: { from: "newsletterTags" } },
30470
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } }
30471
+ }),
30472
+ []
30473
+ )
30474
+ ]
30475
+ )
30476
+ ]
30477
+ )
30478
+ ], {
30479
+ className: "contact-newsletter-container"
30480
+ }),
30481
+ baseClass: "",
30482
+ spacing: "medium",
30483
+ background: "surface"
30484
+ });
30485
+ var contactNewsletterManifest = createBlockManifest({
30486
+ id: "block.contact-newsletter",
30487
+ title: "Contact + Newsletter",
30488
+ titleSource: "contactTitle",
30489
+ description: "Two-column newsletter signup and contact form section.",
30490
+ category: "interactive",
30491
+ layout: contactNewsletterLayout,
30492
+ defaultVariant: "default",
30493
+ variants: {
30494
+ default: contactNewsletterLayout
30495
+ },
30496
+ variantOptions: {
30497
+ default: {
30498
+ label: "Two column",
30499
+ description: "Newsletter and contact form side by side.",
30500
+ icon: "Columns2"
30501
+ }
30502
+ },
30503
+ additionalFields: [
30504
+ {
30505
+ id: "newsletterTitle",
30506
+ type: "text",
30507
+ label: "Newsletter title",
30508
+ defaultValue: "Stay connected"
30509
+ },
30510
+ {
30511
+ id: "newsletterSubtitle",
30512
+ type: "richText",
30513
+ label: "Newsletter intro"
30514
+ },
30515
+ {
30516
+ id: "listId",
30517
+ type: "reference",
30518
+ label: "Newsletter list",
30519
+ description: "Select the list new subscribers should be added to.",
30520
+ required: true,
30521
+ referenceKind: "newsletterList",
30522
+ allowManualEntry: false,
30523
+ ui: { intent: "behavior" }
30524
+ },
30525
+ {
30526
+ id: "preset",
30527
+ type: "select",
30528
+ label: "Newsletter fields",
30529
+ defaultValue: "emailOnly",
30530
+ ui: { intent: "display" },
30531
+ options: [
30532
+ { value: "emailOnly", label: "Email only" },
30533
+ { value: "emailName", label: "Email + Name" },
30534
+ { value: "emailFirstLast", label: "Email + First/Last Name" },
30535
+ { value: "emailNameCompany", label: "Email + Name + Company (B2B)" }
30536
+ ]
30537
+ },
30538
+ {
30539
+ id: "includePhone",
30540
+ type: "boolean",
30541
+ label: "Include phone field",
30542
+ defaultValue: false,
30543
+ ui: { intent: "display" }
30544
+ },
30545
+ {
30546
+ id: "newsletterButtonLabel",
30547
+ type: "text",
30548
+ label: "Newsletter button label",
30549
+ defaultValue: "Subscribe",
30550
+ ui: { intent: "display" }
30551
+ },
30552
+ {
30553
+ id: "newsletterSuccessMessage",
30554
+ type: "text",
30555
+ label: "Newsletter success message",
30556
+ defaultValue: "Thanks for subscribing!",
30557
+ ui: { intent: "behavior" }
30558
+ },
30559
+ {
30560
+ id: "newsletterPrivacyNote",
30561
+ type: "text",
30562
+ label: "Privacy note",
30563
+ ui: { intent: "display" }
30564
+ },
30565
+ {
30566
+ id: "newsletterTags",
30567
+ type: "text",
30568
+ label: "Newsletter tags",
30569
+ description: "Optional tags to apply on subscribe, separated by comma or semicolon.",
30570
+ ui: { intent: "behavior" }
30571
+ },
30572
+ {
30573
+ id: "contactTitle",
30574
+ type: "text",
30575
+ label: "Contact title",
30576
+ defaultValue: "Get in touch"
30577
+ },
30578
+ {
30579
+ id: "contactIntro",
30580
+ type: "richText",
30581
+ label: "Contact intro"
30582
+ },
30583
+ {
30584
+ id: "formSlug",
30585
+ type: "reference",
30586
+ label: "Contact form",
30587
+ description: "Pick a saved form to render.",
30588
+ required: true,
30589
+ referenceKind: "form",
30590
+ allowManualEntry: false,
30591
+ ui: { intent: "behavior" }
30592
+ },
30593
+ {
30594
+ id: "contactSubmitLabel",
30595
+ type: "text",
30596
+ label: "Contact button label",
30597
+ defaultValue: "Send message",
30598
+ ui: { intent: "display" }
30599
+ },
30600
+ {
30601
+ id: "contactSuccessMessage",
30602
+ type: "text",
30603
+ label: "Contact success message",
30604
+ defaultValue: "Thanks - we received your message.",
30605
+ ui: { intent: "behavior" }
30606
+ }
30607
+ ],
30608
+ styleTokens: {
30609
+ background: "surface",
30610
+ typography: "body",
30611
+ spacing: "md"
30612
+ },
30613
+ behaviours: {
30614
+ supportsThemeSwitching: true,
30615
+ inlineEditing: true,
30616
+ animation: false,
30617
+ paletteHidden: false
30618
+ },
30619
+ tags: [
30620
+ "contact",
30621
+ "newsletter",
30622
+ "signup",
30623
+ "email",
30624
+ "form",
30625
+ "lead-capture"
30626
+ ],
30627
+ icon: "MailPlus"
30628
+ });
30629
+ var contactNewsletterBlockDefinition = {
30630
+ manifest: contactNewsletterManifest,
30631
+ dataSchemas: { form: formDataSchema.optional() },
30632
+ dataLoaders: {
30633
+ form: {
30634
+ endpoint: "getPublicFormById",
30635
+ params: {
30636
+ formSlug: { $bind: { from: "formSlug" } }
30637
+ },
30638
+ mode: "server"
30639
+ }
30640
+ }
30641
+ };
30642
+
29525
30643
  // ../blocks/src/system/blocks/faq.ts
29526
30644
  init_fragments();
29527
30645
  init_styledSection();
@@ -29762,6 +30880,7 @@ var joinClasses3 = (parts) => parts.filter(
29762
30880
  ).join(" ").replace(/\s+/g, " ").trim();
29763
30881
  var eyebrowTreatmentClassMap = {
29764
30882
  plain: "",
30883
+ accent: "rb-eyebrow-treatment-accent",
29765
30884
  pill: "rb-eyebrow-treatment-pill",
29766
30885
  "accent-pill": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent",
29767
30886
  "pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-pill-bounce",
@@ -29788,6 +30907,13 @@ var imageGalleryCornerClassMap = {
29788
30907
  "2xl": "rb-rounded-2xl",
29789
30908
  "3xl": "rb-rounded-3xl"
29790
30909
  };
30910
+ var imageShapeClassMap = {
30911
+ default: "",
30912
+ square: "rb-media-shape-square",
30913
+ rounded: "rb-media-shape-rounded",
30914
+ circle: "rb-media-shape-circle",
30915
+ arch: "rb-media-shape-arch"
30916
+ };
29791
30917
  var parseRatio = (raw) => {
29792
30918
  if (typeof raw !== "string") return null;
29793
30919
  const value = raw.trim();
@@ -29932,6 +31058,10 @@ function resolveHeroContentMaxWidth(content) {
29932
31058
  return "default";
29933
31059
  }
29934
31060
  function resolveHeroTypographyScale(content) {
31061
+ const titleSize = readString(content, "titleSize");
31062
+ if (titleSize === "quiet" || titleSize === "editorial" || titleSize === "display" || titleSize === "poster") {
31063
+ return titleSize;
31064
+ }
29935
31065
  const raw = readHeroLayoutString(
29936
31066
  content,
29937
31067
  "typographyScale",
@@ -30173,6 +31303,16 @@ var uiTransforms = [
30173
31303
  heroGridClassFromVerticalAlignmentTransform,
30174
31304
  imageFragmentClassTransform,
30175
31305
  imageFragmentSizeTransform,
31306
+ {
31307
+ id: "ui.imageShapeClassName",
31308
+ kind: "string",
31309
+ summary: "Apply a constrained media shape class",
31310
+ run: (value, options) => {
31311
+ const baseClass = typeof options?.baseClass === "string" ? options.baseClass : "";
31312
+ const shape = typeof value === "string" ? value.trim() : "default";
31313
+ return joinClasses3([baseClass, imageShapeClassMap[shape] ?? ""]);
31314
+ }
31315
+ },
30176
31316
  conditionalClassTransform,
30177
31317
  twoColumnContainerClassTransform,
30178
31318
  twoColumnFlexBasisTransform,
@@ -31514,6 +32654,21 @@ var siteHeaderManifest = createBlockManifest({
31514
32654
  id: "block.site-header",
31515
32655
  title: "Site Header",
31516
32656
  category: "layout",
32657
+ additionalFields: [
32658
+ {
32659
+ id: "mode",
32660
+ type: "select",
32661
+ label: "Header display",
32662
+ required: false,
32663
+ multiple: false,
32664
+ defaultValue: "default",
32665
+ options: [
32666
+ { value: "default", label: "Show header" },
32667
+ { value: "hidden", label: "Hide header" }
32668
+ ],
32669
+ ui: { intent: "display" }
32670
+ }
32671
+ ],
31517
32672
  // Skip section styles - this block uses theme-based styling
31518
32673
  skipSectionStyles: true,
31519
32674
  // Block manages its own wrapper - enables sticky positioning
@@ -32960,6 +34115,9 @@ var mediaTextManifest = createBlockManifest({
32960
34115
  category: "layout",
32961
34116
  includeContainerStyles: true,
32962
34117
  titleSource: "title",
34118
+ previewCustomize: {
34119
+ quickFieldPriority: ["imagePosition", "ratio", "imageShape", "titleAlignment", "aspectRatio"]
34120
+ },
32963
34121
  additionalFields: [
32964
34122
  {
32965
34123
  id: "images",
@@ -32998,7 +34156,7 @@ var mediaTextManifest = createBlockManifest({
32998
34156
  {
32999
34157
  id: "titleAlignment",
33000
34158
  type: "select",
33001
- label: "Title alignment",
34159
+ label: "Content alignment",
33002
34160
  required: false,
33003
34161
  defaultValue: "left",
33004
34162
  multiple: false,
@@ -33056,7 +34214,18 @@ var mediaTextManifest = createBlockManifest({
33056
34214
  transition: "slide"
33057
34215
  },
33058
34216
  ui: { intent: "behavior" }
33059
- }),
34217
+ }).map((field) => ({
34218
+ ...field,
34219
+ ui: {
34220
+ ...field.ui ?? {},
34221
+ visibleWhen: field.id === "carouselAutoplayDelay" ? {
34222
+ allOf: [
34223
+ { field: "images", minItems: 2 },
34224
+ { field: "carouselAutoplay", equals: true }
34225
+ ]
34226
+ } : { field: "images", minItems: 2 }
34227
+ }
34228
+ })),
33060
34229
  createAspectRatioField({
33061
34230
  id: "aspectRatio",
33062
34231
  label: "Media aspect ratio",
@@ -33064,6 +34233,12 @@ var mediaTextManifest = createBlockManifest({
33064
34233
  defaultValue: "auto",
33065
34234
  visibleWhen: { field: "images", notEquals: null }
33066
34235
  }),
34236
+ createImageShapeField({
34237
+ id: "imageShape",
34238
+ label: "Media shape",
34239
+ defaultValue: "default",
34240
+ visibleWhen: { field: "images", notEquals: null }
34241
+ }),
33067
34242
  {
33068
34243
  id: "text",
33069
34244
  type: "richText",
@@ -33097,6 +34272,30 @@ var mediaTextManifest = createBlockManifest({
33097
34272
  ...options?.not ? { not: true } : {}
33098
34273
  }
33099
34274
  });
34275
+ const bodyClassNameFromAlignment = {
34276
+ $bind: {
34277
+ from: "content.titleAlignment",
34278
+ transforms: [
34279
+ {
34280
+ id: "ui.bodyClassFromAlignment",
34281
+ options: { base: "rb-prose rb-max-w-none" }
34282
+ }
34283
+ ],
34284
+ fallback: "rb-prose rb-max-w-none"
34285
+ }
34286
+ };
34287
+ const titleClassNameFromAlignment = {
34288
+ $bind: {
34289
+ from: "content.titleAlignment",
34290
+ transforms: [
34291
+ {
34292
+ id: "ui.headingClassFromAlignment",
34293
+ options: { base: "" }
34294
+ }
34295
+ ],
34296
+ fallback: ""
34297
+ }
34298
+ };
33100
34299
  const defaultTextColumn = el("div", {}, [
33101
34300
  styledCard(
33102
34301
  [
@@ -33121,8 +34320,55 @@ var mediaTextManifest = createBlockManifest({
33121
34320
  bind("content.text")
33122
34321
  )
33123
34322
  ]);
34323
+ const bioTextColumn = el(
34324
+ "div",
34325
+ { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" },
34326
+ [
34327
+ text(
34328
+ {
34329
+ as: "h2",
34330
+ className: titleClassNameFromAlignment
34331
+ },
34332
+ when("content.title"),
34333
+ bind("content.title")
34334
+ ),
34335
+ styledCard(
34336
+ [
34337
+ richText(
34338
+ {
34339
+ className: bodyClassNameFromAlignment
34340
+ },
34341
+ bind("content.text")
34342
+ )
34343
+ ],
34344
+ {
34345
+ stylesFrom: "content._textCardStyles",
34346
+ backgroundFrom: "content._textCardStyles.background"
34347
+ },
34348
+ when("content.wrapTextInCard")
34349
+ ),
34350
+ richText(
34351
+ {
34352
+ className: bodyClassNameFromAlignment
34353
+ },
34354
+ when("content.wrapTextInCard", { not: true }),
34355
+ bind("content.text")
34356
+ )
34357
+ ]
34358
+ );
33124
34359
  const defaultImageCommonProps = {
33125
- className: "rb-w-full rb-h-auto rb-object-cover",
34360
+ className: {
34361
+ $bind: {
34362
+ from: "content.imageShape",
34363
+ transforms: [
34364
+ {
34365
+ id: "ui.imageShapeClassName",
34366
+ options: { baseClass: "rb-w-full rb-h-auto rb-object-cover" }
34367
+ }
34368
+ ],
34369
+ fallback: "rb-w-full rb-h-auto rb-object-cover"
34370
+ }
34371
+ },
33126
34372
  style: {
33127
34373
  aspectRatio: { $bind: { from: "content.aspectRatio" } }
33128
34374
  }
@@ -33163,6 +34409,27 @@ var mediaTextManifest = createBlockManifest({
33163
34409
  ],
33164
34410
  whenImagesLength(0, { not: true })
33165
34411
  );
34412
+ const bioImagesLayout = el(
34413
+ "div",
34414
+ {},
34415
+ [
34416
+ responsiveTwoColumn({
34417
+ image: el("div", {}, [
34418
+ el("div", {}, [defaultSingleImage], whenImagesLength(1)),
34419
+ el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))
34420
+ ]),
34421
+ text: bioTextColumn,
34422
+ ratioFrom: "content.ratio",
34423
+ imagePositionFrom: "content.imagePosition",
34424
+ containerClassName: "rb-flex rb-flex-col rb-md-flex-row rb-md-items-center",
34425
+ gapFrom: "content.gap",
34426
+ gapFallback: "comfortable",
34427
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
34428
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
34429
+ })
34430
+ ],
34431
+ whenImagesLength(0, { not: true })
34432
+ );
33166
34433
  const defaultTextOnlyLayout = el(
33167
34434
  "div",
33168
34435
  {},
@@ -33192,7 +34459,45 @@ var mediaTextManifest = createBlockManifest({
33192
34459
  ],
33193
34460
  whenImagesLength(0)
33194
34461
  );
34462
+ const bioTextOnlyLayout = el(
34463
+ "div",
34464
+ { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" },
34465
+ [
34466
+ text(
34467
+ {
34468
+ as: "h2",
34469
+ className: titleClassNameFromAlignment
34470
+ },
34471
+ when("content.title"),
34472
+ bind("content.title")
34473
+ ),
34474
+ styledCard(
34475
+ [
34476
+ richText(
34477
+ {
34478
+ className: bodyClassNameFromAlignment
34479
+ },
34480
+ bind("content.text")
34481
+ )
34482
+ ],
34483
+ {
34484
+ stylesFrom: "content._textCardStyles",
34485
+ backgroundFrom: "content._textCardStyles.background"
34486
+ },
34487
+ when("content.wrapTextInCard")
34488
+ ),
34489
+ richText(
34490
+ {
34491
+ className: bodyClassNameFromAlignment
34492
+ },
34493
+ when("content.wrapTextInCard", { not: true }),
34494
+ bind("content.text")
34495
+ )
34496
+ ],
34497
+ whenImagesLength(0)
34498
+ );
33195
34499
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
34500
+ const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
33196
34501
  const defaultLayout2 = styledSection({
33197
34502
  children: styledContainer({
33198
34503
  rootType: "stack",
@@ -33201,18 +34506,7 @@ var mediaTextManifest = createBlockManifest({
33201
34506
  text(
33202
34507
  {
33203
34508
  as: "h2",
33204
- className: {
33205
- $bind: {
33206
- from: "content.titleAlignment",
33207
- transforms: [
33208
- {
33209
- id: "ui.headingClassFromAlignment",
33210
- options: { base: "" }
33211
- }
33212
- ],
33213
- fallback: ""
33214
- }
33215
- }
34509
+ className: titleClassNameFromAlignment
33216
34510
  },
33217
34511
  when("content.title"),
33218
34512
  bind("content.title")
@@ -33224,14 +34518,28 @@ var mediaTextManifest = createBlockManifest({
33224
34518
  baseClass: "",
33225
34519
  spacing: "medium"
33226
34520
  });
34521
+ const bioLayout = styledSection({
34522
+ children: styledContainer({
34523
+ rootType: "stack",
34524
+ rootProps: { gap: "lg" },
34525
+ children: [bioInner]
34526
+ }),
34527
+ baseClass: "",
34528
+ spacing: "medium"
34529
+ });
33227
34530
  return {
33228
34531
  layout: defaultLayout2,
33229
34532
  variants: {
33230
- default: defaultLayout2
34533
+ default: defaultLayout2,
34534
+ bio: bioLayout
33231
34535
  },
33232
34536
  defaultVariant: "default",
33233
34537
  variantOptions: {
33234
- default: { label: "Default" }
34538
+ default: { label: "Default" },
34539
+ bio: {
34540
+ label: "Bio",
34541
+ description: "Vertically centered title and copy beside media."
34542
+ }
33235
34543
  }
33236
34544
  };
33237
34545
  })(),
@@ -35046,7 +36354,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
35046
36354
  return keys.length >= 2 ? keys : [];
35047
36355
  }
35048
36356
  function normalizeOfferingsPreviewContentForWrite(value) {
35049
- if (!isRecord4(value)) return null;
36357
+ if (!isRecord6(value)) return null;
35050
36358
  const groupOrderValue = value.groupOrder;
35051
36359
  if (Array.isArray(groupOrderValue)) {
35052
36360
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -35059,7 +36367,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
35059
36367
  return { ...value, groupOrder: [] };
35060
36368
  }
35061
36369
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
35062
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord4) : []
36370
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord6) : []
35063
36371
  );
35064
36372
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
35065
36373
  }
@@ -35073,7 +36381,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
35073
36381
  }
35074
36382
  return keys;
35075
36383
  }
35076
- function isRecord4(value) {
36384
+ function isRecord6(value) {
35077
36385
  return typeof value === "object" && value !== null && !Array.isArray(value);
35078
36386
  }
35079
36387
 
@@ -35440,7 +36748,7 @@ function isOfferingsPreviewItemLimit(value) {
35440
36748
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
35441
36749
  }
35442
36750
  function normalizeOfferingsPreviewGroupOverride(value) {
35443
- if (!isRecord5(value)) return [];
36751
+ if (!isRecord7(value)) return [];
35444
36752
  const override = {};
35445
36753
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
35446
36754
  override.sourceKey = value.sourceKey;
@@ -35472,12 +36780,12 @@ function isButtonVariant(value) {
35472
36780
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
35473
36781
  }
35474
36782
  function normalizeCardStylesContent(value) {
35475
- return isRecord5(value) || value === null ? value : void 0;
36783
+ return isRecord7(value) || value === null ? value : void 0;
35476
36784
  }
35477
36785
  function normalizeSectionStylesContent(value) {
35478
- return isRecord5(value) || value === null ? value : void 0;
36786
+ return isRecord7(value) || value === null ? value : void 0;
35479
36787
  }
35480
- function isRecord5(value) {
36788
+ function isRecord7(value) {
35481
36789
  return typeof value === "object" && value !== null && !Array.isArray(value);
35482
36790
  }
35483
36791
 
@@ -38386,11 +39694,13 @@ var heroImageSurfaceMotions = [
38386
39694
  ];
38387
39695
  var standardEyebrowTreatments = [
38388
39696
  "plain",
39697
+ "accent",
38389
39698
  "pill",
38390
39699
  "accent-pill"
38391
39700
  ];
38392
39701
  var animatedEyebrowTreatments = [
38393
39702
  "plain",
39703
+ "accent",
38394
39704
  "pill",
38395
39705
  "accent-pill",
38396
39706
  "pill-bounce",
@@ -38691,6 +40001,17 @@ var systemBlockDefinitionsRaw = [
38691
40001
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
38692
40002
  ]
38693
40003
  })),
40004
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
40005
+ flow: conversionFlow,
40006
+ layoutProfiles: [
40007
+ layoutProfile({
40008
+ variantKey: "default",
40009
+ family: "split",
40010
+ weight: "featured",
40011
+ bias: "soft"
40012
+ })
40013
+ ]
40014
+ })),
38694
40015
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
38695
40016
  sectionSurfaces: "supported",
38696
40017
  contentFrames: ["plain", "panel"],
@@ -38782,6 +40103,12 @@ var systemBlockDefinitionsRaw = [
38782
40103
  family: "media-text",
38783
40104
  weight: "featured",
38784
40105
  bias: "soft"
40106
+ }),
40107
+ layoutProfile({
40108
+ variantKey: "bio",
40109
+ family: "media-text",
40110
+ weight: "featured",
40111
+ bias: "soft"
38785
40112
  })
38786
40113
  ]
38787
40114
  })),
@@ -39617,6 +40944,7 @@ init_colorStyles();
39617
40944
  // ../theme-core/src/inputs/generateInputCss.ts
39618
40945
  init_types9();
39619
40946
  init_constants();
40947
+ init_colorStyles();
39620
40948
 
39621
40949
  // ../theme-core/src/header/generateHeaderCss.ts
39622
40950
  init_resolver();
@@ -39653,6 +40981,11 @@ ${root} {
39653
40981
  --er-event-card-bg: rgb(var(--tb-surface));
39654
40982
  --er-event-card-border-width: var(--rb-border-width, 1px);
39655
40983
  --er-event-card-hover-opacity: 1;
40984
+ --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
40985
+ --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
40986
+ --er-radius: var(--rb-block-radius);
40987
+ --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
40988
+ --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
39656
40989
 
39657
40990
  /* Step indicator */
39658
40991
  --er-step-active: rgb(var(--tb-primary));
@@ -41250,7 +42583,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
41250
42583
  }
41251
42584
 
41252
42585
  // ../api/src/utils/isRecord.ts
41253
- function isRecord6(value) {
42586
+ function isRecord8(value) {
41254
42587
  return typeof value === "object" && value !== null && !Array.isArray(value);
41255
42588
  }
41256
42589
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
@@ -41388,11 +42721,11 @@ siteBannerSettingsSchema.superRefine((value, ctx) => {
41388
42721
  return;
41389
42722
  }
41390
42723
  const analysis = analyzeSiteBannerBody(value.body);
41391
- for (const issue2 of analysis.issues) {
42724
+ for (const issue4 of analysis.issues) {
41392
42725
  ctx.addIssue({
41393
42726
  code: z.ZodIssueCode.custom,
41394
42727
  path: ["body"],
41395
- message: siteBannerBodyIssueMessage(issue2)
42728
+ message: siteBannerBodyIssueMessage(issue4)
41396
42729
  });
41397
42730
  }
41398
42731
  });
@@ -41426,8 +42759,8 @@ function analyzeSiteBannerBody(body) {
41426
42759
  issues
41427
42760
  };
41428
42761
  }
41429
- function siteBannerBodyIssueMessage(issue2) {
41430
- switch (issue2) {
42762
+ function siteBannerBodyIssueMessage(issue4) {
42763
+ switch (issue4) {
41431
42764
  case "empty":
41432
42765
  return "Banner message is required when the banner is enabled.";
41433
42766
  case "too-many-paragraphs":
@@ -41523,7 +42856,7 @@ function sanitizeMarks(marks) {
41523
42856
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
41524
42857
  return [{ type: mark.type }];
41525
42858
  }
41526
- if (mark.type === "link" && isRecord6(mark.attrs) && typeof mark.attrs.href === "string") {
42859
+ if (mark.type === "link" && isRecord8(mark.attrs) && typeof mark.attrs.href === "string") {
41527
42860
  const attrs = { href: mark.attrs.href };
41528
42861
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
41529
42862
  attrs.target = mark.attrs.target;
@@ -41538,10 +42871,10 @@ function sanitizeMarks(marks) {
41538
42871
  return sanitized.length > 0 ? sanitized : void 0;
41539
42872
  }
41540
42873
  function unwrapRichTextValue(value) {
41541
- if (isRecord6(value) && isRecord6(value.doc)) {
42874
+ if (isRecord8(value) && isRecord8(value.doc)) {
41542
42875
  return unwrapRichTextValue(value.doc);
41543
42876
  }
41544
- if (isRecord6(value) && value.type === "doc") {
42877
+ if (isRecord8(value) && value.type === "doc") {
41545
42878
  return {
41546
42879
  type: "doc",
41547
42880
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -41550,7 +42883,7 @@ function unwrapRichTextValue(value) {
41550
42883
  return EMPTY_SITE_BANNER_BODY;
41551
42884
  }
41552
42885
  function isTipTapNodeLike(value) {
41553
- return isRecord6(value) && typeof value.type === "string";
42886
+ return isRecord8(value) && typeof value.type === "string";
41554
42887
  }
41555
42888
  function coerceTipTapNode(value) {
41556
42889
  return {
@@ -41558,9 +42891,9 @@ function coerceTipTapNode(value) {
41558
42891
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
41559
42892
  ...typeof value.text === "string" ? { text: value.text } : {},
41560
42893
  ...Array.isArray(value.marks) ? {
41561
- marks: value.marks.filter((mark) => isRecord6(mark) && typeof mark.type === "string").map((mark) => ({
42894
+ marks: value.marks.filter((mark) => isRecord8(mark) && typeof mark.type === "string").map((mark) => ({
41562
42895
  type: mark.type,
41563
- ...isRecord6(mark.attrs) ? { attrs: mark.attrs } : {}
42896
+ ...isRecord8(mark.attrs) ? { attrs: mark.attrs } : {}
41564
42897
  }))
41565
42898
  } : {}
41566
42899
  };
@@ -41676,7 +43009,7 @@ function collectCartLinkStats(items, depth = 0) {
41676
43009
  return result;
41677
43010
  }
41678
43011
  function isNavigationMenuValidationItem(value) {
41679
- if (!isRecord6(value)) return false;
43012
+ if (!isRecord8(value)) return false;
41680
43013
  return typeof value.label === "string";
41681
43014
  }
41682
43015
 
@@ -41901,6 +43234,7 @@ var SYSTEM_BLOCK_KINDS = [
41901
43234
  "block.site-footer",
41902
43235
  // Form/booking blocks
41903
43236
  "block.form",
43237
+ "block.contact-newsletter",
41904
43238
  "block.appointment-booking",
41905
43239
  "block.event-registration",
41906
43240
  "block.event-details",
@@ -42109,7 +43443,7 @@ var fieldBindingSchema = z.object({
42109
43443
  var metaBindingSchema = z.object({
42110
43444
  source: z.literal("meta"),
42111
43445
  path: z.enum(TEMPLATE_BINDING_META_PATHS, {
42112
- error: (issue2) => describeInvalidTemplateBindingMetaPath(String(issue2.input))
43446
+ error: (issue4) => describeInvalidTemplateBindingMetaPath(String(issue4.input))
42113
43447
  })
42114
43448
  });
42115
43449
  var literalBindingSchema = z.object({
@@ -42120,7 +43454,7 @@ var transformBindingSchema = z.object({
42120
43454
  source: z.literal("transform"),
42121
43455
  path: z.string().min(1, "Transform path is required"),
42122
43456
  transform: z.enum(BINDING_TRANSFORM_VALUES, {
42123
- error: (issue2) => describeInvalidBindingTransform(String(issue2.input))
43457
+ error: (issue4) => describeInvalidBindingTransform(String(issue4.input))
42124
43458
  })
42125
43459
  });
42126
43460
  var baseBindingSchema = z.discriminatedUnion("source", [
@@ -42924,20 +44258,20 @@ var ManagementApiError = class extends Error {
42924
44258
  function is404Error(error) {
42925
44259
  return error instanceof ManagementApiError && error.statusCode === 404;
42926
44260
  }
42927
- function isRecord7(value) {
44261
+ function isRecord9(value) {
42928
44262
  return Boolean(value && typeof value === "object" && !Array.isArray(value));
42929
44263
  }
42930
44264
  function isFieldError(value) {
42931
- return isRecord7(value) && typeof value.field === "string" && typeof value.code === "string" && typeof value.message === "string";
44265
+ return isRecord9(value) && typeof value.field === "string" && typeof value.code === "string" && typeof value.message === "string";
42932
44266
  }
42933
44267
  function parseApiResponse(value) {
42934
- if (!isRecord7(value)) return null;
44268
+ if (!isRecord9(value)) return null;
42935
44269
  if (value.success === true) {
42936
44270
  return { success: true, data: value.data };
42937
44271
  }
42938
44272
  if (value.success === false) {
42939
44273
  const error = value.error;
42940
- if (!isRecord7(error) || typeof error.code !== "string" || typeof error.message !== "string") {
44274
+ if (!isRecord9(error) || typeof error.code !== "string" || typeof error.message !== "string") {
42941
44275
  return { success: false, error: { code: "sdk:http-error", message: "Request failed", details: error } };
42942
44276
  }
42943
44277
  const fieldErrorsRaw = error.fieldErrors;
@@ -44174,8 +45508,8 @@ function mapEntryForOutput(entry) {
44174
45508
  data: entry.data,
44175
45509
  status: entry.status,
44176
45510
  hasUnpublishedChanges: entry.hasUnpublishedChanges,
44177
- title: entry.title,
44178
- manualOrder: entry.manualOrder
45511
+ manualOrder: entry.manualOrder,
45512
+ blocks: entry.blocks
44179
45513
  };
44180
45514
  if (entry.slug !== void 0) {
44181
45515
  result.slug = entry.slug;
@@ -44466,7 +45800,7 @@ function createListCommand(config2) {
44466
45800
 
44467
45801
  // src/cli/push-config.ts
44468
45802
  var DEFAULT_CONFIG_PATH = "./riverbank.config.ts";
44469
- function isRecord8(value) {
45803
+ function isRecord10(value) {
44470
45804
  return typeof value === "object" && value !== null;
44471
45805
  }
44472
45806
  function parseErrorDetails(value) {
@@ -44474,10 +45808,10 @@ function parseErrorDetails(value) {
44474
45808
  if (typeof value === "string") {
44475
45809
  return { message: value };
44476
45810
  }
44477
- if (!isRecord8(value)) return {};
45811
+ if (!isRecord10(value)) return {};
44478
45812
  const message = typeof value.message === "string" ? value.message : void 0;
44479
45813
  const fieldErrorsRaw = value.fieldErrors;
44480
- const fieldErrors = Array.isArray(fieldErrorsRaw) ? fieldErrorsRaw.filter(isRecord8).map((d) => ({
45814
+ const fieldErrors = Array.isArray(fieldErrorsRaw) ? fieldErrorsRaw.filter(isRecord10).map((d) => ({
44481
45815
  field: typeof d.field === "string" ? d.field : "",
44482
45816
  message: typeof d.message === "string" ? d.message : ""
44483
45817
  })).filter((d) => d.field.length > 0 && d.message.length > 0) : void 0;
@@ -44489,12 +45823,12 @@ function formatFieldErrors(fieldErrors) {
44489
45823
  }
44490
45824
  function getDashboardErrorMessage(responseJson, fallback) {
44491
45825
  if (!responseJson) return fallback;
44492
- if (isRecord8(responseJson) && responseJson.success === false && "error" in responseJson) {
45826
+ if (isRecord10(responseJson) && responseJson.success === false && "error" in responseJson) {
44493
45827
  const parsed = parseErrorDetails(responseJson.error);
44494
45828
  const msg = parsed.message ?? fallback;
44495
45829
  return msg + formatFieldErrors(parsed.fieldErrors);
44496
45830
  }
44497
- if (isRecord8(responseJson) && "error" in responseJson) {
45831
+ if (isRecord10(responseJson) && "error" in responseJson) {
44498
45832
  const parsed = parseErrorDetails(responseJson.error);
44499
45833
  const msg = parsed.message ?? fallback;
44500
45834
  return msg + formatFieldErrors(parsed.fieldErrors);
@@ -44613,9 +45947,9 @@ async function pushConfigAction(output, options) {
44613
45947
  const parseResult = riverbankSiteConfigSchema.safeParse(rawConfig);
44614
45948
  if (!parseResult.success) {
44615
45949
  output.error("Invalid config", {
44616
- issues: parseResult.error.issues.map((issue2) => ({
44617
- path: issue2.path.join("."),
44618
- message: issue2.message
45950
+ issues: parseResult.error.issues.map((issue4) => ({
45951
+ path: issue4.path.join("."),
45952
+ message: issue4.message
44619
45953
  }))
44620
45954
  });
44621
45955
  }
@@ -44819,7 +46153,7 @@ function duplicateNavigationIdentityMessage(error) {
44819
46153
 
44820
46154
  // src/cli/media/portable.ts
44821
46155
  var ENV_SPECIFIC_MEDIA_KEYS = ["assetId", "storagePath", "storageBucket"];
44822
- var isRecord9 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
46156
+ var isRecord11 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
44823
46157
  var isMediaObject = (value) => value.type === "image" || value.type === "video";
44824
46158
  function stripEnvSpecificMediaFieldsInPlace(value) {
44825
46159
  if (value === null || value === void 0) return;
@@ -44829,7 +46163,7 @@ function stripEnvSpecificMediaFieldsInPlace(value) {
44829
46163
  }
44830
46164
  return;
44831
46165
  }
44832
- if (!isRecord9(value)) return;
46166
+ if (!isRecord11(value)) return;
44833
46167
  if (isMediaObject(value)) {
44834
46168
  const hasCmsRef = typeof value.identifier === "string" || typeof value.assetId === "string" || typeof value.storagePath === "string" || typeof value.storageBucket === "string";
44835
46169
  for (const key of ENV_SPECIFIC_MEDIA_KEYS) {
@@ -44840,7 +46174,7 @@ function stripEnvSpecificMediaFieldsInPlace(value) {
44840
46174
  }
44841
46175
  delete value.mimeType;
44842
46176
  }
44843
- if (value.type === "image" && isRecord9(value.attrs)) {
46177
+ if (value.type === "image" && isRecord11(value.attrs)) {
44844
46178
  const attrs = value.attrs;
44845
46179
  const hasIdentifier = typeof attrs.identifier === "string" && attrs.identifier.trim().length > 0;
44846
46180
  if (hasIdentifier) {
@@ -44905,7 +46239,8 @@ function pulledEntryToLocalEntry(entry) {
44905
46239
  data: entry.data,
44906
46240
  status: entry.status,
44907
46241
  hasUnpublishedChanges: entry.hasUnpublishedChanges,
44908
- ...entry.slug !== void 0 ? { slug: entry.slug } : {}
46242
+ ...entry.slug !== void 0 ? { slug: entry.slug } : {},
46243
+ ...entry.blocks !== void 0 ? { blocks: entry.blocks } : {}
44909
46244
  };
44910
46245
  }
44911
46246
 
@@ -45011,11 +46346,11 @@ function entryFilePath(input) {
45011
46346
  }
45012
46347
 
45013
46348
  // src/cli/content/writer.ts
45014
- function isRecord10(value) {
46349
+ function isRecord12(value) {
45015
46350
  return typeof value === "object" && value !== null && !Array.isArray(value);
45016
46351
  }
45017
46352
  function parseThemeMeta(value) {
45018
- if (!isRecord10(value) || typeof value.pulledAt !== "string" || !isRecord10(value.themes)) {
46353
+ if (!isRecord12(value) || typeof value.pulledAt !== "string" || !isRecord12(value.themes)) {
45019
46354
  return null;
45020
46355
  }
45021
46356
  return { pulledAt: value.pulledAt, themes: value.themes };
@@ -45627,7 +46962,9 @@ async function readEntries(contentDir, contentType) {
45627
46962
  const items = await fs5.readdir(entriesDir, { withFileTypes: true });
45628
46963
  for (const item of items) {
45629
46964
  if (item.isDirectory()) {
45630
- const entries = await readEntriesFromDirectory(path5.join(entriesDir, item.name));
46965
+ const entries = await readEntriesFromDirectory(
46966
+ path5.join(entriesDir, item.name)
46967
+ );
45631
46968
  await applyManualOrderMetadata(contentDir, item.name, entries);
45632
46969
  if (entries.length > 0) {
45633
46970
  result.set(item.name, entries);
@@ -45644,7 +46981,9 @@ async function applyManualOrderMetadata(contentDir, contentType, entries) {
45644
46981
  const meta = await readEntriesMeta(contentDir, contentType);
45645
46982
  const order = meta?.manualOrder;
45646
46983
  if (!order?.length) return;
45647
- const orderByIdentifier = new Map(order.map((identifier, index) => [identifier, index]));
46984
+ const orderByIdentifier = new Map(
46985
+ order.map((identifier, index) => [identifier, index])
46986
+ );
45648
46987
  for (const entry of entries) {
45649
46988
  const manualOrder = orderByIdentifier.get(entry.identifier);
45650
46989
  if (manualOrder !== void 0) {
@@ -45689,7 +47028,9 @@ async function readSettings(contentDir) {
45689
47028
  if (!parsed.success) {
45690
47029
  throw new Error(
45691
47030
  `${filePath}: invalid settings.json
45692
- ` + parsed.error.issues.map((issue2) => ` - ${issue2.path.join(".") || "(root)"}: ${issue2.message}`).join("\n")
47031
+ ` + parsed.error.issues.map(
47032
+ (issue4) => ` - ${issue4.path.join(".") || "(root)"}: ${issue4.message}`
47033
+ ).join("\n")
45693
47034
  );
45694
47035
  }
45695
47036
  return parsed.data;
@@ -45809,7 +47150,18 @@ async function readFooter(contentDir) {
45809
47150
  return raw;
45810
47151
  }
45811
47152
  async function readAllContent(contentDir) {
45812
- const [entries, pages, navigation, settings, forms, footer, venues, eventCategories, events, courses] = await Promise.all([
47153
+ const [
47154
+ entries,
47155
+ pages,
47156
+ navigation,
47157
+ settings,
47158
+ forms,
47159
+ footer,
47160
+ venues,
47161
+ eventCategories,
47162
+ events,
47163
+ courses
47164
+ ] = await Promise.all([
45813
47165
  readEntries(contentDir),
45814
47166
  readPages(contentDir),
45815
47167
  readNavigation(contentDir),
@@ -45821,7 +47173,18 @@ async function readAllContent(contentDir) {
45821
47173
  readEvents(contentDir),
45822
47174
  readCourses(contentDir)
45823
47175
  ]);
45824
- return { entries, pages, navigation, settings, forms, footer, venues, eventCategories, events, courses };
47176
+ return {
47177
+ entries,
47178
+ pages,
47179
+ navigation,
47180
+ settings,
47181
+ forms,
47182
+ footer,
47183
+ venues,
47184
+ eventCategories,
47185
+ events,
47186
+ courses
47187
+ };
45825
47188
  }
45826
47189
  async function contentDirExists(contentDir) {
45827
47190
  return fileExists(contentDir);
@@ -46401,9 +47764,9 @@ async function localMediaFileExists(filePath) {
46401
47764
  }
46402
47765
 
46403
47766
  // src/cli/media/identifiers.ts
46404
- var isRecord11 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
47767
+ var isRecord13 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
46405
47768
  var isMediaValue = (value) => {
46406
- if (!isRecord11(value)) return false;
47769
+ if (!isRecord13(value)) return false;
46407
47770
  const type = value.type;
46408
47771
  if (type !== "image" && type !== "video" && type !== "audio" && type !== "document" && type !== "spreadsheet" && type !== "archive") return false;
46409
47772
  return typeof value.identifier === "string" || typeof value.assetId === "string" || typeof value.storagePath === "string" || typeof value.src === "string";
@@ -46418,7 +47781,7 @@ var walkMediaValues = (value, location2, handler) => {
46418
47781
  });
46419
47782
  return;
46420
47783
  }
46421
- if (isRecord11(value)) {
47784
+ if (isRecord13(value)) {
46422
47785
  Object.entries(value).forEach(([key, entry]) => {
46423
47786
  walkMediaValues(entry, location2 ? `${location2}.${key}` : key, handler);
46424
47787
  });
@@ -46428,6 +47791,15 @@ var walkLocalContentMedia = (content, handler) => {
46428
47791
  for (const [contentType, entries] of content.entries ?? []) {
46429
47792
  for (const entry of entries) {
46430
47793
  walkMediaValues(entry.data, `entries.${contentType}.${entry.identifier}.data`, handler);
47794
+ for (const [slotKey, blocks] of Object.entries(entry.blocks ?? {})) {
47795
+ for (const block of blocks) {
47796
+ walkMediaValues(
47797
+ block.content,
47798
+ `entries.${contentType}.${entry.identifier}.blocks.${slotKey}.${block.identifier ?? "unidentified"}.content`,
47799
+ handler
47800
+ );
47801
+ }
47802
+ }
46431
47803
  }
46432
47804
  }
46433
47805
  for (const page of content.pages ?? []) {
@@ -46468,6 +47840,15 @@ var walkPulledContentMedia = (content, handler) => {
46468
47840
  for (const [contentType, entries] of Object.entries(content.entries)) {
46469
47841
  for (const entry of entries) {
46470
47842
  walkMediaValues(entry.data, `entries.${contentType}.${entry.identifier}.data`, handler);
47843
+ for (const [slotKey, blocks] of Object.entries(entry.blocks ?? {})) {
47844
+ for (const block of blocks) {
47845
+ walkMediaValues(
47846
+ block.content,
47847
+ `entries.${contentType}.${entry.identifier}.blocks.${slotKey}.${block.identifier ?? "unidentified"}.content`,
47848
+ handler
47849
+ );
47850
+ }
47851
+ }
46471
47852
  }
46472
47853
  }
46473
47854
  for (const page of content.pages) {
@@ -46526,7 +47907,7 @@ var normalizeMediaValueToIdentifierOnly = (value, identifier, asset) => {
46526
47907
  };
46527
47908
 
46528
47909
  // src/cli/media/rich-text.ts
46529
- var isRecord12 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
47910
+ var isRecord14 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
46530
47911
  function collectRichTextImageAttrs(value, out = [], location2 = "") {
46531
47912
  if (Array.isArray(value)) {
46532
47913
  value.forEach(
@@ -46534,8 +47915,8 @@ function collectRichTextImageAttrs(value, out = [], location2 = "") {
46534
47915
  );
46535
47916
  return out;
46536
47917
  }
46537
- if (!isRecord12(value)) return out;
46538
- if (value.type === "image" && isRecord12(value.attrs)) {
47918
+ if (!isRecord14(value)) return out;
47919
+ if (value.type === "image" && isRecord14(value.attrs)) {
46539
47920
  out.push({ attrs: value.attrs, location: location2 ? `${location2}.attrs` : "attrs" });
46540
47921
  }
46541
47922
  for (const [key, child] of Object.entries(value)) {
@@ -49166,7 +50547,7 @@ async function writeAllEntries(contentDir, entriesByType, pulledAt, entriesMeta,
49166
50547
  }
49167
50548
  const { dirPath, count } = await writeEntries(contentDir, {
49168
50549
  contentType,
49169
- entries,
50550
+ entries: entries.map(mapEntryForOutput),
49170
50551
  meta: { pulledAt, entries: ctMeta },
49171
50552
  pagination: { limit: entries.length, total: entries.length}
49172
50553
  }, writerOptions);
@@ -49181,7 +50562,7 @@ async function fetchAllContentPaginated(client, contentTypes, output, baseConten
49181
50562
  for (const contentType of contentTypes) {
49182
50563
  output.info(`Fetching ${contentType} entries...`);
49183
50564
  const result = await pullEntriesWithPagination(client, contentType, output);
49184
- allEntries[contentType] = result.entries.map(mapEntryForOutput);
50565
+ allEntries[contentType] = result.entries;
49185
50566
  for (const [id, meta] of Object.entries(result.meta.entries || {})) {
49186
50567
  allMeta[`${contentType}:${id}`] = meta;
49187
50568
  }
@@ -50446,10 +51827,303 @@ function normalizeLocalContentShape(content) {
50446
51827
  courses: Array.isArray(value.courses) ? value.courses : []
50447
51828
  };
50448
51829
  }
51830
+
51831
+ // ../api/src/sdk-event-pricing.ts
51832
+ var identifierRegex = /^[a-z0-9][a-z0-9-]*$/;
51833
+ var currencyRegex = /^[A-Z]{3}$/;
51834
+ var isoDateTimeRegex = /^\d{4}-\d{2}-\d{2}T.+/;
51835
+ function issue2(path25, message) {
51836
+ return { path: path25, message };
51837
+ }
51838
+ function isRecord15(value) {
51839
+ return typeof value === "object" && value !== null && !Array.isArray(value);
51840
+ }
51841
+ function isCurrency(value) {
51842
+ return typeof value === "string" && currencyRegex.test(value);
51843
+ }
51844
+ function isWholeNumber(value) {
51845
+ return typeof value === "number" && Number.isInteger(value);
51846
+ }
51847
+ function isWholeMinuteIsoDateTime(value) {
51848
+ if (!isoDateTimeRegex.test(value)) return false;
51849
+ const epochMs = Date.parse(value);
51850
+ return Number.isFinite(epochMs) && epochMs % 6e4 === 0;
51851
+ }
51852
+ function validateTicketType(raw, index, currency) {
51853
+ const path25 = ["ticketTypes", String(index)];
51854
+ if (!isRecord15(raw)) return [issue2(path25, "Ticket type must be an object")];
51855
+ const issues = [];
51856
+ const identifier = raw.identifier;
51857
+ if (typeof identifier !== "string" || !identifierRegex.test(identifier)) {
51858
+ issues.push(
51859
+ issue2(
51860
+ [...path25, "identifier"],
51861
+ "Ticket identifier must use lowercase letters, numbers, and hyphens"
51862
+ )
51863
+ );
51864
+ }
51865
+ const name = raw.name;
51866
+ if (typeof name !== "string" || name.trim().length === 0) {
51867
+ issues.push(issue2([...path25, "name"], "Ticket name is required"));
51868
+ }
51869
+ const priceAmount = raw.priceAmount;
51870
+ if (!isWholeNumber(priceAmount) || priceAmount < 0) {
51871
+ issues.push(
51872
+ issue2(
51873
+ [...path25, "priceAmount"],
51874
+ "Ticket priceAmount must be a non-negative integer"
51875
+ )
51876
+ );
51877
+ }
51878
+ const priceCurrency = raw.priceCurrency;
51879
+ if (priceCurrency !== void 0 && priceCurrency !== null && priceCurrency !== currency) {
51880
+ issues.push(
51881
+ issue2(
51882
+ [...path25, "priceCurrency"],
51883
+ "Ticket priceCurrency must match pricing.priceCurrency"
51884
+ )
51885
+ );
51886
+ }
51887
+ const sortOrder = raw.sortOrder;
51888
+ if (sortOrder !== void 0 && (!isWholeNumber(sortOrder) || sortOrder < 0)) {
51889
+ issues.push(
51890
+ issue2(
51891
+ [...path25, "sortOrder"],
51892
+ "Ticket sortOrder must be a non-negative integer"
51893
+ )
51894
+ );
51895
+ }
51896
+ const capacityLimit2 = raw.capacityLimit;
51897
+ if (capacityLimit2 !== void 0 && capacityLimit2 !== null && (!isWholeNumber(capacityLimit2) || capacityLimit2 < 1)) {
51898
+ issues.push(
51899
+ issue2(
51900
+ [...path25, "capacityLimit"],
51901
+ "Ticket capacityLimit must be a positive integer"
51902
+ )
51903
+ );
51904
+ }
51905
+ const attendanceScope = raw.attendanceScope;
51906
+ if (attendanceScope !== void 0 && attendanceScope !== "in_person" && attendanceScope !== "online" && attendanceScope !== "both") {
51907
+ issues.push(
51908
+ issue2(
51909
+ [...path25, "attendanceScope"],
51910
+ "Ticket attendanceScope must be in_person, online, or both"
51911
+ )
51912
+ );
51913
+ }
51914
+ const saleStartsAt = raw.saleStartsAt;
51915
+ if (saleStartsAt !== void 0 && saleStartsAt !== null && (typeof saleStartsAt !== "string" || !isWholeMinuteIsoDateTime(saleStartsAt))) {
51916
+ issues.push(
51917
+ issue2(
51918
+ [...path25, "saleStartsAt"],
51919
+ "Ticket saleStartsAt must be an ISO datetime aligned to a whole minute"
51920
+ )
51921
+ );
51922
+ }
51923
+ const saleEndsAt = raw.saleEndsAt;
51924
+ if (saleEndsAt !== void 0 && saleEndsAt !== null && (typeof saleEndsAt !== "string" || !isWholeMinuteIsoDateTime(saleEndsAt))) {
51925
+ issues.push(
51926
+ issue2(
51927
+ [...path25, "saleEndsAt"],
51928
+ "Ticket saleEndsAt must be an ISO datetime aligned to a whole minute"
51929
+ )
51930
+ );
51931
+ }
51932
+ if (typeof saleStartsAt === "string" && typeof saleEndsAt === "string" && Date.parse(saleEndsAt) <= Date.parse(saleStartsAt)) {
51933
+ issues.push(
51934
+ issue2(
51935
+ [...path25, "saleEndsAt"],
51936
+ "Ticket saleEndsAt must be after saleStartsAt"
51937
+ )
51938
+ );
51939
+ }
51940
+ const cmsTicketTypeId = raw.cmsTicketTypeId;
51941
+ if (cmsTicketTypeId !== void 0 && cmsTicketTypeId !== null && (typeof cmsTicketTypeId !== "string" || cmsTicketTypeId.length === 0)) {
51942
+ issues.push(
51943
+ issue2(
51944
+ [...path25, "cmsTicketTypeId"],
51945
+ "Ticket cmsTicketTypeId must be a non-empty string"
51946
+ )
51947
+ );
51948
+ }
51949
+ if (issues.length > 0) return issues;
51950
+ return {
51951
+ identifier,
51952
+ ...cmsTicketTypeId ? { cmsTicketTypeId } : {},
51953
+ name,
51954
+ description: typeof raw.description === "string" ? raw.description : null,
51955
+ priceAmount,
51956
+ isActive: typeof raw.isActive === "boolean" ? raw.isActive : true,
51957
+ sortOrder: isWholeNumber(sortOrder) ? sortOrder : index,
51958
+ capacityLimit: isWholeNumber(capacityLimit2) ? capacityLimit2 : null,
51959
+ attendanceScope: attendanceScope === "in_person" || attendanceScope === "online" || attendanceScope === "both" ? attendanceScope : "both",
51960
+ saleStartsAt: typeof saleStartsAt === "string" ? saleStartsAt : null,
51961
+ saleEndsAt: typeof saleEndsAt === "string" ? saleEndsAt : null
51962
+ };
51963
+ }
51964
+ function validateTicketTypes(rawTicketTypes, currency) {
51965
+ if (!Array.isArray(rawTicketTypes) || rawTicketTypes.length === 0) {
51966
+ return [
51967
+ issue2(
51968
+ ["ticketTypes"],
51969
+ "Ticket-type pricing requires at least one ticket type"
51970
+ )
51971
+ ];
51972
+ }
51973
+ const issues = [];
51974
+ const ticketTypes = [];
51975
+ const seenIdentifiers = /* @__PURE__ */ new Set();
51976
+ rawTicketTypes.forEach((rawTicketType, index) => {
51977
+ const rawIdentifier = isRecord15(rawTicketType) ? rawTicketType.identifier : void 0;
51978
+ const hasValidIdentifier = typeof rawIdentifier === "string" && identifierRegex.test(rawIdentifier);
51979
+ const isDuplicateIdentifier = hasValidIdentifier && seenIdentifiers.has(rawIdentifier);
51980
+ if (isDuplicateIdentifier) {
51981
+ issues.push(
51982
+ issue2(
51983
+ ["ticketTypes", String(index), "identifier"],
51984
+ `Duplicate ticket identifier "${rawIdentifier}"`
51985
+ )
51986
+ );
51987
+ } else if (hasValidIdentifier) {
51988
+ seenIdentifiers.add(rawIdentifier);
51989
+ }
51990
+ const parsed = validateTicketType(rawTicketType, index, currency);
51991
+ if (Array.isArray(parsed)) {
51992
+ issues.push(...parsed);
51993
+ return;
51994
+ }
51995
+ if (isDuplicateIdentifier) {
51996
+ return;
51997
+ }
51998
+ ticketTypes.push(parsed);
51999
+ });
52000
+ if (issues.length > 0) return issues;
52001
+ return sortSdkEventTicketTypes(ticketTypes);
52002
+ }
52003
+ function isPricingIssueArray(value) {
52004
+ const first = value[0];
52005
+ return first !== void 0 && "message" in first;
52006
+ }
52007
+ function sortSdkEventTicketTypes(ticketTypes) {
52008
+ return [...ticketTypes].sort((left, right) => {
52009
+ const leftOrder = left.sortOrder ?? Number.MAX_SAFE_INTEGER;
52010
+ const rightOrder = right.sortOrder ?? Number.MAX_SAFE_INTEGER;
52011
+ if (leftOrder !== rightOrder) return leftOrder - rightOrder;
52012
+ const identifierCompare = left.identifier.localeCompare(right.identifier);
52013
+ if (identifierCompare !== 0) return identifierCompare;
52014
+ return left.name.localeCompare(right.name);
52015
+ });
52016
+ }
52017
+ function classifySdkEventPricing(rawInput) {
52018
+ if (rawInput === void 0 || rawInput === null) {
52019
+ return { ok: true, pricing: { kind: "free" } };
52020
+ }
52021
+ if (!isRecord15(rawInput)) {
52022
+ return { ok: false, issues: [issue2([], "Pricing must be an object")] };
52023
+ }
52024
+ const record = rawInput;
52025
+ const kind = typeof record.kind === "string" ? record.kind : record.pricingMode === "ticket_types" ? "ticket_types" : record.pricingMode === "fixed_price" ? "fixed_price" : record.pricingMode === "free" ? "free" : record.requiresPayment || typeof record.priceAmount === "number" && record.priceAmount > 0 ? "fixed_price" : "free";
52026
+ const acceptsPasses = typeof record.acceptsPasses === "boolean" ? record.acceptsPasses : void 0;
52027
+ const acceptsMemberships = typeof record.acceptsMemberships === "boolean" ? record.acceptsMemberships : void 0;
52028
+ const priceDisplay = typeof record.priceDisplay === "string" ? record.priceDisplay : null;
52029
+ switch (kind) {
52030
+ case "free":
52031
+ return {
52032
+ ok: true,
52033
+ pricing: {
52034
+ kind: "free",
52035
+ priceDisplay,
52036
+ ...acceptsPasses !== void 0 ? { acceptsPasses } : {},
52037
+ ...acceptsMemberships !== void 0 ? { acceptsMemberships } : {}
52038
+ }
52039
+ };
52040
+ case "fixed_price": {
52041
+ const issues = [];
52042
+ const priceAmount = record.priceAmount;
52043
+ if (!isWholeNumber(priceAmount) || priceAmount < 0) {
52044
+ issues.push(
52045
+ issue2(
52046
+ ["priceAmount"],
52047
+ "Fixed-price events require a non-negative integer priceAmount"
52048
+ )
52049
+ );
52050
+ }
52051
+ const rawPriceCurrency = record.priceCurrency;
52052
+ const priceCurrency = rawPriceCurrency === void 0 || rawPriceCurrency === null ? "USD" : isCurrency(rawPriceCurrency) ? rawPriceCurrency : null;
52053
+ if (rawPriceCurrency !== void 0 && rawPriceCurrency !== null && !isCurrency(rawPriceCurrency)) {
52054
+ issues.push(
52055
+ issue2(
52056
+ ["priceCurrency"],
52057
+ "priceCurrency must be a 3-letter uppercase currency code"
52058
+ )
52059
+ );
52060
+ }
52061
+ if (issues.length > 0) return { ok: false, issues };
52062
+ if (!isWholeNumber(priceAmount) || priceCurrency === null) {
52063
+ return {
52064
+ ok: false,
52065
+ issues: [issue2(["priceAmount"], "Invalid fixed-price event pricing")]
52066
+ };
52067
+ }
52068
+ return {
52069
+ ok: true,
52070
+ pricing: {
52071
+ kind: "fixed_price",
52072
+ priceAmount,
52073
+ priceCurrency,
52074
+ priceDisplay,
52075
+ ...acceptsPasses !== void 0 ? { acceptsPasses } : {},
52076
+ ...acceptsMemberships !== void 0 ? { acceptsMemberships } : {}
52077
+ }
52078
+ };
52079
+ }
52080
+ case "ticket_types": {
52081
+ const priceCurrency = record.priceCurrency;
52082
+ if (!isCurrency(priceCurrency)) {
52083
+ return {
52084
+ ok: false,
52085
+ issues: [
52086
+ issue2(
52087
+ ["priceCurrency"],
52088
+ "Ticket-type pricing requires a 3-letter uppercase priceCurrency"
52089
+ )
52090
+ ]
52091
+ };
52092
+ }
52093
+ const ticketTypes = record.ticketTypes === void 0 || record.ticketTypes === null ? [] : validateTicketTypes(record.ticketTypes, priceCurrency);
52094
+ if (isPricingIssueArray(ticketTypes)) {
52095
+ return { ok: false, issues: ticketTypes };
52096
+ }
52097
+ return {
52098
+ ok: true,
52099
+ pricing: {
52100
+ kind: "ticket_types",
52101
+ priceCurrency,
52102
+ priceDisplay,
52103
+ ...acceptsPasses !== void 0 ? { acceptsPasses } : {},
52104
+ ...acceptsMemberships !== void 0 ? { acceptsMemberships } : {},
52105
+ ticketTypes
52106
+ }
52107
+ };
52108
+ }
52109
+ default:
52110
+ return {
52111
+ ok: false,
52112
+ issues: [
52113
+ issue2(
52114
+ ["kind"],
52115
+ "Pricing kind must be free, fixed_price, or ticket_types"
52116
+ )
52117
+ ]
52118
+ };
52119
+ }
52120
+ }
52121
+
52122
+ // src/cli/commands/push/pushAllExtras.ts
50449
52123
  function nullishToNull(value) {
50450
52124
  return value == null ? null : value;
50451
52125
  }
50452
- function isRecord13(value) {
52126
+ function isRecord16(value) {
50453
52127
  return typeof value === "object" && value !== null && !Array.isArray(value);
50454
52128
  }
50455
52129
  function stringValue(value, fallback) {
@@ -50459,8 +52133,13 @@ function stringValue(value, fallback) {
50459
52133
  }
50460
52134
  return fallback;
50461
52135
  }
52136
+ function normalizeEventPricingForCompare(pricing) {
52137
+ const result = classifySdkEventPricing(pricing);
52138
+ if (result.ok) return result.pricing;
52139
+ return { kind: "free" };
52140
+ }
50462
52141
  function normalizeVenueAddress(value) {
50463
- const obj = isRecord13(value) ? value : {};
52142
+ const obj = isRecord16(value) ? value : {};
50464
52143
  return {
50465
52144
  line1: nullishToNull(typeof obj.line1 === "string" ? obj.line1 : void 0),
50466
52145
  line2: nullishToNull(typeof obj.line2 === "string" ? obj.line2 : void 0),
@@ -50477,7 +52156,7 @@ function normalizeVenueAddress(value) {
50477
52156
  };
50478
52157
  }
50479
52158
  function normalizeVenueLocation(value) {
50480
- if (!isRecord13(value)) return null;
52159
+ if (!isRecord16(value)) return null;
50481
52160
  const obj = value;
50482
52161
  const lat = typeof obj.lat === "number" ? obj.lat : null;
50483
52162
  const lng = typeof obj.lng === "number" ? obj.lng : null;
@@ -50485,32 +52164,41 @@ function normalizeVenueLocation(value) {
50485
52164
  return { lat, lng };
50486
52165
  }
50487
52166
  function normalizeVenueForCompare(venue) {
50488
- const obj = isRecord13(venue) ? venue : {};
52167
+ const obj = isRecord16(venue) ? venue : {};
50489
52168
  return {
50490
52169
  slug: String(obj.slug),
50491
52170
  title: String(obj.title),
50492
- description: nullishToNull(typeof obj.description === "string" ? obj.description : void 0),
50493
- timezone: nullishToNull(typeof obj.timezone === "string" ? obj.timezone : void 0),
50494
- capacity: nullishToNull(typeof obj.capacity === "number" ? obj.capacity : void 0),
52171
+ description: nullishToNull(
52172
+ typeof obj.description === "string" ? obj.description : void 0
52173
+ ),
52174
+ timezone: nullishToNull(
52175
+ typeof obj.timezone === "string" ? obj.timezone : void 0
52176
+ ),
52177
+ capacity: nullishToNull(
52178
+ typeof obj.capacity === "number" ? obj.capacity : void 0
52179
+ ),
50495
52180
  address: normalizeVenueAddress(obj.address),
50496
52181
  location: normalizeVenueLocation(obj.location),
50497
- mapEmbed: nullishToNull(typeof obj.mapEmbed === "string" ? obj.mapEmbed : void 0)
52182
+ mapEmbed: nullishToNull(
52183
+ typeof obj.mapEmbed === "string" ? obj.mapEmbed : void 0
52184
+ )
50498
52185
  };
50499
52186
  }
50500
52187
  function normalizeEventCategoryForCompare(category) {
50501
- const obj = isRecord13(category) ? category : {};
52188
+ const obj = isRecord16(category) ? category : {};
50502
52189
  return {
50503
52190
  identifier: String(obj.identifier),
50504
52191
  name: String(obj.name),
50505
- description: nullishToNull(typeof obj.description === "string" ? obj.description : void 0),
52192
+ description: nullishToNull(
52193
+ typeof obj.description === "string" ? obj.description : void 0
52194
+ ),
50506
52195
  color: nullishToNull(typeof obj.color === "string" ? obj.color : void 0),
50507
52196
  sortOrder: typeof obj.sortOrder === "number" ? obj.sortOrder : 0
50508
52197
  };
50509
52198
  }
50510
52199
  function normalizeRemoteEventForCompare(event) {
50511
- const obj = isRecord13(event) ? event : {};
50512
- const schedule = isRecord13(obj.schedule) ? obj.schedule : {};
50513
- const pricing = isRecord13(obj.pricing) ? obj.pricing : {};
52200
+ const obj = isRecord16(event) ? event : {};
52201
+ const schedule = isRecord16(obj.schedule) ? obj.schedule : {};
50514
52202
  return {
50515
52203
  identifier: String(obj.identifier),
50516
52204
  title: String(obj.title),
@@ -50521,36 +52209,31 @@ function normalizeRemoteEventForCompare(event) {
50521
52209
  recurrenceRule: nullishToNull(
50522
52210
  schedule.recurrenceRule
50523
52211
  ),
50524
- startDate: nullishToNull(
50525
- schedule.startDate
50526
- ),
52212
+ startDate: nullishToNull(schedule.startDate),
50527
52213
  defaultStartTime: stringValue(schedule.defaultStartTime, "09:00:00"),
50528
52214
  durationMinutes: typeof schedule.durationMinutes === "number" ? schedule.durationMinutes : 60
50529
52215
  },
50530
- capacity: nullishToNull(typeof obj.capacity === "number" ? obj.capacity : void 0),
50531
- pricing: {
50532
- requiresPayment: Boolean(pricing.requiresPayment ?? false),
50533
- priceAmount: nullishToNull(pricing.priceAmount),
50534
- priceCurrency: nullishToNull(
50535
- pricing.priceCurrency
50536
- ),
50537
- priceDisplay: nullishToNull(
50538
- pricing.priceDisplay
50539
- ),
50540
- acceptsPasses: Boolean(pricing.acceptsPasses ?? true),
50541
- acceptsMemberships: Boolean(pricing.acceptsMemberships ?? true)
50542
- },
50543
- venueRef: nullishToNull(typeof obj.venueRef === "string" ? obj.venueRef : void 0),
50544
- categoryRef: nullishToNull(typeof obj.categoryRef === "string" ? obj.categoryRef : void 0),
50545
- formRef: nullishToNull(typeof obj.formRef === "string" ? obj.formRef : void 0),
50546
- content: isRecord13(obj.content) ? obj.content : {},
50547
- settings: isRecord13(obj.settings) ? obj.settings : {},
50548
- presentation: isRecord13(obj.presentation) ? obj.presentation : null,
52216
+ capacity: nullishToNull(
52217
+ typeof obj.capacity === "number" ? obj.capacity : void 0
52218
+ ),
52219
+ pricing: normalizeEventPricingForCompare(obj.pricing),
52220
+ venueRef: nullishToNull(
52221
+ typeof obj.venueRef === "string" ? obj.venueRef : void 0
52222
+ ),
52223
+ categoryRef: nullishToNull(
52224
+ typeof obj.categoryRef === "string" ? obj.categoryRef : void 0
52225
+ ),
52226
+ formRef: nullishToNull(
52227
+ typeof obj.formRef === "string" ? obj.formRef : void 0
52228
+ ),
52229
+ content: isRecord16(obj.content) ? obj.content : {},
52230
+ settings: isRecord16(obj.settings) ? obj.settings : {},
52231
+ presentation: isRecord16(obj.presentation) ? obj.presentation : null,
50549
52232
  tags: Array.isArray(obj.tags) ? obj.tags : []
50550
52233
  };
50551
52234
  }
50552
52235
  function normalizeLocalEventAgainstRemoteForCompare(localEvent, remoteEvent) {
50553
- const local = isRecord13(localEvent) ? localEvent : {};
52236
+ const local = isRecord16(localEvent) ? localEvent : {};
50554
52237
  const base = remoteEvent ? normalizeRemoteEventForCompare(remoteEvent) : normalizeRemoteEventForCompare({
50555
52238
  identifier: local.identifier,
50556
52239
  title: local.title,
@@ -50568,8 +52251,7 @@ function normalizeLocalEventAgainstRemoteForCompare(localEvent, remoteEvent) {
50568
52251
  presentation: local.presentation ?? null,
50569
52252
  tags: local.tags ?? []
50570
52253
  });
50571
- const schedule = isRecord13(local.schedule) ? local.schedule : {};
50572
- const pricing = isRecord13(local.pricing) ? local.pricing : {};
52254
+ const schedule = isRecord16(local.schedule) ? local.schedule : {};
50573
52255
  return {
50574
52256
  ...base,
50575
52257
  identifier: stringValue(local.identifier, base.identifier),
@@ -50580,24 +52262,28 @@ function normalizeLocalEventAgainstRemoteForCompare(localEvent, remoteEvent) {
50580
52262
  schedule: {
50581
52263
  recurrenceRule: schedule.recurrenceRule === void 0 ? base.schedule.recurrenceRule : nullishToNull(schedule.recurrenceRule),
50582
52264
  startDate: schedule.startDate === void 0 ? base.schedule.startDate : nullishToNull(schedule.startDate),
50583
- defaultStartTime: schedule.defaultStartTime === void 0 ? base.schedule.defaultStartTime : stringValue(schedule.defaultStartTime, base.schedule.defaultStartTime),
52265
+ defaultStartTime: schedule.defaultStartTime === void 0 ? base.schedule.defaultStartTime : stringValue(
52266
+ schedule.defaultStartTime,
52267
+ base.schedule.defaultStartTime
52268
+ ),
50584
52269
  durationMinutes: schedule.durationMinutes === void 0 ? base.schedule.durationMinutes : typeof schedule.durationMinutes === "number" ? schedule.durationMinutes : base.schedule.durationMinutes
50585
52270
  },
50586
- capacity: local.capacity === void 0 ? base.capacity : nullishToNull(typeof local.capacity === "number" ? local.capacity : void 0),
50587
- pricing: {
50588
- requiresPayment: pricing.requiresPayment === void 0 ? base.pricing.requiresPayment : Boolean(pricing.requiresPayment),
50589
- priceAmount: pricing.priceAmount === void 0 ? base.pricing.priceAmount : nullishToNull(pricing.priceAmount),
50590
- priceCurrency: pricing.priceCurrency === void 0 ? base.pricing.priceCurrency : nullishToNull(pricing.priceCurrency),
50591
- priceDisplay: pricing.priceDisplay === void 0 ? base.pricing.priceDisplay : nullishToNull(pricing.priceDisplay),
50592
- acceptsPasses: pricing.acceptsPasses === void 0 ? base.pricing.acceptsPasses : Boolean(pricing.acceptsPasses),
50593
- acceptsMemberships: pricing.acceptsMemberships === void 0 ? base.pricing.acceptsMemberships : Boolean(pricing.acceptsMemberships)
50594
- },
50595
- venueRef: local.venueRef === void 0 ? base.venueRef : nullishToNull(typeof local.venueRef === "string" ? local.venueRef : void 0),
50596
- categoryRef: local.categoryRef === void 0 ? base.categoryRef : nullishToNull(typeof local.categoryRef === "string" ? local.categoryRef : void 0),
50597
- formRef: local.formRef === void 0 ? base.formRef : nullishToNull(typeof local.formRef === "string" ? local.formRef : void 0),
50598
- content: local.content === void 0 ? base.content : isRecord13(local.content) ? local.content : {},
50599
- settings: local.settings === void 0 ? base.settings : isRecord13(local.settings) ? local.settings : {},
50600
- presentation: local.presentation === void 0 ? base.presentation : isRecord13(local.presentation) ? local.presentation : null,
52271
+ capacity: local.capacity === void 0 ? base.capacity : nullishToNull(
52272
+ typeof local.capacity === "number" ? local.capacity : void 0
52273
+ ),
52274
+ pricing: local.pricing === void 0 ? base.pricing : normalizeEventPricingForCompare(local.pricing),
52275
+ venueRef: local.venueRef === void 0 ? base.venueRef : nullishToNull(
52276
+ typeof local.venueRef === "string" ? local.venueRef : void 0
52277
+ ),
52278
+ categoryRef: local.categoryRef === void 0 ? base.categoryRef : nullishToNull(
52279
+ typeof local.categoryRef === "string" ? local.categoryRef : void 0
52280
+ ),
52281
+ formRef: local.formRef === void 0 ? base.formRef : nullishToNull(
52282
+ typeof local.formRef === "string" ? local.formRef : void 0
52283
+ ),
52284
+ content: local.content === void 0 ? base.content : isRecord16(local.content) ? local.content : {},
52285
+ settings: local.settings === void 0 ? base.settings : isRecord16(local.settings) ? local.settings : {},
52286
+ presentation: local.presentation === void 0 ? base.presentation : isRecord16(local.presentation) ? local.presentation : null,
50601
52287
  tags: local.tags === void 0 ? base.tags : Array.isArray(local.tags) ? local.tags : []
50602
52288
  };
50603
52289
  }
@@ -50609,7 +52295,7 @@ function toIsoStringOrOriginal(value) {
50609
52295
  function normalizeCourseSessions(value) {
50610
52296
  if (!Array.isArray(value)) return [];
50611
52297
  return value.map((session) => {
50612
- const obj = isRecord13(session) ? session : {};
52298
+ const obj = isRecord16(session) ? session : {};
50613
52299
  return {
50614
52300
  startsAt: toIsoStringOrOriginal(obj.startsAt),
50615
52301
  endsAt: toIsoStringOrOriginal(obj.endsAt)
@@ -50621,41 +52307,53 @@ function normalizeCourseSessions(value) {
50621
52307
  }
50622
52308
  function normalizeCourseProgram(value) {
50623
52309
  if (value == null) return null;
50624
- if (!isRecord13(value)) {
52310
+ if (!isRecord16(value)) {
50625
52311
  return { identifier: null, data: {} };
50626
52312
  }
50627
52313
  return {
50628
52314
  identifier: nullishToNull(
50629
52315
  typeof value.identifier === "string" ? value.identifier : void 0
50630
52316
  ),
50631
- data: isRecord13(value.data) ? value.data : {}
52317
+ data: isRecord16(value.data) ? value.data : {}
50632
52318
  };
50633
52319
  }
50634
52320
  function normalizeRemoteCourseForCompare(course) {
50635
- const obj = isRecord13(course) ? course : {};
52321
+ const obj = isRecord16(course) ? course : {};
50636
52322
  return {
50637
52323
  identifier: String(obj.identifier),
50638
52324
  title: String(obj.title),
50639
52325
  slug: String(obj.slug),
50640
52326
  status: obj.status === "active" || obj.status === "cancelled" || obj.status === "completed" ? obj.status : "draft",
50641
52327
  visibility: obj.visibility === "public" || obj.visibility === "private" || obj.visibility === "unlisted" ? obj.visibility : "public",
50642
- venueRef: nullishToNull(typeof obj.venueRef === "string" ? obj.venueRef : void 0),
50643
- categoryRef: nullishToNull(typeof obj.categoryRef === "string" ? obj.categoryRef : void 0),
50644
- formRef: nullishToNull(typeof obj.formRef === "string" ? obj.formRef : void 0),
50645
- capacity: nullishToNull(typeof obj.capacity === "number" ? obj.capacity : void 0),
52328
+ venueRef: nullishToNull(
52329
+ typeof obj.venueRef === "string" ? obj.venueRef : void 0
52330
+ ),
52331
+ categoryRef: nullishToNull(
52332
+ typeof obj.categoryRef === "string" ? obj.categoryRef : void 0
52333
+ ),
52334
+ formRef: nullishToNull(
52335
+ typeof obj.formRef === "string" ? obj.formRef : void 0
52336
+ ),
52337
+ capacity: nullishToNull(
52338
+ typeof obj.capacity === "number" ? obj.capacity : void 0
52339
+ ),
50646
52340
  enrollmentCapacity: nullishToNull(
50647
52341
  typeof obj.enrollmentCapacity === "number" ? obj.enrollmentCapacity : void 0
50648
52342
  ),
50649
52343
  acceptsMemberships: Boolean(obj.acceptsMemberships ?? false),
50650
- priceCents: nullishToNull(typeof obj.priceCents === "number" ? obj.priceCents : void 0),
52344
+ priceCents: nullishToNull(
52345
+ typeof obj.priceCents === "number" ? obj.priceCents : void 0
52346
+ ),
50651
52347
  currency: typeof obj.currency === "string" && obj.currency.trim().length > 0 ? obj.currency.toUpperCase() : "GBP",
50652
52348
  sessions: normalizeCourseSessions(obj.sessions),
50653
- programRef: nullishToNull(typeof obj.programRef === "string" ? obj.programRef : void 0),
52349
+ programRef: nullishToNull(
52350
+ typeof obj.programRef === "string" ? obj.programRef : void 0
52351
+ ),
50654
52352
  program: normalizeCourseProgram(obj.program)
50655
52353
  };
50656
52354
  }
50657
52355
  function normalizeLocalCourseAgainstRemoteForCompare(localCourse, remoteCourse) {
50658
- const local = isRecord13(localCourse) ? localCourse : {};
52356
+ const local = isRecord16(localCourse) ? localCourse : {};
50659
52357
  const base = remoteCourse ? normalizeRemoteCourseForCompare(remoteCourse) : normalizeRemoteCourseForCompare({
50660
52358
  identifier: local.identifier,
50661
52359
  title: local.title,
@@ -50676,11 +52374,11 @@ function normalizeLocalCourseAgainstRemoteForCompare(localCourse, remoteCourse)
50676
52374
  });
50677
52375
  const status = local.status === void 0 ? base.status : local.status === "active" || local.status === "cancelled" || local.status === "completed" ? local.status : "draft";
50678
52376
  const visibility = local.visibility === void 0 ? base.visibility : local.visibility === "public" || local.visibility === "private" || local.visibility === "unlisted" ? local.visibility : "public";
50679
- const program2 = local.program === void 0 ? base.program : local.program === null ? null : isRecord13(local.program) ? {
52377
+ const program2 = local.program === void 0 ? base.program : local.program === null ? null : isRecord16(local.program) ? {
50680
52378
  identifier: local.program.identifier === void 0 ? base.program?.identifier ?? null : nullishToNull(
50681
52379
  typeof local.program.identifier === "string" ? local.program.identifier : void 0
50682
52380
  ),
50683
- data: isRecord13(local.program.data) ? local.program.data : base.program?.data ?? {}
52381
+ data: isRecord16(local.program.data) ? local.program.data : base.program?.data ?? {}
50684
52382
  } : base.program;
50685
52383
  return {
50686
52384
  ...base,
@@ -50689,18 +52387,30 @@ function normalizeLocalCourseAgainstRemoteForCompare(localCourse, remoteCourse)
50689
52387
  slug: stringValue(local.slug, base.slug),
50690
52388
  status,
50691
52389
  visibility,
50692
- venueRef: local.venueRef === void 0 ? base.venueRef : nullishToNull(typeof local.venueRef === "string" ? local.venueRef : void 0),
50693
- categoryRef: local.categoryRef === void 0 ? base.categoryRef : nullishToNull(typeof local.categoryRef === "string" ? local.categoryRef : void 0),
50694
- formRef: local.formRef === void 0 ? base.formRef : nullishToNull(typeof local.formRef === "string" ? local.formRef : void 0),
50695
- capacity: local.capacity === void 0 ? base.capacity : nullishToNull(typeof local.capacity === "number" ? local.capacity : void 0),
52390
+ venueRef: local.venueRef === void 0 ? base.venueRef : nullishToNull(
52391
+ typeof local.venueRef === "string" ? local.venueRef : void 0
52392
+ ),
52393
+ categoryRef: local.categoryRef === void 0 ? base.categoryRef : nullishToNull(
52394
+ typeof local.categoryRef === "string" ? local.categoryRef : void 0
52395
+ ),
52396
+ formRef: local.formRef === void 0 ? base.formRef : nullishToNull(
52397
+ typeof local.formRef === "string" ? local.formRef : void 0
52398
+ ),
52399
+ capacity: local.capacity === void 0 ? base.capacity : nullishToNull(
52400
+ typeof local.capacity === "number" ? local.capacity : void 0
52401
+ ),
50696
52402
  enrollmentCapacity: local.enrollmentCapacity === void 0 ? base.enrollmentCapacity : nullishToNull(
50697
52403
  typeof local.enrollmentCapacity === "number" ? local.enrollmentCapacity : void 0
50698
52404
  ),
50699
52405
  acceptsMemberships: local.acceptsMemberships === void 0 ? base.acceptsMemberships : Boolean(local.acceptsMemberships),
50700
- priceCents: local.priceCents === void 0 ? base.priceCents : nullishToNull(typeof local.priceCents === "number" ? local.priceCents : void 0),
52406
+ priceCents: local.priceCents === void 0 ? base.priceCents : nullishToNull(
52407
+ typeof local.priceCents === "number" ? local.priceCents : void 0
52408
+ ),
50701
52409
  currency: local.currency === void 0 ? base.currency : typeof local.currency === "string" && local.currency.trim().length > 0 ? local.currency.toUpperCase() : base.currency,
50702
52410
  sessions: local.sessions === void 0 ? base.sessions : normalizeCourseSessions(local.sessions),
50703
- programRef: local.programRef === void 0 ? base.programRef : nullishToNull(typeof local.programRef === "string" ? local.programRef : void 0),
52411
+ programRef: local.programRef === void 0 ? base.programRef : nullishToNull(
52412
+ typeof local.programRef === "string" ? local.programRef : void 0
52413
+ ),
50704
52414
  program: program2
50705
52415
  };
50706
52416
  }
@@ -50717,26 +52427,15 @@ function detectOrphans(changes, localIds, remoteMap) {
50717
52427
  }
50718
52428
  function calculatePushAllExtraChanges(local, remote, options) {
50719
52429
  const deleteOrphaned = options?.deleteOrphaned ?? false;
50720
- const remoteVenues = new Map(
50721
- (remote.venues ?? []).map((v) => [v.slug, v])
50722
- );
52430
+ const remoteVenues = new Map((remote.venues ?? []).map((v) => [v.slug, v]));
50723
52431
  const remoteCategories = new Map(
50724
- (remote.eventCategories ?? []).map((c) => [
50725
- c.identifier,
50726
- c
50727
- ])
52432
+ (remote.eventCategories ?? []).map((c) => [c.identifier, c])
50728
52433
  );
50729
52434
  const remoteEvents = new Map(
50730
- (remote.events ?? []).map((e) => [
50731
- e.identifier,
50732
- e
50733
- ])
52435
+ (remote.events ?? []).map((e) => [e.identifier, e])
50734
52436
  );
50735
52437
  const remoteCourses = new Map(
50736
- (remote.courses ?? []).map((course) => [
50737
- course.identifier,
50738
- course
50739
- ])
52438
+ (remote.courses ?? []).map((course) => [course.identifier, course])
50740
52439
  );
50741
52440
  const venues = {
50742
52441
  toPush: /* @__PURE__ */ new Set(),
@@ -50801,7 +52500,10 @@ function calculatePushAllExtraChanges(local, remote, options) {
50801
52500
  events.toPush.add(identifier);
50802
52501
  continue;
50803
52502
  }
50804
- const localNorm = normalizeLocalEventAgainstRemoteForCompare(event, remoteEvent);
52503
+ const localNorm = normalizeLocalEventAgainstRemoteForCompare(
52504
+ event,
52505
+ remoteEvent
52506
+ );
50805
52507
  const remoteNorm = normalizeRemoteEventForCompare(remoteEvent);
50806
52508
  if (!equal(localNorm, remoteNorm)) {
50807
52509
  events.update++;
@@ -50825,7 +52527,10 @@ function calculatePushAllExtraChanges(local, remote, options) {
50825
52527
  courses.toPush.add(identifier);
50826
52528
  continue;
50827
52529
  }
50828
- const localNorm = normalizeLocalCourseAgainstRemoteForCompare(course, remoteCourse);
52530
+ const localNorm = normalizeLocalCourseAgainstRemoteForCompare(
52531
+ course,
52532
+ remoteCourse
52533
+ );
50829
52534
  const remoteNorm = normalizeRemoteCourseForCompare(remoteCourse);
50830
52535
  if (!equal(localNorm, remoteNorm)) {
50831
52536
  courses.update++;
@@ -50835,10 +52540,26 @@ function calculatePushAllExtraChanges(local, remote, options) {
50835
52540
  }
50836
52541
  }
50837
52542
  if (deleteOrphaned) {
50838
- detectOrphans(venues, local.venues.map((v) => String(v.slug)), remoteVenues);
50839
- detectOrphans(eventCategories, local.eventCategories.map((c) => String(c.identifier)), remoteCategories);
50840
- detectOrphans(events, local.events.map((e) => String(e.identifier)), remoteEvents);
50841
- detectOrphans(courses, local.courses.map((course) => String(course.identifier)), remoteCourses);
52543
+ detectOrphans(
52544
+ venues,
52545
+ local.venues.map((v) => String(v.slug)),
52546
+ remoteVenues
52547
+ );
52548
+ detectOrphans(
52549
+ eventCategories,
52550
+ local.eventCategories.map((c) => String(c.identifier)),
52551
+ remoteCategories
52552
+ );
52553
+ detectOrphans(
52554
+ events,
52555
+ local.events.map((e) => String(e.identifier)),
52556
+ remoteEvents
52557
+ );
52558
+ detectOrphans(
52559
+ courses,
52560
+ local.courses.map((course) => String(course.identifier)),
52561
+ remoteCourses
52562
+ );
50842
52563
  }
50843
52564
  return {
50844
52565
  venues,
@@ -51264,6 +52985,12 @@ var appointmentResourceRefSchema = resourceRefSchema("appointment-resource");
51264
52985
  var appointmentAvailabilityRefSchema = resourceRefSchema("availability");
51265
52986
  var unknownRecordSchema = z.record(z.string(), z.unknown());
51266
52987
  var stringArraySchema = z.array(z.string()).readonly();
52988
+ var entrySlotBlockSchema = z.object({
52989
+ identifier: z.string().nullable().optional(),
52990
+ kind: z.string().min(1),
52991
+ content: unknownRecordSchema
52992
+ }).strict();
52993
+ var entrySlotBlocksSchema = z.record(z.string(), z.array(entrySlotBlockSchema));
51267
52994
  var positiveIntegerSchema = z.number().int().positive();
51268
52995
  var nonNegativeIntegerSchema = z.number().int().nonnegative();
51269
52996
  var recipeIdentifierSchema = z.string().regex(
@@ -51642,6 +53369,7 @@ var upsertContentEntryCommandSchema = z.object({
51642
53369
  title: z.string().min(1).optional(),
51643
53370
  manualOrder: z.number().int().min(0).optional(),
51644
53371
  data: unknownRecordSchema.optional(),
53372
+ blocks: entrySlotBlocksSchema.optional(),
51645
53373
  linkedSubjectRef: contentEntryRefSchema.optional(),
51646
53374
  mediaRefs: z.array(mediaRefSchema).readonly().optional()
51647
53375
  }).strict()
@@ -52885,7 +54613,7 @@ function getSiteCommandLifecycleIntent(command) {
52885
54613
  init_src();
52886
54614
 
52887
54615
  // ../site-commands/src/guards.ts
52888
- function isRecord14(value) {
54616
+ function isRecord17(value) {
52889
54617
  return typeof value === "object" && value !== null;
52890
54618
  }
52891
54619
 
@@ -53150,7 +54878,7 @@ function collectVenueRefsFromIntervals(intervals, path25) {
53150
54878
  }
53151
54879
  function collectNavigationRefs(items, path25) {
53152
54880
  return items.flatMap((item, index) => {
53153
- if (!isRecord14(item)) return [];
54881
+ if (!isRecord17(item)) return [];
53154
54882
  const itemPath = `${path25}[${index}]`;
53155
54883
  const refs = [];
53156
54884
  if (typeof item.pageRef === "string") {
@@ -53167,7 +54895,7 @@ function collectNavigationRefs(items, path25) {
53167
54895
  }
53168
54896
  function collectBlockRefs(blocks, path25) {
53169
54897
  return blocks.flatMap((block, index) => {
53170
- if (!isRecord14(block)) return [];
54898
+ if (!isRecord17(block)) return [];
53171
54899
  const blockPath = `${path25}[${index}]`;
53172
54900
  return [
53173
54901
  ...collectNestedRefs(block.props, `${blockPath}.props`),
@@ -53183,7 +54911,7 @@ function collectNestedRefs(value, path25) {
53183
54911
  if (Array.isArray(value)) {
53184
54912
  return value.flatMap((item, index) => collectNestedRefs(item, `${path25}[${index}]`));
53185
54913
  }
53186
- if (!isRecord14(value)) return [];
54914
+ if (!isRecord17(value)) return [];
53187
54915
  return Object.entries(value).flatMap(([key, child]) => collectNestedRefs(child, `${path25}.${key}`));
53188
54916
  }
53189
54917
 
@@ -53267,7 +54995,7 @@ function parseCommandBatch(input) {
53267
54995
  if (unknownTypeErrors.length > 0) return err(unknownTypeErrors);
53268
54996
  const parsed = siteCommandBatchSchema.safeParse(input);
53269
54997
  if (!parsed.success) {
53270
- return err(parsed.error.issues.map((issue2) => invalidPayloadError(input, issue2)));
54998
+ return err(parsed.error.issues.map((issue4) => invalidPayloadError(input, issue4)));
53271
54999
  }
53272
55000
  return ok(parsed.data);
53273
55001
  }
@@ -53439,9 +55167,9 @@ function deriveIdempotencyKey(input) {
53439
55167
  ].join("|"));
53440
55168
  }
53441
55169
  function findUnknownCommandTypes(input) {
53442
- if (!isRecord14(input) || !Array.isArray(input.commands)) return [];
55170
+ if (!isRecord17(input) || !Array.isArray(input.commands)) return [];
53443
55171
  return input.commands.flatMap((command, commandIndex) => {
53444
- if (!isRecord14(command) || typeof command.type !== "string") return [];
55172
+ if (!isRecord17(command) || typeof command.type !== "string") return [];
53445
55173
  if (commandTypeSet.has(command.type)) return [];
53446
55174
  return [{
53447
55175
  code: "unknown_command_type",
@@ -53451,25 +55179,25 @@ function findUnknownCommandTypes(input) {
53451
55179
  }];
53452
55180
  });
53453
55181
  }
53454
- function invalidPayloadError(input, issue2) {
53455
- const commandIndex = commandIndexForIssuePath(issue2.path);
55182
+ function invalidPayloadError(input, issue4) {
55183
+ const commandIndex = commandIndexForIssuePath(issue4.path);
53456
55184
  const commandType = commandTypeForIssue(input, commandIndex);
53457
- const field = formatIssuePath(issue2.path);
55185
+ const field = formatIssuePath(issue4.path);
53458
55186
  return {
53459
55187
  code: "invalid_command_payload",
53460
55188
  commandIndex,
53461
55189
  commandType,
53462
55190
  field,
53463
- message: `${field}: ${issue2.message}`
55191
+ message: `${field}: ${issue4.message}`
53464
55192
  };
53465
55193
  }
53466
55194
  function commandIndexForIssuePath(path25) {
53467
55195
  return path25[0] === "commands" && typeof path25[1] === "number" ? path25[1] : -1;
53468
55196
  }
53469
55197
  function commandTypeForIssue(input, commandIndex) {
53470
- if (!isRecord14(input) || !isUnknownArray3(input.commands)) return null;
55198
+ if (!isRecord17(input) || !isUnknownArray3(input.commands)) return null;
53471
55199
  const command = input.commands[commandIndex];
53472
- return isRecord14(command) && typeof command.type === "string" ? command.type : null;
55200
+ return isRecord17(command) && typeof command.type === "string" ? command.type : null;
53473
55201
  }
53474
55202
  function isUnknownArray3(value) {
53475
55203
  return Array.isArray(value);
@@ -54136,6 +55864,186 @@ function reportSubjectForCommandRef(subjectsByCommandRef, commandRef) {
54136
55864
 
54137
55865
  // src/cli/site-commands/datedOfferingCommands.ts
54138
55866
  init_src();
55867
+
55868
+ // ../api/src/sdk-event-schedule.ts
55869
+ var timeRegex = /^([01]\d|2[0-3]):([0-5]\d)(:([0-5]\d))?$/;
55870
+ var explicitOffsetDateTimeRegex = /^(\d{4})-(\d{2})-(\d{2})T([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?(\.\d{1,3})?(Z|[+-]([01]\d|2[0-3]):[0-5]\d)$/;
55871
+ var localDateTimeRegex = /^(\d{4})-(\d{2})-(\d{2})T([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?(\.\d{1,3})?$/;
55872
+ function issue3(path25, message) {
55873
+ return { path: path25, message };
55874
+ }
55875
+ function isValidDateParts(year, month, day) {
55876
+ const date = new Date(Date.UTC(year, month - 1, day));
55877
+ return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
55878
+ }
55879
+ function isZeroFraction(fraction) {
55880
+ return fraction === void 0 || /^\.0+$/.test(fraction);
55881
+ }
55882
+ function datePart(year, month, day) {
55883
+ return `${year}-${month}-${day}`;
55884
+ }
55885
+ function timePart(hours, minutes, seconds = "00") {
55886
+ return `${hours}:${minutes}:${seconds}`;
55887
+ }
55888
+ function parseSdkEventDateTime(value) {
55889
+ const explicitMatch = explicitOffsetDateTimeRegex.exec(value);
55890
+ if (explicitMatch) {
55891
+ const [, yearRaw2, monthRaw2, dayRaw2, hours2, minutes2, seconds2 = "00", fraction2] = explicitMatch;
55892
+ if (!yearRaw2 || !monthRaw2 || !dayRaw2 || !hours2 || !minutes2) return null;
55893
+ const year2 = Number(yearRaw2);
55894
+ const month2 = Number(monthRaw2);
55895
+ const day2 = Number(dayRaw2);
55896
+ if (!isValidDateParts(year2, month2, day2) || !isZeroFraction(fraction2)) return null;
55897
+ const epochMs2 = Date.parse(value);
55898
+ if (!Number.isFinite(epochMs2)) return null;
55899
+ return {
55900
+ epochMs: epochMs2,
55901
+ date: datePart(yearRaw2, monthRaw2, dayRaw2),
55902
+ time: timePart(hours2, minutes2, seconds2),
55903
+ iso: new Date(epochMs2).toISOString()
55904
+ };
55905
+ }
55906
+ const localMatch = localDateTimeRegex.exec(value);
55907
+ if (!localMatch) return null;
55908
+ const [, yearRaw, monthRaw, dayRaw, hours, minutes, seconds = "00", fraction] = localMatch;
55909
+ if (!yearRaw || !monthRaw || !dayRaw || !hours || !minutes) return null;
55910
+ const year = Number(yearRaw);
55911
+ const month = Number(monthRaw);
55912
+ const day = Number(dayRaw);
55913
+ if (!isValidDateParts(year, month, day) || !isZeroFraction(fraction)) return null;
55914
+ const epochMs = Date.UTC(year, month - 1, day, Number(hours), Number(minutes), Number(seconds));
55915
+ return {
55916
+ epochMs,
55917
+ date: datePart(yearRaw, monthRaw, dayRaw),
55918
+ time: timePart(hours, minutes, seconds),
55919
+ iso: new Date(epochMs).toISOString()
55920
+ };
55921
+ }
55922
+ function durationMinutesBetween(startsAt, endsAt) {
55923
+ if (endsAt.epochMs <= startsAt.epochMs) return null;
55924
+ const durationMs = endsAt.epochMs - startsAt.epochMs;
55925
+ if (durationMs % 6e4 !== 0) return null;
55926
+ return durationMs / 6e4;
55927
+ }
55928
+ function exceedsMaxDuration(durationMinutes, options) {
55929
+ return options.maxDurationMinutes !== void 0 && durationMinutes > options.maxDurationMinutes;
55930
+ }
55931
+ function maxDurationMessage(options) {
55932
+ return options.maxDurationDays === void 0 ? "Duration is above the allowed maximum" : `Duration must be ${options.maxDurationDays} days or less`;
55933
+ }
55934
+ function classifyCanonicalSchedule(input, options) {
55935
+ const issues = [];
55936
+ if (options.requireCanonicalFields && input.recurrenceRule === void 0) {
55937
+ issues.push(issue3(["recurrenceRule"], "recurrenceRule is required"));
55938
+ }
55939
+ if (input.defaultStartTime !== void 0 && input.defaultStartTime !== null && !timeRegex.test(input.defaultStartTime)) {
55940
+ issues.push(issue3(["defaultStartTime"], "Invalid time format (HH:MM or HH:MM:SS)"));
55941
+ }
55942
+ if (options.requireCanonicalFields && !input.defaultStartTime) {
55943
+ issues.push(issue3(["defaultStartTime"], "defaultStartTime is required"));
55944
+ }
55945
+ if (options.requireCanonicalFields && input.durationMinutes === void 0) {
55946
+ issues.push(issue3(["durationMinutes"], "durationMinutes is required"));
55947
+ }
55948
+ if (input.durationMinutes !== void 0 && input.durationMinutes !== null) {
55949
+ if (input.durationMinutes < 1) {
55950
+ issues.push(issue3(["durationMinutes"], "durationMinutes must be at least 1"));
55951
+ } else if (exceedsMaxDuration(input.durationMinutes, options)) {
55952
+ issues.push(issue3(["durationMinutes"], maxDurationMessage(options)));
55953
+ }
55954
+ }
55955
+ if (issues.length > 0) return { ok: false, issues };
55956
+ return {
55957
+ ok: true,
55958
+ kind: "canonical",
55959
+ canonical: {
55960
+ recurrenceRule: input.recurrenceRule ?? null,
55961
+ startDate: input.startDate,
55962
+ defaultStartTime: input.defaultStartTime ?? "09:00:00",
55963
+ durationMinutes: input.durationMinutes ?? 60
55964
+ }
55965
+ };
55966
+ }
55967
+ function classifySdkEventSchedule(input, options = {}) {
55968
+ const issues = [];
55969
+ const hasStartsAt = input.startsAt !== void 0 && input.startsAt !== null;
55970
+ const hasEndsAt = input.endsAt !== void 0 && input.endsAt !== null;
55971
+ const hasDateTimeDuration = hasStartsAt && input.durationMinutes !== void 0 && input.durationMinutes !== null;
55972
+ const hasCanonicalStart = input.startDate !== void 0 || input.defaultStartTime !== void 0;
55973
+ if (!hasStartsAt && !hasEndsAt) {
55974
+ return classifyCanonicalSchedule(input, options);
55975
+ }
55976
+ if (hasStartsAt && hasCanonicalStart) {
55977
+ issues.push(issue3(["startsAt"], "Use either startsAt or startDate/defaultStartTime, not both"));
55978
+ }
55979
+ if (input.recurrenceRule) {
55980
+ issues.push(issue3(["recurrenceRule"], "startsAt schedules are only supported for one-off events"));
55981
+ }
55982
+ if (!hasStartsAt) {
55983
+ issues.push(issue3(["startsAt"], "startsAt is required when endsAt is provided"));
55984
+ }
55985
+ if (!hasEndsAt && !hasDateTimeDuration) {
55986
+ issues.push(issue3(["endsAt"], "Provide either endsAt or durationMinutes with startsAt"));
55987
+ }
55988
+ if (hasEndsAt && hasDateTimeDuration) {
55989
+ issues.push(issue3(["endsAt"], "Use either endsAt or durationMinutes with startsAt, not both"));
55990
+ }
55991
+ const startsAt = typeof input.startsAt === "string" ? parseSdkEventDateTime(input.startsAt) : null;
55992
+ const endsAt = typeof input.endsAt === "string" ? parseSdkEventDateTime(input.endsAt) : null;
55993
+ if (hasStartsAt && !startsAt) {
55994
+ issues.push(issue3(["startsAt"], "Invalid datetime format. Use ISO datetime format, e.g. 2026-06-01T10:00:00Z"));
55995
+ }
55996
+ if (hasEndsAt && !endsAt) {
55997
+ issues.push(issue3(["endsAt"], "Invalid datetime format. Use ISO datetime format, e.g. 2026-06-07T10:00:00Z"));
55998
+ }
55999
+ if (startsAt && endsAt) {
56000
+ const durationMinutes = durationMinutesBetween(startsAt, endsAt);
56001
+ if (durationMinutes === null) {
56002
+ issues.push(issue3(["endsAt"], "endsAt must be after startsAt and align to a whole minute"));
56003
+ } else if (exceedsMaxDuration(durationMinutes, options)) {
56004
+ issues.push(issue3(["endsAt"], maxDurationMessage(options)));
56005
+ }
56006
+ if (issues.length === 0 && durationMinutes !== null) {
56007
+ return {
56008
+ ok: true,
56009
+ kind: "start-end",
56010
+ canonical: {
56011
+ recurrenceRule: null,
56012
+ startDate: startsAt.date,
56013
+ defaultStartTime: startsAt.time,
56014
+ durationMinutes
56015
+ },
56016
+ startsAtIso: startsAt.iso,
56017
+ endsAtIso: endsAt.iso
56018
+ };
56019
+ }
56020
+ }
56021
+ if (startsAt && hasDateTimeDuration && input.durationMinutes !== void 0 && input.durationMinutes !== null) {
56022
+ if (input.durationMinutes < 1) {
56023
+ issues.push(issue3(["durationMinutes"], "durationMinutes must be at least 1"));
56024
+ } else if (exceedsMaxDuration(input.durationMinutes, options)) {
56025
+ issues.push(issue3(["durationMinutes"], maxDurationMessage(options)));
56026
+ }
56027
+ if (issues.length === 0) {
56028
+ const endsAtMs = startsAt.epochMs + input.durationMinutes * 6e4;
56029
+ return {
56030
+ ok: true,
56031
+ kind: "start-duration",
56032
+ canonical: {
56033
+ recurrenceRule: null,
56034
+ startDate: startsAt.date,
56035
+ defaultStartTime: startsAt.time,
56036
+ durationMinutes: input.durationMinutes
56037
+ },
56038
+ startsAtIso: startsAt.iso,
56039
+ endsAtIso: new Date(endsAtMs).toISOString()
56040
+ };
56041
+ }
56042
+ }
56043
+ return { ok: false, issues };
56044
+ }
56045
+
56046
+ // src/cli/site-commands/datedOfferingCommands.ts
54139
56047
  var datedOfferingSiteCommandTypes = [
54140
56048
  "upsertVenue",
54141
56049
  "deleteVenue",
@@ -54151,72 +56059,105 @@ function compileDatedOfferingPushCommands(input) {
54151
56059
  for (const venue of input.venues?.items ?? []) {
54152
56060
  const command = venueCommand(venue.item);
54153
56061
  if (!command.ok) return command;
54154
- commandBindings.push(commandBinding(command.value, {
54155
- scopeCommand: "venues",
54156
- scopeName: "venues",
54157
- itemLabelSingular: "venue",
54158
- identifier: venue.item.slug,
54159
- counter: venue.exists ? "updated" : "created"
54160
- }));
56062
+ commandBindings.push(
56063
+ commandBinding(command.value, {
56064
+ scopeCommand: "venues",
56065
+ scopeName: "venues",
56066
+ itemLabelSingular: "venue",
56067
+ identifier: venue.item.slug,
56068
+ counter: venue.exists ? "updated" : "created"
56069
+ })
56070
+ );
54161
56071
  }
54162
56072
  for (const category of input.eventCategories?.items ?? []) {
54163
- commandBindings.push(commandBinding(eventCategoryCommand(category.item), {
54164
- scopeCommand: "event-categories",
54165
- scopeName: "event categories",
54166
- itemLabelSingular: "event category",
54167
- identifier: category.item.identifier,
54168
- counter: category.exists ? "updated" : "created"
54169
- }));
56073
+ commandBindings.push(
56074
+ commandBinding(eventCategoryCommand(category.item), {
56075
+ scopeCommand: "event-categories",
56076
+ scopeName: "event categories",
56077
+ itemLabelSingular: "event category",
56078
+ identifier: category.item.identifier,
56079
+ counter: category.exists ? "updated" : "created"
56080
+ })
56081
+ );
54170
56082
  }
54171
56083
  for (const event of input.events?.items ?? []) {
54172
56084
  const command = eventSeriesCommand(event.item);
54173
56085
  if (!command.ok) return command;
54174
- commandBindings.push(commandBinding(command.value, {
54175
- scopeCommand: "events",
54176
- scopeName: "events",
54177
- itemLabelSingular: "event",
54178
- identifier: event.item.identifier,
54179
- counter: event.exists ? "updated" : "created"
54180
- }));
56086
+ commandBindings.push(
56087
+ commandBinding(command.value, {
56088
+ scopeCommand: "events",
56089
+ scopeName: "events",
56090
+ itemLabelSingular: "event",
56091
+ identifier: event.item.identifier,
56092
+ counter: event.exists ? "updated" : "created"
56093
+ })
56094
+ );
54181
56095
  }
54182
56096
  for (const course of input.courses?.items ?? []) {
54183
56097
  const command = courseCommand(course.item);
54184
56098
  if (!command.ok) return command;
54185
- commandBindings.push(commandBinding(command.value, {
54186
- scopeCommand: "courses",
54187
- scopeName: "courses",
54188
- itemLabelSingular: "course",
54189
- identifier: course.item.identifier,
54190
- counter: course.exists ? "updated" : "created"
54191
- }));
56099
+ commandBindings.push(
56100
+ commandBinding(command.value, {
56101
+ scopeCommand: "courses",
56102
+ scopeName: "courses",
56103
+ itemLabelSingular: "course",
56104
+ identifier: course.item.identifier,
56105
+ counter: course.exists ? "updated" : "created"
56106
+ })
56107
+ );
54192
56108
  }
54193
56109
  for (const identifier of input.delete?.events ?? []) {
54194
- commandBindings.push(commandBinding({
54195
- type: "deleteEventSeries",
54196
- ref: createCommandRef("delete-event", [identifier]),
54197
- input: { identifier }
54198
- }, deleteSubject("events", "events", "event", identifier)));
56110
+ commandBindings.push(
56111
+ commandBinding(
56112
+ {
56113
+ type: "deleteEventSeries",
56114
+ ref: createCommandRef("delete-event", [identifier]),
56115
+ input: { identifier }
56116
+ },
56117
+ deleteSubject("events", "events", "event", identifier)
56118
+ )
56119
+ );
54199
56120
  }
54200
56121
  for (const identifier of input.delete?.courses ?? []) {
54201
- commandBindings.push(commandBinding({
54202
- type: "deleteCourse",
54203
- ref: createCommandRef("delete-course", [identifier]),
54204
- input: { identifier }
54205
- }, deleteSubject("courses", "courses", "course", identifier)));
56122
+ commandBindings.push(
56123
+ commandBinding(
56124
+ {
56125
+ type: "deleteCourse",
56126
+ ref: createCommandRef("delete-course", [identifier]),
56127
+ input: { identifier }
56128
+ },
56129
+ deleteSubject("courses", "courses", "course", identifier)
56130
+ )
56131
+ );
54206
56132
  }
54207
56133
  for (const slug of input.delete?.venues ?? []) {
54208
- commandBindings.push(commandBinding({
54209
- type: "deleteVenue",
54210
- ref: createCommandRef("delete-venue", [slug]),
54211
- input: { slug }
54212
- }, deleteSubject("venues", "venues", "venue", slug)));
56134
+ commandBindings.push(
56135
+ commandBinding(
56136
+ {
56137
+ type: "deleteVenue",
56138
+ ref: createCommandRef("delete-venue", [slug]),
56139
+ input: { slug }
56140
+ },
56141
+ deleteSubject("venues", "venues", "venue", slug)
56142
+ )
56143
+ );
54213
56144
  }
54214
56145
  for (const identifier of input.delete?.eventCategories ?? []) {
54215
- commandBindings.push(commandBinding({
54216
- type: "deleteEventCategory",
54217
- ref: createCommandRef("delete-event-category", [identifier]),
54218
- input: { identifier }
54219
- }, deleteSubject("event-categories", "event categories", "event category", identifier)));
56146
+ commandBindings.push(
56147
+ commandBinding(
56148
+ {
56149
+ type: "deleteEventCategory",
56150
+ ref: createCommandRef("delete-event-category", [identifier]),
56151
+ input: { identifier }
56152
+ },
56153
+ deleteSubject(
56154
+ "event-categories",
56155
+ "event categories",
56156
+ "event category",
56157
+ identifier
56158
+ )
56159
+ )
56160
+ );
54220
56161
  }
54221
56162
  const planned = planCliCommandBatchForBindings({
54222
56163
  ...input,
@@ -54281,10 +56222,16 @@ function deleteSubject(scopeCommand, scopeName, itemLabelSingular, identifier) {
54281
56222
  }
54282
56223
  function venueCommand(venue) {
54283
56224
  if (!venue.timezone) {
54284
- return unsupported(venue.slug, `Venue ${venue.slug} is missing timezone; command-backed venue pushes require an IANA timezone.`);
56225
+ return unsupported(
56226
+ venue.slug,
56227
+ `Venue ${venue.slug} is missing timezone; command-backed venue pushes require an IANA timezone.`
56228
+ );
54285
56229
  }
54286
56230
  if (venue.location && (typeof venue.location.lat !== "number" || typeof venue.location.lng !== "number")) {
54287
- return unsupported(venue.slug, `Venue ${venue.slug} has an incomplete location; command-backed venue pushes require both lat and lng.`);
56231
+ return unsupported(
56232
+ venue.slug,
56233
+ `Venue ${venue.slug} has an incomplete location; command-backed venue pushes require both lat and lng.`
56234
+ );
54288
56235
  }
54289
56236
  const location2 = venue.location && typeof venue.location.lat === "number" && typeof venue.location.lng === "number" ? {
54290
56237
  latitude: venue.location.lat,
@@ -54327,10 +56274,16 @@ function eventCategoryCommand(category) {
54327
56274
  }
54328
56275
  function eventSeriesCommand(event) {
54329
56276
  if (event.identifier !== event.slug) {
54330
- return unsupported(event.identifier, `Event identifier "${event.identifier}" must match slug "${event.slug}".`);
56277
+ return unsupported(
56278
+ event.identifier,
56279
+ `Event identifier "${event.identifier}" must match slug "${event.slug}".`
56280
+ );
54331
56281
  }
54332
56282
  if (event.schedule?.recurrenceRule) {
54333
- return unsupported(event.identifier, `Event ${event.identifier} uses recurrenceRule; command-backed SDK pushes currently support one-off events only.`);
56283
+ return unsupported(
56284
+ event.identifier,
56285
+ `Event ${event.identifier} uses recurrenceRule; command-backed SDK pushes currently support one-off events only.`
56286
+ );
54334
56287
  }
54335
56288
  const occurrence = eventOccurrence(event);
54336
56289
  if (!occurrence.ok) return occurrence;
@@ -54354,8 +56307,8 @@ function eventSeriesCommand(event) {
54354
56307
  capacity: capacity(event.capacity),
54355
56308
  pricing: pricing.value,
54356
56309
  priceDisplay: event.pricing?.priceDisplay ?? void 0,
54357
- acceptsPasses: event.pricing?.acceptsPasses,
54358
- acceptsMemberships: event.pricing?.acceptsMemberships,
56310
+ acceptsPasses: event.pricing?.acceptsPasses ?? void 0,
56311
+ acceptsMemberships: event.pricing?.acceptsMemberships ?? void 0,
54359
56312
  occurrences: [occurrence.value],
54360
56313
  content: event.content ? {
54361
56314
  summary: event.content.summary ?? void 0,
@@ -54370,7 +56323,10 @@ function eventSeriesCommand(event) {
54370
56323
  }
54371
56324
  function courseCommand(course) {
54372
56325
  if (course.identifier !== course.slug) {
54373
- return unsupported(course.identifier, `Course identifier "${course.identifier}" must match slug "${course.slug}".`);
56326
+ return unsupported(
56327
+ course.identifier,
56328
+ `Course identifier "${course.identifier}" must match slug "${course.slug}".`
56329
+ );
54374
56330
  }
54375
56331
  const pricing = coursePricing(course);
54376
56332
  if (!pricing.ok) return pricing;
@@ -54402,39 +56358,74 @@ function courseCommand(course) {
54402
56358
  });
54403
56359
  }
54404
56360
  function eventOccurrence(event) {
56361
+ const scheduleClassification = classifySdkEventSchedule(event.schedule ?? {});
56362
+ if (!scheduleClassification.ok) {
56363
+ return unsupported(
56364
+ event.identifier,
56365
+ `Event ${event.identifier} has an invalid schedule: ${scheduleClassification.issues.map((validationIssue) => validationIssue.message).join("; ")}`
56366
+ );
56367
+ }
56368
+ if (scheduleClassification.kind === "start-end" || scheduleClassification.kind === "start-duration") {
56369
+ return ok({
56370
+ startAt: scheduleClassification.startsAtIso,
56371
+ endAt: scheduleClassification.endsAtIso
56372
+ });
56373
+ }
54405
56374
  const startDate = event.schedule?.startDate;
54406
56375
  if (!startDate) {
54407
- return unsupported(event.identifier, `Event ${event.identifier} is missing schedule.startDate; command-backed event pushes require a concrete occurrence.`);
56376
+ return unsupported(
56377
+ event.identifier,
56378
+ `Event ${event.identifier} is missing schedule.startDate; command-backed event pushes require a concrete occurrence.`
56379
+ );
54408
56380
  }
54409
56381
  const startTime = event.schedule?.defaultStartTime ?? "09:00:00";
54410
56382
  const durationMinutes = event.schedule?.durationMinutes ?? 60;
54411
56383
  const startAt = toUtcIso(startDate, startTime);
54412
- const endAt = new Date(Date.parse(startAt) + durationMinutes * 6e4).toISOString();
56384
+ const endAt = new Date(
56385
+ Date.parse(startAt) + durationMinutes * 6e4
56386
+ ).toISOString();
54413
56387
  return ok({
54414
56388
  startAt,
54415
56389
  endAt
54416
56390
  });
54417
56391
  }
54418
56392
  function eventPricing(event) {
54419
- const pricing = event.pricing;
54420
- if (!pricing?.requiresPayment) return ok({ kind: "free" });
54421
- const amount = pricing.priceAmount;
54422
- if (typeof amount !== "number" || amount < 0) {
54423
- return unsupported(event.identifier, `Event ${event.identifier} requires payment but has no valid priceAmount.`);
56393
+ const pricing = classifySdkEventPricing(event.pricing);
56394
+ if (!pricing.ok) {
56395
+ return unsupported(
56396
+ event.identifier,
56397
+ `Event ${event.identifier} has invalid pricing: ${pricing.issues[0]?.message ?? "invalid pricing"}.`
56398
+ );
56399
+ }
56400
+ switch (pricing.pricing.kind) {
56401
+ case "free":
56402
+ return ok({ kind: "free" });
56403
+ case "fixed_price":
56404
+ return ok({
56405
+ kind: "fixed_price",
56406
+ price: {
56407
+ amountCents: pricing.pricing.priceAmount,
56408
+ currency: pricing.pricing.priceCurrency
56409
+ }
56410
+ });
56411
+ case "ticket_types":
56412
+ return unsupported(
56413
+ event.identifier,
56414
+ `Event ${event.identifier} uses ticket-type pricing; command-backed event pushes do not support ticket types yet.`
56415
+ );
56416
+ default:
56417
+ return assertNever(pricing.pricing);
54424
56418
  }
54425
- return ok({
54426
- kind: "fixed_price",
54427
- price: {
54428
- amountCents: amount,
54429
- currency: pricing.priceCurrency
54430
- }
54431
- });
54432
56419
  }
54433
56420
  function coursePricing(course) {
54434
56421
  const amount = course.priceCents;
54435
- if (amount === void 0 || amount === null || amount === 0) return ok({ kind: "free" });
56422
+ if (amount === void 0 || amount === null || amount === 0)
56423
+ return ok({ kind: "free" });
54436
56424
  if (amount < 0) {
54437
- return unsupported(course.identifier, `Course ${course.identifier} has invalid priceCents.`);
56425
+ return unsupported(
56426
+ course.identifier,
56427
+ `Course ${course.identifier} has invalid priceCents.`
56428
+ );
54438
56429
  }
54439
56430
  return ok({
54440
56431
  kind: "fixed_price",
@@ -54468,7 +56459,8 @@ function venueUpsertInput(command) {
54468
56459
  }
54469
56460
  function eventSeriesUpsertInput(command) {
54470
56461
  const occurrence = command.input.occurrences[0];
54471
- if (!occurrence) throw new Error(`Event command ${command.ref} has no occurrence.`);
56462
+ if (!occurrence)
56463
+ throw new Error(`Event command ${command.ref} has no occurrence.`);
54472
56464
  return {
54473
56465
  identifier: command.input.slug,
54474
56466
  title: command.input.title,
@@ -54491,8 +56483,8 @@ function eventContentInput(content) {
54491
56483
  if (!content) return void 0;
54492
56484
  return {
54493
56485
  ...content.summary ? { summary: content.summary } : {},
54494
- ...typeof content.body === "string" || isRecord15(content.body) ? { body: content.body } : {},
54495
- ...typeof content.image === "string" || isRecord15(content.image) ? { image: content.image } : {}
56486
+ ...typeof content.body === "string" || isRecord18(content.body) ? { body: content.body } : {},
56487
+ ...typeof content.image === "string" || isRecord18(content.image) ? { image: content.image } : {}
54496
56488
  };
54497
56489
  }
54498
56490
  function courseUpsertInput(command) {
@@ -54524,34 +56516,29 @@ function eventPricingInput(input) {
54524
56516
  switch (input.pricing.kind) {
54525
56517
  case "free":
54526
56518
  return {
54527
- requiresPayment: false,
54528
- priceAmount: null,
54529
- priceCurrency: null,
56519
+ kind: "free",
54530
56520
  priceDisplay: input.priceDisplay ?? null,
54531
56521
  acceptsPasses: input.acceptsPasses ?? false,
54532
56522
  acceptsMemberships: input.acceptsMemberships ?? false
54533
56523
  };
54534
56524
  case "fixed_price":
54535
56525
  return {
54536
- requiresPayment: input.pricing.price.amountCents > 0,
56526
+ kind: "fixed_price",
54537
56527
  priceAmount: input.pricing.price.amountCents,
54538
- priceCurrency: input.pricing.price.currency ?? null,
56528
+ priceCurrency: input.pricing.price.currency ?? "USD",
54539
56529
  priceDisplay: input.priceDisplay ?? null,
54540
56530
  acceptsPasses: input.acceptsPasses ?? false,
54541
56531
  acceptsMemberships: input.acceptsMemberships ?? false
54542
56532
  };
54543
56533
  case "ticket_types":
54544
- return {
54545
- requiresPayment: false,
54546
- priceAmount: null,
54547
- priceCurrency: input.pricing.currency ?? null,
54548
- priceDisplay: input.priceDisplay ?? null,
54549
- acceptsPasses: input.acceptsPasses ?? false,
54550
- acceptsMemberships: input.acceptsMemberships ?? false
54551
- };
56534
+ throw new Error(
56535
+ "Unsupported ticket-type event command reached SDK mapper."
56536
+ );
54552
56537
  case "manual_payment":
54553
56538
  case "external":
54554
- throw new Error(`Unsupported event pricing mode reached SDK mapper: ${input.pricing.kind}`);
56539
+ throw new Error(
56540
+ `Unsupported event pricing mode reached SDK mapper: ${input.pricing.kind}`
56541
+ );
54555
56542
  default:
54556
56543
  return assertNever(input.pricing);
54557
56544
  }
@@ -54567,7 +56554,9 @@ function coursePricingInput(pricing) {
54567
56554
  };
54568
56555
  case "manual_payment":
54569
56556
  case "external":
54570
- throw new Error(`Unsupported course pricing mode reached SDK mapper: ${pricing.kind}`);
56557
+ throw new Error(
56558
+ `Unsupported course pricing mode reached SDK mapper: ${pricing.kind}`
56559
+ );
54571
56560
  default:
54572
56561
  return assertNever(pricing);
54573
56562
  }
@@ -54657,14 +56646,16 @@ function scheduleFromOccurrence(occurrence) {
54657
56646
  recurrenceRule: null,
54658
56647
  startDate: occurrence.startAt.slice(0, 10),
54659
56648
  defaultStartTime: occurrence.startAt.slice(11, 19),
54660
- durationMinutes: Math.round((Date.parse(occurrence.endAt) - Date.parse(occurrence.startAt)) / 6e4)
56649
+ durationMinutes: Math.round(
56650
+ (Date.parse(occurrence.endAt) - Date.parse(occurrence.startAt)) / 6e4
56651
+ )
54661
56652
  };
54662
56653
  }
54663
56654
  function toUtcIso(date, time) {
54664
56655
  const normalizedTime = time.length === 5 ? `${time}:00` : time;
54665
56656
  return (/* @__PURE__ */ new Date(`${date}T${normalizedTime}Z`)).toISOString();
54666
56657
  }
54667
- function isRecord15(value) {
56658
+ function isRecord18(value) {
54668
56659
  return Boolean(value && typeof value === "object" && !Array.isArray(value));
54669
56660
  }
54670
56661
  function unsupported(identifier, message) {
@@ -54777,7 +56768,8 @@ async function executeEntryCommandPlan(input) {
54777
56768
  contentType: command.input.contentTypeKey,
54778
56769
  data: command.input.data ?? {},
54779
56770
  slug: command.input.slug,
54780
- manualOrder: command.input.manualOrder
56771
+ manualOrder: command.input.manualOrder,
56772
+ blocks: command.input.blocks
54781
56773
  });
54782
56774
  return;
54783
56775
  }
@@ -54902,7 +56894,8 @@ function entryCommandsForDiff(input) {
54902
56894
  ...localEntry.slug ? { slug: localEntry.slug } : {},
54903
56895
  ...typeof localEntry.manualOrder === "number" ? { manualOrder: localEntry.manualOrder } : {},
54904
56896
  ...optionalTitle(localEntry.data),
54905
- data: localEntry.data
56897
+ data: localEntry.data,
56898
+ ...localEntry.blocks ? { blocks: localEntry.blocks } : {}
54906
56899
  }
54907
56900
  };
54908
56901
  commandBindings.push({
@@ -55504,15 +57497,15 @@ function validateBlockContent(data, manifest, customFields) {
55504
57497
  validator.parse(data);
55505
57498
  } catch (error) {
55506
57499
  if (error instanceof ZodError) {
55507
- for (const issue2 of error.issues) {
55508
- const fieldPath = issue2.path.join(".");
55509
- if (issue2.code === "invalid_type" && issue2.received === "undefined") {
57500
+ for (const issue4 of error.issues) {
57501
+ const fieldPath = issue4.path.join(".");
57502
+ if (issue4.code === "invalid_type" && issue4.received === "undefined") {
55510
57503
  continue;
55511
57504
  }
55512
57505
  warnings.push({
55513
57506
  type: "invalid_content",
55514
57507
  field: fieldPath || "(root)",
55515
- message: `Invalid content${fieldPath ? ` in "${fieldPath}"` : ""}: ${issue2.message}`
57508
+ message: `Invalid content${fieldPath ? ` in "${fieldPath}"` : ""}: ${issue4.message}`
55516
57509
  });
55517
57510
  }
55518
57511
  }
@@ -56948,7 +58941,7 @@ async function handleThemePushForAllScope(params) {
56948
58941
  }
56949
58942
  const validation = themeSchema2.safeParse(localTheme.theme);
56950
58943
  if (!validation.success) {
56951
- const errors = validation.error.issues.map((issue2) => ` - ${issue2.path.join(".")}: ${issue2.message}`).join("\n");
58944
+ const errors = validation.error.issues.map((issue4) => ` - ${issue4.path.join(".")}: ${issue4.message}`).join("\n");
56952
58945
  output.warn(
56953
58946
  `Skipping theme push - invalid theme at content/themes/${themeName}.json:
56954
58947
  ${errors}`
@@ -57557,9 +59550,14 @@ function entriesEqual(left, right) {
57557
59550
  function contentFields(entry) {
57558
59551
  const data = structuredClone(entry.data);
57559
59552
  stripEnvSpecificMediaFieldsInPlace(data);
59553
+ const blocks = entry.blocks ? structuredClone(entry.blocks) : void 0;
59554
+ if (blocks) {
59555
+ stripEnvSpecificMediaFieldsInPlace(blocks);
59556
+ }
57560
59557
  return {
57561
59558
  identifier: entry.identifier,
57562
59559
  data: sortRecord(data),
59560
+ ...blocks ? { blocks: sortRecord(blocks) } : {},
57563
59561
  ...entry.slug !== void 0 ? { slug: entry.slug } : {}
57564
59562
  };
57565
59563
  }
@@ -58429,7 +60427,7 @@ ${available.map((t) => ` - ${t.name} (content/themes/${t.name}.json)`).join("\n
58429
60427
  }
58430
60428
  const validation = themeSchema.safeParse(localTheme.theme);
58431
60429
  if (!validation.success) {
58432
- const errors = validation.error.issues.map((issue2) => ` - ${issue2.path.join(".")}: ${issue2.message}`).join("\n");
60430
+ const errors = validation.error.issues.map((issue4) => ` - ${issue4.path.join(".")}: ${issue4.message}`).join("\n");
58433
60431
  output.error(
58434
60432
  `Invalid theme file at content/themes/${themeName}.json:
58435
60433
  ${errors}`
@@ -59588,7 +61586,8 @@ async function applyOneOffEntryCommand(command, client) {
59588
61586
  identifier: entryIdentifierForCommand(command),
59589
61587
  contentType: command.input.contentTypeKey,
59590
61588
  data: command.input.data ?? {},
59591
- slug: command.input.slug
61589
+ slug: command.input.slug,
61590
+ blocks: command.input.blocks
59592
61591
  });
59593
61592
  case "publishContentEntry":
59594
61593
  await client.entries.publish(
@@ -60721,7 +62720,7 @@ var THEME_FIELD_CATEGORY_MAP = {
60721
62720
  };
60722
62721
 
60723
62722
  // src/cli/init-docs/zod-to-markdown.ts
60724
- function isRecord16(value) {
62723
+ function isRecord19(value) {
60725
62724
  return typeof value === "object" && value !== null && !Array.isArray(value);
60726
62725
  }
60727
62726
  function isZodTypeAny(value) {
@@ -60849,7 +62848,7 @@ function extractLiteralValue(schema) {
60849
62848
  const typeName = getTypeName(schema);
60850
62849
  if (typeName !== ZodTypeName.ZodLiteral) return void 0;
60851
62850
  const def = schema._def;
60852
- if (!isRecord16(def)) return void 0;
62851
+ if (!isRecord19(def)) return void 0;
60853
62852
  return String(def.value);
60854
62853
  }
60855
62854
  function extractSchemaInfo(schema, skipFields = []) {
@@ -60919,7 +62918,7 @@ function extractFieldInfo(name, schema) {
60919
62918
  }
60920
62919
  if (typeName === ZodTypeName.ZodRecord) {
60921
62920
  const def = inner._def;
60922
- const valueSchema = isRecord16(def) ? def.valueType : void 0;
62921
+ const valueSchema = isRecord19(def) ? def.valueType : void 0;
60923
62922
  if (!isZodTypeAny(valueSchema)) {
60924
62923
  info.recordValueType = "unknown";
60925
62924
  return info;
@@ -60934,7 +62933,7 @@ function extractFieldInfo(name, schema) {
60934
62933
  }
60935
62934
  } else if (getTypeName(valueInner) === ZodTypeName.ZodRecord) {
60936
62935
  const nestedDef = valueInner._def;
60937
- const nestedValueSchema = isRecord16(nestedDef) ? nestedDef.valueType : void 0;
62936
+ const nestedValueSchema = isRecord19(nestedDef) ? nestedDef.valueType : void 0;
60938
62937
  if (!isZodTypeAny(nestedValueSchema)) {
60939
62938
  info.recordValueType = "record<string, unknown>";
60940
62939
  return info;
@@ -60945,7 +62944,7 @@ function extractFieldInfo(name, schema) {
60945
62944
  }
60946
62945
  if (typeName === ZodTypeName.ZodUnion || typeName === ZodTypeName.ZodDiscriminatedUnion) {
60947
62946
  const def = inner._def;
60948
- const optionsValue = isRecord16(def) ? def.options : void 0;
62947
+ const optionsValue = isRecord19(def) ? def.options : void 0;
60949
62948
  const options = Array.isArray(optionsValue) ? optionsValue.filter(isZodTypeAny) : [];
60950
62949
  const optionTypes = options.map((opt) => {
60951
62950
  const { inner: optInner } = unwrapSchema(opt);
@@ -62109,7 +64108,7 @@ var SimpleCache = class {
62109
64108
  };
62110
64109
 
62111
64110
  // src/version.ts
62112
- var SDK_VERSION = "0.82.0";
64111
+ var SDK_VERSION = "0.84.0";
62113
64112
 
62114
64113
  // src/client/error.ts
62115
64114
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -64201,9 +66200,9 @@ Examples:
64201
66200
  const parseResult = verifyConfigSchema.safeParse(rawConfig);
64202
66201
  if (!parseResult.success) {
64203
66202
  return output.error("Invalid config format", {
64204
- issues: parseResult.error.issues.map((issue2) => ({
64205
- path: issue2.path.join("."),
64206
- message: issue2.message
66203
+ issues: parseResult.error.issues.map((issue4) => ({
66204
+ path: issue4.path.join("."),
66205
+ message: issue4.message
64207
66206
  })),
64208
66207
  suggestion: "Ensure your config exports a valid riverbank config object"
64209
66208
  });
@@ -64731,8 +66730,8 @@ async function executeAuditForEnv(output, target, options, isJsonOutput) {
64731
66730
  client
64732
66731
  });
64733
66732
  const mediaIssues = mapMediaGuardDiagnosticsToAuditIssues(mediaGuardResult.diagnostics);
64734
- errors.push(...mediaIssues.filter((issue2) => issue2.severity === "error"));
64735
- warnings.push(...mediaIssues.filter((issue2) => issue2.severity === "warning"));
66733
+ errors.push(...mediaIssues.filter((issue4) => issue4.severity === "error"));
66734
+ warnings.push(...mediaIssues.filter((issue4) => issue4.severity === "warning"));
64736
66735
  }
64737
66736
  if (!isJsonOutput) {
64738
66737
  output.info("Checking for duplicate page paths...");
@@ -64756,8 +66755,8 @@ async function executeAuditForEnv(output, target, options, isJsonOutput) {
64756
66755
  }
64757
66756
  errors.push(...auditEventReferences(localContent.events, auditCtx));
64758
66757
  const courseRefIssues = auditCourseReferences(localContent.courses, auditCtx);
64759
- errors.push(...courseRefIssues.filter((issue2) => issue2.severity === "error"));
64760
- warnings.push(...courseRefIssues.filter((issue2) => issue2.severity === "warning"));
66758
+ errors.push(...courseRefIssues.filter((issue4) => issue4.severity === "error"));
66759
+ warnings.push(...courseRefIssues.filter((issue4) => issue4.severity === "warning"));
64761
66760
  const success = errors.length === 0;
64762
66761
  const result = { success, errors, warnings };
64763
66762
  if (isJsonOutput) {
@@ -64772,14 +66771,14 @@ async function executeAuditForEnv(output, target, options, isJsonOutput) {
64772
66771
  output.info("");
64773
66772
  if (errors.length > 0) {
64774
66773
  output.warn(`Found ${errors.length} error(s):`);
64775
- for (const issue2 of errors) {
64776
- output.info(` [ERROR] ${issue2.message}`);
66774
+ for (const issue4 of errors) {
66775
+ output.info(` [ERROR] ${issue4.message}`);
64777
66776
  }
64778
66777
  }
64779
66778
  if (warnings.length > 0) {
64780
66779
  output.warn(`Found ${warnings.length} warning(s):`);
64781
- for (const issue2 of warnings) {
64782
- output.info(` [WARN] ${issue2.message}`);
66780
+ for (const issue4 of warnings) {
66781
+ output.info(` [WARN] ${issue4.message}`);
64783
66782
  }
64784
66783
  }
64785
66784
  if (success && warnings.length === 0) {
@@ -68629,27 +70628,76 @@ var envStatusCommand = new Command("status").description("Show which environment
68629
70628
  })
68630
70629
  );
68631
70630
  var envCommand = new Command("env").description("Environment configuration and status").addCommand(envStatusCommand);
70631
+ var eventScheduleInputSchema = z.object({
70632
+ recurrenceRule: z.string().nullable().optional(),
70633
+ startDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).nullable().optional(),
70634
+ defaultStartTime: z.string().min(1).optional(),
70635
+ durationMinutes: z.number().int().positive().optional(),
70636
+ startsAt: z.string().min(1).optional(),
70637
+ endsAt: z.string().min(1).optional()
70638
+ }).superRefine((schedule, ctx) => {
70639
+ const result = classifySdkEventSchedule(schedule, {
70640
+ requireCanonicalFields: true
70641
+ });
70642
+ if (!result.ok) {
70643
+ result.issues.forEach((validationIssue) => {
70644
+ ctx.addIssue({
70645
+ code: "custom",
70646
+ path: [...validationIssue.path],
70647
+ message: validationIssue.message
70648
+ });
70649
+ });
70650
+ }
70651
+ }).transform((schedule) => {
70652
+ const result = classifySdkEventSchedule(schedule, {
70653
+ requireCanonicalFields: true
70654
+ });
70655
+ if (!result.ok) {
70656
+ throw new Error("Unreachable invalid event schedule after Zod validation");
70657
+ }
70658
+ if (result.kind === "start-end") {
70659
+ const { startsAt, endsAt } = schedule;
70660
+ if (typeof startsAt !== "string" || typeof endsAt !== "string") {
70661
+ throw new Error("Unreachable invalid start/end event schedule after Zod validation");
70662
+ }
70663
+ return { startsAt, endsAt };
70664
+ }
70665
+ if (result.kind === "start-duration") {
70666
+ const { startsAt, durationMinutes } = schedule;
70667
+ if (typeof startsAt !== "string" || typeof durationMinutes !== "number") {
70668
+ throw new Error("Unreachable invalid start/duration event schedule after Zod validation");
70669
+ }
70670
+ return { startsAt, durationMinutes };
70671
+ }
70672
+ return result.canonical;
70673
+ });
70674
+ var eventPricingInputSchema = z.unknown().superRefine((pricing, ctx) => {
70675
+ const result = classifySdkEventPricing(pricing);
70676
+ if (!result.ok) {
70677
+ result.issues.forEach((validationIssue) => {
70678
+ ctx.addIssue({
70679
+ code: "custom",
70680
+ path: [...validationIssue.path],
70681
+ message: validationIssue.message
70682
+ });
70683
+ });
70684
+ }
70685
+ }).transform((pricing) => {
70686
+ const result = classifySdkEventPricing(pricing);
70687
+ if (!result.ok) {
70688
+ throw new Error("Unreachable invalid event pricing after Zod validation");
70689
+ }
70690
+ return result.pricing;
70691
+ });
68632
70692
  var eventUpsertInputSchema = z.object({
68633
70693
  identifier: z.string().min(1).optional(),
68634
70694
  title: z.string().min(1, "title is required"),
68635
70695
  slug: z.string().min(1).optional(),
68636
70696
  status: z.enum(["draft", "active", "archived", "cancelled", "completed"]).optional(),
68637
70697
  visibility: z.enum(["private", "public", "unlisted"]).optional(),
68638
- schedule: z.object({
68639
- recurrenceRule: z.string().nullable(),
68640
- startDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).nullable().optional(),
68641
- defaultStartTime: z.string().min(1),
68642
- durationMinutes: z.number().int().positive()
68643
- }),
70698
+ schedule: eventScheduleInputSchema,
68644
70699
  capacity: z.number().int().positive().nullable().optional(),
68645
- pricing: z.object({
68646
- requiresPayment: z.boolean().optional(),
68647
- priceAmount: z.number().nullable().optional(),
68648
- priceCurrency: z.string().nullable().optional(),
68649
- priceDisplay: z.string().nullable().optional(),
68650
- acceptsPasses: z.boolean().optional(),
68651
- acceptsMemberships: z.boolean().optional()
68652
- }).optional(),
70700
+ pricing: eventPricingInputSchema.optional(),
68653
70701
  venueRef: z.string().nullable().optional(),
68654
70702
  categoryRef: z.string().nullable().optional(),
68655
70703
  content: z.record(z.string(), z.unknown()).optional(),
@@ -68683,7 +70731,13 @@ function toEventUpsertInput(identifier, raw) {
68683
70731
  return payload;
68684
70732
  }
68685
70733
  function buildCancelledEventUpsertInput(current) {
68686
- const { id: _id, createdAt: _createdAt, updatedAt: _updatedAt, contentUpdatedAt: _contentUpdatedAt, ...rest } = current;
70734
+ const {
70735
+ id: _id,
70736
+ createdAt: _createdAt,
70737
+ updatedAt: _updatedAt,
70738
+ contentUpdatedAt: _contentUpdatedAt,
70739
+ ...rest
70740
+ } = current;
68687
70741
  return {
68688
70742
  ...rest,
68689
70743
  status: "cancelled"
@@ -68693,23 +70747,25 @@ function canCancelEventStatus(status) {
68693
70747
  return status === "draft" || status === "active";
68694
70748
  }
68695
70749
  var upsertCommand5 = new Command("upsert").description("Create or update an event series").argument("<identifier>", "Event identifier").option("--data <json>", "Event payload as JSON string").option("--file <path>", "Path to JSON file with event payload").action(
68696
- withErrorHandling(async (identifier, options, command) => {
68697
- const { output, client } = createCommandContext(command);
68698
- const raw = await parseJsonData(options);
68699
- if (raw.status === "completed") {
68700
- output.warn(
68701
- `Event ${identifier}: status "completed" is read-only; omitting status on upsert.`
68702
- );
70750
+ withErrorHandling(
70751
+ async (identifier, options, command) => {
70752
+ const { output, client } = createCommandContext(command);
70753
+ const raw = await parseJsonData(options);
70754
+ if (raw.status === "completed") {
70755
+ output.warn(
70756
+ `Event ${identifier}: status "completed" is read-only; omitting status on upsert.`
70757
+ );
70758
+ }
70759
+ const input = toEventUpsertInput(identifier, raw);
70760
+ output.info(`Upserting event: ${identifier}`);
70761
+ const event = await client.events.upsert(input);
70762
+ output.success(`Event upserted: ${event.identifier}`, {
70763
+ id: event.id,
70764
+ status: event.status,
70765
+ visibility: event.visibility
70766
+ });
68703
70767
  }
68704
- const input = toEventUpsertInput(identifier, raw);
68705
- output.info(`Upserting event: ${identifier}`);
68706
- const event = await client.events.upsert(input);
68707
- output.success(`Event upserted: ${event.identifier}`, {
68708
- id: event.id,
68709
- status: event.status,
68710
- visibility: event.visibility
68711
- });
68712
- })
70768
+ )
68713
70769
  );
68714
70770
  var getCommand5 = createGetCommand({
68715
70771
  resourceName: "event",
@@ -68753,31 +70809,35 @@ var deleteCommand3 = new Command("delete").description("Delete an event series")
68753
70809
  )
68754
70810
  );
68755
70811
  var cancelCommand = new Command("cancel").description("Cancel an event series").argument("<identifier>", "Event identifier").action(
68756
- withErrorHandling(async (identifier, _options, command) => {
68757
- const { output, client } = createCommandContext(command);
68758
- const current = await client.events.get(identifier);
68759
- if (!current) {
68760
- return output.error(`Event not found: ${identifier}`);
68761
- }
68762
- if (current.status === "cancelled") {
68763
- output.success(`Event already cancelled: ${identifier}`);
68764
- return;
68765
- }
68766
- if (!canCancelEventStatus(current.status)) {
68767
- return output.error(
68768
- `Event ${identifier} cannot be cancelled from status "${current.status}".`
68769
- );
68770
- }
68771
- try {
68772
- await client.events.upsert(buildCancelledEventUpsertInput(current));
68773
- output.success(`Event cancelled: ${identifier}`);
68774
- } catch (error) {
68775
- if (error instanceof ManagementApiError && error.statusCode === 404) {
68776
- return output.error(`Event ${identifier} was removed before cancellation. Pull and retry.`);
70812
+ withErrorHandling(
70813
+ async (identifier, _options, command) => {
70814
+ const { output, client } = createCommandContext(command);
70815
+ const current = await client.events.get(identifier);
70816
+ if (!current) {
70817
+ return output.error(`Event not found: ${identifier}`);
70818
+ }
70819
+ if (current.status === "cancelled") {
70820
+ output.success(`Event already cancelled: ${identifier}`);
70821
+ return;
70822
+ }
70823
+ if (!canCancelEventStatus(current.status)) {
70824
+ return output.error(
70825
+ `Event ${identifier} cannot be cancelled from status "${current.status}".`
70826
+ );
70827
+ }
70828
+ try {
70829
+ await client.events.upsert(buildCancelledEventUpsertInput(current));
70830
+ output.success(`Event cancelled: ${identifier}`);
70831
+ } catch (error) {
70832
+ if (error instanceof ManagementApiError && error.statusCode === 404) {
70833
+ return output.error(
70834
+ `Event ${identifier} was removed before cancellation. Pull and retry.`
70835
+ );
70836
+ }
70837
+ throw error;
68777
70838
  }
68778
- throw error;
68779
70839
  }
68780
- })
70840
+ )
68781
70841
  );
68782
70842
  var eventCommand = new Command("event").description("Manage events").addHelpText(
68783
70843
  "after",