@designcrowd/library.brand-page 6.0.6-undo-3 → 6.0.6-undo-4

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 (32) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-x7BcD7Sj.js → CreatedOnBrandCrowd-de-de-BqD7lX6T.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-CG-ThD_q.js → CreatedOnBrandCrowd-en-us-BXFZ-Vv_.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-aab4_Re2.js → CreatedOnBrandCrowd-es-es-qTAVOIsd.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-Drl8X5uh.js → CreatedOnBrandCrowd-fr-ca-LVZ7sAKH.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-Drl8X5uh.js → CreatedOnBrandCrowd-fr-fr-LVZ7sAKH.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-8Ib7T70i.js → CreatedOnBrandCrowd-pt-br-TSeJN2wb.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-8Ib7T70i.js → CreatedOnBrandCrowd-pt-pt-TSeJN2wb.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-FJtydzc5.js → CreatedOnDcom-de-de-BLLcDw_4.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-BMiXru6P.js → CreatedOnDcom-en-us-BVdWxcIs.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-B8Srdnku.js → CreatedOnDcom-es-es-BZRzR4GZ.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-tcXGiBNt.js → CreatedOnDcom-fr-ca-B97f7ekB.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-nE1cuUEU.js → CreatedOnDcom-fr-fr-CNWS12Rb.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-DxCCXCg8.js → CreatedOnDcom-pt-br-CsASsHeV.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-Csabip9G.js → CreatedOnDcom-pt-pt-CsYqjPls.js} +1 -1
  15. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +4 -4
  16. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +4 -4
  17. package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +6 -1
  18. package/lib/src/index.mjs +1 -1
  19. package/lib/src/{lib-C_UlYMJy.js → lib-BNqCRgBN.js} +1246 -1241
  20. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +4 -4
  21. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +4 -4
  22. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +4 -4
  23. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +4 -4
  24. package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.d.ts +4 -4
  25. package/lib/src/shared/content-settings/store/content-settings-store.d.ts +4 -4
  26. package/lib/src/shared/content-settings/store/content-settings-store.js +24 -4
  27. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +4 -4
  28. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +4 -4
  29. package/package.json +1 -1
  30. package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +6 -1
  31. package/src/shared/content-settings/store/content-settings-store.test.ts +28 -1
  32. package/src/shared/content-settings/store/content-settings-store.ts +28 -0
