@designcrowd/library.brand-page 5.18.3-snapshot-imp → 5.18.3-undo-35

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 (147) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-ChzmotnG.js → CreatedOnBrandCrowd-de-de-nGPiEkaH.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-ZdFzOWbY.js → CreatedOnBrandCrowd-en-us-D3ibxOrN.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-CuDl4NR4.js → CreatedOnBrandCrowd-es-es-BAq0PV5c.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-BAvtNfrv.js → CreatedOnBrandCrowd-fr-ca-9foHt2a-.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-BAvtNfrv.js → CreatedOnBrandCrowd-fr-fr-9foHt2a-.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-b4itoYT_.js → CreatedOnBrandCrowd-pt-br-DO739Uxl.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-b4itoYT_.js → CreatedOnBrandCrowd-pt-pt-DO739Uxl.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-G5gGEkB6.js → CreatedOnDcom-de-de-CFbNW8tl.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-BpguOdZJ.js → CreatedOnDcom-en-us-BL34V8eu.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-BRgcye-V.js → CreatedOnDcom-es-es-BKXWvHkV.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-CFbsr6oq.js → CreatedOnDcom-fr-ca-DCyU-m6J.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-DUmO5M1Y.js → CreatedOnDcom-fr-fr-DEciA_zh.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-CmF0vR2v.js → CreatedOnDcom-pt-br-BVB2zdvU.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-CuEzlMh3.js → CreatedOnDcom-pt-pt-DatUuIK6.js} +1 -1
  15. package/lib/src/brand-page/components/image-gallery/masonry/MasonryGallery.mixin.d.ts +1 -1
  16. package/lib/src/brand-page/components/media/Media.mixin.d.ts +2 -2
  17. package/lib/src/brand-page-maker/components/action-bar/ActionBar.mixin.d.ts +7 -2
  18. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +7 -2
  19. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +10 -0
  20. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.mixin.d.ts +7 -2
  21. package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.js +1 -0
  22. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +23 -2
  23. package/lib/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.d.ts +7 -2
  24. package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.d.ts +3 -0
  25. package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.js +11 -0
  26. package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +7 -2
  27. package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +7 -2
  28. package/lib/src/brand-page-maker/components/social-share/SocialShare.mixin.d.ts +7 -2
  29. package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +7 -2
  30. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +12 -16
  31. package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +20 -1
  32. package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +20 -0
  33. package/lib/src/brand-page-maker/composables/useEventTracker.js +17 -0
  34. package/lib/src/brand-page-maker/composables/useUndoRedoFlag.d.ts +16 -0
  35. package/lib/src/brand-page-maker/composables/useUndoRedoFlag.js +22 -0
  36. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.d.ts +41 -2
  37. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +307 -5
  38. package/lib/src/brand-page-maker/stores/history/history-store.d.ts +83 -0
  39. package/lib/src/brand-page-maker/stores/history/history-store.js +488 -0
  40. package/lib/src/brand-page-maker/stores/logo-store/logo-store.d.ts +1 -0
  41. package/lib/src/brand-page-maker/stores/user/user-store.js +1 -0
  42. package/lib/src/bundled-translations-D1q3rSEz.js +175 -0
  43. package/lib/src/{bundled-translations.de-DE-2Ys7epLO.js → bundled-translations.de-DE-DpdVePM9.js} +1 -1
  44. package/lib/src/bundled-translations.es-ES-BsIcrzZF.js +175 -0
  45. package/lib/src/bundled-translations.fr-CA-G1XCp2Qh.js +175 -0
  46. package/lib/src/bundled-translations.fr-FR-BdwLXOnB.js +175 -0
  47. package/lib/src/bundled-translations.pt-BR-Bvn5ePe7.js +175 -0
  48. package/lib/src/bundled-translations.pt-PT-CDtkb2k1.js +175 -0
  49. package/lib/src/bundles/bundled-translations.de-DE.json +2 -0
  50. package/lib/src/bundles/bundled-translations.es-ES.json +2 -0
  51. package/lib/src/bundles/bundled-translations.fr-CA.json +2 -0
  52. package/lib/src/bundles/bundled-translations.fr-FR.json +2 -0
  53. package/lib/src/bundles/bundled-translations.json +5 -1
  54. package/lib/src/bundles/bundled-translations.pt-BR.json +2 -0
  55. package/lib/src/bundles/bundled-translations.pt-PT.json +2 -0
  56. package/lib/src/composables/useSnapshot.js +21 -233
  57. package/lib/src/constants/ui.d.ts +1 -0
  58. package/lib/src/css/library.brand-page-brandCrowd.min.css +70 -18
  59. package/lib/src/css/library.brand-page-brandPage.min.css +70 -19
  60. package/lib/src/css/library.brand-page-designCom.min.css +70 -18
  61. package/lib/src/css/library.brand-page-preview.min.css +70 -18
  62. package/lib/src/index.mjs +1 -1
  63. package/lib/src/{lib-ChiCt_bx.js → lib-C_Pc-5bF.js} +35301 -34780
  64. package/lib/src/metadata-builder/builders/reorder-pages-builder.d.ts +13 -0
  65. package/lib/src/metadata-builder/builders/reorder-pages-builder.js +49 -0
  66. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +87 -2
  67. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +5 -0
  68. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.stories.js +1 -0
  69. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +23 -2
  70. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +16 -0
  71. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +7 -2
  72. package/lib/src/shared/content-settings/components/draggable-item-list/DraggableItemList.mixin.d.ts +3 -0
  73. package/lib/src/shared/content-settings/components/draggable-item-list/DraggableItemList.mixin.js +19 -2
  74. package/lib/src/shared/content-settings/components/form-fields-field/FormFieldsField.mixin.js +18 -8
  75. package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +64 -0
  76. package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.js +6 -0
  77. package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.d.ts +19 -0
  78. package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.js +11 -0
  79. package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +10 -2
  80. package/lib/src/shared/logo-settings/store/editable-logo-store.d.ts +5 -1
  81. package/lib/src/shared/logo-settings/store/editable-logo-store.js +31 -0
  82. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +24 -2
  83. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +10 -2
  84. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +23 -2
  85. package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +16 -0
  86. package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +23 -2
  87. package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +16 -0
  88. package/package.json +1 -1
  89. package/src/brand-page-maker/components/ai-website-builder/AiWebsiteBuilder.vue +4 -3
  90. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +11 -0
  91. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.vue +3 -11
  92. package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts +1 -0
  93. package/src/brand-page-maker/components/brandpage-settings/BrandPageSettings.vue +8 -0
  94. package/src/brand-page-maker/components/cookie-collection/CookieSettings.vue +18 -17
  95. package/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.ts +13 -0
  96. package/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.vue +26 -3
  97. package/src/brand-page-maker/components/quick-link-bar/RedoButton.vue +66 -0
  98. package/src/brand-page-maker/components/quick-link-bar/UndoButton.vue +66 -0
  99. package/src/brand-page-maker/components/quick-link-bar/i18n/quick-link-bar.json +3 -1
  100. package/src/brand-page-maker/components/quick-link-bar/undo-redo-buttons.test.ts +116 -0
  101. package/src/brand-page-maker/components/save-contact/SaveContact.vue +12 -19
  102. package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +14 -19
  103. package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +24 -1
  104. package/src/brand-page-maker/composables/useEventTracker.ts +29 -0
  105. package/src/brand-page-maker/composables/useUndoRedoFlag.ts +26 -0
  106. package/src/brand-page-maker/constants/i18n/constants.de-DE.json +2 -0
  107. package/src/brand-page-maker/constants/i18n/constants.es-ES.json +2 -0
  108. package/src/brand-page-maker/constants/i18n/constants.fr-CA.json +2 -0
  109. package/src/brand-page-maker/constants/i18n/constants.fr-FR.json +2 -0
  110. package/src/brand-page-maker/constants/i18n/constants.json +2 -0
  111. package/src/brand-page-maker/constants/i18n/constants.pt-BR.json +2 -0
  112. package/src/brand-page-maker/constants/i18n/constants.pt-PT.json +2 -0
  113. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.test.ts +335 -0
  114. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +371 -4
  115. package/src/brand-page-maker/stores/history/history-store.test.ts +1120 -0
  116. package/src/brand-page-maker/stores/history/history-store.ts +651 -0
  117. package/src/brand-page-maker/stores/logo-store/logo-store.ts +5 -0
  118. package/src/brand-page-maker/stores/user/user-store.ts +1 -0
  119. package/src/bundles/bundled-translations.de-DE.json +2 -0
  120. package/src/bundles/bundled-translations.es-ES.json +2 -0
  121. package/src/bundles/bundled-translations.fr-CA.json +2 -0
  122. package/src/bundles/bundled-translations.fr-FR.json +2 -0
  123. package/src/bundles/bundled-translations.json +5 -1
  124. package/src/bundles/bundled-translations.pt-BR.json +2 -0
  125. package/src/bundles/bundled-translations.pt-PT.json +2 -0
  126. package/src/composables/useSnapshot.ts +31 -316
  127. package/src/constants/ui.ts +1 -0
  128. package/src/metadata-builder/builders/reorder-pages-builder.ts +80 -0
  129. package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +5 -0
  130. package/src/shared/content-settings/components/content-settings/ContentSettings.stories.ts +1 -0
  131. package/src/shared/content-settings/components/draggable-item-list/DraggableItemList.mixin.ts +19 -2
  132. package/src/shared/content-settings/components/draggable-item-list/DraggableItemList.vue +1 -1
  133. package/src/shared/content-settings/components/form-fields-field/FormFieldsField.mixin.ts +26 -10
  134. package/src/shared/content-settings/components/logo-selection-field/LogoSelection.vue +63 -48
  135. package/src/shared/content-settings/components/page-dropdown-field/PageDropdownField.vue +4 -0
  136. package/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.ts +7 -0
  137. package/src/shared/content-settings/components/text-field/TextField.vue +1 -0
  138. package/src/shared/content-settings/components/text-image-field/TextImageField.vue +33 -4
  139. package/src/shared/font-family-selector/FontPicker.vue +91 -4
  140. package/src/shared/logo-settings/components/EditLogoSettings.mixin.ts +11 -0
  141. package/src/shared/logo-settings/store/editable-logo-store.ts +42 -1
  142. package/lib/src/bundled-translations-CnareLWC.js +0 -175
  143. package/lib/src/bundled-translations.es-ES-Cjp-G8rT.js +0 -175
  144. package/lib/src/bundled-translations.fr-CA-CsaW4Oae.js +0 -175
  145. package/lib/src/bundled-translations.fr-FR-DIT2dd8J.js +0 -175
  146. package/lib/src/bundled-translations.pt-BR-BamoBpDW.js +0 -175
  147. package/lib/src/bundled-translations.pt-PT-C9A4hY_e.js +0 -175
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-ChiCt_bx.js";
2
+ import { _ as t } from "./lib-C_Pc-5bF.js";
3
3
  const i = {}, h = {
4
4
  width: "275",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-ChiCt_bx.js";
2
+ import { _ as t } from "./lib-C_Pc-5bF.js";
3
3
  const i = {}, h = {
4
4
  width: "251",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-ChiCt_bx.js";
2
+ import { _ as t } from "./lib-C_Pc-5bF.js";
3
3
  const i = {}, h = {
4
4
  width: "250",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-ChiCt_bx.js";
2
+ import { _ as t } from "./lib-C_Pc-5bF.js";
3
3
  const i = {}, h = {
4
4
  width: "237",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-ChiCt_bx.js";
2
+ import { _ as t } from "./lib-C_Pc-5bF.js";
3
3
  const i = {}, h = {
4
4
  width: "237",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-ChiCt_bx.js";
2
+ import { _ as t } from "./lib-C_Pc-5bF.js";
3
3
  const i = {}, h = {
4
4
  width: "263",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-ChiCt_bx.js";
2
+ import { _ as t } from "./lib-C_Pc-5bF.js";
3
3
  const i = {}, h = {
4
4
  width: "263",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-ChiCt_bx.js";
2
+ import { _ as e } from "./lib-C_Pc-5bF.js";
3
3
  const M = {}, Z = {
4
4
  width: "242",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-ChiCt_bx.js";
2
+ import { _ as e } from "./lib-C_Pc-5bF.js";
3
3
  const i = {}, M = {
4
4
  width: "231",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-ChiCt_bx.js";
2
+ import { _ as e } from "./lib-C_Pc-5bF.js";
3
3
  const M = {}, Z = {
4
4
  width: "230",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-ChiCt_bx.js";
2
+ import { _ as e } from "./lib-C_Pc-5bF.js";
3
3
  const i = {}, l = {
4
4
  width: "216",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-ChiCt_bx.js";
2
+ import { _ as e } from "./lib-C_Pc-5bF.js";
3
3
  const i = {}, l = {
4
4
  width: "216",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as M } from "./lib-ChiCt_bx.js";
2
+ import { _ as M } from "./lib-C_Pc-5bF.js";
3
3
  const Z = {}, e = {
4
4
  width: "232",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as M } from "./lib-ChiCt_bx.js";
2
+ import { _ as M } from "./lib-C_Pc-5bF.js";
3
3
  const Z = {}, e = {
4
4
  width: "232",
5
5
  height: "36",
@@ -63,7 +63,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
63
63
  }>> & Readonly<{
64
64
  "onImage-click"?: ((...args: any[]) => any) | undefined;
65
65
  }>, {
66
- gap: number;
67
66
  contentIndex: number;
67
+ gap: number;
68
68
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
69
69
  export default _default;
@@ -141,10 +141,10 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
141
141
  size: string;
142
142
  displayStyle: string;
143
143
  role: string;
144
- minHeight: number | boolean;
145
- minWidth: number | boolean;
146
144
  contentIndex: number;
147
145
  altText: string;
148
146
  imgClasses: string | Record<string, any>;
147
+ minHeight: number | boolean;
148
+ minWidth: number | boolean;
149
149
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
150
150
  export default _default;
@@ -107,16 +107,21 @@ declare const _default: import("vue").DefineComponent<{}, {
107
107
  hideChangeTemplateConfirmModal(): void;
108
108
  onBackgroundChanged(): void;
109
109
  onChangeTemplateConfirmModalCancel(): void;
110
- onChangeTemplateConfirmModalConfirm(): void;
110
+ onChangeTemplateConfirmModalConfirm(): Promise<void>;
111
111
  onContentChanged(): void;
112
112
  onStyleChanged(): void;
113
- onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void;
113
+ onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
114
114
  setSelectedTabName(payload: any): void;
115
115
  showNextNotificationMessage(): Promise<void>;
116
116
  updateContent<TContent extends import("@brand-page/models").Content, P extends {
117
117
  id: string;
118
118
  content: TContent;
119
119
  }>(payload: P): Promise<void>;
120
+ _captureTemplateSwitchIfEnabled(): void;
121
+ applyHistorySnapshot(snapshot: import("@brand-page/models").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
122
+ _syncLogoSettingsFromSnapshot(snapshot: import("@brand-page/models").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
123
+ _navigateToActivePage(activePageId?: string | undefined): void;
124
+ _fallbackSidebarIfSelectedContentMissing(snapshot: import("@brand-page/models").BrandPageModel): void;
120
125
  export(): import("@brand-page/models").BrandPageModel;
121
126
  setBrandPageType({ brandPageType }: {
122
127
  brandPageType: "default" | "brandSite" | "brandContact";
@@ -152,16 +152,21 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
152
152
  hideChangeTemplateConfirmModal(): void;
153
153
  onBackgroundChanged(): void;
154
154
  onChangeTemplateConfirmModalCancel(): void;
155
- onChangeTemplateConfirmModalConfirm(): void;
155
+ onChangeTemplateConfirmModalConfirm(): Promise<void>;
156
156
  onContentChanged(): void;
157
157
  onStyleChanged(): void;
158
- onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void;
158
+ onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
159
159
  setSelectedTabName(payload: any): void;
160
160
  showNextNotificationMessage(): Promise<void>;
161
161
  updateContent<TContent extends import("@brand-page").Content, P extends {
162
162
  id: string;
163
163
  content: TContent;
164
164
  }>(payload: P): Promise<void>;
165
+ _captureTemplateSwitchIfEnabled(): void;
166
+ applyHistorySnapshot(snapshot: import("@brand-page").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
167
+ _syncLogoSettingsFromSnapshot(snapshot: import("@brand-page").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
168
+ _navigateToActivePage(activePageId?: string | undefined): void;
169
+ _fallbackSidebarIfSelectedContentMissing(snapshot: import("@brand-page").BrandPageModel): void;
165
170
  export(): import("@brand-page").BrandPageModel;
166
171
  setBrandPageType({ brandPageType }: {
167
172
  brandPageType: "default" | "brandSite" | "brandContact";
@@ -11,6 +11,8 @@ import { navigateToPageByPageId } from '../../routing';
11
11
  import { useBrandPageContainerStore } from '@brand-page-maker/stores';
12
12
  import { UI_DEVICE_MODES, UI_SCREENSIZE_MODES, } from '@shared/models';
13
13
  import { useBrandPageMakerStore, useBrandPageMakerUserStore, useLocalisedRouteStore, useUiStore, useSnapshotStore, useVideoStore, } from '@brand-page-maker/stores';
14
+ import { useHistoryStore } from '@brand-page-maker/stores/history/history-store';
15
+ import { useUndoRedoFlag } from '@brand-page-maker/composables/useUndoRedoFlag';
14
16
  import { useUiContentSettingsStore } from '@shared/content-settings/store';
15
17
  import { useUiTemplateSettingsStore } from '@shared/template-settings/store';
16
18
  import { useUiPageSettingsStore } from '@shared/page-settings/store';
@@ -189,6 +191,14 @@ export default defineComponent({
189
191
  }
190
192
  // Mark brand page as fully loaded
191
193
  this.brandPageMakerStore.setIsBrandPageLoaded(true);
194
+ // Capture baseline for undo/redo when the feature is active for this
195
+ // session. `useUndoRedoFlag` requires both the LaunchDarkly feature
196
+ // (`userStore.features.canUseUndoRedo`) AND the maker being a brand-site
197
+ // — V1 scope is brand-site only; brand-page and brand-contact don't get
198
+ // undo/redo. See useUndoRedoFlag.ts for the rationale.
199
+ if (useUndoRedoFlag().value) {
200
+ useHistoryStore().captureBaseline();
201
+ }
192
202
  this.$emit(EVENTS.Initialised);
193
203
  },
194
204
  mounted() {
@@ -96,16 +96,21 @@ declare const _default: import("vue").DefineComponent<{}, {
96
96
  hideChangeTemplateConfirmModal(): void;
97
97
  onBackgroundChanged(): void;
98
98
  onChangeTemplateConfirmModalCancel(): void;
99
- onChangeTemplateConfirmModalConfirm(): void;
99
+ onChangeTemplateConfirmModalConfirm(): Promise<void>;
100
100
  onContentChanged(): void;
101
101
  onStyleChanged(): void;
102
- onTemplateSelected(payload: import("../../stores").OnTemplateSelectedPayload): void;
102
+ onTemplateSelected(payload: import("../../stores").OnTemplateSelectedPayload): Promise<void>;
103
103
  setSelectedTabName(payload: any): void;
104
104
  showNextNotificationMessage(): Promise<void>;
105
105
  updateContent<TContent extends import("../../../lib").Content, P extends {
106
106
  id: string;
107
107
  content: TContent;
108
108
  }>(payload: P): Promise<void>;
109
+ _captureTemplateSwitchIfEnabled(): void;
110
+ applyHistorySnapshot(snapshot: import("../../../lib").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
111
+ _syncLogoSettingsFromSnapshot(snapshot: import("../../../lib").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
112
+ _navigateToActivePage(activePageId?: string | undefined): void;
113
+ _fallbackSidebarIfSelectedContentMissing(snapshot: import("../../../lib").BrandPageModel): void;
109
114
  export(): import("../../../lib").BrandPageModel;
110
115
  setBrandPageType({ brandPageType }: {
111
116
  brandPageType: "default" | "brandSite" | "brandContact";
@@ -53,6 +53,7 @@ export const userFeatures = {
53
53
  canUseGettyVideos: false,
54
54
  canUseGoogleAdsense: false,
55
55
  googleAdsenseEnabled: false,
56
+ canUseUndoRedo: false,
56
57
  };
57
58
  export const BRAND_PAGE = {
58
59
  styles: {
@@ -602,16 +602,21 @@ declare const _default: import("vue").DefineComponent<{}, {
602
602
  hideChangeTemplateConfirmModal(): void;
603
603
  onBackgroundChanged(): void;
604
604
  onChangeTemplateConfirmModalCancel(): void;
605
- onChangeTemplateConfirmModalConfirm(): void;
605
+ onChangeTemplateConfirmModalConfirm(): Promise<void>;
606
606
  onContentChanged(): void;
607
607
  onStyleChanged(): void;
608
- onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void;
608
+ onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
609
609
  setSelectedTabName(payload: any): void;
610
610
  showNextNotificationMessage(): Promise<void>;
611
611
  updateContent<TContent extends Content, P extends {
612
612
  id: string;
613
613
  content: TContent;
614
614
  }>(payload: P): Promise<void>;
615
+ _captureTemplateSwitchIfEnabled(): void;
616
+ applyHistorySnapshot(snapshot: import("@brand-page").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
617
+ _syncLogoSettingsFromSnapshot(snapshot: import("@brand-page").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
618
+ _navigateToActivePage(activePageId?: string | undefined): void;
619
+ _fallbackSidebarIfSelectedContentMissing(snapshot: import("@brand-page").BrandPageModel): void;
615
620
  export(): import("@brand-page").BrandPageModel;
616
621
  setBrandPageType({ brandPageType }: {
617
622
  brandPageType: "default" | "brandSite" | "brandContact";
@@ -1046,6 +1051,22 @@ declare const _default: import("vue").DefineComponent<{}, {
1046
1051
  }>;
1047
1052
  eventTracker: {
1048
1053
  sendShippingToggleEvent: (isEnabled: boolean) => void;
1054
+ sendUndoEvent: (props: {
1055
+ entries_count: number;
1056
+ actor: string | undefined;
1057
+ }) => void;
1058
+ sendRedoEvent: (props: {
1059
+ entries_count: number;
1060
+ actor: string | undefined;
1061
+ }) => void;
1062
+ sendHistoryCappedEvent: (props: {
1063
+ entries_count: number;
1064
+ size_bytes: number;
1065
+ }) => void;
1066
+ sendHistoryOversizedEvent: (props: {
1067
+ attempted_bytes: number;
1068
+ source: string;
1069
+ }) => void;
1049
1070
  sendSaveContactEvent: () => void;
1050
1071
  sendStartForFreeEvent: () => void;
1051
1072
  sendFooterLinkClickEvent: (linkType: "watermark_logo" | "create_your_website") => void;
@@ -102,16 +102,21 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
102
102
  hideChangeTemplateConfirmModal(): void;
103
103
  onBackgroundChanged(): void;
104
104
  onChangeTemplateConfirmModalCancel(): void;
105
- onChangeTemplateConfirmModalConfirm(): void;
105
+ onChangeTemplateConfirmModalConfirm(): Promise<void>;
106
106
  onContentChanged(): void;
107
107
  onStyleChanged(): void;
108
- onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void;
108
+ onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
109
109
  setSelectedTabName(payload: any): void;
110
110
  showNextNotificationMessage(): Promise<void>;
111
111
  updateContent<TContent extends import("../../../brand-page").Content, P extends {
112
112
  id: string;
113
113
  content: TContent;
114
114
  }>(payload: P): Promise<void>;
115
+ _captureTemplateSwitchIfEnabled(): void;
116
+ applyHistorySnapshot(snapshot: import("../../../brand-page").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
117
+ _syncLogoSettingsFromSnapshot(snapshot: import("../../../brand-page").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
118
+ _navigateToActivePage(activePageId?: string | undefined): void;
119
+ _fallbackSidebarIfSelectedContentMissing(snapshot: import("../../../brand-page").BrandPageModel): void;
115
120
  export(): import("../../../brand-page").BrandPageModel;
116
121
  setBrandPageType({ brandPageType }: {
117
122
  brandPageType: "default" | "brandSite" | "brandContact";
@@ -291,9 +291,12 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
291
291
  pushManageWebPageUpdateSensitiveContentClickEvent(): Promise<void>;
292
292
  pushManageWebPageUnpublishClickEvent(): Promise<void>;
293
293
  }>;
294
+ undoRedoEnabled: import("vue").ComputedRef<boolean>;
294
295
  }, {
295
296
  copied: boolean;
296
297
  }, {
298
+ isPublished(): boolean;
299
+ shouldShowBar(): boolean;
297
300
  brandPageUrl(): string;
298
301
  copyButtonLabel(): string;
299
302
  }, {
@@ -1,6 +1,7 @@
1
1
  import { defineComponent } from 'vue';
2
2
  import { CUSTOM_DOMAIN_STATUSES } from '@brand-page-maker/constants';
3
3
  import { useBrandPageContainerStore, useEventManagerStore, } from '@brand-page-maker/stores';
4
+ import { useUndoRedoFlag } from '@brand-page-maker/composables/useUndoRedoFlag';
4
5
  import { quickLinkBarTr } from '@src/composables/useTranslate';
5
6
  export default defineComponent({
6
7
  props: {
@@ -17,6 +18,7 @@ export default defineComponent({
17
18
  return {
18
19
  brandPageContainerStore: useBrandPageContainerStore(),
19
20
  eventManagerStore: useEventManagerStore(),
21
+ undoRedoEnabled: useUndoRedoFlag(),
20
22
  };
21
23
  },
22
24
  data() {
@@ -25,6 +27,15 @@ export default defineComponent({
25
27
  };
26
28
  },
27
29
  computed: {
30
+ isPublished() {
31
+ return this.brandPageContainerStore.isPublished;
32
+ },
33
+ // Only render the bar when at least one inner cluster has something to
34
+ // show. Otherwise we'd render an empty white strip — e.g. on an
35
+ // unpublished page with the undo flag off.
36
+ shouldShowBar() {
37
+ return Boolean(this.undoRedoEnabled) || this.isPublished;
38
+ },
28
39
  brandPageUrl() {
29
40
  if (this.brandPageContainerStore.isCustomDomainEnabled &&
30
41
  this.brandPageContainerStore.customDomain &&
@@ -380,16 +380,21 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
380
380
  hideChangeTemplateConfirmModal(): void;
381
381
  onBackgroundChanged(): void;
382
382
  onChangeTemplateConfirmModalCancel(): void;
383
- onChangeTemplateConfirmModalConfirm(): void;
383
+ onChangeTemplateConfirmModalConfirm(): Promise<void>;
384
384
  onContentChanged(): void;
385
385
  onStyleChanged(): void;
386
- onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void;
386
+ onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
387
387
  setSelectedTabName(payload: any): void;
388
388
  showNextNotificationMessage(): Promise<void>;
389
389
  updateContent<TContent extends import("../../../brand-page").Content, P extends {
390
390
  id: string;
391
391
  content: TContent;
392
392
  }>(payload: P): Promise<void>;
393
+ _captureTemplateSwitchIfEnabled(): void;
394
+ applyHistorySnapshot(snapshot: import("../../../brand-page").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
395
+ _syncLogoSettingsFromSnapshot(snapshot: import("../../../brand-page").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
396
+ _navigateToActivePage(activePageId?: string | undefined): void;
397
+ _fallbackSidebarIfSelectedContentMissing(snapshot: import("../../../brand-page").BrandPageModel): void;
393
398
  export(): import("../../../brand-page").BrandPageModel;
394
399
  setBrandPageType({ brandPageType }: {
395
400
  brandPageType: "default" | "brandSite" | "brandContact";
@@ -381,16 +381,21 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
381
381
  hideChangeTemplateConfirmModal(): void;
382
382
  onBackgroundChanged(): void;
383
383
  onChangeTemplateConfirmModalCancel(): void;
384
- onChangeTemplateConfirmModalConfirm(): void;
384
+ onChangeTemplateConfirmModalConfirm(): Promise<void>;
385
385
  onContentChanged(): void;
386
386
  onStyleChanged(): void;
387
- onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void;
387
+ onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
388
388
  setSelectedTabName(payload: any): void;
389
389
  showNextNotificationMessage(): Promise<void>;
390
390
  updateContent<TContent extends import("../../../brand-page").Content, P extends {
391
391
  id: string;
392
392
  content: TContent;
393
393
  }>(payload: P): Promise<void>;
394
+ _captureTemplateSwitchIfEnabled(): void;
395
+ applyHistorySnapshot(snapshot: import("../../../brand-page").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
396
+ _syncLogoSettingsFromSnapshot(snapshot: import("../../../brand-page").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
397
+ _navigateToActivePage(activePageId?: string | undefined): void;
398
+ _fallbackSidebarIfSelectedContentMissing(snapshot: import("../../../brand-page").BrandPageModel): void;
394
399
  export(): import("../../../brand-page").BrandPageModel;
395
400
  setBrandPageType({ brandPageType }: {
396
401
  brandPageType: "default" | "brandSite" | "brandContact";
@@ -112,16 +112,21 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
112
112
  hideChangeTemplateConfirmModal(): void;
113
113
  onBackgroundChanged(): void;
114
114
  onChangeTemplateConfirmModalCancel(): void;
115
- onChangeTemplateConfirmModalConfirm(): void;
115
+ onChangeTemplateConfirmModalConfirm(): Promise<void>;
116
116
  onContentChanged(): void;
117
117
  onStyleChanged(): void;
118
- onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void;
118
+ onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
119
119
  setSelectedTabName(payload: any): void;
120
120
  showNextNotificationMessage(): Promise<void>;
121
121
  updateContent<TContent extends import("../../../brand-page").Content, P extends {
122
122
  id: string;
123
123
  content: TContent;
124
124
  }>(payload: P): Promise<void>;
125
+ _captureTemplateSwitchIfEnabled(): void;
126
+ applyHistorySnapshot(snapshot: import("../../../brand-page").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
127
+ _syncLogoSettingsFromSnapshot(snapshot: import("../../../brand-page").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
128
+ _navigateToActivePage(activePageId?: string | undefined): void;
129
+ _fallbackSidebarIfSelectedContentMissing(snapshot: import("../../../brand-page").BrandPageModel): void;
125
130
  export(): import("../../../brand-page").BrandPageModel;
126
131
  setBrandPageType({ brandPageType }: {
127
132
  brandPageType: "default" | "brandSite" | "brandContact";
@@ -432,16 +432,21 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
432
432
  hideChangeTemplateConfirmModal(): void;
433
433
  onBackgroundChanged(): void;
434
434
  onChangeTemplateConfirmModalCancel(): void;
435
- onChangeTemplateConfirmModalConfirm(): void;
435
+ onChangeTemplateConfirmModalConfirm(): Promise<void>;
436
436
  onContentChanged(): void;
437
437
  onStyleChanged(): void;
438
- onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void;
438
+ onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
439
439
  setSelectedTabName(payload: any): void;
440
440
  showNextNotificationMessage(): Promise<void>;
441
441
  updateContent<TContent extends import("@brand-page").Content, P extends {
442
442
  id: string;
443
443
  content: TContent;
444
444
  }>(payload: P): Promise<void>;
445
+ _captureTemplateSwitchIfEnabled(): void;
446
+ applyHistorySnapshot(snapshot: import("@brand-page").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
447
+ _syncLogoSettingsFromSnapshot(snapshot: import("@brand-page").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
448
+ _navigateToActivePage(activePageId?: string | undefined): void;
449
+ _fallbackSidebarIfSelectedContentMissing(snapshot: import("@brand-page").BrandPageModel): void;
445
450
  export(): import("@brand-page").BrandPageModel;
446
451
  setBrandPageType({ brandPageType }: {
447
452
  brandPageType: "default" | "brandSite" | "brandContact";
@@ -10,6 +10,8 @@ import { usePageNavigationStore } from '../../../shared/page-navigation/store/pa
10
10
  import { navigateToPageByPageId } from '../../routing';
11
11
  import { useSnapshotStore, useAiWebsiteBuilderThreadStore, useAiCheckpointStore, useBrandPageContainerStore, useUiStore, } from '../../stores';
12
12
  import { useBrandPageMakerStore } from '../../stores';
13
+ import { useHistoryStore } from '../../stores/history/history-store';
14
+ import { useUndoRedoFlag } from '../useUndoRedoFlag';
13
15
  import { useBrandPageMakerUserStore } from '../../stores/user/user-store';
14
16
  import { useAiMetadataBuilder } from './useAiMetadataBuilder';
15
17
  import { pickErrorMessage, pickWsErrorMessage, buildSubmitErrorReport, } from './aiErrorCopy';
@@ -23,6 +25,8 @@ export function useAiWebsiteBuilderChat() {
23
25
  const aiThreadStore = useAiWebsiteBuilderThreadStore();
24
26
  const snapshotStore = useSnapshotStore();
25
27
  const brandPageMakerStore = useBrandPageMakerStore();
28
+ const historyStore = useHistoryStore();
29
+ const undoRedoEnabled = useUndoRedoFlag();
26
30
  const containerStore = useBrandPageContainerStore();
27
31
  const userStore = useBrandPageMakerUserStore();
28
32
  const uiStore = useUiStore();
@@ -298,6 +302,13 @@ export function useAiWebsiteBuilderChat() {
298
302
  navigateToPageByPageId(pageNavigationStore.activePageId);
299
303
  }
300
304
  await nextTick();
305
+ // One history entry per AI prompt (US-E1). `captureAiChangeset` cancels
306
+ // the auto-watcher's pending flush so the apply doesn't double-capture.
307
+ if (undoRedoEnabled.value) {
308
+ historyStore.captureAiChangeset();
309
+ }
310
+ // Re-capture snapshot so subsequent messages reflect the updated page
311
+ await snapshotStore.refreshSnapshotAsync();
301
312
  return {
302
313
  shouldContinue: toolResults.length > 0 && aiThreadStore.runId !== null,
303
314
  toolResults,
@@ -465,6 +476,7 @@ export function useAiWebsiteBuilderChat() {
465
476
  settled = true;
466
477
  clearTimeout(timeout);
467
478
  finishBuild();
479
+ await snapshotStore.refreshSnapshotAsync();
468
480
  resolve({
469
481
  text: aiResponse.message || lastAiMessage || '',
470
482
  });
@@ -633,22 +645,6 @@ export function useAiWebsiteBuilderChat() {
633
645
  try {
634
646
  aiLogger.startGroup();
635
647
  aiLogger.log('sendMessageAsync', { messageOptions });
636
- // Capture a fresh, full-page snapshot before building the request payload,
637
- // so every turn — including the first message and any manual edits between
638
- // turns — carries an up-to-date snapshot. Done here (after the user/typing
639
- // bubbles are already on screen) so a slow or failed capture never delays
640
- // or blocks the message from appearing in the thread.
641
- //
642
- // Best-effort: the snapshot is optional context, so a capture failure must
643
- // never fail the AI request. Swallow any error and proceed — the pipeline
644
- // handles a missing websiteSnapshot, and `callApiBuildAsync` already falls
645
- // back to `undefined` when the store has no snapshot.
646
- try {
647
- await snapshotStore.refreshSnapshotAsync();
648
- }
649
- catch (snapshotError) {
650
- console.error('Snapshot capture failed; sending message without it:', snapshotError);
651
- }
652
648
  const result = await callApiBuildAsync(text || '', userMessage.id);
653
649
  if (isStopped.value)
654
650
  return;
@@ -21,6 +21,7 @@ import { buildInitialMarks, emToPx, isStyleChanged, pxToEm, sanitiseClientSideRT
21
21
  import { HYPERLINK_TYPE, } from '@brand-page';
22
22
  import { letterSpacingValueConvertor, colorConvertor, backgroundColorConvertor, } from '@brand-page-maker/convertors';
23
23
  import { useUiContentSettingsStore } from '@shared/content-settings/store';
24
+ import { useHistoryStore } from '@brand-page-maker/stores/history/history-store';
24
25
  import { AllSelection } from 'prosemirror-state';
25
26
  import { MaxLength } from './extensions/MaxLength';
26
27
  import { AutoLink } from './extensions/AutoLink';
@@ -72,6 +73,10 @@ export const useExternalRichTextEditor = () => {
72
73
  };
73
74
  };
74
75
  export const useRichTextEditor = (model, props, emit, fontSettings, fontStyleDropdownRef, selectedGlobalTextStyles, onSelectTextStyleType, updateRichTextEditor, textStyleTypeOptions, markedText, isHyperlinkPopupOpen, selectedLinkTypeValue) => {
76
+ const historyStore = useHistoryStore();
77
+ // TipTap rehydrates and writes back canonical HTML on mount — fold
78
+ // that into the current head instead of pushing a phantom entry.
79
+ historyStore.mergeNextMutation();
75
80
  const editor = new Editor({
76
81
  content: model.value ?? '',
77
82
  editable: !props.readOnly,
@@ -229,7 +234,14 @@ export const useRichTextEditor = (model, props, emit, fontSettings, fontStyleDro
229
234
  }
230
235
  });
231
236
  watch(() => model.value, (newValue) => {
232
- if (updateRichTextEditor.value && editor.getHTML() !== newValue) {
237
+ // Re-seed the editor when the model has been mutated from outside
238
+ // (history undo/redo, template switch, reorder). `!editor.isFocused`
239
+ // distinguishes "external mutation" from "user is typing in me" — the
240
+ // latter would wipe the user's cursor if we called setContent.
241
+ // `updateRichTextEditor.value` is retained as an explicit override for
242
+ // callers (reorder) that need to force a re-seed while focused.
243
+ const isExternalMutation = updateRichTextEditor.value || !editor.isFocused;
244
+ if (isExternalMutation && editor.getHTML() !== newValue) {
233
245
  editor.commands.setContent(newValue, false);
234
246
  updateRichTextEditor.value = false;
235
247
  //text style type is not switching when reordering
@@ -256,6 +268,13 @@ export const useRichTextEditor = (model, props, emit, fontSettings, fontStyleDro
256
268
  emit('update:modelValue', sanitizedData.sanitizedHtml);
257
269
  });
258
270
  editor.on('selectionUpdate', () => {
271
+ // Skip while a history snapshot is being applied — `setContent` fires
272
+ // selectionUpdate before the editor has fully rehydrated, which causes
273
+ // toolbar buttons (alignment, letter-spacing) to flash through bogus
274
+ // active states before settling. The editor emits a final selectionUpdate
275
+ // after apply completes, which lands the correct values (BP-5506).
276
+ if (historyStore.isApplyingSnapshot)
277
+ return;
259
278
  const textStyleAttributes = editor.getAttributes('textStyle');
260
279
  const highlightAttributes = editor.getAttributes('highlight');
261
280
  const focusedAlignment = editor.getAttributes(editor.state.selection.$anchor.node().type.name);
@@ -55,6 +55,10 @@ export declare const EVENTS: {
55
55
  WEBSITE_MAKER_DIGITAL_BUSINESS_CARDS_HIDE_POPUP: string;
56
56
  WEBSITE_MAKER_GETTY_VIDEO: string;
57
57
  WEBSITE_MAKER_SHIPPING_TOGGLE: string;
58
+ WEBSITE_MAKER_UNDO: string;
59
+ WEBSITE_MAKER_REDO: string;
60
+ WEBSITE_MAKER_HISTORY_CAPPED: string;
61
+ WEBSITE_MAKER_HISTORY_OVERSIZED: string;
58
62
  };
59
63
  export declare const SELECT_LOCATIONS: {
60
64
  MAKER_PREVIEW: string;
@@ -107,6 +111,22 @@ export declare const PUBLISH_OPTION_MODAL_CONTINUATION_EVENTS: {
107
111
  };
108
112
  declare const useEventTracker: () => {
109
113
  sendShippingToggleEvent: (isEnabled: boolean) => void;
114
+ sendUndoEvent: (props: {
115
+ entries_count: number;
116
+ actor: string | undefined;
117
+ }) => void;
118
+ sendRedoEvent: (props: {
119
+ entries_count: number;
120
+ actor: string | undefined;
121
+ }) => void;
122
+ sendHistoryCappedEvent: (props: {
123
+ entries_count: number;
124
+ size_bytes: number;
125
+ }) => void;
126
+ sendHistoryOversizedEvent: (props: {
127
+ attempted_bytes: number;
128
+ source: string;
129
+ }) => void;
110
130
  sendSaveContactEvent: () => void;
111
131
  sendStartForFreeEvent: () => void;
112
132
  sendFooterLinkClickEvent: (linkType: 'watermark_logo' | 'create_your_website') => void;