@riverbankcms/sdk 0.78.2 → 0.79.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 (159) hide show
  1. package/README.md +80 -0
  2. package/dist/{PreviewEditorSidebar-4DXLYX2V.mjs → PreviewEditorSidebar-56NMJMIK.mjs} +724 -47
  3. package/dist/{PreviewEditorUI-CS5P4N3P.mjs → PreviewEditorUI-27KJVEET.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-H4BSP6E7.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +36 -0
  6. package/dist/_dts/api/src/endpoints.d.ts +55 -0
  7. package/dist/_dts/api/src/index.d.ts +5 -3
  8. package/dist/_dts/api/src/media.d.ts +8 -1
  9. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +1 -1
  10. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +8 -8
  11. package/dist/_dts/api/src/navigation/identity.d.ts +59 -0
  12. package/dist/_dts/api/src/navigation.d.ts +2 -0
  13. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +4 -0
  14. package/dist/_dts/api/src/sdkContracts.d.ts +1 -0
  15. package/dist/_dts/api/src/siteIcons.d.ts +128 -0
  16. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +16 -0
  17. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +7 -0
  18. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -1
  19. package/dist/_dts/api/src/types.d.ts +1 -1
  20. package/dist/_dts/api/src/webhooks.d.ts +239 -0
  21. package/dist/_dts/blocks/src/index.d.ts +4 -0
  22. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  23. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  24. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  25. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  26. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  27. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +294 -289
  28. package/dist/_dts/blocks/src/system/blocks/feature-card-icons.d.ts +57 -0
  29. package/dist/_dts/blocks/src/system/blocks/feature-cards.d.ts +4 -0
  30. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/blocks/index.d.ts +1 -0
  32. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  33. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +22 -22
  34. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  35. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  36. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  37. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +7 -1
  38. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +170 -0
  39. package/dist/_dts/blocks/src/system/fragments/library/testimonialsCarousel.d.ts +5 -0
  40. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +3 -1
  41. package/dist/_dts/blocks/src/system/icons/ids.d.ts +13 -0
  42. package/dist/_dts/blocks/src/system/icons/index.d.ts +6 -0
  43. package/dist/_dts/blocks/src/system/icons/presets.d.ts +4 -0
  44. package/dist/_dts/blocks/src/system/icons/registry.d.ts +18 -0
  45. package/dist/_dts/blocks/src/system/icons/semantic.d.ts +239 -0
  46. package/dist/_dts/blocks/src/system/icons/value.d.ts +94 -0
  47. package/dist/_dts/blocks/src/system/index.d.ts +1 -0
  48. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +4 -1
  49. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +23 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/feature-card-icon.d.ts +13 -0
  51. package/dist/_dts/content-model/src/contentManifest.d.ts +3 -1
  52. package/dist/_dts/core/src/branded.d.ts +6 -0
  53. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +191 -0
  54. package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +12 -1
  55. package/dist/_dts/editor-blocks/src/block-editor/BlockCardBody.d.ts +12 -1
  56. package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +12 -2
  57. package/dist/_dts/editor-blocks/src/block-editor/FeatureCardIconsPanel.d.ts +21 -0
  58. package/dist/_dts/editor-blocks/src/block-editor/GeneratedIconSetDialog.d.ts +40 -0
  59. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +11 -1
  60. package/dist/_dts/editor-blocks/src/block-editor/featureCardIconActions.d.ts +82 -0
  61. package/dist/_dts/editor-blocks/src/widgets/icon-picker/IconPickerField.d.ts +1 -1
  62. package/dist/_dts/media-core/src/fileDomain.d.ts +8 -1
  63. package/dist/_dts/media-editor/src/MediaEditor.d.ts +3 -2
  64. package/dist/_dts/media-react/src/components/MediaLibrary.d.ts +2 -1
  65. package/dist/_dts/media-react/src/components/MediaPickerMini.d.ts +2 -1
  66. package/dist/_dts/preview-next/src/client/blocks/previewCustomizeActions.d.ts +17 -0
  67. package/dist/_dts/preview-next/src/client/preview/PageDesignEditorStateContext.d.ts +4 -0
  68. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +3 -2
  69. package/dist/_dts/preview-next/src/client/preview/previewCustomizeHistory.d.ts +6 -0
  70. package/dist/_dts/sdk/src/cli/navigationIdentity.d.ts +11 -0
  71. package/dist/_dts/sdk/src/cli/site-commands/navigationCommands.d.ts +4 -0
  72. package/dist/_dts/sdk/src/cli/site-commands/oneOffCommands.d.ts +1 -0
  73. package/dist/_dts/sdk/src/cli/sync/diff.d.ts +9 -0
  74. package/dist/_dts/sdk/src/client/management/types.d.ts +2 -0
  75. package/dist/_dts/sdk/src/config/field-definitions.d.ts +3 -1
  76. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  77. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +19 -2
  78. package/dist/_dts/sdk/src/next/index.d.ts +1 -1
  79. package/dist/_dts/sdk/src/next/revalidate.d.ts +26 -5
  80. package/dist/_dts/sdk/src/next/static-params.d.ts +28 -3
  81. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -1
  82. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  83. package/dist/_dts/sdk/src/version.d.ts +1 -1
  84. package/dist/_dts/sdk/src/webhooks/index.d.ts +1 -1
  85. package/dist/_dts/sdk/src/webhooks/verify.d.ts +6 -102
  86. package/dist/_dts/site-commands/src/commands.d.ts +3 -0
  87. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  88. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +3 -3
  89. package/dist/_dts/theme-core/src/schema.d.ts +5 -5
  90. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +25 -2
  91. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +5 -5
  92. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  93. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +4 -4
  94. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -0
  95. package/dist/_dts/ui/src/combobox.d.ts +1 -0
  96. package/dist/{chunk-RGTOD4AJ.mjs → chunk-4HCW7FHJ.mjs} +491 -56
  97. package/dist/{chunk-OKMBEAXY.mjs → chunk-A3HHFKVT.mjs} +1 -1
  98. package/dist/{chunk-6HYXHRAI.mjs → chunk-GP555I66.mjs} +177 -7
  99. package/dist/{chunk-CR5HKAGU.mjs → chunk-K2IIF34C.mjs} +55 -0
  100. package/dist/{chunk-4QEGTLK6.mjs → chunk-LCY32PXF.mjs} +1 -1
  101. package/dist/{chunk-MCRQMPET.mjs → chunk-V47ZU33I.mjs} +1745 -157
  102. package/dist/cli/index.mjs +1169 -171
  103. package/dist/cli/init-docs/content/workflow-editor-workflows.md +2 -0
  104. package/dist/cli/init-docs/content/workflow-isr-revalidation.md +138 -0
  105. package/dist/client/{accordion-PLYNJIIM.mjs → accordion-QLA7KBYO.mjs} +1 -1
  106. package/dist/client/{bookingForm-BXAP6AO7.mjs → bookingForm-PYZIPA5G.mjs} +3 -3
  107. package/dist/client/bookings.mjs +110 -2
  108. package/dist/client/{carousel-TRBXDHGF.mjs → carousel-5EIULWBI.mjs} +2 -2
  109. package/dist/client/{cart-Z7H3HJRS.mjs → cart-DOP3FNI4.mjs} +5 -5
  110. package/dist/client/{checkout-WAFCUBIX.mjs → checkout-BVMF6FBV.mjs} +5 -5
  111. package/dist/client/{chunk-JRDUHZCT.mjs → chunk-44K2U3QI.mjs} +4 -4
  112. package/dist/client/{chunk-UVQEJJTN.mjs → chunk-CCNTDRCF.mjs} +1 -1
  113. package/dist/client/{chunk-ZI3LLBPZ.mjs → chunk-GG4M2NP6.mjs} +1 -1
  114. package/dist/client/{chunk-JGXPTEI2.mjs → chunk-R5ESWNKX.mjs} +6 -3
  115. package/dist/client/{chunk-CWGTG37I.mjs → chunk-TYONZMST.mjs} +1 -1
  116. package/dist/client/{chunk-75OUS5MT.mjs → chunk-UDS3NTWA.mjs} +1 -1
  117. package/dist/client/{chunk-DNRGY432.mjs → chunk-V6M5FCR5.mjs} +1 -1
  118. package/dist/client/{chunk-FUXW6VW2.mjs → chunk-YLDYVRZL.mjs} +4 -4
  119. package/dist/client/client.mjs +21329 -19729
  120. package/dist/client/{courseRegistration-AHFQHWIJ.mjs → courseRegistration-E6EAA6NL.mjs} +3 -3
  121. package/dist/client/{eventCalendar-LDXTV5R7.mjs → eventCalendar-HBG3HAK6.mjs} +5 -5
  122. package/dist/client/{eventCombined-A4JGTNJO.mjs → eventCombined-6K5ZZWAK.mjs} +5 -5
  123. package/dist/client/{eventDetails-4YXTZ7EG.mjs → eventDetails-Q75ICXLT.mjs} +5 -5
  124. package/dist/client/{eventListing-P72TPFFM.mjs → eventListing-27P5F7DZ.mjs} +5 -5
  125. package/dist/client/{eventRegistration-LSYJHGMT.mjs → eventRegistration-IQ7AMASR.mjs} +5 -5
  126. package/dist/client/{form-AOPYOKOW.mjs → form-JRTD65FN.mjs} +1 -1
  127. package/dist/client/{headerSection-5TFYDFVQ.mjs → headerSection-7FPSSZHS.mjs} +2 -2
  128. package/dist/client/hooks.mjs +350 -35
  129. package/dist/client/{locationMap-QSZ3ZVAZ.mjs → locationMap-7NGFNYBH.mjs} +1 -1
  130. package/dist/client/{newsletterForm-KTRHZY52.mjs → newsletterForm-F3BADCI2.mjs} +1 -1
  131. package/dist/client/{productDetail-N4E775RG.mjs → productDetail-V3HP7ITJ.mjs} +5 -5
  132. package/dist/client/{productList-UGUQ2S45.mjs → productList-L3EGJUF2.mjs} +5 -5
  133. package/dist/client/rendering/client.mjs +2713 -1382
  134. package/dist/client/rendering/islands.mjs +18 -18
  135. package/dist/client/rendering.mjs +2014 -414
  136. package/dist/client/{shop-VHSZEEQ2.mjs → shop-DQUB5E2C.mjs} +5 -5
  137. package/dist/preview-next/before-render.mjs +55 -0
  138. package/dist/preview-next/client/runtime.mjs +5 -5
  139. package/dist/preview-next/middleware.mjs +55 -0
  140. package/dist/{sdk-runtime-WHPJEF5G.mjs → sdk-runtime-AF6KXJU4.mjs} +6 -6
  141. package/dist/server/components.mjs +2169 -781
  142. package/dist/server/config-validation.mjs +350 -35
  143. package/dist/server/config.mjs +350 -35
  144. package/dist/server/data.mjs +350 -35
  145. package/dist/server/index.mjs +64 -1
  146. package/dist/server/next/revalidate.mjs +229 -34
  147. package/dist/server/next.mjs +2307 -818
  148. package/dist/server/page-converter.mjs +275 -34
  149. package/dist/server/prebuild.mjs +1 -1
  150. package/dist/server/rendering/server.mjs +2174 -786
  151. package/dist/server/rendering.mjs +2187 -799
  152. package/dist/server/routing.mjs +767 -50
  153. package/dist/server/server.mjs +351 -36
  154. package/dist/server/theme-bridge.mjs +164 -2
  155. package/dist/server/theme.mjs +2 -2
  156. package/dist/server/webhooks.mjs +129 -25
  157. package/dist/styles/index.css +55 -0
  158. package/package.json +2 -1
  159. package/dist/SdkPreviewModeRuntime-IJDHTW4W.mjs +0 -8
@@ -439,9 +439,24 @@ var init_fileSafety = __esm({
439
439
  "../media-core/src/fileSafety.ts"() {
440
440
  }
441
441
  });
442
+
443
+ // ../media-core/src/fileDomain.ts
444
+ var AMBIENT_BACKGROUND_ROLES2;
442
445
  var init_fileDomain = __esm({
443
446
  "../media-core/src/fileDomain.ts"() {
444
447
  init_src();
448
+ AMBIENT_BACKGROUND_ROLES2 = [
449
+ "light-texture",
450
+ "proof-band-dark",
451
+ "cta-wash",
452
+ "footer-detail",
453
+ "style-atmosphere-1",
454
+ "style-atmosphere-2"
455
+ ];
456
+ [
457
+ "selected-background",
458
+ ...AMBIENT_BACKGROUND_ROLES2
459
+ ];
445
460
  ({
446
461
  audio: unsafeAsPositiveByteCount(250 * 1024 * 1024),
447
462
  rawVideoBeforeCompression: unsafeAsPositiveByteCount(500 * 1024 * 1024),
@@ -1159,6 +1174,14 @@ var init_repeaterGrid = __esm({
1159
1174
  DEFAULT_REPEATER_GRID_COLUMN_FIELD_ID = "gridColumn";
1160
1175
  }
1161
1176
  });
1177
+
1178
+ // ../blocks/src/system/icons/presets.ts
1179
+ var ICON_PICKER_PRESETS;
1180
+ var init_presets = __esm({
1181
+ "../blocks/src/system/icons/presets.ts"() {
1182
+ ICON_PICKER_PRESETS = ["cta", "feature"];
1183
+ }
1184
+ });
1162
1185
  function isDisplayMediaKind(kind) {
1163
1186
  return DISPLAY_MEDIA_KINDS.includes(kind);
1164
1187
  }
@@ -1246,6 +1269,7 @@ var init_schema2 = __esm({
1246
1269
  init_src2();
1247
1270
  init_node();
1248
1271
  init_repeaterGrid();
1272
+ init_presets();
1249
1273
  visibilityLevels = ["admin", "designer", "author"];
1250
1274
  MEDIA_KINDS = [
1251
1275
  "image",
@@ -1397,7 +1421,7 @@ var init_schema2 = __esm({
1397
1421
  layoutGridColumnField: z.string().optional(),
1398
1422
  layoutGridMaxRows: z.number().int().positive().optional(),
1399
1423
  // Icon picker configuration (used when ui.widget === 'iconPicker')
1400
- iconPickerPreset: z.enum(["cta"]).optional(),
1424
+ iconPickerPreset: z.enum(ICON_PICKER_PRESETS).optional(),
1401
1425
  // Entry picker configuration
1402
1426
  contentTypeField: z.string().optional(),
1403
1427
  fixedContentType: z.string().optional(),
@@ -3067,7 +3091,7 @@ function parseThemeColorToken(value) {
3067
3091
  if (!isThemeColorToken(value)) return null;
3068
3092
  return value.trim();
3069
3093
  }
3070
- var PALETTE_TOKEN_NAMES, paletteTokenNameSchema, themeColorBaseTokenNames, themeColorBaseTokenSet, SHADE_STEPS, shadeStepSet, themeColorTokenSchema;
3094
+ var PALETTE_TOKEN_NAMES, paletteTokenNameSchema, themeColorBaseTokenNames, themeColorBaseTokenSet, themeColorShadeSteps, shadeStepSet, themeColorTokenSchema;
3071
3095
  var init_themeColorTokens = __esm({
3072
3096
  "../theme-core/src/tokens/themeColorTokens.ts"() {
3073
3097
  init_blockColorTokens();
@@ -3101,7 +3125,7 @@ var init_themeColorTokens = __esm({
3101
3125
  "accentForeground"
3102
3126
  ];
3103
3127
  themeColorBaseTokenSet = new Set(themeColorBaseTokenNames);
3104
- SHADE_STEPS = [
3128
+ themeColorShadeSteps = [
3105
3129
  "50",
3106
3130
  "100",
3107
3131
  "200",
@@ -3114,7 +3138,7 @@ var init_themeColorTokens = __esm({
3114
3138
  "900",
3115
3139
  "950"
3116
3140
  ];
3117
- shadeStepSet = new Set(SHADE_STEPS);
3141
+ shadeStepSet = new Set(themeColorShadeSteps);
3118
3142
  themeColorTokenSchema = z.string().min(1).refine((value) => Boolean(isThemeColorToken(value)), "Expected a known Theme V2 color token");
3119
3143
  }
3120
3144
  });
@@ -4283,7 +4307,7 @@ var init_generateButtonCss = __esm({
4283
4307
  });
4284
4308
 
4285
4309
  // ../theme-core/src/buttons/presets.ts
4286
- var init_presets = __esm({
4310
+ var init_presets2 = __esm({
4287
4311
  "../theme-core/src/buttons/presets.ts"() {
4288
4312
  }
4289
4313
  });
@@ -4308,7 +4332,7 @@ var init_buttons = __esm({
4308
4332
  init_generateButtonCss();
4309
4333
  init_generateDefaultButtonSystem();
4310
4334
  init_constants();
4311
- init_presets();
4335
+ init_presets2();
4312
4336
  init_personalities();
4313
4337
  init_types5();
4314
4338
  init_registry();
@@ -7473,6 +7497,7 @@ var init_curatedSiteStyles = __esm({
7473
7497
  "site-style:personal-retreat-journal",
7474
7498
  "site-style:tactile-workshop",
7475
7499
  "site-style:modern-wellness",
7500
+ "site-style:clarity-zen-blue",
7476
7501
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
7477
7502
  "site-style:bold-launch",
7478
7503
  "site-style:south-west-twerk-school"
@@ -7825,6 +7850,114 @@ var init_curatedSiteStyles = __esm({
7825
7850
  paletteChoice("warm-neutral-clay")
7826
7851
  ]
7827
7852
  }),
7853
+ defineCuratedSiteStyle({
7854
+ id: "site-style:clarity-zen-blue",
7855
+ name: "Clarity Zen",
7856
+ description: "Calm, editorial, and reassuring for therapy, counselling, and wellbeing support practices.",
7857
+ generationBrief: "Use a calm, soft palette, editorial serif headings, warm grounded copy, rounded cards, calm proof sections, and clear booking routes. Keep the tone compassionate and straightforward, with professional trust rather than hard-sell wellness language.",
7858
+ siteCreatorSelection: {
7859
+ kind: "site_creator_keyword_heuristic",
7860
+ priority: 25
7861
+ },
7862
+ selectionKeywordRules: [
7863
+ { kind: "substring", value: "psychotherap" },
7864
+ { kind: "phrase", value: "mental health" },
7865
+ { kind: "phrase", value: "talk therapy" },
7866
+ { kind: "phrase", value: "therapy and wellbeing" }
7867
+ ],
7868
+ tokenRecipes: {
7869
+ palette: "brand-led",
7870
+ contrast: "standard",
7871
+ radius: "rounded",
7872
+ shadow: "subtle",
7873
+ typography: "serif-editorial",
7874
+ spacing: "airy",
7875
+ motion: "subtle"
7876
+ },
7877
+ compositionBudget: balancedBudget,
7878
+ themeOverrides: {
7879
+ typography: {
7880
+ body: {
7881
+ family: "Inter, system-ui, sans-serif",
7882
+ size: "md",
7883
+ weight: "regular",
7884
+ lineHeight: "relaxed",
7885
+ letterSpacing: "normal"
7886
+ },
7887
+ headings: {
7888
+ default: {
7889
+ family: '"Cormorant Garamond", Georgia, serif',
7890
+ weight: "regular",
7891
+ lineHeight: "normal",
7892
+ letterSpacing: "normal",
7893
+ colorToken: "text",
7894
+ italic: null,
7895
+ case: null
7896
+ },
7897
+ h1: {
7898
+ size: "xl",
7899
+ weight: "regular",
7900
+ lineHeight: "normal",
7901
+ letterSpacing: "normal",
7902
+ italic: null
7903
+ },
7904
+ h2: {
7905
+ size: "lg",
7906
+ weight: "regular",
7907
+ lineHeight: "normal",
7908
+ letterSpacing: "normal",
7909
+ italic: null
7910
+ },
7911
+ h3: {
7912
+ size: "md",
7913
+ weight: "regular",
7914
+ lineHeight: "normal",
7915
+ letterSpacing: "normal",
7916
+ italic: null
7917
+ }
7918
+ },
7919
+ scale: "majorThird"
7920
+ },
7921
+ bodyText: {
7922
+ intro: {
7923
+ paragraphSize: "default",
7924
+ headingSize: "editorial"
7925
+ }
7926
+ }
7927
+ },
7928
+ defaultBlockVariants: {
7929
+ "block.faq": "split-heading-columns"
7930
+ },
7931
+ recommendedAppearancePresetIds: [
7932
+ "hero-split-editorial",
7933
+ "intro-organic-statement",
7934
+ "feature-cards-raised-rule",
7935
+ "media-text-quiet-story",
7936
+ "testimonials-brand-background-quotes",
7937
+ "faq-contained-help",
7938
+ "contact-form-panel"
7939
+ ],
7940
+ recommendedHeaderLookIds: [
7941
+ "centered-calm",
7942
+ "serif-line",
7943
+ "minimal-transparent"
7944
+ ],
7945
+ recommendedFooterLookIds: [
7946
+ "footer-muted-grounding",
7947
+ "site-footer-brand-two-band"
7948
+ ],
7949
+ buttonPersonalityChoices: [
7950
+ buttonChoice("soft-pill"),
7951
+ buttonChoice("pebble"),
7952
+ buttonChoice("editorial-link")
7953
+ ],
7954
+ paletteVariantChoices: [
7955
+ paletteChoice("brand-led-cool"),
7956
+ paletteChoice("soft-natural-watercolor"),
7957
+ paletteChoice("soft-natural-stone"),
7958
+ paletteChoice("warm-neutral-cream")
7959
+ ]
7960
+ }),
7828
7961
  defineCuratedSiteStyle({
7829
7962
  id: "site-style:personal-retreat-journal",
7830
7963
  name: "Personal Retreat Journal",
@@ -12212,36 +12345,46 @@ function buildCarouselLayout() {
12212
12345
  [buildTestimonialCard(repeat("data.entries", "testimonial"))]
12213
12346
  );
12214
12347
  }
12348
+ function buildResponsiveGridCards() {
12349
+ return [
12350
+ // 2 columns
12351
+ grid(
12352
+ { gap: "lg", cols: { base: 1, sm: 2 } },
12353
+ [buildTestimonialCard(repeat("data.entries", "testimonial"))],
12354
+ when("gridColumns", { equals: "2" })
12355
+ ),
12356
+ // 3 columns (default when unset)
12357
+ grid(
12358
+ { gap: "lg", cols: { base: 1, sm: 2, lg: 3 } },
12359
+ [buildTestimonialCard(repeat("data.entries", "testimonial"))],
12360
+ when("gridColumns", { equals: "3" })
12361
+ ),
12362
+ // 4 columns
12363
+ grid(
12364
+ { gap: "lg", cols: { base: 1, sm: 2, lg: 3, xl: 4 } },
12365
+ [buildTestimonialCard(repeat("data.entries", "testimonial"))],
12366
+ when("gridColumns", { equals: "4" })
12367
+ ),
12368
+ // Fallback to 3 columns when gridColumns is not set
12369
+ grid(
12370
+ { gap: "lg", cols: { base: 1, sm: 2, lg: 3 } },
12371
+ [buildTestimonialCard(repeat("data.entries", "testimonial"))],
12372
+ when("gridColumns", { not: true })
12373
+ )
12374
+ ];
12375
+ }
12215
12376
  function buildGridLayout() {
12216
12377
  return el(
12217
12378
  "div",
12218
12379
  { className: "rb-mt-12 rb-testimonials-carousel" },
12219
- [
12220
- // 2 columns
12221
- grid(
12222
- { gap: "lg", cols: { base: 1, sm: 2 } },
12223
- [buildTestimonialCard(repeat("data.entries", "testimonial"))],
12224
- when("gridColumns", { equals: "2" })
12225
- ),
12226
- // 3 columns (default when unset)
12227
- grid(
12228
- { gap: "lg", cols: { base: 1, sm: 2, lg: 3 } },
12229
- [buildTestimonialCard(repeat("data.entries", "testimonial"))],
12230
- when("gridColumns", { equals: "3" })
12231
- ),
12232
- // 4 columns
12233
- grid(
12234
- { gap: "lg", cols: { base: 1, sm: 2, lg: 3, xl: 4 } },
12235
- [buildTestimonialCard(repeat("data.entries", "testimonial"))],
12236
- when("gridColumns", { equals: "4" })
12237
- ),
12238
- // Fallback to 3 columns when gridColumns is not set
12239
- grid(
12240
- { gap: "lg", cols: { base: 1, sm: 2, lg: 3 } },
12241
- [buildTestimonialCard(repeat("data.entries", "testimonial"))],
12242
- when("gridColumns", { not: true })
12243
- )
12244
- ]
12380
+ buildResponsiveGridCards()
12381
+ );
12382
+ }
12383
+ function buildGridCardsLayout(className) {
12384
+ return el(
12385
+ "div",
12386
+ { className },
12387
+ buildResponsiveGridCards()
12245
12388
  );
12246
12389
  }
12247
12390
  var grid, testimonialsCarouselFragment;
@@ -14477,7 +14620,7 @@ var init_form_interactive = __esm({
14477
14620
  });
14478
14621
 
14479
14622
  // ../blocks/src/lib/typeGuards.ts
14480
- function isRecord2(value) {
14623
+ function isRecord3(value) {
14481
14624
  return typeof value === "object" && value !== null && !Array.isArray(value);
14482
14625
  }
14483
14626
  var init_typeGuards = __esm({
@@ -19373,6 +19516,46 @@ var ENDPOINT_DEFINITIONS = {
19373
19516
  auth: "user",
19374
19517
  responseKind: "json"
19375
19518
  },
19519
+ getSiteIconStyleGuide: {
19520
+ path: "/sites/{siteId}/settings/icon-style-guide",
19521
+ method: "GET",
19522
+ revalidate: 120,
19523
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
19524
+ auth: "user",
19525
+ responseKind: "json",
19526
+ errors: []
19527
+ },
19528
+ updateSiteIconStyleGuide: {
19529
+ path: "/sites/{siteId}/settings/icon-style-guide",
19530
+ method: "POST",
19531
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
19532
+ auth: "user",
19533
+ responseKind: "json",
19534
+ errors: []
19535
+ },
19536
+ regenerateSiteIconStyleGuide: {
19537
+ path: "/sites/{siteId}/settings/icon-style-guide/regenerate",
19538
+ method: "POST",
19539
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
19540
+ auth: "user",
19541
+ responseKind: "json",
19542
+ errors: []
19543
+ },
19544
+ generateGeneratedIconSet: {
19545
+ path: "/sites/{siteId}/ai/generated-icons/generate",
19546
+ method: "POST",
19547
+ auth: "user",
19548
+ responseKind: "json",
19549
+ errors: []
19550
+ },
19551
+ applyGeneratedIconSet: {
19552
+ path: "/sites/{siteId}/ai/generated-icons/apply",
19553
+ method: "POST",
19554
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
19555
+ auth: "user",
19556
+ responseKind: "json",
19557
+ errors: []
19558
+ },
19376
19559
  getSiteAiProfile: {
19377
19560
  path: "/sites/{siteId}/settings/ai-site-profile",
19378
19561
  method: "GET",
@@ -21148,6 +21331,14 @@ var ENDPOINT_DEFINITIONS = {
21148
21331
  auth: "public",
21149
21332
  responseKind: "json"
21150
21333
  },
21334
+ getGeneratedIconRenderAssets: {
21335
+ path: "/public/sites/{siteId}/generated-icon-assets",
21336
+ method: "POST",
21337
+ tags: [TAG_TEMPLATES.siteRoutableContent],
21338
+ auth: "public",
21339
+ responseKind: "json",
21340
+ errors: []
21341
+ },
21151
21342
  // Resolve entry subroute by kind and URL segment
21152
21343
  resolveEntrySubroute: {
21153
21344
  path: "/public/sites/{siteId}/routing/subroutes/resolve",
@@ -22852,6 +23043,13 @@ var ENDPOINT_DEFINITIONS = {
22852
23043
  auth: "service",
22853
23044
  responseKind: "json"
22854
23045
  },
23046
+ sdkDeleteNavigationMenu: {
23047
+ path: "/sdk/{siteId}/navigation/{menuId}",
23048
+ method: "DELETE",
23049
+ auth: "service",
23050
+ responseKind: "json",
23051
+ errors: ["resource:not_found", "server:internal_error"]
23052
+ },
22855
23053
  sdkUpsertTheme: {
22856
23054
  path: "/sdk/{siteId}/theme",
22857
23055
  method: "POST",
@@ -23619,6 +23817,370 @@ var linkSchema = z.union([
23619
23817
 
23620
23818
  // ../blocks/src/system/manifest/fieldValidation/index.ts
23621
23819
  init_schema2();
23820
+
23821
+ // ../blocks/src/system/icons/ids.ts
23822
+ var GENERATED_ICON_SET_ID_PATTERN = /^generated-icon-set:[a-z0-9][a-z0-9:_-]{0,107}$/u;
23823
+ var GENERATED_ICON_ASSET_ID_PATTERN = /^generated-icon-asset:[a-z0-9][a-z0-9:_-]{0,105}$/u;
23824
+ var SITE_ICON_STYLE_GUIDE_VERSION_ID_PATTERN = /^site-icon-style-guide:[a-f0-9]{16}$/u;
23825
+ function normalizeString(value) {
23826
+ if (typeof value !== "string") return null;
23827
+ const normalized = value.trim();
23828
+ return normalized.length > 0 ? normalized : null;
23829
+ }
23830
+ function unsafeAsGeneratedIconSetId(value) {
23831
+ return value;
23832
+ }
23833
+ function unsafeAsGeneratedIconAssetId(value) {
23834
+ return value;
23835
+ }
23836
+ function unsafeAsSiteIconStyleGuideVersionId(value) {
23837
+ return value;
23838
+ }
23839
+ function parseGeneratedIconSetId(value) {
23840
+ const normalized = normalizeString(value);
23841
+ return normalized !== null && GENERATED_ICON_SET_ID_PATTERN.test(normalized) ? unsafeAsGeneratedIconSetId(normalized) : null;
23842
+ }
23843
+ function parseGeneratedIconAssetId(value) {
23844
+ const normalized = normalizeString(value);
23845
+ return normalized !== null && GENERATED_ICON_ASSET_ID_PATTERN.test(normalized) ? unsafeAsGeneratedIconAssetId(normalized) : null;
23846
+ }
23847
+ function parseSiteIconStyleGuideVersionId(value) {
23848
+ if (typeof value !== "string") return null;
23849
+ const normalized = value.trim();
23850
+ return SITE_ICON_STYLE_GUIDE_VERSION_ID_PATTERN.test(normalized) ? unsafeAsSiteIconStyleGuideVersionId(normalized) : null;
23851
+ }
23852
+
23853
+ // ../blocks/src/system/icons/semantic.ts
23854
+ var SEMANTIC_ICON_IDS = [
23855
+ "protection-trust",
23856
+ "confidentiality",
23857
+ "care-support",
23858
+ "partnership",
23859
+ "warmth",
23860
+ "community",
23861
+ "personal-guidance",
23862
+ "conversation",
23863
+ "friendly-welcome",
23864
+ "insight-learning",
23865
+ "natural-wellbeing",
23866
+ "growth",
23867
+ "gentle-care",
23868
+ "special-touch",
23869
+ "ideas",
23870
+ "direction",
23871
+ "focus",
23872
+ "quality",
23873
+ "highlight",
23874
+ "verified-quality",
23875
+ "learning",
23876
+ "training",
23877
+ "programmes-dates",
23878
+ "place",
23879
+ "products",
23880
+ "packages",
23881
+ "time",
23882
+ "practical-service",
23883
+ "at-home",
23884
+ "worldwide",
23885
+ "professional-service"
23886
+ ];
23887
+ var featurePreset = ["feature"];
23888
+ var SEMANTIC_ICON_DEFINITIONS = [
23889
+ {
23890
+ id: "protection-trust",
23891
+ label: "Protection and trust",
23892
+ tags: ["safe", "safety", "security", "trust", "privacy", "confidence"],
23893
+ domains: ["wellbeing", "services", "technology"],
23894
+ tone: ["trustworthy", "practical"],
23895
+ presets: featurePreset
23896
+ },
23897
+ {
23898
+ id: "confidentiality",
23899
+ label: "Confidentiality",
23900
+ tags: ["confidential", "privacy", "secure", "protected", "private"],
23901
+ domains: ["wellbeing", "coaching", "services", "technology"],
23902
+ tone: ["trustworthy", "calm"],
23903
+ presets: featurePreset
23904
+ },
23905
+ {
23906
+ id: "care-support",
23907
+ label: "Care and support",
23908
+ tags: ["care", "support", "therapy", "kindness", "help", "compassion"],
23909
+ domains: ["wellbeing", "coaching", "community"],
23910
+ tone: ["warm", "human"],
23911
+ presets: featurePreset
23912
+ },
23913
+ {
23914
+ id: "partnership",
23915
+ label: "Partnership",
23916
+ tags: ["partnership", "together", "support", "relationship", "collaboration"],
23917
+ domains: ["coaching", "community", "services"],
23918
+ tone: ["warm", "human", "trustworthy"],
23919
+ presets: featurePreset
23920
+ },
23921
+ {
23922
+ id: "warmth",
23923
+ label: "Warmth",
23924
+ tags: ["heart", "warmth", "care", "love", "wellbeing", "personal"],
23925
+ domains: ["wellbeing", "community", "hospitality"],
23926
+ tone: ["warm", "human"],
23927
+ presets: featurePreset
23928
+ },
23929
+ {
23930
+ id: "community",
23931
+ label: "Community",
23932
+ tags: ["community", "group", "people", "team", "members", "belonging"],
23933
+ domains: ["community", "education", "events"],
23934
+ tone: ["human", "warm"],
23935
+ presets: featurePreset
23936
+ },
23937
+ {
23938
+ id: "personal-guidance",
23939
+ label: "Personal guidance",
23940
+ tags: ["guidance", "personal", "coach", "expert", "one to one", "trusted"],
23941
+ domains: ["coaching", "services", "education"],
23942
+ tone: ["trustworthy", "human"],
23943
+ presets: featurePreset
23944
+ },
23945
+ {
23946
+ id: "conversation",
23947
+ label: "Conversation",
23948
+ tags: ["conversation", "talk", "chat", "communication", "support"],
23949
+ domains: ["coaching", "community", "services"],
23950
+ tone: ["human", "warm"],
23951
+ presets: featurePreset
23952
+ },
23953
+ {
23954
+ id: "friendly-welcome",
23955
+ label: "Friendly welcome",
23956
+ tags: ["friendly", "welcome", "positive", "happy", "approachable"],
23957
+ domains: ["hospitality", "community", "services"],
23958
+ tone: ["warm", "playful", "human"],
23959
+ presets: featurePreset
23960
+ },
23961
+ {
23962
+ id: "insight-learning",
23963
+ label: "Insight and learning",
23964
+ tags: ["mind", "insight", "learning", "clarity", "thinking", "therapy"],
23965
+ domains: ["wellbeing", "coaching", "education"],
23966
+ tone: ["calm", "practical"],
23967
+ presets: featurePreset
23968
+ },
23969
+ {
23970
+ id: "natural-wellbeing",
23971
+ label: "Natural wellbeing",
23972
+ tags: ["natural", "wellbeing", "growth", "eco", "calm", "organic"],
23973
+ domains: ["wellbeing", "hospitality", "creative"],
23974
+ tone: ["calm", "warm"],
23975
+ presets: featurePreset
23976
+ },
23977
+ {
23978
+ id: "growth",
23979
+ label: "Growth",
23980
+ tags: ["growth", "new", "progress", "development", "nurture"],
23981
+ domains: ["wellbeing", "coaching", "education", "community"],
23982
+ tone: ["warm", "calm"],
23983
+ presets: featurePreset
23984
+ },
23985
+ {
23986
+ id: "gentle-care",
23987
+ label: "Gentle care",
23988
+ tags: ["gentle", "soft", "care", "wellbeing", "beauty", "calm"],
23989
+ domains: ["wellbeing", "creative", "hospitality"],
23990
+ tone: ["warm", "calm", "premium"],
23991
+ presets: featurePreset
23992
+ },
23993
+ {
23994
+ id: "special-touch",
23995
+ label: "Special touch",
23996
+ tags: ["special", "sparkle", "magic", "polish", "delight", "creative"],
23997
+ domains: ["creative", "commerce", "hospitality"],
23998
+ tone: ["playful", "premium"],
23999
+ presets: featurePreset
24000
+ },
24001
+ {
24002
+ id: "ideas",
24003
+ label: "Ideas",
24004
+ tags: ["idea", "innovation", "clarity", "creative", "strategy"],
24005
+ domains: ["coaching", "education", "creative", "technology"],
24006
+ tone: ["practical", "playful"],
24007
+ presets: featurePreset
24008
+ },
24009
+ {
24010
+ id: "direction",
24011
+ label: "Direction",
24012
+ tags: ["direction", "navigation", "path", "journey", "guidance"],
24013
+ domains: ["coaching", "education", "services"],
24014
+ tone: ["trustworthy", "practical"],
24015
+ presets: featurePreset
24016
+ },
24017
+ {
24018
+ id: "focus",
24019
+ label: "Focus",
24020
+ tags: ["focus", "goal", "outcome", "aim", "strategy"],
24021
+ domains: ["coaching", "services", "technology"],
24022
+ tone: ["practical"],
24023
+ presets: featurePreset
24024
+ },
24025
+ {
24026
+ id: "quality",
24027
+ label: "Quality",
24028
+ tags: ["quality", "award", "standard", "achievement", "premium"],
24029
+ domains: ["services", "education", "commerce"],
24030
+ tone: ["premium", "trustworthy"],
24031
+ presets: featurePreset
24032
+ },
24033
+ {
24034
+ id: "highlight",
24035
+ label: "Highlight",
24036
+ tags: ["highlight", "featured", "favorite", "quality", "special"],
24037
+ domains: ["creative", "commerce", "services"],
24038
+ tone: ["playful", "premium"],
24039
+ presets: featurePreset
24040
+ },
24041
+ {
24042
+ id: "verified-quality",
24043
+ label: "Verified quality",
24044
+ tags: ["verified", "quality", "approved", "trusted", "check"],
24045
+ domains: ["services", "commerce", "education"],
24046
+ tone: ["trustworthy", "practical"],
24047
+ presets: featurePreset
24048
+ },
24049
+ {
24050
+ id: "learning",
24051
+ label: "Learning",
24052
+ tags: ["learning", "book", "course", "knowledge", "education"],
24053
+ domains: ["education", "coaching", "community"],
24054
+ tone: ["calm", "practical"],
24055
+ presets: featurePreset
24056
+ },
24057
+ {
24058
+ id: "training",
24059
+ label: "Training",
24060
+ tags: ["training", "course", "qualification", "school", "education"],
24061
+ domains: ["education", "coaching"],
24062
+ tone: ["trustworthy", "practical"],
24063
+ presets: featurePreset
24064
+ },
24065
+ {
24066
+ id: "programmes-dates",
24067
+ label: "Programmes and dates",
24068
+ tags: ["calendar", "dates", "schedule", "events", "programme", "classes"],
24069
+ domains: ["events", "education", "community"],
24070
+ tone: ["practical"],
24071
+ presets: featurePreset
24072
+ },
24073
+ {
24074
+ id: "place",
24075
+ label: "Place",
24076
+ tags: ["place", "location", "local", "venue", "destination"],
24077
+ domains: ["events", "hospitality", "services"],
24078
+ tone: ["practical"],
24079
+ presets: featurePreset
24080
+ },
24081
+ {
24082
+ id: "products",
24083
+ label: "Products",
24084
+ tags: ["products", "shop", "store", "retail", "commerce"],
24085
+ domains: ["commerce"],
24086
+ tone: ["practical", "premium"],
24087
+ presets: featurePreset
24088
+ },
24089
+ {
24090
+ id: "packages",
24091
+ label: "Packages",
24092
+ tags: ["package", "bundle", "delivery", "offer", "product"],
24093
+ domains: ["commerce", "services"],
24094
+ tone: ["practical"],
24095
+ presets: featurePreset
24096
+ },
24097
+ {
24098
+ id: "time",
24099
+ label: "Time",
24100
+ tags: ["time", "duration", "schedule", "availability", "appointment"],
24101
+ domains: ["events", "services", "wellbeing"],
24102
+ tone: ["practical", "calm"],
24103
+ presets: featurePreset
24104
+ },
24105
+ {
24106
+ id: "practical-service",
24107
+ label: "Practical service",
24108
+ tags: ["service", "repair", "setup", "practical", "tools", "support"],
24109
+ domains: ["services", "technology"],
24110
+ tone: ["practical"],
24111
+ presets: featurePreset
24112
+ },
24113
+ {
24114
+ id: "at-home",
24115
+ label: "At home",
24116
+ tags: ["home", "domestic", "comfort", "local", "space"],
24117
+ domains: ["hospitality", "services", "community"],
24118
+ tone: ["warm", "calm"],
24119
+ presets: featurePreset
24120
+ },
24121
+ {
24122
+ id: "worldwide",
24123
+ label: "Worldwide",
24124
+ tags: ["global", "online", "worldwide", "remote", "international"],
24125
+ domains: ["technology", "education", "services"],
24126
+ tone: ["practical"],
24127
+ presets: featurePreset
24128
+ },
24129
+ {
24130
+ id: "professional-service",
24131
+ label: "Professional service",
24132
+ tags: ["business", "professional", "consulting", "service", "work"],
24133
+ domains: ["services", "technology", "coaching"],
24134
+ tone: ["practical", "trustworthy"],
24135
+ presets: featurePreset
24136
+ }
24137
+ ];
24138
+ SEMANTIC_ICON_DEFINITIONS.map(({ id, label }) => ({
24139
+ id,
24140
+ label
24141
+ }));
24142
+ function isSemanticIconId(value) {
24143
+ return typeof value === "string" && SEMANTIC_ICON_IDS.includes(value);
24144
+ }
24145
+
24146
+ // ../blocks/src/system/icons/value.ts
24147
+ var NO_BLOCK_ICON_VALUE = { kind: "none" };
24148
+ function isRecord(value) {
24149
+ return typeof value === "object" && value !== null && !Array.isArray(value);
24150
+ }
24151
+ function parseBlockIconValue(value) {
24152
+ if (isSemanticIconId(value)) {
24153
+ return { kind: "semantic", iconId: value };
24154
+ }
24155
+ if (!isRecord(value)) {
24156
+ return NO_BLOCK_ICON_VALUE;
24157
+ }
24158
+ switch (value.kind) {
24159
+ case "none":
24160
+ return NO_BLOCK_ICON_VALUE;
24161
+ case "semantic":
24162
+ return isSemanticIconId(value.iconId) ? { kind: "semantic", iconId: value.iconId } : NO_BLOCK_ICON_VALUE;
24163
+ case "generated": {
24164
+ const setId = parseGeneratedIconSetId(value.setId);
24165
+ const assetId = parseGeneratedIconAssetId(value.assetId);
24166
+ const styleGuideVersionId = parseSiteIconStyleGuideVersionId(value.styleGuideVersionId);
24167
+ if (setId !== null && assetId !== null && isSemanticIconId(value.semanticFallbackIconId) && styleGuideVersionId !== null) {
24168
+ return {
24169
+ kind: "generated",
24170
+ setId,
24171
+ assetId,
24172
+ semanticFallbackIconId: value.semanticFallbackIconId,
24173
+ styleGuideVersionId
24174
+ };
24175
+ }
24176
+ return NO_BLOCK_ICON_VALUE;
24177
+ }
24178
+ default:
24179
+ return NO_BLOCK_ICON_VALUE;
24180
+ }
24181
+ }
24182
+
24183
+ // ../blocks/src/system/manifest/fieldValidation/index.ts
23622
24184
  var TEL_RE = /^[+()0-9\s-]{3,}$/;
23623
24185
  var SLUG_PATTERN = /^(?:[a-z0-9]+(?:-[a-z0-9]+)*)(?:\/(?:[a-z0-9]+(?:-[a-z0-9]+)*))*$/;
23624
24186
  var ALLOWED_URL_PROTOCOLS = ["http:", "https:"];
@@ -23707,7 +24269,7 @@ function deriveFieldValidationPlan(field, path24 = [field.id]) {
23707
24269
  return makePlan("number", "number", field, path24, required, constraints2);
23708
24270
  }
23709
24271
  const constraints = commonConstraints(required, {
23710
- kind: "textType"
24272
+ kind: field.ui?.widget === "iconPicker" ? "blockIconValue" : "textType"
23711
24273
  });
23712
24274
  if (inputType === "email") constraints.push({ kind: "emailFormat" });
23713
24275
  if (inputType === "tel") constraints.push({ kind: "phoneFormat" });
@@ -24040,39 +24602,52 @@ function isMissingForPlan(plan, value) {
24040
24602
  return false;
24041
24603
  }
24042
24604
  function validateStringPlan(plan, value) {
24605
+ if (plan.constraints.some((constraint) => constraint.kind === "blockIconValue")) {
24606
+ return plan.constraints.flatMap((constraint) => validateStringConstraint(plan, constraint, value));
24607
+ }
24043
24608
  if (typeof value !== "string") return [issue(plan, "wrongType", { expected: "text" })];
24044
24609
  return plan.constraints.flatMap((constraint) => validateStringConstraint(plan, constraint, value));
24045
24610
  }
24046
24611
  function validateStringConstraint(plan, constraint, value) {
24047
24612
  switch (constraint.kind) {
24048
24613
  case "required":
24614
+ return [];
24049
24615
  case "textType":
24050
24616
  case "referenceText":
24051
- return [];
24617
+ return typeof value === "string" ? [] : [issue(plan, "wrongType", { expected: "text" })];
24618
+ case "blockIconValue":
24619
+ return isValidIconPickerValue(value) ? [] : [issue(plan, "wrongType", { expected: "text or icon" })];
24052
24620
  case "maxLength":
24053
- return value.length > constraint.maximum ? [issue(plan, "tooLong", { maximum: constraint.maximum })] : [];
24621
+ return typeof value === "string" && value.length > constraint.maximum ? [issue(plan, "tooLong", { maximum: constraint.maximum })] : [];
24054
24622
  case "emailFormat":
24055
- return isCanonicalEmailValue(value) ? [] : [issue(plan, "invalidEmail")];
24623
+ return typeof value === "string" && isCanonicalEmailValue(value) ? [] : [issue(plan, "invalidEmail")];
24056
24624
  case "phoneFormat":
24057
- return isCanonicalPhoneValue(value) ? [] : [issue(plan, "invalidPhone")];
24625
+ return typeof value === "string" && isCanonicalPhoneValue(value) ? [] : [issue(plan, "invalidPhone")];
24058
24626
  case "patternFormat": {
24627
+ if (typeof value !== "string") return [issue(plan, "wrongType", { expected: "text" })];
24059
24628
  const re = compilePattern(constraint.pattern);
24060
24629
  return re && !re.test(value) ? [issue(plan, "invalidPattern")] : [];
24061
24630
  }
24062
24631
  case "urlFormat":
24063
- return isCanonicalUrlValue(value, { allowRelative: constraint.allowRelative }) ? [] : [issue(plan, "invalidUrl")];
24632
+ return typeof value === "string" && isCanonicalUrlValue(value, { allowRelative: constraint.allowRelative }) ? [] : [issue(plan, "invalidUrl")];
24064
24633
  case "dateFormat":
24065
- return isValidDateString(value) ? [] : [issue(plan, "invalidDate")];
24634
+ return typeof value === "string" && isValidDateString(value) ? [] : [issue(plan, "invalidDate")];
24066
24635
  case "timeFormat":
24067
- return isValidTimeString(value) ? [] : [issue(plan, "invalidTime")];
24636
+ return typeof value === "string" && isValidTimeString(value) ? [] : [issue(plan, "invalidTime")];
24068
24637
  case "datetimeFormat":
24069
- return isValidDateTimeInstantString(value) ? [] : [issue(plan, "invalidDateTime")];
24638
+ return typeof value === "string" && isValidDateTimeInstantString(value) ? [] : [issue(plan, "invalidDateTime")];
24070
24639
  case "slugFormat":
24071
- return SLUG_PATTERN.test(value) ? [] : [issue(plan, "invalidSlug")];
24640
+ return typeof value === "string" && SLUG_PATTERN.test(value) ? [] : [issue(plan, "invalidSlug")];
24072
24641
  default:
24073
24642
  return assertNever2(constraint);
24074
24643
  }
24075
24644
  }
24645
+ function isValidIconPickerValue(value) {
24646
+ if (typeof value === "string") return true;
24647
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
24648
+ if (value.kind === "none") return true;
24649
+ return parseBlockIconValue(value).kind !== "none";
24650
+ }
24076
24651
  function validateNumberPlan(plan, value) {
24077
24652
  if (!isValidNumber(value)) return [issue(plan, "invalidNumber")];
24078
24653
  return plan.constraints.flatMap((constraint) => validateNumberConstraint(plan, constraint, Number(value)));
@@ -25639,6 +26214,24 @@ var questionColumnsLayout = styledSection({
25639
26214
  }),
25640
26215
  baseClass: ""
25641
26216
  });
26217
+ var splitHeadingColumnsLayout = styledSection({
26218
+ children: styledContainer({
26219
+ baseClassName: "rb-relative rb-isolate",
26220
+ children: el(
26221
+ "div",
26222
+ {
26223
+ className: "rb-faq-split-heading-columns rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
26224
+ },
26225
+ [
26226
+ el("div", { className: "rb-faq-split-heading-columns-copy" }, [headingLayout]),
26227
+ el("div", { className: "rb-faq-split-heading-columns-accordion" }, [
26228
+ questionColumnsAccordionLayout
26229
+ ])
26230
+ ]
26231
+ )
26232
+ }),
26233
+ baseClass: ""
26234
+ });
25642
26235
  var faqManifest = createBlockManifest({
25643
26236
  id: "block.faq",
25644
26237
  title: "FAQ",
@@ -25659,7 +26252,8 @@ var faqManifest = createBlockManifest({
25659
26252
  variants: {
25660
26253
  default: defaultLayout,
25661
26254
  "two-column": twoColumnLayout,
25662
- "question-columns": questionColumnsLayout
26255
+ "question-columns": questionColumnsLayout,
26256
+ "split-heading-columns": splitHeadingColumnsLayout
25663
26257
  },
25664
26258
  defaultVariant: "default",
25665
26259
  variantOptions: {
@@ -25674,6 +26268,10 @@ var faqManifest = createBlockManifest({
25674
26268
  "question-columns": {
25675
26269
  label: "Question columns",
25676
26270
  description: "A full-width heading above FAQ items split into two columns."
26271
+ },
26272
+ "split-heading-columns": {
26273
+ label: "Split heading columns",
26274
+ description: "A left heading column with FAQ items split into two columns on the right."
25677
26275
  }
25678
26276
  },
25679
26277
  description: "Accordion of frequently asked questions and answers.",
@@ -26912,16 +27510,16 @@ var interpolateRichTextTokensOptionsSchema = z.object({
26912
27510
  var richTextTokenPattern = /\{\{\s*([a-zA-Z0-9_]+)\s*\}\}/g;
26913
27511
  function getSiteName(context) {
26914
27512
  const viewModel = context.viewModel;
26915
- if (!isRecord2(viewModel)) return null;
27513
+ if (!isRecord3(viewModel)) return null;
26916
27514
  const site = viewModel.site;
26917
- if (isRecord2(site) && typeof site.title === "string") {
27515
+ if (isRecord3(site) && typeof site.title === "string") {
26918
27516
  const title = site.title.trim();
26919
27517
  return title.length > 0 ? title : null;
26920
27518
  }
26921
27519
  const root = viewModel.$root;
26922
- if (isRecord2(root)) {
27520
+ if (isRecord3(root)) {
26923
27521
  const rootSite = root.site;
26924
- if (isRecord2(rootSite) && typeof rootSite.title === "string") {
27522
+ if (isRecord3(rootSite) && typeof rootSite.title === "string") {
26925
27523
  const title = rootSite.title.trim();
26926
27524
  if (title.length > 0) return title;
26927
27525
  }
@@ -26943,7 +27541,7 @@ function replaceTokenText(input, allowedTokens, tokenValues) {
26943
27541
  });
26944
27542
  }
26945
27543
  function visitRichTextNode(node, allowedTokens, tokenValues) {
26946
- if (!isRecord2(node)) return node;
27544
+ if (!isRecord3(node)) return node;
26947
27545
  let changed = false;
26948
27546
  const nextNode = { ...node };
26949
27547
  if (nextNode.type === "text" && typeof nextNode.text === "string") {
@@ -26969,13 +27567,13 @@ function visitRichTextNode(node, allowedTokens, tokenValues) {
26969
27567
  return changed ? nextNode : node;
26970
27568
  }
26971
27569
  function interpolateRichTextTokens(value, options, context) {
26972
- if (!isRecord2(value)) return value;
27570
+ if (!isRecord3(value)) return value;
26973
27571
  const allowedTokens = new Set(options.tokens);
26974
27572
  const tokenValues = {
26975
27573
  year: String((/* @__PURE__ */ new Date()).getFullYear()),
26976
27574
  site_name: getSiteName(context)
26977
27575
  };
26978
- if (isRecord2(value.doc)) {
27576
+ if (isRecord3(value.doc)) {
26979
27577
  const nextDoc = visitRichTextNode(value.doc, allowedTokens, tokenValues);
26980
27578
  if (nextDoc === value.doc) return value;
26981
27579
  return { ...value, doc: nextDoc };
@@ -27774,6 +28372,8 @@ init_boxStyles();
27774
28372
  init_defineBlock();
27775
28373
  init_builder();
27776
28374
  init_fragments2();
28375
+ init_colorStyles();
28376
+ var backgroundImageClassName = "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-object-cover rb-opacity-50";
27777
28377
  var wrapVariant = (variantLayout) => styledSection({
27778
28378
  children: styledContainer({
27779
28379
  children: stack(
@@ -27787,10 +28387,53 @@ var wrapVariant = (variantLayout) => styledSection({
27787
28387
  // styledContainer (rb-container) already provides horizontal padding
27788
28388
  baseClass: "",
27789
28389
  spacing: "comfortable",
27790
- imageClassName: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-object-cover rb-opacity-50"
28390
+ imageClassName: backgroundImageClassName
27791
28391
  });
27792
28392
  var carouselLayout = wrapVariant(buildCarouselLayout());
27793
28393
  var gridLayout2 = wrapVariant(buildGridLayout());
28394
+ var splitHeading = stack(
28395
+ { gap: "md", className: "rb-testimonials-split-heading-copy rb-max-w-xl" },
28396
+ [
28397
+ text(
28398
+ { as: "h2" },
28399
+ when("content.heading"),
28400
+ bind("content.heading")
28401
+ ),
28402
+ headingDecoration({
28403
+ family: "short-center-rule",
28404
+ placement: "after-heading"
28405
+ }),
28406
+ text(
28407
+ {
28408
+ as: "p",
28409
+ className: "rb-prose",
28410
+ style: textColorStyle("mutedText")
28411
+ },
28412
+ when("content.subheading"),
28413
+ bind("content.subheading")
28414
+ )
28415
+ ]
28416
+ );
28417
+ var splitGridLayout = styledSection({
28418
+ children: styledContainer({
28419
+ baseClassName: "rb-relative rb-isolate",
28420
+ children: el(
28421
+ "div",
28422
+ {
28423
+ className: "rb-testimonials-split-grid rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
28424
+ },
28425
+ [
28426
+ el("div", { className: "rb-testimonials-split-grid-heading" }, [splitHeading]),
28427
+ el("div", { className: "rb-testimonials-split-grid-cards" }, [
28428
+ buildGridCardsLayout("rb-testimonials-split-grid-card-list")
28429
+ ])
28430
+ ]
28431
+ )
28432
+ }),
28433
+ baseClass: "",
28434
+ spacing: "comfortable",
28435
+ imageClassName: backgroundImageClassName
28436
+ });
27794
28437
  var additionalFields = parseFieldDefinitions([
27795
28438
  // Heading fields from fragment
27796
28439
  ...testimonialsHeadingFragment.fields,
@@ -27822,7 +28465,7 @@ var additionalFields = parseFieldDefinitions([
27822
28465
  ],
27823
28466
  ui: {
27824
28467
  intent: "display",
27825
- visibleWhen: { field: "variant", equals: "grid" }
28468
+ visibleWhen: { field: "variant", oneOf: ["grid", "split-grid"] }
27826
28469
  }
27827
28470
  },
27828
28471
  // Carousel-specific fields (from fragment)
@@ -27856,7 +28499,8 @@ var testimonialsManifest = createBlockManifest({
27856
28499
  // Variant system - enables the variant switcher control in the editor
27857
28500
  variants: {
27858
28501
  carousel: carouselLayout,
27859
- grid: gridLayout2
28502
+ grid: gridLayout2,
28503
+ "split-grid": splitGridLayout
27860
28504
  },
27861
28505
  defaultVariant: "carousel",
27862
28506
  variantOptions: {
@@ -27869,6 +28513,11 @@ var testimonialsManifest = createBlockManifest({
27869
28513
  label: "Grid",
27870
28514
  description: "Responsive grid layout",
27871
28515
  icon: "Grid"
28516
+ },
28517
+ "split-grid": {
28518
+ label: "Split grid",
28519
+ description: "Heading on the left with testimonial cards on the right",
28520
+ icon: "PanelLeft"
27872
28521
  }
27873
28522
  },
27874
28523
  // Fields (variant field is auto-generated by augmentManifest)
@@ -28283,6 +28932,15 @@ init_ctas();
28283
28932
  init_builder();
28284
28933
  init_fragments();
28285
28934
  init_colorStyles();
28935
+
28936
+ // ../blocks/src/system/blocks/feature-card-icons.ts
28937
+ var FEATURE_CARD_ICON_TREATMENTS = [
28938
+ "plain",
28939
+ "soft-badge",
28940
+ "utility-badge"
28941
+ ];
28942
+
28943
+ // ../blocks/src/system/blocks/feature-cards.ts
28286
28944
  function grid3(props2, children) {
28287
28945
  return el("grid", props2 ?? void 0, children ?? void 0);
28288
28946
  }
@@ -28324,6 +28982,15 @@ var featureCard = styledCard(
28324
28982
  bind("card.media")
28325
28983
  ),
28326
28984
  stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
28985
+ el(
28986
+ "feature-card-icon",
28987
+ {
28988
+ treatment: { $bind: { from: "content._iconTreatment", fallback: "soft-badge" } },
28989
+ generatedAssets: { $bind: { from: "data.generatedIconAssets" } }
28990
+ },
28991
+ null,
28992
+ bind("card.icon")
28993
+ ),
28327
28994
  text(
28328
28995
  {
28329
28996
  as: "h3",
@@ -28445,6 +29112,16 @@ var featureCardsConfig = {
28445
29112
  defaultValue: "4/3",
28446
29113
  visibleWhen: { field: "media", notEquals: null }
28447
29114
  }),
29115
+ {
29116
+ id: "icon",
29117
+ type: "text",
29118
+ label: "Icon",
29119
+ required: false,
29120
+ ui: {
29121
+ widget: "iconPicker",
29122
+ iconPickerPreset: "feature"
29123
+ }
29124
+ },
28448
29125
  {
28449
29126
  id: "title",
28450
29127
  type: "text",
@@ -28480,6 +29157,19 @@ var featureCardsConfig = {
28480
29157
  ]
28481
29158
  }
28482
29159
  },
29160
+ {
29161
+ id: "_iconTreatment",
29162
+ type: "select",
29163
+ label: "Icon style",
29164
+ required: false,
29165
+ defaultValue: "soft-badge",
29166
+ multiple: false,
29167
+ options: FEATURE_CARD_ICON_TREATMENTS.map((value) => ({
29168
+ value,
29169
+ label: value === "plain" ? "Plain" : value === "soft-badge" ? "Soft badge" : "Utility badge"
29170
+ })),
29171
+ ui: { intent: "display" }
29172
+ },
28483
29173
  cardStylesField({
28484
29174
  id: "_cardStyles",
28485
29175
  label: "Card styles"
@@ -33818,7 +34508,8 @@ var systemBlockDefinitionsRaw = [
33818
34508
  layoutProfiles: [
33819
34509
  layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
33820
34510
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" }),
33821
- layoutProfile({ variantKey: "question-columns", family: "grid", weight: "standard" })
34511
+ layoutProfile({ variantKey: "question-columns", family: "grid", weight: "standard" }),
34512
+ layoutProfile({ variantKey: "split-heading-columns", family: "split", weight: "standard" })
33822
34513
  ]
33823
34514
  })),
33824
34515
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
@@ -33849,6 +34540,12 @@ var systemBlockDefinitionsRaw = [
33849
34540
  family: "grid",
33850
34541
  weight: "standard",
33851
34542
  bias: "soft"
34543
+ }),
34544
+ layoutProfile({
34545
+ variantKey: "split-grid",
34546
+ family: "split",
34547
+ weight: "featured",
34548
+ bias: "soft"
33852
34549
  })
33853
34550
  ]
33854
34551
  })),
@@ -37392,7 +38089,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
37392
38089
  }
37393
38090
 
37394
38091
  // ../api/src/utils/isRecord.ts
37395
- function isRecord3(value) {
38092
+ function isRecord4(value) {
37396
38093
  return typeof value === "object" && value !== null && !Array.isArray(value);
37397
38094
  }
37398
38095
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
@@ -37665,7 +38362,7 @@ function sanitizeMarks(marks) {
37665
38362
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
37666
38363
  return [{ type: mark.type }];
37667
38364
  }
37668
- if (mark.type === "link" && isRecord3(mark.attrs) && typeof mark.attrs.href === "string") {
38365
+ if (mark.type === "link" && isRecord4(mark.attrs) && typeof mark.attrs.href === "string") {
37669
38366
  const attrs = { href: mark.attrs.href };
37670
38367
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
37671
38368
  attrs.target = mark.attrs.target;
@@ -37680,10 +38377,10 @@ function sanitizeMarks(marks) {
37680
38377
  return sanitized.length > 0 ? sanitized : void 0;
37681
38378
  }
37682
38379
  function unwrapRichTextValue(value) {
37683
- if (isRecord3(value) && isRecord3(value.doc)) {
38380
+ if (isRecord4(value) && isRecord4(value.doc)) {
37684
38381
  return unwrapRichTextValue(value.doc);
37685
38382
  }
37686
- if (isRecord3(value) && value.type === "doc") {
38383
+ if (isRecord4(value) && value.type === "doc") {
37687
38384
  return {
37688
38385
  type: "doc",
37689
38386
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -37692,7 +38389,7 @@ function unwrapRichTextValue(value) {
37692
38389
  return EMPTY_SITE_BANNER_BODY;
37693
38390
  }
37694
38391
  function isTipTapNodeLike(value) {
37695
- return isRecord3(value) && typeof value.type === "string";
38392
+ return isRecord4(value) && typeof value.type === "string";
37696
38393
  }
37697
38394
  function coerceTipTapNode(value) {
37698
38395
  return {
@@ -37700,9 +38397,9 @@ function coerceTipTapNode(value) {
37700
38397
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
37701
38398
  ...typeof value.text === "string" ? { text: value.text } : {},
37702
38399
  ...Array.isArray(value.marks) ? {
37703
- marks: value.marks.filter((mark) => isRecord3(mark) && typeof mark.type === "string").map((mark) => ({
38400
+ marks: value.marks.filter((mark) => isRecord4(mark) && typeof mark.type === "string").map((mark) => ({
37704
38401
  type: mark.type,
37705
- ...isRecord3(mark.attrs) ? { attrs: mark.attrs } : {}
38402
+ ...isRecord4(mark.attrs) ? { attrs: mark.attrs } : {}
37706
38403
  }))
37707
38404
  } : {}
37708
38405
  };
@@ -37818,7 +38515,7 @@ function collectCartLinkStats(items, depth = 0) {
37818
38515
  return result;
37819
38516
  }
37820
38517
  function isNavigationMenuValidationItem(value) {
37821
- if (!isRecord3(value)) return false;
38518
+ if (!isRecord4(value)) return false;
37822
38519
  return typeof value.label === "string";
37823
38520
  }
37824
38521
 
@@ -37834,7 +38531,6 @@ var websiteSurfaceIds = [
37834
38531
  "site.footerBlocks",
37835
38532
  "site.navigation",
37836
38533
  "site.media",
37837
- "site.style",
37838
38534
  "site.performance"
37839
38535
  ];
37840
38536
  new Set(
@@ -37854,6 +38550,104 @@ var hiddenDemoSettingsNavSurfaceIds = [
37854
38550
  "settings.backup"
37855
38551
  ];
37856
38552
  new Set(hiddenDemoSettingsNavSurfaceIds);
38553
+
38554
+ // ../api/src/navigation/identity.ts
38555
+ init_src();
38556
+ function unsafeAsNavigationMenuIdentifier(identifier) {
38557
+ return identifier;
38558
+ }
38559
+ function unsafeAsNavigationMenuIdentity(identity) {
38560
+ return identity;
38561
+ }
38562
+ var MAIN_NAVIGATION_MENU_IDENTIFIER = unsafeAsNavigationMenuIdentifier("main");
38563
+ function parseNavigationMenuIdentifier(value) {
38564
+ if (typeof value !== "string") {
38565
+ return err({ kind: "not_string" });
38566
+ }
38567
+ const trimmed = value.trim();
38568
+ if (trimmed.length === 0) {
38569
+ return err({ kind: "empty_string" });
38570
+ }
38571
+ return ok(unsafeAsNavigationMenuIdentifier(trimmed));
38572
+ }
38573
+ function normalizeNavigationMenuIdentifier(identifier) {
38574
+ const parsed = parseNavigationMenuIdentifier(identifier);
38575
+ return parsed.ok ? parsed.value : null;
38576
+ }
38577
+ function navigationMenuIdentity(input) {
38578
+ return unsafeAsNavigationMenuIdentity(
38579
+ normalizeNavigationMenuIdentifier(input.identifier) ?? input.name
38580
+ );
38581
+ }
38582
+ function planNavigationMenuMatch(input, menus) {
38583
+ const identifier = normalizeNavigationMenuIdentifier(input.identifier);
38584
+ if (identifier) {
38585
+ const identifierMatches = menus.filter(
38586
+ (menu) => normalizeNavigationMenuIdentifier(menu.identifier) === identifier
38587
+ );
38588
+ const identifierMatch = identifierMatches[0];
38589
+ if (identifierMatches.length === 1 && identifierMatch) {
38590
+ return {
38591
+ type: "update",
38592
+ menuId: identifierMatch.id,
38593
+ identifier
38594
+ };
38595
+ }
38596
+ if (identifierMatches.length > 1) {
38597
+ return {
38598
+ type: "identifier_conflict",
38599
+ identifier,
38600
+ menuIds: identifierMatches.map((menu) => menu.id)
38601
+ };
38602
+ }
38603
+ if (identifier === MAIN_NAVIGATION_MENU_IDENTIFIER) {
38604
+ const legacyPrimaryMatches = menus.filter(
38605
+ (menu) => menu.isPrimary && normalizeNavigationMenuIdentifier(menu.identifier) === null
38606
+ );
38607
+ const legacyPrimaryMatch = legacyPrimaryMatches[0];
38608
+ if (legacyPrimaryMatches.length === 1 && legacyPrimaryMatch) {
38609
+ return {
38610
+ type: "adopt_legacy_primary",
38611
+ menuId: legacyPrimaryMatch.id,
38612
+ identifier
38613
+ };
38614
+ }
38615
+ if (legacyPrimaryMatches.length > 1) {
38616
+ return {
38617
+ type: "ambiguous_legacy_primary",
38618
+ identifier,
38619
+ menuIds: legacyPrimaryMatches.map((menu) => menu.id)
38620
+ };
38621
+ }
38622
+ }
38623
+ return { type: "create", identifier };
38624
+ }
38625
+ const nameMatches = menus.filter((menu) => menu.name === input.name);
38626
+ const nameMatch = nameMatches[0];
38627
+ if (nameMatches.length === 1 && nameMatch) {
38628
+ return { type: "update", menuId: nameMatch.id, identifier: null };
38629
+ }
38630
+ if (nameMatches.length > 1) {
38631
+ return {
38632
+ type: "ambiguous_name",
38633
+ name: input.name,
38634
+ menuIds: nameMatches.map((menu) => menu.id)
38635
+ };
38636
+ }
38637
+ return { type: "create", identifier: null };
38638
+ }
38639
+ function actionableNavigationMenuMatchPlan(plan) {
38640
+ switch (plan.type) {
38641
+ case "create":
38642
+ case "update":
38643
+ case "adopt_legacy_primary":
38644
+ return ok(plan);
38645
+ case "identifier_conflict":
38646
+ case "ambiguous_legacy_primary":
38647
+ case "ambiguous_name":
38648
+ return err(plan);
38649
+ }
38650
+ }
37857
38651
  var Rfc6902PatchOp = z.discriminatedUnion("op", [
37858
38652
  // Standard RFC-6902 operations
37859
38653
  z.object({
@@ -38967,20 +39761,20 @@ var ManagementApiError = class extends Error {
38967
39761
  function is404Error(error) {
38968
39762
  return error instanceof ManagementApiError && error.statusCode === 404;
38969
39763
  }
38970
- function isRecord4(value) {
39764
+ function isRecord5(value) {
38971
39765
  return Boolean(value && typeof value === "object" && !Array.isArray(value));
38972
39766
  }
38973
39767
  function isFieldError(value) {
38974
- return isRecord4(value) && typeof value.field === "string" && typeof value.code === "string" && typeof value.message === "string";
39768
+ return isRecord5(value) && typeof value.field === "string" && typeof value.code === "string" && typeof value.message === "string";
38975
39769
  }
38976
39770
  function parseApiResponse(value) {
38977
- if (!isRecord4(value)) return null;
39771
+ if (!isRecord5(value)) return null;
38978
39772
  if (value.success === true) {
38979
39773
  return { success: true, data: value.data };
38980
39774
  }
38981
39775
  if (value.success === false) {
38982
39776
  const error = value.error;
38983
- if (!isRecord4(error) || typeof error.code !== "string" || typeof error.message !== "string") {
39777
+ if (!isRecord5(error) || typeof error.code !== "string" || typeof error.message !== "string") {
38984
39778
  return { success: false, error: { code: "sdk:http-error", message: "Request failed", details: error } };
38985
39779
  }
38986
39780
  const fieldErrorsRaw = error.fieldErrors;
@@ -39324,9 +40118,10 @@ function createNavigationOperations(http) {
39324
40118
  async upsert(input) {
39325
40119
  const result = await http.post("/navigation", input);
39326
40120
  return mapPulledNavigationMenu({
39327
- ...result.menu,
39328
- identifier: null
39329
- });
40121
+ ...result.menu});
40122
+ },
40123
+ async delete(menuId) {
40124
+ await http.delete(`/navigation/${encodeURIComponent(menuId)}`);
39330
40125
  }
39331
40126
  };
39332
40127
  }
@@ -40496,7 +41291,7 @@ function createListCommand(config2) {
40496
41291
 
40497
41292
  // src/cli/push-config.ts
40498
41293
  var DEFAULT_CONFIG_PATH = "./riverbank.config.ts";
40499
- function isRecord5(value) {
41294
+ function isRecord6(value) {
40500
41295
  return typeof value === "object" && value !== null;
40501
41296
  }
40502
41297
  function parseErrorDetails(value) {
@@ -40504,10 +41299,10 @@ function parseErrorDetails(value) {
40504
41299
  if (typeof value === "string") {
40505
41300
  return { message: value };
40506
41301
  }
40507
- if (!isRecord5(value)) return {};
41302
+ if (!isRecord6(value)) return {};
40508
41303
  const message = typeof value.message === "string" ? value.message : void 0;
40509
41304
  const fieldErrorsRaw = value.fieldErrors;
40510
- const fieldErrors = Array.isArray(fieldErrorsRaw) ? fieldErrorsRaw.filter(isRecord5).map((d) => ({
41305
+ const fieldErrors = Array.isArray(fieldErrorsRaw) ? fieldErrorsRaw.filter(isRecord6).map((d) => ({
40511
41306
  field: typeof d.field === "string" ? d.field : "",
40512
41307
  message: typeof d.message === "string" ? d.message : ""
40513
41308
  })).filter((d) => d.field.length > 0 && d.message.length > 0) : void 0;
@@ -40519,12 +41314,12 @@ function formatFieldErrors(fieldErrors) {
40519
41314
  }
40520
41315
  function getDashboardErrorMessage(responseJson, fallback) {
40521
41316
  if (!responseJson) return fallback;
40522
- if (isRecord5(responseJson) && responseJson.success === false && "error" in responseJson) {
41317
+ if (isRecord6(responseJson) && responseJson.success === false && "error" in responseJson) {
40523
41318
  const parsed = parseErrorDetails(responseJson.error);
40524
41319
  const msg = parsed.message ?? fallback;
40525
41320
  return msg + formatFieldErrors(parsed.fieldErrors);
40526
41321
  }
40527
- if (isRecord5(responseJson) && "error" in responseJson) {
41322
+ if (isRecord6(responseJson) && "error" in responseJson) {
40528
41323
  const parsed = parseErrorDetails(responseJson.error);
40529
41324
  const msg = parsed.message ?? fallback;
40530
41325
  return msg + formatFieldErrors(parsed.fieldErrors);
@@ -40882,9 +41677,34 @@ function convertPulledFooterToLocal(remoteFooter) {
40882
41677
  return { bottomText: remoteFooter.bottomText };
40883
41678
  }
40884
41679
 
41680
+ // src/cli/navigationIdentity.ts
41681
+ init_src();
41682
+ var navigationIdentity = navigationMenuIdentity;
41683
+ function navigationIdentityMap(menus) {
41684
+ const byIdentity = /* @__PURE__ */ new Map();
41685
+ const menuNamesByIdentity = /* @__PURE__ */ new Map();
41686
+ for (const menu of menus) {
41687
+ const identity = navigationIdentity(menu);
41688
+ const existingNames = menuNamesByIdentity.get(identity);
41689
+ if (existingNames) {
41690
+ return err({
41691
+ code: "duplicate_navigation_identity",
41692
+ identity,
41693
+ menuNames: [...existingNames, menu.name]
41694
+ });
41695
+ }
41696
+ byIdentity.set(identity, menu);
41697
+ menuNamesByIdentity.set(identity, [menu.name]);
41698
+ }
41699
+ return ok(byIdentity);
41700
+ }
41701
+ function duplicateNavigationIdentityMessage(error) {
41702
+ return `Duplicate navigation menu identity '${error.identity}' for menus: ${error.menuNames.join(", ")}. Use unique navigation identifiers or names before syncing.`;
41703
+ }
41704
+
40885
41705
  // src/cli/media/portable.ts
40886
41706
  var ENV_SPECIFIC_MEDIA_KEYS = ["assetId", "storagePath", "storageBucket"];
40887
- var isRecord6 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
41707
+ var isRecord7 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
40888
41708
  var isMediaObject = (value) => value.type === "image" || value.type === "video";
40889
41709
  function stripEnvSpecificMediaFieldsInPlace(value) {
40890
41710
  if (value === null || value === void 0) return;
@@ -40894,7 +41714,7 @@ function stripEnvSpecificMediaFieldsInPlace(value) {
40894
41714
  }
40895
41715
  return;
40896
41716
  }
40897
- if (!isRecord6(value)) return;
41717
+ if (!isRecord7(value)) return;
40898
41718
  if (isMediaObject(value)) {
40899
41719
  const hasCmsRef = typeof value.identifier === "string" || typeof value.assetId === "string" || typeof value.storagePath === "string" || typeof value.storageBucket === "string";
40900
41720
  for (const key of ENV_SPECIFIC_MEDIA_KEYS) {
@@ -40905,7 +41725,7 @@ function stripEnvSpecificMediaFieldsInPlace(value) {
40905
41725
  }
40906
41726
  delete value.mimeType;
40907
41727
  }
40908
- if (value.type === "image" && isRecord6(value.attrs)) {
41728
+ if (value.type === "image" && isRecord7(value.attrs)) {
40909
41729
  const attrs = value.attrs;
40910
41730
  const hasIdentifier = typeof attrs.identifier === "string" && attrs.identifier.trim().length > 0;
40911
41731
  if (hasIdentifier) {
@@ -41076,11 +41896,11 @@ function entryFilePath(input) {
41076
41896
  }
41077
41897
 
41078
41898
  // src/cli/content/writer.ts
41079
- function isRecord7(value) {
41899
+ function isRecord8(value) {
41080
41900
  return typeof value === "object" && value !== null && !Array.isArray(value);
41081
41901
  }
41082
41902
  function parseThemeMeta(value) {
41083
- if (!isRecord7(value) || typeof value.pulledAt !== "string" || !isRecord7(value.themes)) {
41903
+ if (!isRecord8(value) || typeof value.pulledAt !== "string" || !isRecord8(value.themes)) {
41084
41904
  return null;
41085
41905
  }
41086
41906
  return { pulledAt: value.pulledAt, themes: value.themes };
@@ -41210,7 +42030,7 @@ async function writeNavigation(contentDir, pulledNavigation, options) {
41210
42030
  await writeJsonFile(filePath, localNavigation);
41211
42031
  const menusMeta = {};
41212
42032
  for (const menu of pulledNavigation.menus) {
41213
- menusMeta[menu.name] = {
42033
+ menusMeta[navigationIdentity(menu)] = {
41214
42034
  createdAt: menu.createdAt,
41215
42035
  updatedAt: menu.updatedAt
41216
42036
  };
@@ -41519,7 +42339,7 @@ async function updateMetadataAfterPush(contentDir, remoteContent) {
41519
42339
  const metaPath = path5.join(metaDir, "navigation.json");
41520
42340
  const menusMeta = {};
41521
42341
  for (const menu of remoteContent.navigation) {
41522
- menusMeta[menu.name] = {
42342
+ menusMeta[navigationIdentity(menu)] = {
41523
42343
  createdAt: menu.createdAt,
41524
42344
  updatedAt: menu.updatedAt
41525
42345
  };
@@ -42466,9 +43286,9 @@ async function localMediaFileExists(filePath) {
42466
43286
  }
42467
43287
 
42468
43288
  // src/cli/media/identifiers.ts
42469
- var isRecord8 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
43289
+ var isRecord9 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
42470
43290
  var isMediaValue = (value) => {
42471
- if (!isRecord8(value)) return false;
43291
+ if (!isRecord9(value)) return false;
42472
43292
  const type = value.type;
42473
43293
  if (type !== "image" && type !== "video" && type !== "audio" && type !== "document" && type !== "spreadsheet" && type !== "archive") return false;
42474
43294
  return typeof value.identifier === "string" || typeof value.assetId === "string" || typeof value.storagePath === "string" || typeof value.src === "string";
@@ -42483,7 +43303,7 @@ var walkMediaValues = (value, location2, handler) => {
42483
43303
  });
42484
43304
  return;
42485
43305
  }
42486
- if (isRecord8(value)) {
43306
+ if (isRecord9(value)) {
42487
43307
  Object.entries(value).forEach(([key, entry]) => {
42488
43308
  walkMediaValues(entry, location2 ? `${location2}.${key}` : key, handler);
42489
43309
  });
@@ -42591,7 +43411,7 @@ var normalizeMediaValueToIdentifierOnly = (value, identifier, asset) => {
42591
43411
  };
42592
43412
 
42593
43413
  // src/cli/media/rich-text.ts
42594
- var isRecord9 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
43414
+ var isRecord10 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
42595
43415
  function collectRichTextImageAttrs(value, out = [], location2 = "") {
42596
43416
  if (Array.isArray(value)) {
42597
43417
  value.forEach(
@@ -42599,8 +43419,8 @@ function collectRichTextImageAttrs(value, out = [], location2 = "") {
42599
43419
  );
42600
43420
  return out;
42601
43421
  }
42602
- if (!isRecord9(value)) return out;
42603
- if (value.type === "image" && isRecord9(value.attrs)) {
43422
+ if (!isRecord10(value)) return out;
43423
+ if (value.type === "image" && isRecord10(value.attrs)) {
42604
43424
  out.push({ attrs: value.attrs, location: location2 ? `${location2}.attrs` : "attrs" });
42605
43425
  }
42606
43426
  for (const [key, child] of Object.entries(value)) {
@@ -43453,15 +44273,78 @@ function determineStatusChange(localStatus, remoteStatus) {
43453
44273
  }
43454
44274
  return void 0;
43455
44275
  }
44276
+ function findRemoteNavigationMenuForLocal(localMenu, remoteNavigation) {
44277
+ const plan = actionableNavigationMenuMatchPlan(
44278
+ planNavigationMenuMatch(localMenu, remoteNavigationMatchCandidates(remoteNavigation))
44279
+ );
44280
+ const menuId = plan.ok ? matchedNavigationMenuId(plan.value) : void 0;
44281
+ if (!menuId) return void 0;
44282
+ return remoteNavigation.find((menu) => remoteNavigationCandidateId(menu) === menuId);
44283
+ }
44284
+ function findLocalNavigationMenuForRemote(remoteMenu, localNavigation) {
44285
+ const localMenus = localNavigation?.menus ?? [];
44286
+ const directPlan = actionableNavigationMenuMatchPlan(
44287
+ planNavigationMenuMatch(remoteMenu, localNavigationMatchCandidates(localMenus))
44288
+ );
44289
+ const directMenuId = directPlan.ok ? matchedNavigationMenuId(directPlan.value) : void 0;
44290
+ if (directMenuId) {
44291
+ return localMenus.find((menu) => navigationIdentity(menu) === directMenuId);
44292
+ }
44293
+ if (!remoteMenu.isPrimary || remoteMenu.identifier !== null) return void 0;
44294
+ const legacyMainPlan = actionableNavigationMenuMatchPlan(
44295
+ planNavigationMenuMatch(
44296
+ { identifier: "main", name: remoteMenu.name },
44297
+ localNavigationMatchCandidates(localMenus)
44298
+ )
44299
+ );
44300
+ const legacyMainMenuId = legacyMainPlan.ok ? matchedNavigationMenuId(legacyMainPlan.value) : void 0;
44301
+ if (!legacyMainMenuId) return void 0;
44302
+ return localMenus.find((menu) => navigationIdentity(menu) === legacyMainMenuId);
44303
+ }
44304
+ function matchedNavigationMenuId(plan) {
44305
+ switch (plan.type) {
44306
+ case "create":
44307
+ return void 0;
44308
+ case "update":
44309
+ case "adopt_legacy_primary":
44310
+ return plan.menuId;
44311
+ }
44312
+ }
44313
+ function localNavigationMatchCandidates(menus) {
44314
+ return menus.map((menu) => ({
44315
+ id: navigationIdentity(menu),
44316
+ identifier: menu.identifier,
44317
+ name: menu.name,
44318
+ isPrimary: menu.isPrimary ?? false
44319
+ }));
44320
+ }
44321
+ function remoteNavigationMatchCandidates(menus) {
44322
+ return menus.map((menu) => ({
44323
+ id: remoteNavigationCandidateId(menu),
44324
+ identifier: menu.identifier,
44325
+ name: menu.name,
44326
+ isPrimary: menu.isPrimary
44327
+ }));
44328
+ }
44329
+ function remoteNavigationCandidateId(menu) {
44330
+ return menu.id ?? navigationIdentity(menu);
44331
+ }
43456
44332
  function buildJsonDiff(diff, local, remote, mode) {
43457
44333
  const summary = { creates: 0, updates: 0, deletes: 0, publishes: 0, unpublishes: 0 };
43458
44334
  const changes = [];
44335
+ const warnings = [];
43459
44336
  const localPages = new Map(local.pages.map((page) => [page.identifier, page]));
43460
44337
  const remotePages = new Map(remote.pages.map((page) => [page.identifier, page]));
43461
44338
  const localEntries = local.entries;
43462
44339
  const remoteEntries = remote.entries;
43463
- const localMenus = new Map((local.navigation?.menus ?? []).map((menu) => [menu.name, menu]));
43464
- const remoteMenus = new Map(remote.navigation.map((menu) => [menu.name, menu]));
44340
+ const localMenus = navigationIdentityMap(local.navigation?.menus ?? []);
44341
+ const remoteMenus = navigationIdentityMap(remote.navigation);
44342
+ if (!localMenus.ok) {
44343
+ warnings.push(jsonDiffDuplicateNavigationIdentityWarning("local", localMenus.error));
44344
+ }
44345
+ if (!remoteMenus.ok) {
44346
+ warnings.push(jsonDiffDuplicateNavigationIdentityWarning("remote", remoteMenus.error));
44347
+ }
43465
44348
  const localForms = new Map(local.forms.map((form2) => [form2.slug, form2]));
43466
44349
  const remoteForms = new Map(remote.forms.map((form2) => [form2.slug, form2]));
43467
44350
  const addChange = (change) => {
@@ -43546,9 +44429,9 @@ function buildJsonDiff(diff, local, remote, mode) {
43546
44429
  for (const navDiff of diff.navigation) {
43547
44430
  if (navDiff.type === "unchanged") continue;
43548
44431
  if (navDiff.type !== "create" && navDiff.type !== "update") continue;
43549
- const identifier = navDiff.name;
43550
- const localMenu = localMenus.get(navDiff.name);
43551
- const remoteMenu = remoteMenus.get(navDiff.name);
44432
+ const identifier = navigationIdentity(navDiff);
44433
+ const localMenu = localMenus.ok ? localMenus.value.get(identifier) : void 0;
44434
+ const remoteMenu = localMenu ? findRemoteNavigationMenuForLocal(localMenu, remote.navigation) : remoteMenus.ok ? remoteMenus.value.get(identifier) : void 0;
43552
44435
  const change = {
43553
44436
  type: "navigation",
43554
44437
  identifier,
@@ -43592,7 +44475,20 @@ function buildJsonDiff(diff, local, remote, mode) {
43592
44475
  }
43593
44476
  addChange(change);
43594
44477
  }
43595
- return { summary, changes };
44478
+ return {
44479
+ summary,
44480
+ changes,
44481
+ ...warnings.length > 0 ? { warnings } : {}
44482
+ };
44483
+ }
44484
+ function jsonDiffDuplicateNavigationIdentityWarning(source, error) {
44485
+ return {
44486
+ type: "duplicate_navigation_identity",
44487
+ source,
44488
+ identity: error.identity,
44489
+ menuNames: error.menuNames,
44490
+ message: duplicateNavigationIdentityMessage(error)
44491
+ };
43596
44492
  }
43597
44493
  function calculateEntryDiffs(localEntries, remoteEntries, options) {
43598
44494
  const diffs = /* @__PURE__ */ new Map();
@@ -43853,20 +44749,23 @@ function calculateNavigationDiffs(localNavigation, remoteNavigation) {
43853
44749
  if (!localNavigation || !localNavigation.menus) {
43854
44750
  return { diffs, summary };
43855
44751
  }
43856
- const remoteLookup = /* @__PURE__ */ new Map();
43857
- for (const menu of remoteNavigation) {
43858
- remoteLookup.set(menu.name, menu);
43859
- }
43860
44752
  for (const localMenu of localNavigation.menus) {
43861
- const remoteMenu = remoteLookup.get(localMenu.name);
44753
+ const remoteMenu = findRemoteNavigationMenuForLocal(
44754
+ localMenu,
44755
+ remoteNavigation
44756
+ );
43862
44757
  if (!remoteMenu) {
43863
44758
  diffs.push({
43864
44759
  type: "create",
44760
+ identifier: localMenu.identifier,
43865
44761
  name: localMenu.name
43866
44762
  });
43867
44763
  summary.create++;
43868
44764
  } else {
43869
44765
  const changes = [];
44766
+ if (localMenu.name !== remoteMenu.name) {
44767
+ changes.push("name");
44768
+ }
43870
44769
  if (!equal(localMenu.items, stripNavigationItemIds(remoteMenu.items))) {
43871
44770
  changes.push("items");
43872
44771
  }
@@ -43879,6 +44778,7 @@ function calculateNavigationDiffs(localNavigation, remoteNavigation) {
43879
44778
  if (changes.length > 0) {
43880
44779
  diffs.push({
43881
44780
  type: "update",
44781
+ identifier: localMenu.identifier,
43882
44782
  name: localMenu.name,
43883
44783
  changes
43884
44784
  });
@@ -43886,6 +44786,7 @@ function calculateNavigationDiffs(localNavigation, remoteNavigation) {
43886
44786
  } else {
43887
44787
  diffs.push({
43888
44788
  type: "unchanged",
44789
+ identifier: localMenu.identifier,
43889
44790
  name: localMenu.name
43890
44791
  });
43891
44792
  summary.unchanged++;
@@ -44270,19 +45171,23 @@ function calculatePullDiff(remote, local) {
44270
45171
  }
44271
45172
  const navDiffs = [];
44272
45173
  const navSummary = { create: 0, update: 0, unchanged: 0 };
44273
- const localNavLookup = /* @__PURE__ */ new Map();
44274
- if (local?.navigation?.menus) {
44275
- for (const menu of local.navigation.menus) {
44276
- localNavLookup.set(menu.name, menu);
44277
- }
44278
- }
44279
45174
  for (const remoteMenu of remote.navigation) {
44280
- const localMenu = localNavLookup.get(remoteMenu.name);
45175
+ const localMenu = findLocalNavigationMenuForRemote(
45176
+ remoteMenu,
45177
+ local?.navigation ?? null
45178
+ );
44281
45179
  if (!localMenu) {
44282
- navDiffs.push({ type: "create", name: remoteMenu.name });
45180
+ navDiffs.push({
45181
+ type: "create",
45182
+ identifier: remoteMenu.identifier,
45183
+ name: remoteMenu.name
45184
+ });
44283
45185
  navSummary.create++;
44284
45186
  } else {
44285
45187
  const changes = [];
45188
+ if (localMenu.name !== remoteMenu.name) {
45189
+ changes.push("name");
45190
+ }
44286
45191
  if (!equal(stripNavigationItemIds(remoteMenu.items), localMenu.items)) {
44287
45192
  changes.push("items");
44288
45193
  }
@@ -44293,10 +45198,19 @@ function calculatePullDiff(remote, local) {
44293
45198
  changes.push("isFooter");
44294
45199
  }
44295
45200
  if (changes.length > 0) {
44296
- navDiffs.push({ type: "update", name: remoteMenu.name, changes });
45201
+ navDiffs.push({
45202
+ type: "update",
45203
+ identifier: remoteMenu.identifier,
45204
+ name: remoteMenu.name,
45205
+ changes
45206
+ });
44297
45207
  navSummary.update++;
44298
45208
  } else {
44299
- navDiffs.push({ type: "unchanged", name: remoteMenu.name });
45209
+ navDiffs.push({
45210
+ type: "unchanged",
45211
+ identifier: remoteMenu.identifier,
45212
+ name: remoteMenu.name
45213
+ });
44300
45214
  navSummary.unchanged++;
44301
45215
  }
44302
45216
  }
@@ -45234,12 +46148,17 @@ function buildPullJsonDiff(diff, remoteContent, localContent, mode) {
45234
46148
  }
45235
46149
  for (const navDiff of diff.navigation) {
45236
46150
  if (navDiff.type === "unchanged") continue;
45237
- const remoteMenu = remoteContent.navigation.find((m) => m.name === navDiff.name);
45238
- const localMenu = localContent?.navigation?.menus.find((m) => m.name === navDiff.name);
46151
+ const navIdentifier = navigationIdentity(navDiff);
46152
+ const remoteMenu = remoteContent.navigation.find(
46153
+ (m) => navigationIdentity(m) === navIdentifier
46154
+ );
46155
+ const localMenu = localContent?.navigation?.menus.find(
46156
+ (m) => navigationIdentity(m) === navIdentifier
46157
+ );
45239
46158
  changes.push({
45240
46159
  type: "navigation",
45241
46160
  operation: navDiff.type,
45242
- identifier: navDiff.name,
46161
+ identifier: navIdentifier,
45243
46162
  before: localMenu ?? null,
45244
46163
  after: remoteMenu ?? null
45245
46164
  });
@@ -46413,11 +47332,11 @@ function normalizeLocalContentShape(content) {
46413
47332
  function nullishToNull(value) {
46414
47333
  return value == null ? null : value;
46415
47334
  }
46416
- function isRecord10(value) {
47335
+ function isRecord11(value) {
46417
47336
  return typeof value === "object" && value !== null && !Array.isArray(value);
46418
47337
  }
46419
47338
  function normalizeVenueAddress(value) {
46420
- const obj = isRecord10(value) ? value : {};
47339
+ const obj = isRecord11(value) ? value : {};
46421
47340
  return {
46422
47341
  line1: nullishToNull(typeof obj.line1 === "string" ? obj.line1 : void 0),
46423
47342
  line2: nullishToNull(typeof obj.line2 === "string" ? obj.line2 : void 0),
@@ -46434,7 +47353,7 @@ function normalizeVenueAddress(value) {
46434
47353
  };
46435
47354
  }
46436
47355
  function normalizeVenueLocation(value) {
46437
- if (!isRecord10(value)) return null;
47356
+ if (!isRecord11(value)) return null;
46438
47357
  const obj = value;
46439
47358
  const lat = typeof obj.lat === "number" ? obj.lat : null;
46440
47359
  const lng = typeof obj.lng === "number" ? obj.lng : null;
@@ -46442,7 +47361,7 @@ function normalizeVenueLocation(value) {
46442
47361
  return { lat, lng };
46443
47362
  }
46444
47363
  function normalizeVenueForCompare(venue) {
46445
- const obj = isRecord10(venue) ? venue : {};
47364
+ const obj = isRecord11(venue) ? venue : {};
46446
47365
  return {
46447
47366
  slug: String(obj.slug),
46448
47367
  title: String(obj.title),
@@ -46455,7 +47374,7 @@ function normalizeVenueForCompare(venue) {
46455
47374
  };
46456
47375
  }
46457
47376
  function normalizeEventCategoryForCompare(category) {
46458
- const obj = isRecord10(category) ? category : {};
47377
+ const obj = isRecord11(category) ? category : {};
46459
47378
  return {
46460
47379
  identifier: String(obj.identifier),
46461
47380
  name: String(obj.name),
@@ -46465,9 +47384,9 @@ function normalizeEventCategoryForCompare(category) {
46465
47384
  };
46466
47385
  }
46467
47386
  function normalizeRemoteEventForCompare(event) {
46468
- const obj = isRecord10(event) ? event : {};
46469
- const schedule = isRecord10(obj.schedule) ? obj.schedule : {};
46470
- const pricing = isRecord10(obj.pricing) ? obj.pricing : {};
47387
+ const obj = isRecord11(event) ? event : {};
47388
+ const schedule = isRecord11(obj.schedule) ? obj.schedule : {};
47389
+ const pricing = isRecord11(obj.pricing) ? obj.pricing : {};
46471
47390
  return {
46472
47391
  identifier: String(obj.identifier),
46473
47392
  title: String(obj.title),
@@ -46500,14 +47419,14 @@ function normalizeRemoteEventForCompare(event) {
46500
47419
  venueRef: nullishToNull(typeof obj.venueRef === "string" ? obj.venueRef : void 0),
46501
47420
  categoryRef: nullishToNull(typeof obj.categoryRef === "string" ? obj.categoryRef : void 0),
46502
47421
  formRef: nullishToNull(typeof obj.formRef === "string" ? obj.formRef : void 0),
46503
- content: isRecord10(obj.content) ? obj.content : {},
46504
- settings: isRecord10(obj.settings) ? obj.settings : {},
46505
- presentation: isRecord10(obj.presentation) ? obj.presentation : null,
47422
+ content: isRecord11(obj.content) ? obj.content : {},
47423
+ settings: isRecord11(obj.settings) ? obj.settings : {},
47424
+ presentation: isRecord11(obj.presentation) ? obj.presentation : null,
46506
47425
  tags: Array.isArray(obj.tags) ? obj.tags : []
46507
47426
  };
46508
47427
  }
46509
47428
  function normalizeLocalEventAgainstRemoteForCompare(localEvent, remoteEvent) {
46510
- const local = isRecord10(localEvent) ? localEvent : {};
47429
+ const local = isRecord11(localEvent) ? localEvent : {};
46511
47430
  const base = remoteEvent ? normalizeRemoteEventForCompare(remoteEvent) : normalizeRemoteEventForCompare({
46512
47431
  identifier: local.identifier,
46513
47432
  title: local.title,
@@ -46525,8 +47444,8 @@ function normalizeLocalEventAgainstRemoteForCompare(localEvent, remoteEvent) {
46525
47444
  presentation: local.presentation ?? null,
46526
47445
  tags: local.tags ?? []
46527
47446
  });
46528
- const schedule = isRecord10(local.schedule) ? local.schedule : {};
46529
- const pricing = isRecord10(local.pricing) ? local.pricing : {};
47447
+ const schedule = isRecord11(local.schedule) ? local.schedule : {};
47448
+ const pricing = isRecord11(local.pricing) ? local.pricing : {};
46530
47449
  return {
46531
47450
  ...base,
46532
47451
  identifier: String(local.identifier ?? base.identifier),
@@ -46552,9 +47471,9 @@ function normalizeLocalEventAgainstRemoteForCompare(localEvent, remoteEvent) {
46552
47471
  venueRef: local.venueRef === void 0 ? base.venueRef : nullishToNull(typeof local.venueRef === "string" ? local.venueRef : void 0),
46553
47472
  categoryRef: local.categoryRef === void 0 ? base.categoryRef : nullishToNull(typeof local.categoryRef === "string" ? local.categoryRef : void 0),
46554
47473
  formRef: local.formRef === void 0 ? base.formRef : nullishToNull(typeof local.formRef === "string" ? local.formRef : void 0),
46555
- content: local.content === void 0 ? base.content : isRecord10(local.content) ? local.content : {},
46556
- settings: local.settings === void 0 ? base.settings : isRecord10(local.settings) ? local.settings : {},
46557
- presentation: local.presentation === void 0 ? base.presentation : isRecord10(local.presentation) ? local.presentation : null,
47474
+ content: local.content === void 0 ? base.content : isRecord11(local.content) ? local.content : {},
47475
+ settings: local.settings === void 0 ? base.settings : isRecord11(local.settings) ? local.settings : {},
47476
+ presentation: local.presentation === void 0 ? base.presentation : isRecord11(local.presentation) ? local.presentation : null,
46558
47477
  tags: local.tags === void 0 ? base.tags : Array.isArray(local.tags) ? local.tags : []
46559
47478
  };
46560
47479
  }
@@ -46566,7 +47485,7 @@ function toIsoStringOrOriginal(value) {
46566
47485
  function normalizeCourseSessions(value) {
46567
47486
  if (!Array.isArray(value)) return [];
46568
47487
  return value.map((session) => {
46569
- const obj = isRecord10(session) ? session : {};
47488
+ const obj = isRecord11(session) ? session : {};
46570
47489
  return {
46571
47490
  startsAt: toIsoStringOrOriginal(obj.startsAt),
46572
47491
  endsAt: toIsoStringOrOriginal(obj.endsAt)
@@ -46578,18 +47497,18 @@ function normalizeCourseSessions(value) {
46578
47497
  }
46579
47498
  function normalizeCourseProgram(value) {
46580
47499
  if (value == null) return null;
46581
- if (!isRecord10(value)) {
47500
+ if (!isRecord11(value)) {
46582
47501
  return { identifier: null, data: {} };
46583
47502
  }
46584
47503
  return {
46585
47504
  identifier: nullishToNull(
46586
47505
  typeof value.identifier === "string" ? value.identifier : void 0
46587
47506
  ),
46588
- data: isRecord10(value.data) ? value.data : {}
47507
+ data: isRecord11(value.data) ? value.data : {}
46589
47508
  };
46590
47509
  }
46591
47510
  function normalizeRemoteCourseForCompare(course) {
46592
- const obj = isRecord10(course) ? course : {};
47511
+ const obj = isRecord11(course) ? course : {};
46593
47512
  return {
46594
47513
  identifier: String(obj.identifier),
46595
47514
  title: String(obj.title),
@@ -46612,7 +47531,7 @@ function normalizeRemoteCourseForCompare(course) {
46612
47531
  };
46613
47532
  }
46614
47533
  function normalizeLocalCourseAgainstRemoteForCompare(localCourse, remoteCourse) {
46615
- const local = isRecord10(localCourse) ? localCourse : {};
47534
+ const local = isRecord11(localCourse) ? localCourse : {};
46616
47535
  const base = remoteCourse ? normalizeRemoteCourseForCompare(remoteCourse) : normalizeRemoteCourseForCompare({
46617
47536
  identifier: local.identifier,
46618
47537
  title: local.title,
@@ -46633,11 +47552,11 @@ function normalizeLocalCourseAgainstRemoteForCompare(localCourse, remoteCourse)
46633
47552
  });
46634
47553
  const status = local.status === void 0 ? base.status : local.status === "active" || local.status === "cancelled" || local.status === "completed" ? local.status : "draft";
46635
47554
  const visibility = local.visibility === void 0 ? base.visibility : local.visibility === "public" || local.visibility === "private" || local.visibility === "unlisted" ? local.visibility : "public";
46636
- const program2 = local.program === void 0 ? base.program : local.program === null ? null : isRecord10(local.program) ? {
47555
+ const program2 = local.program === void 0 ? base.program : local.program === null ? null : isRecord11(local.program) ? {
46637
47556
  identifier: local.program.identifier === void 0 ? base.program?.identifier ?? null : nullishToNull(
46638
47557
  typeof local.program.identifier === "string" ? local.program.identifier : void 0
46639
47558
  ),
46640
- data: isRecord10(local.program.data) ? local.program.data : base.program?.data ?? {}
47559
+ data: isRecord11(local.program.data) ? local.program.data : base.program?.data ?? {}
46641
47560
  } : base.program;
46642
47561
  return {
46643
47562
  ...base,
@@ -47539,6 +48458,7 @@ var upsertNavigationMenuCommandSchema = z.object({
47539
48458
  type: z.literal("upsertNavigationMenu"),
47540
48459
  ref: navigationRefSchema,
47541
48460
  input: z.object({
48461
+ identifier: z.string().min(1).optional(),
47542
48462
  name: z.string().min(1).optional(),
47543
48463
  location: z.enum(navigationLocations).optional(),
47544
48464
  role: z.enum(navigationMenuRoles).optional(),
@@ -48824,7 +49744,7 @@ function getSiteCommandLifecycleIntent(command) {
48824
49744
  init_src();
48825
49745
 
48826
49746
  // ../site-commands/src/guards.ts
48827
- function isRecord11(value) {
49747
+ function isRecord12(value) {
48828
49748
  return typeof value === "object" && value !== null;
48829
49749
  }
48830
49750
 
@@ -49089,7 +50009,7 @@ function collectVenueRefsFromIntervals(intervals, path24) {
49089
50009
  }
49090
50010
  function collectNavigationRefs(items, path24) {
49091
50011
  return items.flatMap((item, index) => {
49092
- if (!isRecord11(item)) return [];
50012
+ if (!isRecord12(item)) return [];
49093
50013
  const itemPath = `${path24}[${index}]`;
49094
50014
  const refs = [];
49095
50015
  if (typeof item.pageRef === "string") {
@@ -49106,7 +50026,7 @@ function collectNavigationRefs(items, path24) {
49106
50026
  }
49107
50027
  function collectBlockRefs(blocks, path24) {
49108
50028
  return blocks.flatMap((block, index) => {
49109
- if (!isRecord11(block)) return [];
50029
+ if (!isRecord12(block)) return [];
49110
50030
  const blockPath = `${path24}[${index}]`;
49111
50031
  return [
49112
50032
  ...collectNestedRefs(block.props, `${blockPath}.props`),
@@ -49122,7 +50042,7 @@ function collectNestedRefs(value, path24) {
49122
50042
  if (Array.isArray(value)) {
49123
50043
  return value.flatMap((item, index) => collectNestedRefs(item, `${path24}[${index}]`));
49124
50044
  }
49125
- if (!isRecord11(value)) return [];
50045
+ if (!isRecord12(value)) return [];
49126
50046
  return Object.entries(value).flatMap(([key, child]) => collectNestedRefs(child, `${path24}.${key}`));
49127
50047
  }
49128
50048
 
@@ -49378,9 +50298,9 @@ function deriveIdempotencyKey(input) {
49378
50298
  ].join("|"));
49379
50299
  }
49380
50300
  function findUnknownCommandTypes(input) {
49381
- if (!isRecord11(input) || !Array.isArray(input.commands)) return [];
50301
+ if (!isRecord12(input) || !Array.isArray(input.commands)) return [];
49382
50302
  return input.commands.flatMap((command, commandIndex) => {
49383
- if (!isRecord11(command) || typeof command.type !== "string") return [];
50303
+ if (!isRecord12(command) || typeof command.type !== "string") return [];
49384
50304
  if (commandTypeSet.has(command.type)) return [];
49385
50305
  return [{
49386
50306
  code: "unknown_command_type",
@@ -49406,9 +50326,9 @@ function commandIndexForIssuePath(path24) {
49406
50326
  return path24[0] === "commands" && typeof path24[1] === "number" ? path24[1] : -1;
49407
50327
  }
49408
50328
  function commandTypeForIssue(input, commandIndex) {
49409
- if (!isRecord11(input) || !isUnknownArray3(input.commands)) return null;
50329
+ if (!isRecord12(input) || !isUnknownArray3(input.commands)) return null;
49410
50330
  const command = input.commands[commandIndex];
49411
- return isRecord11(command) && typeof command.type === "string" ? command.type : null;
50331
+ return isRecord12(command) && typeof command.type === "string" ? command.type : null;
49412
50332
  }
49413
50333
  function isUnknownArray3(value) {
49414
50334
  return Array.isArray(value);
@@ -50430,8 +51350,8 @@ function eventContentInput(content) {
50430
51350
  if (!content) return void 0;
50431
51351
  return {
50432
51352
  ...content.summary ? { summary: content.summary } : {},
50433
- ...typeof content.body === "string" || isRecord12(content.body) ? { body: content.body } : {},
50434
- ...typeof content.image === "string" || isRecord12(content.image) ? { image: content.image } : {}
51353
+ ...typeof content.body === "string" || isRecord13(content.body) ? { body: content.body } : {},
51354
+ ...typeof content.image === "string" || isRecord13(content.image) ? { image: content.image } : {}
50435
51355
  };
50436
51356
  }
50437
51357
  function courseUpsertInput(command) {
@@ -50603,7 +51523,7 @@ function toUtcIso(date, time) {
50603
51523
  const normalizedTime = time.length === 5 ? `${time}:00` : time;
50604
51524
  return (/* @__PURE__ */ new Date(`${date}T${normalizedTime}Z`)).toISOString();
50605
51525
  }
50606
- function isRecord12(value) {
51526
+ function isRecord13(value) {
50607
51527
  return Boolean(value && typeof value === "object" && !Array.isArray(value));
50608
51528
  }
50609
51529
  function unsupported(identifier, message) {
@@ -51181,14 +52101,22 @@ var navigationSiteCommandTypes = [
51181
52101
  ];
51182
52102
  function compileNavigationPushCommands(input) {
51183
52103
  const commandBindings = [];
51184
- const menusByName = new Map(
51185
- (input.local.navigation?.menus ?? []).map((menu) => [unsafeAsCliNavigationMenuName(menu.name), menu])
52104
+ const menusByIdentity = navigationIdentityMap(
52105
+ input.local.navigation?.menus ?? []
51186
52106
  );
52107
+ if (!menusByIdentity.ok) {
52108
+ return err({
52109
+ code: menusByIdentity.error.code,
52110
+ identity: menusByIdentity.error.identity,
52111
+ message: duplicateNavigationIdentityMessage(menusByIdentity.error)
52112
+ });
52113
+ }
51187
52114
  for (const navigationDiff of input.diff) {
51188
52115
  if (navigationDiff.type === "unchanged") continue;
51189
- const menuName = unsafeAsCliNavigationMenuName(navigationDiff.name);
51190
- const menu = menusByName.get(menuName);
52116
+ const menuIdentity = navigationIdentity(navigationDiff);
52117
+ const menu = menusByIdentity.value.get(menuIdentity);
51191
52118
  if (!menu) {
52119
+ const menuName = unsafeAsCliNavigationMenuName(navigationDiff.name);
51192
52120
  return err({
51193
52121
  code: "missing_local_navigation_menu",
51194
52122
  name: menuName,
@@ -51202,6 +52130,7 @@ function compileNavigationPushCommands(input) {
51202
52130
  type: "upsertNavigationMenu",
51203
52131
  ref: commandRef,
51204
52132
  input: {
52133
+ ...menu.identifier ? { identifier: menu.identifier } : {},
51205
52134
  name: localMenuName,
51206
52135
  ...role ? { role } : {},
51207
52136
  items: menu.items.map(navigationItemForCommand)
@@ -51232,6 +52161,7 @@ async function executeNavigationCommandPlan(input) {
51232
52161
  case "upsertNavigationMenu": {
51233
52162
  const role = navigationCommandRole(command);
51234
52163
  await input.client.navigation.upsert({
52164
+ ...command.input.identifier ? { identifier: command.input.identifier } : {},
51235
52165
  name: navigationCommandMenuName(command),
51236
52166
  items: command.input.items.map(navigationItemInput),
51237
52167
  ...role === "primary" ? { isPrimary: true } : {},
@@ -51258,10 +52188,22 @@ function executeNavigationCommandPlanAsReport(input) {
51258
52188
  }
51259
52189
  function navigationCommandCompileErrorToReport(error) {
51260
52190
  return commandCompileFailureToReport({
51261
- identifier: error.code === "missing_local_navigation_menu" ? error.name : "command-validation",
52191
+ identifier: navigationCompileErrorIdentifier(error),
51262
52192
  message: error.message
51263
52193
  });
51264
52194
  }
52195
+ function navigationCompileErrorIdentifier(error) {
52196
+ switch (error.code) {
52197
+ case "missing_local_navigation_menu":
52198
+ return error.name;
52199
+ case "duplicate_navigation_identity":
52200
+ return error.identity;
52201
+ case "command_validation_failed":
52202
+ return "command-validation";
52203
+ default:
52204
+ return assertNever(error);
52205
+ }
52206
+ }
51265
52207
  function navigationCommandExecutionToReport(input) {
51266
52208
  return commandExecutionToReport({
51267
52209
  execution: input.execution,
@@ -55545,6 +56487,7 @@ async function applyOneOffPageCommandReturningBlock(command, client) {
55545
56487
  async function applyOneOffNavigationCommand(command, client) {
55546
56488
  const role = navigationCommandRole2(command);
55547
56489
  return client.navigation.upsert({
56490
+ ...command.input.identifier ? { identifier: command.input.identifier } : {},
55548
56491
  name: navigationCommandMenuName2(command),
55549
56492
  items: command.input.items.map(navigationItemInput2),
55550
56493
  ...role === "primary" ? { isPrimary: true } : {},
@@ -55704,6 +56647,7 @@ function oneOffNavigationCommandBinding(mutation) {
55704
56647
  type: "upsertNavigationMenu",
55705
56648
  ref: createNavigationRef([name]),
55706
56649
  input: {
56650
+ ...mutation.identifier ? { identifier: mutation.identifier } : {},
55707
56651
  name,
55708
56652
  items: mutation.items.map(navigationItemForCommand2)
55709
56653
  }
@@ -56463,7 +57407,7 @@ function countItems(items) {
56463
57407
  }
56464
57408
  return count;
56465
57409
  }
56466
- var upsertCommand4 = new Command("upsert").description("Create or update a navigation menu").argument("<menu-name>", "Navigation menu name").option("--file <path>", "Path to JSON file with menu items").option("--data <json>", "Menu items as JSON string").action(
57410
+ var upsertCommand4 = new Command("upsert").description("Create or update a navigation menu").argument("<menu-name>", "Navigation menu name").option("--identifier <identifier>", "Stable SDK identifier for this menu").option("--file <path>", "Path to JSON file with menu items").option("--data <json>", "Menu items as JSON string").action(
56467
57411
  withCommandContext(async (ctx, menuName, options) => {
56468
57412
  const { output, client, siteId, targetEnv } = ctx;
56469
57413
  const items = await parseJsonArray(options);
@@ -56472,7 +57416,12 @@ var upsertCommand4 = new Command("upsert").description("Create or update a navig
56472
57416
  source: "one_off_navigation",
56473
57417
  siteId,
56474
57418
  targetEnv,
56475
- mutation: { kind: "upsert", menuName, items }
57419
+ mutation: {
57420
+ kind: "upsert",
57421
+ ...options.identifier ? { identifier: options.identifier } : {},
57422
+ menuName,
57423
+ items
57424
+ }
56476
57425
  });
56477
57426
  if (!compiled.ok) {
56478
57427
  return output.error(compiled.error.message);
@@ -56510,10 +57459,58 @@ var listCommand4 = createListCommand({
56510
57459
  tableHeaders: ["Name", "Items", "Updated"],
56511
57460
  formatRow: formatMenuRow
56512
57461
  });
57462
+ function resolveNavigationMenuForDelete(menus, selector) {
57463
+ const idMatch = menus.find((menu) => menu.id === selector);
57464
+ if (idMatch) return idMatch;
57465
+ const nameMatches = menus.filter((menu) => menu.name === selector);
57466
+ const onlyNameMatch = nameMatches[0];
57467
+ if (nameMatches.length === 1 && onlyNameMatch) {
57468
+ return onlyNameMatch;
57469
+ }
57470
+ if (nameMatches.length > 1) {
57471
+ throw new Error(
57472
+ `Multiple navigation menus are named "${selector}". Delete by ID instead: ${nameMatches.map((menu) => menu.id).join(", ")}`
57473
+ );
57474
+ }
57475
+ throw new Error(`Navigation menu not found by ID or exact name: ${selector}`);
57476
+ }
57477
+ var deleteCommand = new Command("delete").description("Delete a navigation menu by ID or exact unique name").argument("<menu-id-or-name>", "Navigation menu ID, or exact name when unique").option("--yes", "Skip confirmation prompt (required for --env=remote)").action(
57478
+ withCommandContext(async (ctx, selector, options) => {
57479
+ const { client, isRemote, output, targetEnv } = ctx;
57480
+ const menu = resolveNavigationMenuForDelete(await client.navigation.list(), selector);
57481
+ const itemCount = countItems(menu.items);
57482
+ const flags = [
57483
+ menu.isPrimary ? "primary" : null,
57484
+ menu.isFooter ? "footer" : null
57485
+ ].filter((flag) => Boolean(flag));
57486
+ const flagText = flags.length > 0 ? flags.join(", ") : "none";
57487
+ const confirmed = await confirmAction(
57488
+ `Delete navigation menu "${menu.name}" (${menu.id}) from ${targetEnv}? flags: ${flagText}; items: ${itemCount}`,
57489
+ options,
57490
+ isRemote
57491
+ );
57492
+ if (!confirmed) {
57493
+ output.info("Operation cancelled");
57494
+ return;
57495
+ }
57496
+ output.info(`Deleting navigation menu: ${menu.name}`);
57497
+ await client.navigation.delete(menu.id);
57498
+ output.success(`Navigation menu deleted: ${menu.name}`, {
57499
+ id: menu.id,
57500
+ name: menu.name,
57501
+ identifier: menu.identifier,
57502
+ isPrimary: menu.isPrimary,
57503
+ isFooter: menu.isFooter,
57504
+ itemCount,
57505
+ environment: targetEnv
57506
+ });
57507
+ })
57508
+ );
56513
57509
  var navigationCommand = new Command("navigation").description("Manage navigation menus").addHelpText("after", `
56514
57510
  Examples:
56515
57511
  $ riverbankcms navigation upsert main --file ./main-nav.json
56516
57512
  $ riverbankcms navigation upsert footer --data '[{"label": "Home", "url": "/"}]'
57513
+ $ riverbankcms navigation delete "Primary navigation" --yes
56517
57514
  $ riverbankcms navigation get main
56518
57515
  $ riverbankcms navigation list
56519
57516
 
@@ -56526,7 +57523,7 @@ JSON file format:
56526
57523
  ]}
56527
57524
  ]
56528
57525
  }
56529
- `).addCommand(upsertCommand4).addCommand(getCommand4).addCommand(listCommand4);
57526
+ `).addCommand(upsertCommand4).addCommand(deleteCommand).addCommand(getCommand4).addCommand(listCommand4);
56530
57527
  var deleteEntryCommand = new Command("entry").description("Delete a content entry").argument("<type>", "Content type").argument("<identifier>", "Entry identifier").option("--yes", "Skip confirmation prompt (required for --env=remote)").action(
56531
57528
  withConfirmation(
56532
57529
  (type, identifier) => `Delete entry "${type}/${identifier}"?`,
@@ -56547,7 +57544,7 @@ var deleteBlockCommand = new Command("block").description("Delete a block from a
56547
57544
  }
56548
57545
  )
56549
57546
  );
56550
- var deleteCommand = new Command("delete").description("Delete content from CMS").addHelpText("after", `
57547
+ var deleteCommand2 = new Command("delete").description("Delete content from CMS").addHelpText("after", `
56551
57548
  Examples:
56552
57549
  $ riverbankcms delete entry blog-post my-post
56553
57550
  $ riverbankcms delete entry blog-post my-post --yes
@@ -56577,7 +57574,7 @@ var THEME_FIELD_CATEGORY_MAP = {
56577
57574
  };
56578
57575
 
56579
57576
  // src/cli/init-docs/zod-to-markdown.ts
56580
- function isRecord13(value) {
57577
+ function isRecord14(value) {
56581
57578
  return typeof value === "object" && value !== null && !Array.isArray(value);
56582
57579
  }
56583
57580
  function isZodTypeAny(value) {
@@ -56705,7 +57702,7 @@ function extractLiteralValue(schema) {
56705
57702
  const typeName = getTypeName(schema);
56706
57703
  if (typeName !== ZodTypeName.ZodLiteral) return void 0;
56707
57704
  const def = schema._def;
56708
- if (!isRecord13(def)) return void 0;
57705
+ if (!isRecord14(def)) return void 0;
56709
57706
  return String(def.value);
56710
57707
  }
56711
57708
  function extractSchemaInfo(schema, skipFields = []) {
@@ -56775,7 +57772,7 @@ function extractFieldInfo(name, schema) {
56775
57772
  }
56776
57773
  if (typeName === ZodTypeName.ZodRecord) {
56777
57774
  const def = inner._def;
56778
- const valueSchema = isRecord13(def) ? def.valueType : void 0;
57775
+ const valueSchema = isRecord14(def) ? def.valueType : void 0;
56779
57776
  if (!isZodTypeAny(valueSchema)) {
56780
57777
  info.recordValueType = "unknown";
56781
57778
  return info;
@@ -56790,7 +57787,7 @@ function extractFieldInfo(name, schema) {
56790
57787
  }
56791
57788
  } else if (getTypeName(valueInner) === ZodTypeName.ZodRecord) {
56792
57789
  const nestedDef = valueInner._def;
56793
- const nestedValueSchema = isRecord13(nestedDef) ? nestedDef.valueType : void 0;
57790
+ const nestedValueSchema = isRecord14(nestedDef) ? nestedDef.valueType : void 0;
56794
57791
  if (!isZodTypeAny(nestedValueSchema)) {
56795
57792
  info.recordValueType = "record<string, unknown>";
56796
57793
  return info;
@@ -56801,7 +57798,7 @@ function extractFieldInfo(name, schema) {
56801
57798
  }
56802
57799
  if (typeName === ZodTypeName.ZodUnion || typeName === ZodTypeName.ZodDiscriminatedUnion) {
56803
57800
  const def = inner._def;
56804
- const optionsValue = isRecord13(def) ? def.options : void 0;
57801
+ const optionsValue = isRecord14(def) ? def.options : void 0;
56805
57802
  const options = Array.isArray(optionsValue) ? optionsValue.filter(isZodTypeAny) : [];
56806
57803
  const optionTypes = options.map((opt) => {
56807
57804
  const { inner: optInner } = unwrapSchema(opt);
@@ -57190,7 +58187,7 @@ function renderConfigGuideSection() {
57190
58187
  " navigation: {",
57191
58188
  " siteNav: {",
57192
58189
  " // mode: 'augment' | 'restrict'",
57193
- " // allowIds: ['site.style']",
58190
+ " // allowIds: ['site.performance']",
57194
58191
  " // denyIds: ['site.performance', 'site.newsletter']",
57195
58192
  " roles: {",
57196
58193
  " editor: { mode: 'restrict', allowIds: ['site.overview', 'site.content', 'site.media', 'site.bookings'] },",
@@ -57211,7 +58208,7 @@ function renderConfigGuideSection() {
57211
58208
  "Navigation IDs:",
57212
58209
  "",
57213
58210
  "- Top nav (`dashboard.navigation.siteNav`):",
57214
- " - `site.overview`, `site.content`, `site.media`, `site.bookings`, `site.newsletter`, `site.style`, `site.performance`, `site.settings`",
58211
+ " - `site.overview`, `site.content`, `site.media`, `site.bookings`, `site.newsletter`, `site.performance`, `site.settings`",
57215
58212
  "- Settings sidebar (`dashboard.navigation.settingsNav`):",
57216
58213
  " - `settings.general`, `settings.domains`, `settings.fonts`, `settings.navigation`, `settings.redirects`, `settings.emails`",
57217
58214
  " - `settings.ai.siteProfile`, `settings.ai.brandGuidelines`",
@@ -57636,7 +58633,8 @@ async function initDocs(options) {
57636
58633
  { filename: "templates.md", template: "workflow-templates" },
57637
58634
  { filename: "cmsify-page.md", template: "workflow-cmsify-page" },
57638
58635
  { filename: "editor-workflows.md", template: "workflow-editor-workflows" },
57639
- { filename: "preview-mode.md", template: "workflow-preview-mode" }
58636
+ { filename: "preview-mode.md", template: "workflow-preview-mode" },
58637
+ { filename: "isr-revalidation.md", template: "workflow-isr-revalidation" }
57640
58638
  ];
57641
58639
  await Promise.all(
57642
58640
  coreWorkflows.map(
@@ -57961,7 +58959,7 @@ var SimpleCache = class {
57961
58959
  };
57962
58960
 
57963
58961
  // src/version.ts
57964
- var SDK_VERSION = "0.78.2";
58962
+ var SDK_VERSION = "0.79.0";
57965
58963
 
57966
58964
  // src/client/error.ts
57967
58965
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -64553,7 +65551,7 @@ var listCommand6 = createListCommand({
64553
65551
  tableHeaders: ["Identifier", "Status", "Visibility", "Updated"],
64554
65552
  formatRow: formatEventRow
64555
65553
  });
64556
- var deleteCommand2 = new Command("delete").description("Delete an event series").argument("<identifier>", "Event identifier").option("--yes", "Skip confirmation prompt (required for --env=remote)").action(
65554
+ var deleteCommand3 = new Command("delete").description("Delete an event series").argument("<identifier>", "Event identifier").option("--yes", "Skip confirmation prompt (required for --env=remote)").action(
64557
65555
  withConfirmation(
64558
65556
  (identifier) => `Delete event "${identifier}"?`,
64559
65557
  async (ctx, identifier) => {
@@ -64600,7 +65598,7 @@ Examples:
64600
65598
  $ riverbankcms event cancel summer-fest
64601
65599
  $ riverbankcms event delete summer-fest --yes
64602
65600
  `
64603
- ).addCommand(listCommand6).addCommand(getCommand5).addCommand(upsertCommand5).addCommand(cancelCommand).addCommand(deleteCommand2);
65601
+ ).addCommand(listCommand6).addCommand(getCommand5).addCommand(upsertCommand5).addCommand(cancelCommand).addCommand(deleteCommand3);
64604
65602
  var courseUpsertInputSchema = z.object({
64605
65603
  identifier: z.string().min(1).optional(),
64606
65604
  title: z.string().min(1, "title is required"),
@@ -64722,7 +65720,7 @@ var listCommand7 = createListCommand({
64722
65720
  tableHeaders: ["Identifier", "Status", "Visibility", "Updated"],
64723
65721
  formatRow: formatCourseRow
64724
65722
  });
64725
- var deleteCommand3 = new Command("delete").description("Delete a course run").argument("<identifier>", "Course identifier").option("--yes", "Skip confirmation prompt (required for --env=remote)").action(
65723
+ var deleteCommand4 = new Command("delete").description("Delete a course run").argument("<identifier>", "Course identifier").option("--yes", "Skip confirmation prompt (required for --env=remote)").action(
64726
65724
  withConfirmation(
64727
65725
  (identifier) => `Delete course "${identifier}"?`,
64728
65726
  async (ctx, identifier) => {
@@ -64773,7 +65771,7 @@ Examples:
64773
65771
  $ riverbankcms course cancel beginner-yoga
64774
65772
  $ riverbankcms course delete beginner-yoga --yes
64775
65773
  `
64776
- ).addCommand(listCommand7).addCommand(getCommand6).addCommand(upsertCommand6).addCommand(cancelCommand2).addCommand(deleteCommand3);
65774
+ ).addCommand(listCommand7).addCommand(getCommand6).addCommand(upsertCommand6).addCommand(cancelCommand2).addCommand(deleteCommand4);
64777
65775
  function isPlainObject3(value) {
64778
65776
  return !!value && typeof value === "object" && !Array.isArray(value);
64779
65777
  }
@@ -65170,7 +66168,7 @@ program.addCommand(entryCommand);
65170
66168
  program.addCommand(pageCommand);
65171
66169
  program.addCommand(blockCommand);
65172
66170
  program.addCommand(navigationCommand);
65173
- program.addCommand(deleteCommand);
66171
+ program.addCommand(deleteCommand2);
65174
66172
  program.addCommand(initDocsCommand);
65175
66173
  program.addCommand(identifiersCommand);
65176
66174
  program.addCommand(deployCommand);