@@ -550,14 +550,14 @@ declare const _default: import("vue").DefineComponent<{}, {
550
550
  resetMode(): void;
551
551
  updateItemValue(payload: import("../../models").UpdateItemValuePayload<unknown>): void;
552
552
  updateMultipleItemValues({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
553
- updateTextStyleType({ id, name, value, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
554
- updateTextStyles({ id, name, value, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
553
+ updateTextStyleType({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
554
+ updateTextStyles({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
555
555
  getTextStyles({ id, name }: {
556
556
  id: string;
557
557
  name: string;
558
558
  }): unknown;
559
- updateTextItemTextStyleType({ id, name, value, index, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
560
- updateTextItemTextStyleTypeWithStyles({ id, name, value, index, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
559
+ updateTextItemTextStyleType({ id, name, value, index, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
560
+ updateTextItemTextStyleTypeWithStyles({ id, name, value, index, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
561
561
  _setActiveCategoryTab({ activeCategoryTab, }: {
562
562
  activeCategoryTab: ItemCategory;
563
563
  }): void;
@@ -400,14 +400,14 @@ declare const _default: import("vue").DefineComponent<{}, {
400
400
  resetMode(): void;
401
401
  updateItemValue(payload: import("../../models").UpdateItemValuePayload<unknown>): void;
402
402
  updateMultipleItemValues({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
403
- updateTextStyleType({ id, name, value, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
404
- updateTextStyles({ id, name, value, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
403
+ updateTextStyleType({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
404
+ updateTextStyles({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
405
405
  getTextStyles({ id, name }: {
406
406
  id: string;
407
407
  name: string;
408
408
  }): unknown;
409
- updateTextItemTextStyleType({ id, name, value, index, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
410
- updateTextItemTextStyleTypeWithStyles({ id, name, value, index, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
409
+ updateTextItemTextStyleType({ id, name, value, index, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
410
+ updateTextItemTextStyleTypeWithStyles({ id, name, value, index, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
411
411
  _setActiveCategoryTab({ activeCategoryTab, }: {
412
412
  activeCategoryTab: import("../../../../brand-page-maker/models").ItemCategory;
413
413
  }): void;
@@ -386,14 +386,14 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
386
386
  resetMode(): void;
387
387
  updateItemValue(payload: UpdateItemValuePayload<unknown>): void;
388
388
  updateMultipleItemValues({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
389
- updateTextStyleType({ id, name, value, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
390
- updateTextStyles({ id, name, value, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
389
+ updateTextStyleType({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
390
+ updateTextStyles({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
391
391
  getTextStyles({ id, name }: {
392
392
  id: string;
393
393
  name: string;
394
394
  }): unknown;
395
- updateTextItemTextStyleType({ id, name, value, index, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
396
- updateTextItemTextStyleTypeWithStyles({ id, name, value, index, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
395
+ updateTextItemTextStyleType({ id, name, value, index, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
396
+ updateTextItemTextStyleTypeWithStyles({ id, name, value, index, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
397
397
  _setActiveCategoryTab({ activeCategoryTab, }: {
398
398
  activeCategoryTab: import("@brand-page-maker/models").ItemCategory;
399
399
  }): void;
@@ -428,14 +428,14 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
428
428
  resetMode(): void;
429
429
  updateItemValue(payload: UpdateItemValuePayload<unknown>): void;
430
430
  updateMultipleItemValues({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
431
- updateTextStyleType({ id, name, value, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
432
- updateTextStyles({ id, name, value, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
431
+ updateTextStyleType({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
432
+ updateTextStyles({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
433
433
  getTextStyles({ id, name }: {
434
434
  id: string;
435
435
  name: string;
436
436
  }): unknown;
437
- updateTextItemTextStyleType({ id, name, value, index, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
438
- updateTextItemTextStyleTypeWithStyles({ id, name, value, index, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
437
+ updateTextItemTextStyleType({ id, name, value, index, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
438
+ updateTextItemTextStyleTypeWithStyles({ id, name, value, index, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
439
439
  _setActiveCategoryTab({ activeCategoryTab, }: {
440
440
  activeCategoryTab: import("@brand-page-maker/models").ItemCategory;
441
441
  }): void;
@@ -379,14 +379,14 @@ declare const _default: import("vue").DefineComponent<{}, {
379
379
  resetMode(): void;
380
380
  updateItemValue(payload: UpdateItemValuePayload<unknown>): void;
381
381
  updateMultipleItemValues({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
382
- updateTextStyleType({ id, name, value, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
383
- updateTextStyles({ id, name, value, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
382
+ updateTextStyleType({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
383
+ updateTextStyles({ id, name, value, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
384
384
  getTextStyles({ id, name }: {
385
385
  id: string;
386
386
  name: string;
387
387
  }): unknown;
388
- updateTextItemTextStyleType({ id, name, value, index, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
389
- updateTextItemTextStyleTypeWithStyles({ id, name, value, index, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
388
+ updateTextItemTextStyleType({ id, name, value, index, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
389
+ updateTextItemTextStyleTypeWithStyles({ id, name, value, index, isHydrationWrite, }: import("../../models").UpdateMultipleItemValuesPayload<any>): void;
390
390
  _setActiveCategoryTab({ activeCategoryTab, }: {
391
391
  activeCategoryTab: import("@brand-page-maker/models").ItemCategory;
392
392
  }): void;
@@ -394,14 +394,14 @@ export declare const useUiContentSettingsStore: import("pinia").StoreDefinition<
394
394
  resetMode(): void;
395
395
  updateItemValue(payload: UpdateItemValuePayload<unknown>): void;
396
396
  updateMultipleItemValues({ id, name, value, isHydrationWrite, }: UpdateMultipleItemValuesPayload<any>): void;
397
- updateTextStyleType({ id, name, value, }: UpdateMultipleItemValuesPayload<any>): void;
398
- updateTextStyles({ id, name, value, }: UpdateMultipleItemValuesPayload<any>): void;
397
+ updateTextStyleType({ id, name, value, isHydrationWrite, }: UpdateMultipleItemValuesPayload<any>): void;
398
+ updateTextStyles({ id, name, value, isHydrationWrite, }: UpdateMultipleItemValuesPayload<any>): void;
399
399
  getTextStyles({ id, name }: {
400
400
  id: string;
401
401
  name: string;
402
402
  }): unknown;
403
- updateTextItemTextStyleType({ id, name, value, index, }: UpdateMultipleItemValuesPayload<any>): void;
404
- updateTextItemTextStyleTypeWithStyles({ id, name, value, index, }: UpdateMultipleItemValuesPayload<any>): void;
403
+ updateTextItemTextStyleType({ id, name, value, index, isHydrationWrite, }: UpdateMultipleItemValuesPayload<any>): void;
404
+ updateTextItemTextStyleTypeWithStyles({ id, name, value, index, isHydrationWrite, }: UpdateMultipleItemValuesPayload<any>): void;
405
405
  _setActiveCategoryTab({ activeCategoryTab, }: {
406
406
  activeCategoryTab: ItemCategory;
407
407
  }): void;
@@ -240,20 +240,32 @@ export const useUiContentSettingsStore = defineStore('uiContentSettings', {
240
240
  this.validateItem({ id, name });
241
241
  this.onContentChanged();
242
242
  },
243
- updateTextStyleType({ id, name, value, }) {
243
+ updateTextStyleType({ id, name, value, isHydrationWrite, }) {
244
244
  const item = this.items.find((i) => i.id === id);
245
245
  if (!item) {
246
246
  return;
247
247
  }
248
+ // Same hydration-write contract as updateItemValue.
249
+ if (isHydrationWrite) {
250
+ useHistoryStore().mergeNextMutation();
251
+ }
248
252
  item.settings.content[`${name}Style`].textStyleType = vueDeepMerge(item.settings.content, value);
249
253
  this.validateItem({ id, name });
250
254
  this.onContentChanged();
251
255
  },
252
- updateTextStyles({ id, name, value, }) {
256
+ updateTextStyles({ id, name, value, isHydrationWrite, }) {
253
257
  const item = this.items.find((i) => i.id === id);
254
258
  if (!item) {
255
259
  return;
256
260
  }
261
+ // Same hydration-write contract as updateItemValue. The RTE's
262
+ // mount-time style sync (setInitialStyleSettings) lands here ~100ms
263
+ // BEFORE its canonical text write-back — if this write opens a plain
264
+ // capture burst, the flagged text write joins it and both commit as a
265
+ // phantom entry (BP-5810's second act).
266
+ if (isHydrationWrite) {
267
+ useHistoryStore().mergeNextMutation();
268
+ }
257
269
  item.settings.content[`${name}Style`] = vueDeepMerge(item.settings.content[`${name}Style`], value);
258
270
  this.validateItem({ id, name });
259
271
  this.onContentChanged();
@@ -265,21 +277,29 @@ export const useUiContentSettingsStore = defineStore('uiContentSettings', {
265
277
  }
266
278
  return item.settings.content[`${name}Style`];
267
279
  },
268
- updateTextItemTextStyleType({ id, name, value, index, }) {
280
+ updateTextItemTextStyleType({ id, name, value, index, isHydrationWrite, }) {
269
281
  const item = this.items.find((i) => i.id === id);
270
282
  if (!item) {
271
283
  return;
272
284
  }
285
+ // Same hydration-write contract as updateItemValue.
286
+ if (isHydrationWrite) {
287
+ useHistoryStore().mergeNextMutation();
288
+ }
273
289
  item.settings.content.textItems[index].textStyle.textStyleType =
274
290
  vueDeepMerge(item.settings.content.textItems[index].textStyle.textStyleType, value);
275
291
  this.validateItem({ id, name });
276
292
  this.onContentChanged();
277
293
  },
278
- updateTextItemTextStyleTypeWithStyles({ id, name, value, index, }) {
294
+ updateTextItemTextStyleTypeWithStyles({ id, name, value, index, isHydrationWrite, }) {
279
295
  const item = this.items.find((i) => i.id === id);
280
296
  if (!item) {
281
297
  return;
282
298
  }
299
+ // Same hydration-write contract as updateItemValue.
300
+ if (isHydrationWrite) {
301
+ useHistoryStore().mergeNextMutation();
302
+ }
283
303
  item.settings.content.textItems[index].textStyle = vueDeepMerge(item.settings.content.textItems[index].textStyle, value);
284
304
  this.validateItem({ id, name });
285
305
  this.onContentChanged();
@@ -4412,14 +4412,14 @@ declare const _default: import("vue").DefineComponent<{}, {
4412
4412
  resetMode(): void;
4413
4413
  updateItemValue(payload: import("../../../content-settings/models").UpdateItemValuePayload<unknown>): void;
4414
4414
  updateMultipleItemValues({ id, name, value, isHydrationWrite, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
4415
- updateTextStyleType({ id, name, value, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
4416
- updateTextStyles({ id, name, value, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
4415
+ updateTextStyleType({ id, name, value, isHydrationWrite, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
4416
+ updateTextStyles({ id, name, value, isHydrationWrite, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
4417
4417
  getTextStyles({ id, name }: {
4418
4418
  id: string;
4419
4419
  name: string;
4420
4420
  }): unknown;
4421
- updateTextItemTextStyleType({ id, name, value, index, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
4422
- updateTextItemTextStyleTypeWithStyles({ id, name, value, index, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
4421
+ updateTextItemTextStyleType({ id, name, value, index, isHydrationWrite, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
4422
+ updateTextItemTextStyleTypeWithStyles({ id, name, value, index, isHydrationWrite, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
4423
4423
  _setActiveCategoryTab({ activeCategoryTab, }: {
4424
4424
  activeCategoryTab: import("../../../../brand-page-maker/models").ItemCategory;
4425
4425
  }): void;
@@ -3788,14 +3788,14 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3788
3788
  resetMode(): void;
3789
3789
  updateItemValue(payload: UpdateItemValuePayload<unknown>): void;
3790
3790
  updateMultipleItemValues({ id, name, value, isHydrationWrite, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
3791
- updateTextStyleType({ id, name, value, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
3792
- updateTextStyles({ id, name, value, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
3791
+ updateTextStyleType({ id, name, value, isHydrationWrite, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
3792
+ updateTextStyles({ id, name, value, isHydrationWrite, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
3793
3793
  getTextStyles({ id, name }: {
3794
3794
  id: string;
3795
3795
  name: string;
3796
3796
  }): unknown;
3797
- updateTextItemTextStyleType({ id, name, value, index, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
3798
- updateTextItemTextStyleTypeWithStyles({ id, name, value, index, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
3797
+ updateTextItemTextStyleType({ id, name, value, index, isHydrationWrite, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
3798
+ updateTextItemTextStyleTypeWithStyles({ id, name, value, index, isHydrationWrite, }: import("../../../content-settings/models").UpdateMultipleItemValuesPayload<any>): void;
3799
3799
  _setActiveCategoryTab({ activeCategoryTab, }: {
3800
3800
  activeCategoryTab: import("../../../../brand-page-maker/models").ItemCategory;
3801
3801
  }): void;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@designcrowd/library.brand-page",
3
3
  "description": "A collection of Maker/Designer applications",
4
- "version": "6.0.6-undo-3",
4
+ "version": "6.0.6-undo-4",
5
5
  "author": "Design.com Eng",
6
6
  "license": "UNLICENSED",
7
7
  "type": "module",
@@ -625,7 +625,11 @@ export const useRichTextEditor = (
625
625
  );
626
626
 
627
627
  if (globalStyles) {
628
- // sync content settings style
628
+ // sync content settings style — a mount-time re-derivation, not a user
629
+ // edit. Flag it so the store folds it into the current undo head: this
630
+ // write lands ~100ms BEFORE the editor's canonical text write-back, and
631
+ // an unflagged write here would open a plain capture burst that
632
+ // swallows the flagged text write into a phantom entry (BP-5810).
629
633
  contentSettingStore.updateTextStyles({
630
634
  id: props.rawId,
631
635
  name: props.name,
@@ -639,6 +643,7 @@ export const useRichTextEditor = (
639
643
  lineHeight: globalStyles.lineHeight,
640
644
  letterSpacing: globalStyles.letterSpacing,
641
645
  },
646
+ isHydrationWrite: !editor.isFocused,
642
647
  });
643
648
 
644
649
  // sync toolbar editor styles
@@ -89,7 +89,7 @@ describe('content settings store — hydration writes arm the history merge', ()
89
89
  id: 'item-1',
90
90
  type: 'social-links',
91
91
  settings: {
92
- content: { title: '<p>old</p>' },
92
+ content: { title: '<p>old</p>', titleStyle: { fontSize: '2em' } },
93
93
  },
94
94
  });
95
95
 
@@ -156,6 +156,33 @@ describe('content settings store — hydration writes arm the history merge', ()
156
156
  expect(mergeNextMutationMock).not.toHaveBeenCalled();
157
157
  });
158
158
 
159
+ // The RTE's mount-time style sync (setInitialStyleSettings) writes through
160
+ // updateTextStyles ~100ms BEFORE the canonical text write-back. If it isn't
161
+ // armed, it opens a plain capture burst that swallows the flagged text
162
+ // write — the phantom's second act (BP-5810).
163
+ test('updateTextStyles honours the hydration-write contract', () => {
164
+ const store = setupStore();
165
+
166
+ store.updateTextStyles({
167
+ id: 'item-1',
168
+ name: 'title',
169
+ value: { fontSize: '2.25em' },
170
+ isHydrationWrite: true,
171
+ });
172
+
173
+ expect(mergeNextMutationMock).toHaveBeenCalledTimes(1);
174
+
175
+ mergeNextMutationMock.mockClear();
176
+
177
+ store.updateTextStyles({
178
+ id: 'item-1',
179
+ name: 'title',
180
+ value: { fontSize: '3em' },
181
+ });
182
+
183
+ expect(mergeNextMutationMock).not.toHaveBeenCalled();
184
+ });
185
+
159
186
  test('updateMultipleItemValues honours the same contract', () => {
160
187
  const store = setupStore();
161
188
 
@@ -434,6 +434,7 @@ export const useUiContentSettingsStore = defineStore('uiContentSettings', {
434
434
  id,
435
435
  name,
436
436
  value,
437
+ isHydrationWrite,
437
438
  }: UpdateMultipleItemValuesPayload<any>): void {
438
439
  const item = this.items.find((i) => i.id === id);
439
440
 
@@ -441,6 +442,11 @@ export const useUiContentSettingsStore = defineStore('uiContentSettings', {
441
442
  return;
442
443
  }
443
444
 
445
+ // Same hydration-write contract as updateItemValue.
446
+ if (isHydrationWrite) {
447
+ useHistoryStore().mergeNextMutation();
448
+ }
449
+
444
450
  item.settings.content[`${name}Style`].textStyleType = vueDeepMerge(
445
451
  item.settings.content,
446
452
  value,
@@ -452,6 +458,7 @@ export const useUiContentSettingsStore = defineStore('uiContentSettings', {
452
458
  id,
453
459
  name,
454
460
  value,
461
+ isHydrationWrite,
455
462
  }: UpdateMultipleItemValuesPayload<any>): void {
456
463
  const item = this.items.find((i) => i.id === id);
457
464
 
@@ -459,6 +466,15 @@ export const useUiContentSettingsStore = defineStore('uiContentSettings', {
459
466
  return;
460
467
  }
461
468
 
469
+ // Same hydration-write contract as updateItemValue. The RTE's
470
+ // mount-time style sync (setInitialStyleSettings) lands here ~100ms
471
+ // BEFORE its canonical text write-back — if this write opens a plain
472
+ // capture burst, the flagged text write joins it and both commit as a
473
+ // phantom entry (BP-5810's second act).
474
+ if (isHydrationWrite) {
475
+ useHistoryStore().mergeNextMutation();
476
+ }
477
+
462
478
  item.settings.content[`${name}Style`] = vueDeepMerge(
463
479
  item.settings.content[`${name}Style`],
464
480
  value,
@@ -480,6 +496,7 @@ export const useUiContentSettingsStore = defineStore('uiContentSettings', {
480
496
  name,
481
497
  value,
482
498
  index,
499
+ isHydrationWrite,
483
500
  }: UpdateMultipleItemValuesPayload<any>): void {
484
501
  const item = this.items.find((i) => i.id === id);
485
502
 
@@ -487,6 +504,11 @@ export const useUiContentSettingsStore = defineStore('uiContentSettings', {
487
504
  return;
488
505
  }
489
506
 
507
+ // Same hydration-write contract as updateItemValue.
508
+ if (isHydrationWrite) {
509
+ useHistoryStore().mergeNextMutation();
510
+ }
511
+
490
512
  item.settings.content.textItems[index!].textStyle.textStyleType =
491
513
  vueDeepMerge(
492
514
  item.settings.content.textItems[index!].textStyle.textStyleType,
@@ -500,6 +522,7 @@ export const useUiContentSettingsStore = defineStore('uiContentSettings', {
500
522
  name,
501
523
  value,
502
524
  index,
525
+ isHydrationWrite,
503
526
  }: UpdateMultipleItemValuesPayload<any>): void {
504
527
  const item = this.items.find((i) => i.id === id);
505
528
 
@@ -507,6 +530,11 @@ export const useUiContentSettingsStore = defineStore('uiContentSettings', {
507
530
  return;
508
531
  }
509
532
 
533
+ // Same hydration-write contract as updateItemValue.
534
+ if (isHydrationWrite) {
535
+ useHistoryStore().mergeNextMutation();
536
+ }
537
+
510
538
  item.settings.content.textItems[index!].textStyle = vueDeepMerge(
511
539
  item.settings.content.textItems[index!].textStyle,
512
540
  value,