docxodus 9.3.0 → 9.4.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.
@@ -4914,6 +4914,12 @@ var DocxodusEditor = (() => {
4914
4914
  /** Anchors the current drag source may legally move next to, per the engine's own rules.
4915
4915
  * Null when the bridge predates ValidMoveTargets — then every block is offered, as before. */
4916
4916
  this.blockMoveTargets = null;
4917
+ /** Memoized `ValidMoveTargets` answers, keyed by source anchor and dropped whenever an edit
4918
+ * lands. The legal-target set is a property of the document, so hovering back and forth over
4919
+ * the same blocks between edits must not re-ask the engine. */
4920
+ this.blockMoveTargetCache = /* @__PURE__ */ new Map();
4921
+ /** Cancels the pending idle prefetch of the hovered block's targets — see `showBlockHandle`. */
4922
+ this.blockMoveTargetPrefetch = null;
4917
4923
  /** Why the last move was refused, verbatim from the engine — diagnostics, not announcement copy. */
4918
4924
  this.lastMoveError = null;
4919
4925
  /**
@@ -5214,8 +5220,7 @@ var DocxodusEditor = (() => {
5214
5220
  return true;
5215
5221
  }
5216
5222
  const destination = res.created?.[0] ?? res.modified?.[0];
5217
- if (this.renderTrackedChanges) this.remount();
5218
- else this.reconcile();
5223
+ this.reconcile();
5219
5224
  const moved = destination ? this.bodyUnitNodes().find((el) => el.getAttribute("data-anchor") === destination.unid) : null;
5220
5225
  if (moved) {
5221
5226
  moved.classList.add("docx-block-move-flash");
@@ -5240,7 +5245,12 @@ var DocxodusEditor = (() => {
5240
5245
  const node = target instanceof Node ? target : null;
5241
5246
  const el = node?.nodeType === Node.ELEMENT_NODE ? node : node?.parentElement;
5242
5247
  if (!el || !this.editRoot.contains(el)) return null;
5243
- return this.bodyUnitNodes().find((unit) => unit === el || unit.contains(el)) ?? null;
5248
+ let unit = null;
5249
+ for (let candidate = el.closest("[data-anchor]"); candidate && this.editRoot.contains(candidate); candidate = candidate.parentElement?.closest("[data-anchor]") ?? null) {
5250
+ unit = candidate;
5251
+ }
5252
+ if (!unit || unit.closest("section.footnotes, section.endnotes")) return null;
5253
+ return unit;
5244
5254
  }
5245
5255
  isMovableBlockUnit(unit) {
5246
5256
  if (!unit || !this.anchorIdOf(unit)) return false;
@@ -5262,18 +5272,18 @@ var DocxodusEditor = (() => {
5262
5272
  if (!handle || !this.isMovableBlockUnit(unit)) return;
5263
5273
  const changed = unit !== this.blockDragSource;
5264
5274
  this.blockDragSource = unit;
5265
- if (changed) this.refreshBlockMoveTargets(unit);
5266
- if (this.blockMoveTargets?.size === 0) {
5275
+ const known = this.blockMoveTargetsFor(unit, { cachedOnly: true });
5276
+ if (known?.size === 0) {
5267
5277
  handle.style.display = "none";
5268
5278
  return;
5269
5279
  }
5280
+ if (changed && known === void 0) this.prefetchBlockMoveTargets(unit);
5270
5281
  const rect = unit.getBoundingClientRect();
5271
5282
  handle.style.display = "flex";
5272
5283
  handle.style.left = `${Math.max(4, rect.left - 32)}px`;
5273
5284
  handle.style.top = `${Math.max(4, rect.top + (unit.tagName === "TABLE" ? 6 : Math.max(0, (rect.height - 28) / 2)))}px`;
5274
5285
  const preview = (unit.textContent ?? "").trim().replace(/\s+/g, " ").slice(0, 48);
5275
5286
  handle.setAttribute("aria-label", preview ? `Move block: ${preview}` : "Move block");
5276
- if (changed) this.refreshBlockDropTargets();
5277
5287
  }
5278
5288
  hideBlockHandle() {
5279
5289
  if (this.blockDragging || this.blockMoveMenu?.style.display === "block") return;
@@ -5310,19 +5320,52 @@ var DocxodusEditor = (() => {
5310
5320
  * behaviour this replaces. Null (no bridge support) keeps the previous offer-everything path.
5311
5321
  */
5312
5322
  refreshBlockMoveTargets(source) {
5323
+ this.blockMoveTargets = source ? this.blockMoveTargetsFor(source) ?? null : null;
5324
+ }
5325
+ /**
5326
+ * This block's legal destinations, from the memo when it is there. Returns `undefined` — not
5327
+ * `null` — for "not asked yet", so a caller can tell an unknown answer from the engine's
5328
+ * "no bridge support, offer everything" one.
5329
+ */
5330
+ blockMoveTargetsFor(source, options = {}) {
5313
5331
  const bridge = this.exports.DocxSessionBridge;
5314
- const sourceId = source ? this.anchorIdOf(source) : null;
5315
- if (!sourceId || typeof bridge.ValidMoveTargets !== "function") {
5316
- this.blockMoveTargets = null;
5317
- return;
5318
- }
5332
+ const sourceId = this.anchorIdOf(source);
5333
+ if (!sourceId || typeof bridge.ValidMoveTargets !== "function") return null;
5334
+ if (this.blockMoveTargetCache.has(sourceId)) return this.blockMoveTargetCache.get(sourceId);
5335
+ if (options.cachedOnly) return void 0;
5336
+ let targets;
5319
5337
  try {
5320
- const targets = JSON.parse(bridge.ValidMoveTargets(this.handle, sourceId));
5321
- this.blockMoveTargets = new Map(
5322
- targets.map((t) => [t.anchorId, { before: t.before, after: t.after }])
5323
- );
5338
+ const parsed = JSON.parse(bridge.ValidMoveTargets(this.handle, sourceId));
5339
+ targets = new Map(parsed.map((t) => [t.anchorId, { before: t.before, after: t.after }]));
5324
5340
  } catch {
5325
- this.blockMoveTargets = null;
5341
+ targets = null;
5342
+ }
5343
+ this.blockMoveTargetCache.set(sourceId, targets);
5344
+ return targets;
5345
+ }
5346
+ /**
5347
+ * Ask for the hovered block's destinations off the interaction path, and hide the handle if
5348
+ * the answer comes back empty and that block is still the one under the pointer. The handle
5349
+ * therefore appears immediately on hover and withdraws a beat later on the rare immovable
5350
+ * block, instead of every hover paying for the query up front.
5351
+ */
5352
+ prefetchBlockMoveTargets(source) {
5353
+ const view = this.container.ownerDocument.defaultView;
5354
+ if (!view) return;
5355
+ this.blockMoveTargetPrefetch?.();
5356
+ const run = () => {
5357
+ this.blockMoveTargetPrefetch = null;
5358
+ if (this.closed || !source.isConnected || this.blockDragSource !== source) return;
5359
+ if (this.blockMoveTargetsFor(source)?.size === 0 && this.blockDragHandle)
5360
+ this.blockDragHandle.style.display = "none";
5361
+ };
5362
+ const idle = view;
5363
+ if (idle.requestIdleCallback && idle.cancelIdleCallback) {
5364
+ const id = idle.requestIdleCallback(run, { timeout: 500 });
5365
+ this.blockMoveTargetPrefetch = () => idle.cancelIdleCallback(id);
5366
+ } else {
5367
+ const id = view.setTimeout(run, 0);
5368
+ this.blockMoveTargetPrefetch = () => view.clearTimeout(id);
5326
5369
  }
5327
5370
  }
5328
5371
  /**
@@ -5412,7 +5455,8 @@ var DocxodusEditor = (() => {
5412
5455
  const index = units.indexOf(source);
5413
5456
  if (index < 0) return null;
5414
5457
  const position = action === "up" || action === "top" ? "before" : "after";
5415
- const candidates = units.filter((el) => el !== source && this.isValidMoveTarget(el, position)).filter((el) => position === "before" ? units.indexOf(el) < index : units.indexOf(el) > index);
5458
+ const side = position === "before" ? units.slice(0, index) : units.slice(index + 1);
5459
+ const candidates = side.filter((el) => this.isValidMoveTarget(el, position));
5416
5460
  if (candidates.length === 0) return null;
5417
5461
  if (action === "up") return { target: candidates[candidates.length - 1], position };
5418
5462
  if (action === "down") return { target: candidates[0], position };
@@ -5592,6 +5636,9 @@ var DocxodusEditor = (() => {
5592
5636
  this.refreshBlockDropTargets();
5593
5637
  }
5594
5638
  teardownBlockDrag() {
5639
+ this.blockMoveTargetPrefetch?.();
5640
+ this.blockMoveTargetPrefetch = null;
5641
+ this.blockMoveTargetCache.clear();
5595
5642
  for (const cleanup of this.blockDragTargetCleanup.splice(0)) cleanup();
5596
5643
  for (const cleanup of this.blockDragCleanup.splice(0)) cleanup();
5597
5644
  this.blockDragHandle?.remove();
@@ -6109,11 +6156,22 @@ var DocxodusEditor = (() => {
6109
6156
  }
6110
6157
  parseEdit(json) {
6111
6158
  try {
6112
- return JSON.parse(json);
6159
+ const result = JSON.parse(json);
6160
+ if (result.success) this.invalidateBlockMoveTargets();
6161
+ return result;
6113
6162
  } catch {
6114
6163
  return { success: false };
6115
6164
  }
6116
6165
  }
6166
+ /**
6167
+ * Drop the memoized `ValidMoveTargets` answers. Which blocks a block may move next to is a
6168
+ * fact about the DOCUMENT, so it survives hovering but not editing — and the two places a
6169
+ * document changes are `parseEdit` (every mutation that returns an `EditResult`) and
6170
+ * undo/redo, which return a bare boolean and so cannot go through it.
6171
+ */
6172
+ invalidateBlockMoveTargets() {
6173
+ this.blockMoveTargetCache.clear();
6174
+ }
6117
6175
  // ─── M5: formatting commands (ribbon) ────────────────────────────────
6118
6176
  // ─── Multi-block selection helpers (format a whole stack of paragraphs at once) ──────
6119
6177
  /**
@@ -6667,12 +6725,16 @@ var DocxodusEditor = (() => {
6667
6725
  /** Undo the last edit (incremental repaint; falls back to a full re-render). */
6668
6726
  undo() {
6669
6727
  if (this.closed) return;
6670
- if (this.exports.DocxSessionBridge.Undo(this.handle)) this.reconcile();
6728
+ if (!this.exports.DocxSessionBridge.Undo(this.handle)) return;
6729
+ this.invalidateBlockMoveTargets();
6730
+ this.reconcile();
6671
6731
  }
6672
6732
  /** Redo the last undone edit (incremental repaint; falls back to a full re-render). */
6673
6733
  redo() {
6674
6734
  if (this.closed) return;
6675
- if (this.exports.DocxSessionBridge.Redo(this.handle)) this.reconcile();
6735
+ if (!this.exports.DocxSessionBridge.Redo(this.handle)) return;
6736
+ this.invalidateBlockMoveTargets();
6737
+ this.reconcile();
6676
6738
  }
6677
6739
  // ─── Header/footer region commands (no-ops unless `headerFooter` is on) ───────────────
6678
6740
  /**
@@ -6901,7 +6963,11 @@ var DocxodusEditor = (() => {
6901
6963
  const oldTokens = oldNodes.map(_DocxEditor.domTokenOf);
6902
6964
  const oldKinds = oldNodes.map(_DocxEditor.domKindOf);
6903
6965
  const bodyDiff = diffUnits(oldTokens, plan.body);
6904
- if (needsRemount(bodyDiff, plan.body, oldKinds)) return this.bail("needsRemount (li change or churn)");
6966
+ if (needsRemount(bodyDiff, plan.body, oldKinds)) {
6967
+ return this.bail(
6968
+ `needsRemount (li change or churn): +${bodyDiff.added.length} -${bodyDiff.removed.length} ~${bodyDiff.substituted.length} moved=${bodyDiff.moved.length} of ${plan.body.length}`
6969
+ );
6970
+ }
6905
6971
  const fnState = this.notesDiff("footnotes", plan.footnotes);
6906
6972
  const enState = this.notesDiff("endnotes", plan.endnotes);
6907
6973
  if (fnState === null || enState === null) return this.bail("notes container unstampable/missing");
package/dist/editor.d.ts CHANGED
@@ -164,6 +164,12 @@ export declare class DocxEditor {
164
164
  /** Anchors the current drag source may legally move next to, per the engine's own rules.
165
165
  * Null when the bridge predates ValidMoveTargets — then every block is offered, as before. */
166
166
  private blockMoveTargets;
167
+ /** Memoized `ValidMoveTargets` answers, keyed by source anchor and dropped whenever an edit
168
+ * lands. The legal-target set is a property of the document, so hovering back and forth over
169
+ * the same blocks between edits must not re-ask the engine. */
170
+ private blockMoveTargetCache;
171
+ /** Cancels the pending idle prefetch of the hovered block's targets — see `showBlockHandle`. */
172
+ private blockMoveTargetPrefetch;
167
173
  /** Why the last move was refused, verbatim from the engine — diagnostics, not announcement copy. */
168
174
  lastMoveError: string | null;
169
175
  /**
@@ -280,6 +286,19 @@ export declare class DocxEditor {
280
286
  * behaviour this replaces. Null (no bridge support) keeps the previous offer-everything path.
281
287
  */
282
288
  private refreshBlockMoveTargets;
289
+ /**
290
+ * This block's legal destinations, from the memo when it is there. Returns `undefined` — not
291
+ * `null` — for "not asked yet", so a caller can tell an unknown answer from the engine's
292
+ * "no bridge support, offer everything" one.
293
+ */
294
+ private blockMoveTargetsFor;
295
+ /**
296
+ * Ask for the hovered block's destinations off the interaction path, and hide the handle if
297
+ * the answer comes back empty and that block is still the one under the pointer. The handle
298
+ * therefore appears immediately on hover and withdraws a beat later on the rare immovable
299
+ * block, instead of every hover paying for the query up front.
300
+ */
301
+ private prefetchBlockMoveTargets;
283
302
  /**
284
303
  * Whether `unit` is a legal destination for the current drag source — for a SPECIFIC side when
285
304
  * one is given. A cross-block range or a section break between the blocks can make one side
@@ -407,6 +426,13 @@ export declare class DocxEditor {
407
426
  /** The editable block immediately before `el` within its own root, or null. */
408
427
  private previousEditable;
409
428
  private parseEdit;
429
+ /**
430
+ * Drop the memoized `ValidMoveTargets` answers. Which blocks a block may move next to is a
431
+ * fact about the DOCUMENT, so it survives hovering but not editing — and the two places a
432
+ * document changes are `parseEdit` (every mutation that returns an `EditResult`) and
433
+ * undo/redo, which return a bare boolean and so cannot go through it.
434
+ */
435
+ private invalidateBlockMoveTargets;
410
436
  /**
411
437
  * Restore a cross-block selection after a native toolbar control took focus. The bookmark uses
412
438
  * stable anchor ids and content offsets, so it also survives incremental block swaps.
@@ -1 +1 @@
1
- {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAU1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAIjE,4FAA4F;AAC5F,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE;QACjB,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;QACjE,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;QACvC,eAAe,EAAE,MAAM,UAAU,CAAC;QAClC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QACpC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;QACpE,iBAAiB,EAAE,CACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,KACZ,MAAM,CAAC;QACZ,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QAC3E,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QAC3E,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QACxD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;QAChG;sGAC8F;QAC9F,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;QACpE,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;QAChG,WAAW,EAAE,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,KAChB,MAAM,CAAC;QACZ,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;QAC5E,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;QAC/E,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;QAC/D,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;QAClE,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QAC1F,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;QAC/E,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QAC/E,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;QAC1E,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;QACxE,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QAC9D,eAAe,EAAE,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,OAAO,KACtB,MAAM,CAAC;QACZ,wBAAwB,CAAC,EAAE,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,OAAO,EACzB,oBAAoB,EAAE,OAAO,KAC1B,MAAM,CAAC;QACZ,oFAAoF;QACpF,UAAU,CAAC,EAAE,CACX,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,OAAO,EACzB,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,MAAM,KACV,MAAM,CAAC;QACZ,mBAAmB,CAAC,EAAE,CACpB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,OAAO,EACzB,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,MAAM,EACb,oBAAoB,EAAE,OAAO,KAC1B,MAAM,CAAC;QACZ,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,CAAC;QACrC;2EACmE;QACnE,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,CAAC;QACnD,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAClC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAClC,wFAAwF;QACxF,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;QAC7D,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;QAC1F,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;QAC1F,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QACjG,yBAAyB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;QACpF,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QAC7E,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QAC/D,gEAAgE;QAChE,cAAc,CAAC,EAAE,CACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC;QACZ,aAAa,CAAC,EAAE,CACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC;QACZ;uFAC+E;QAC/E,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QACxC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,KAAK,MAAM,CAAC;QAC/E,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC;QAC1D,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;QACzC,gBAAgB,CAAC,EAAE,CACjB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,OAAO,KACtB,MAAM,CAAC;QACZ,yBAAyB,CAAC,EAAE,CAC1B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,OAAO,EACzB,oBAAoB,EAAE,OAAO,KAC1B,MAAM,CAAC;KACb,CAAC;IACF,iBAAiB,EAAE;QACjB,yBAAyB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC;KACvD,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kGAAkG;IAClG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iGAAiG;IACjG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qFAAqF;IACrF,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5D,4CAA4C;IAC5C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAClF;AAyHD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAqBlE;AA+TD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,aAAa,GAAG,WAAW,CAAC;AAE1G,6DAA6D;AAC7D,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AA+GtE,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CACuB;IAC/C,uFAAuF;IACvF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,yGAAyG;IACzG,OAAO,CAAC,QAAQ,CAAc;IAC9B,wFAAwF;IACxF,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB;;;;;OAKG;IACH,OAAO,CAAC,SAAS,CAAS;IAE1B,yFAAyF;IACzF,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,sBAAsB,CAAyB;IACvD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,oBAAoB,CAAS;IACrC;mGAC+F;IAC/F,OAAO,CAAC,gBAAgB,CAAiE;IACzF;;oEAEgE;IAChE,OAAO,CAAC,oBAAoB,CAA8E;IAC1G,gGAAgG;IAChG,OAAO,CAAC,uBAAuB,CAA6B;IAC5D,oGAAoG;IACpG,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa,CAA0E;IAE/F;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB,CAA4C;IAE3E,4FAA4F;IAC5F,OAAO,CAAC,aAAa,CAAwC;IAE7D,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAmC;IAEjD;yDACqD;IACrD,OAAO,CAAC,qBAAqB,CAAuB;IAEpD,OAAO;IAmBP,kGAAkG;IAClG,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAoChC;IAEF,kFAAkF;IAClF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAe1B;IAEF;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAe1B,+DAA+D;IAC/D,OAAO,CAAC,kBAAkB;IAQ1B;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAe1B;IAEF,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAYxB;IAEF;;uGAEmG;IACnG,OAAO,CAAC,eAAe;IAOvB;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAIjB,6EAA6E;IAC7E,OAAO,CAAC,WAAW;IAInB;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IAUpB,wEAAwE;IACxE,MAAM,CAAC,IAAI,CACT,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,iBAAsB,GAC9B,UAAU;IAyCb;;;;OAIG;IACH,MAAM,CAAC,SAAS,CACd,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,iBAAsB,GAC9B,UAAU;IAIb,gDAAgD;IAChD,IAAI,IAAI,UAAU;IAKlB,6EAA6E;IAC7E,KAAK,IAAI,IAAI;IAcb;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAOlC,uDAAuD;IACvD,IAAI,IAAI,IAAI,WAAW,CAEtB;IAED;;;;;;OAMG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,2FAA2F;IAC3F,SAAS,CACP,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAC3B,OAAO;IAuDV,2FAA2F;IAC3F,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,iBAAiB;IAOzB;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAI/B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAwBhC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,uBAAuB;IA8B/B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,iBAAiB;IAkBzB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,sBAAsB;IAW9B,yFAAyF;IACzF,OAAO,CAAC,eAAe;IAUvB,+FAA+F;IAC/F,OAAO,CAAC,cAAc;IA6JtB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,UAAU;IAIlB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAOlB,4EAA4E;IAC5E,OAAO,CAAC,YAAY;IAYpB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAOjB,2FAA2F;IAC3F,OAAO,CAAC,SAAS;IAwBjB,4FAA4F;IAC5F,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;IAyCjB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;IAcnB,iGAAiG;IACjG,OAAO,CAAC,WAAW;IA2DnB,OAAO,CAAC,SAAS;IAyDjB,sFAAsF;IACtF,OAAO,CAAC,aAAa;IAUrB,sFAAsF;IACtF,OAAO,CAAC,cAAc;IAMtB;;+EAE2E;IAC3E,OAAO,CAAC,iBAAiB;IAuBzB;;;;2CAIuC;IACvC,OAAO,CAAC,sBAAsB;IAM9B,+DAA+D;IAC/D,OAAO,CAAC,YAAY;IAoDpB,wEAAwE;IACxE,OAAO,CAAC,iBAAiB;IAiDzB;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAsCxB,2FAA2F;IAC3F,OAAO,CAAC,SAAS;IAOjB,qFAAqF;IACrF,OAAO,CAAC,UAAU;IAMlB,OAAO,KAAK,oBAAoB,GAE/B;IAED,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,cAAc;IAOtB;;;;6CAIyC;IACzC,OAAO,CAAC,SAAS;IAkCjB,+EAA+E;IAC/E,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,SAAS;IAUjB;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;IAQlC;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAelC;;;8EAG0E;IAC1E,OAAO,CAAC,cAAc;IA4BtB;;mFAE+E;IAC/E,OAAO,CAAC,qBAAqB;IAqB7B;;;8FAG0F;IAC1F,OAAO,CAAC,yBAAyB;IAejC;;;6EAGyE;IACzE,OAAO,CAAC,4BAA4B;IAiBpC;8FAC0F;IAC1F,OAAO,CAAC,iBAAiB;IAmBzB;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;IA2C1B;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI;IAwC7C;;;;OAIG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IA6B9B;;;;;;OAMG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA2BjC,+EAA+E;IAC/E,YAAY,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAI9C;;;;OAIG;IACH,oBAAoB,CAAC,MAAM,SAAK,EAAE,KAAK,SAAW,EAAE,QAAQ,GAAE,OAAO,GAAG,OAAiB,GAAG,IAAI;IAwBhG;;;;OAIG;IACH,WAAW,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,aAAa,CAAC,EAAE,eAAe,CAAC;QAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,GACA,IAAI;IA8BP,0FAA0F;IAC1F,OAAO,CAAC,SAAS;IAcjB,6EAA6E;IAC7E,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI;IAM9C,qFAAqF;IACrF,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAMhD,qGAAqG;IACrG,cAAc,IAAI,IAAI;IAItB,2GAA2G;IAC3G,iBAAiB,IAAI,IAAI;IAIzB;;;;;OAKG;IACH,MAAM,CAAC,UAAU,SAAM,GAAG,IAAI;IAQ9B,wFAAwF;IACxF,OAAO,CAAC,YAAY;IAgBpB,6DAA6D;IAC7D,eAAe,CAAC,KAAK,UAAO,GAAG,IAAI;IAInC;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI;IA2B5C;;mGAE+F;IAC/F,qBAAqB,IAAI,IAAI;IAI7B;;;;;;OAMG;IACH,WAAW,IAAI,IAAI;IAenB;;;;;;;;;OASG;IACH,cAAc,CAAC,QAAQ,SAAkB,GAAG,IAAI;IAIhD,gGAAgG;IAChG,aAAa,CAAC,QAAQ,SAAiB,GAAG,IAAI;IAI9C,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,oBAAoB;IAmC5B;mDAC+C;IAC/C,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAuBxC,gFAAgF;IAChF,IAAI,IAAI,IAAI;IAOZ,uFAAuF;IACvF,IAAI,IAAI,IAAI;IASZ;;;;;OAKG;IACH,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAKnE,kFAAkF;IAClF,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,GAAG,IAAI;IAI3D;;;OAGG;IACH,gBAAgB,CAAC,KAAK,GAAE,aAAa,GAAG,YAA4B,GAAG,IAAI;IAc3E;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,YAAY,CAAA;KAAE,GAAG,IAAI;IAKrE;2DACuD;IACvD,kBAAkB,IAAI,IAAI;IAK1B;kFAC8E;IAC9E,aAAa,IAAI;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,YAAY,CAAA;KAAE;IAI1D,2FAA2F;IAC3F,gBAAgB,IAAI,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;IAa9C,yFAAyF;IACzF,OAAO,CAAC,SAAS;IAuBjB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAuCtB,0FAA0F;IAC1F,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAMlB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAanB,oFAAoF;IACpF,OAAO,CAAC,YAAY;IAUpB;;0BAEsB;IACtB,OAAO,CAAC,aAAa;IASrB,8EAA8E;IAC9E,OAAO,CAAC,MAAM,CAAC,UAAU;IAMzB;0BACsB;IACtB,OAAO,CAAC,MAAM,CAAC,SAAS;IAKxB,OAAO,CAAC,MAAM,CAAC,cAAc;IAK7B;;;;OAIG;IACH,OAAO,CAAC,SAAS;IA0BjB,uEAAuE;IACvE,OAAO,CAAC,aAAa;IA+FrB,OAAO,CAAC,IAAI;IAKZ;;iFAE6E;IAC7E,OAAO,CAAC,aAAa;IAcrB;uFACmF;IACnF,OAAO,CAAC,MAAM,CAAC,UAAU;IAMzB;;4EAEwE;IACxE,OAAO,CAAC,aAAa;IA0GrB;;kDAE8C;IAC9C,OAAO,CAAC,QAAQ;IAOhB;iCAC6B;IAC7B,OAAO,CAAC,SAAS;IAmBjB,uFAAuF;IACvF,OAAO,CAAC,cAAc;IA2BtB;;wEAEoE;IACpE,OAAO,CAAC,WAAW;IAkBnB;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAwC1B;2EACuE;IACvE,OAAO,CAAC,kBAAkB;IAK1B;;iEAE6D;IAC7D,OAAO,CAAC,cAAc;IA+BtB;;;;;OAKG;IACH,OAAO,CAAC,OAAO;CAoBhB"}
package/dist/editor.js CHANGED
@@ -565,6 +565,12 @@ export class DocxEditor {
565
565
  /** Anchors the current drag source may legally move next to, per the engine's own rules.
566
566
  * Null when the bridge predates ValidMoveTargets — then every block is offered, as before. */
567
567
  this.blockMoveTargets = null;
568
+ /** Memoized `ValidMoveTargets` answers, keyed by source anchor and dropped whenever an edit
569
+ * lands. The legal-target set is a property of the document, so hovering back and forth over
570
+ * the same blocks between edits must not re-ask the engine. */
571
+ this.blockMoveTargetCache = new Map();
572
+ /** Cancels the pending idle prefetch of the hovered block's targets — see `showBlockHandle`. */
573
+ this.blockMoveTargetPrefetch = null;
568
574
  /** Why the last move was refused, verbatim from the engine — diagnostics, not announcement copy. */
569
575
  this.lastMoveError = null;
570
576
  /**
@@ -890,13 +896,12 @@ export class DocxEditor {
890
896
  return true;
891
897
  }
892
898
  const destination = res.created?.[0] ?? res.modified?.[0];
893
- // Review rendering creates a visible move-from and move-to pair. A full remount keeps
894
- // their revision wrappers and table-row styling canonical; direct moves use the ordered
895
- // incremental reconciler and retain the exact existing DOM node.
896
- if (this.renderTrackedChanges)
897
- this.remount();
898
- else
899
- this.reconcile();
899
+ // Both modes reconcile. A direct move relocates the existing element, so the reconciler moves
900
+ // the exact DOM node it already has. Review rendering additionally rewrites the SOURCE in
901
+ // place it becomes the move-from half — and that is visible to the diff because the plan
902
+ // signs every unit with a content hash, so the source diffs as an in-place substitution.
903
+ // This used to remount, which on a real charter is seconds for a one-block change.
904
+ this.reconcile();
900
905
  const moved = destination
901
906
  ? this.bodyUnitNodes().find((el) => el.getAttribute("data-anchor") === destination.unid)
902
907
  : null;
@@ -928,7 +933,15 @@ export class DocxEditor {
928
933
  : node?.parentElement;
929
934
  if (!el || !this.editRoot.contains(el))
930
935
  return null;
931
- return this.bodyUnitNodes().find((unit) => unit === el || unit.contains(el)) ?? null;
936
+ // Climb rather than scan: this runs on every pointer move over the document, and listing
937
+ // every anchored node to find the one containing the pointer is linear in the document.
938
+ let unit = null;
939
+ for (let candidate = el.closest("[data-anchor]"); candidate && this.editRoot.contains(candidate); candidate = candidate.parentElement?.closest("[data-anchor]") ?? null) {
940
+ unit = candidate;
941
+ }
942
+ if (!unit || unit.closest("section.footnotes, section.endnotes"))
943
+ return null;
944
+ return unit;
932
945
  }
933
946
  isMovableBlockUnit(unit) {
934
947
  if (!unit || !this.anchorIdOf(unit))
@@ -956,23 +969,27 @@ export class DocxEditor {
956
969
  return;
957
970
  const changed = unit !== this.blockDragSource;
958
971
  this.blockDragSource = unit;
959
- if (changed)
960
- this.refreshBlockMoveTargets(unit);
961
972
  // A block the engine will not move anywhere — one owning a section break, or already carrying
962
973
  // revision markup a tracked move would have to re-wrap — gets no handle rather than a handle
963
- // that always fails.
964
- if (this.blockMoveTargets?.size === 0) {
974
+ // that always fails. Asking costs an engine round trip, so hovering only ever CONSUMES a
975
+ // cached answer and schedules the ask for idle time; the drag start and the menu ask for
976
+ // real. Merely moving the pointer across the document must not run document-scale work.
977
+ const known = this.blockMoveTargetsFor(unit, { cachedOnly: true });
978
+ if (known?.size === 0) {
965
979
  handle.style.display = "none";
966
980
  return;
967
981
  }
982
+ if (changed && known === undefined)
983
+ this.prefetchBlockMoveTargets(unit);
968
984
  const rect = unit.getBoundingClientRect();
969
985
  handle.style.display = "flex";
970
986
  handle.style.left = `${Math.max(4, rect.left - 32)}px`;
971
987
  handle.style.top = `${Math.max(4, rect.top + (unit.tagName === "TABLE" ? 6 : Math.max(0, (rect.height - 28) / 2)))}px`;
972
988
  const preview = (unit.textContent ?? "").trim().replace(/\s+/g, " ").slice(0, 48);
973
989
  handle.setAttribute("aria-label", preview ? `Move block: ${preview}` : "Move block");
974
- if (changed)
975
- this.refreshBlockDropTargets();
990
+ // Drop targets are registered when a drag actually begins (and once at mount), not on
991
+ // hover: re-registering one listener per body block every time the pointer crosses a
992
+ // paragraph boundary is work no drop can use.
976
993
  }
977
994
  hideBlockHandle() {
978
995
  if (this.blockDragging || this.blockMoveMenu?.style.display === "block")
@@ -1013,18 +1030,60 @@ export class DocxEditor {
1013
1030
  * behaviour this replaces. Null (no bridge support) keeps the previous offer-everything path.
1014
1031
  */
1015
1032
  refreshBlockMoveTargets(source) {
1033
+ this.blockMoveTargets = source ? this.blockMoveTargetsFor(source) ?? null : null;
1034
+ }
1035
+ /**
1036
+ * This block's legal destinations, from the memo when it is there. Returns `undefined` — not
1037
+ * `null` — for "not asked yet", so a caller can tell an unknown answer from the engine's
1038
+ * "no bridge support, offer everything" one.
1039
+ */
1040
+ blockMoveTargetsFor(source, options = {}) {
1016
1041
  const bridge = this.exports.DocxSessionBridge;
1017
- const sourceId = source ? this.anchorIdOf(source) : null;
1018
- if (!sourceId || typeof bridge.ValidMoveTargets !== "function") {
1019
- this.blockMoveTargets = null;
1020
- return;
1021
- }
1042
+ const sourceId = this.anchorIdOf(source);
1043
+ if (!sourceId || typeof bridge.ValidMoveTargets !== "function")
1044
+ return null;
1045
+ if (this.blockMoveTargetCache.has(sourceId))
1046
+ return this.blockMoveTargetCache.get(sourceId);
1047
+ if (options.cachedOnly)
1048
+ return undefined;
1049
+ let targets;
1022
1050
  try {
1023
- const targets = JSON.parse(bridge.ValidMoveTargets(this.handle, sourceId));
1024
- this.blockMoveTargets = new Map(targets.map((t) => [t.anchorId, { before: t.before, after: t.after }]));
1051
+ const parsed = JSON.parse(bridge.ValidMoveTargets(this.handle, sourceId));
1052
+ targets = new Map(parsed.map((t) => [t.anchorId, { before: t.before, after: t.after }]));
1025
1053
  }
1026
1054
  catch {
1027
- this.blockMoveTargets = null;
1055
+ targets = null;
1056
+ }
1057
+ this.blockMoveTargetCache.set(sourceId, targets);
1058
+ return targets;
1059
+ }
1060
+ /**
1061
+ * Ask for the hovered block's destinations off the interaction path, and hide the handle if
1062
+ * the answer comes back empty and that block is still the one under the pointer. The handle
1063
+ * therefore appears immediately on hover and withdraws a beat later on the rare immovable
1064
+ * block, instead of every hover paying for the query up front.
1065
+ */
1066
+ prefetchBlockMoveTargets(source) {
1067
+ const view = this.container.ownerDocument.defaultView;
1068
+ if (!view)
1069
+ return;
1070
+ this.blockMoveTargetPrefetch?.();
1071
+ const run = () => {
1072
+ this.blockMoveTargetPrefetch = null;
1073
+ // The pointer has moved on (or the DOM was repainted) — the answer is no longer wanted.
1074
+ if (this.closed || !source.isConnected || this.blockDragSource !== source)
1075
+ return;
1076
+ if (this.blockMoveTargetsFor(source)?.size === 0 && this.blockDragHandle)
1077
+ this.blockDragHandle.style.display = "none";
1078
+ };
1079
+ const idle = view;
1080
+ if (idle.requestIdleCallback && idle.cancelIdleCallback) {
1081
+ const id = idle.requestIdleCallback(run, { timeout: 500 });
1082
+ this.blockMoveTargetPrefetch = () => idle.cancelIdleCallback(id);
1083
+ }
1084
+ else {
1085
+ const id = view.setTimeout(run, 0);
1086
+ this.blockMoveTargetPrefetch = () => view.clearTimeout(id);
1028
1087
  }
1029
1088
  }
1030
1089
  /**
@@ -1126,11 +1185,8 @@ export class DocxEditor {
1126
1185
  // Only pairs the engine accepts: a target can be reachable on one side and refused on the
1127
1186
  // other, so the SIDE is part of what makes a candidate valid.
1128
1187
  const position = action === "up" || action === "top" ? "before" : "after";
1129
- const candidates = units
1130
- .filter((el) => el !== source && this.isValidMoveTarget(el, position))
1131
- .filter((el) => (position === "before"
1132
- ? units.indexOf(el) < index
1133
- : units.indexOf(el) > index));
1188
+ const side = position === "before" ? units.slice(0, index) : units.slice(index + 1);
1189
+ const candidates = side.filter((el) => this.isValidMoveTarget(el, position));
1134
1190
  if (candidates.length === 0)
1135
1191
  return null;
1136
1192
  if (action === "up")
@@ -1316,6 +1372,9 @@ export class DocxEditor {
1316
1372
  this.refreshBlockDropTargets();
1317
1373
  }
1318
1374
  teardownBlockDrag() {
1375
+ this.blockMoveTargetPrefetch?.();
1376
+ this.blockMoveTargetPrefetch = null;
1377
+ this.blockMoveTargetCache.clear();
1319
1378
  for (const cleanup of this.blockDragTargetCleanup.splice(0))
1320
1379
  cleanup();
1321
1380
  for (const cleanup of this.blockDragCleanup.splice(0))
@@ -1951,12 +2010,24 @@ export class DocxEditor {
1951
2010
  }
1952
2011
  parseEdit(json) {
1953
2012
  try {
1954
- return JSON.parse(json);
2013
+ const result = JSON.parse(json);
2014
+ if (result.success)
2015
+ this.invalidateBlockMoveTargets();
2016
+ return result;
1955
2017
  }
1956
2018
  catch {
1957
2019
  return { success: false };
1958
2020
  }
1959
2021
  }
2022
+ /**
2023
+ * Drop the memoized `ValidMoveTargets` answers. Which blocks a block may move next to is a
2024
+ * fact about the DOCUMENT, so it survives hovering but not editing — and the two places a
2025
+ * document changes are `parseEdit` (every mutation that returns an `EditResult`) and
2026
+ * undo/redo, which return a bare boolean and so cannot go through it.
2027
+ */
2028
+ invalidateBlockMoveTargets() {
2029
+ this.blockMoveTargetCache.clear();
2030
+ }
1960
2031
  // ─── M5: formatting commands (ribbon) ────────────────────────────────
1961
2032
  // ─── Multi-block selection helpers (format a whole stack of paragraphs at once) ──────
1962
2033
  /**
@@ -2544,15 +2615,19 @@ export class DocxEditor {
2544
2615
  undo() {
2545
2616
  if (this.closed)
2546
2617
  return;
2547
- if (this.exports.DocxSessionBridge.Undo(this.handle))
2548
- this.reconcile();
2618
+ if (!this.exports.DocxSessionBridge.Undo(this.handle))
2619
+ return;
2620
+ this.invalidateBlockMoveTargets();
2621
+ this.reconcile();
2549
2622
  }
2550
2623
  /** Redo the last undone edit (incremental repaint; falls back to a full re-render). */
2551
2624
  redo() {
2552
2625
  if (this.closed)
2553
2626
  return;
2554
- if (this.exports.DocxSessionBridge.Redo(this.handle))
2555
- this.reconcile();
2627
+ if (!this.exports.DocxSessionBridge.Redo(this.handle))
2628
+ return;
2629
+ this.invalidateBlockMoveTargets();
2630
+ this.reconcile();
2556
2631
  }
2557
2632
  // ─── Header/footer region commands (no-ops unless `headerFooter` is on) ───────────────
2558
2633
  /**
@@ -2783,8 +2858,12 @@ export class DocxEditor {
2783
2858
  const oldTokens = oldNodes.map(DocxEditor.domTokenOf);
2784
2859
  const oldKinds = oldNodes.map(DocxEditor.domKindOf);
2785
2860
  const bodyDiff = diffUnits(oldTokens, plan.body);
2786
- if (needsRemount(bodyDiff, plan.body, oldKinds))
2787
- return this.bail("needsRemount (li change or churn)");
2861
+ if (needsRemount(bodyDiff, plan.body, oldKinds)) {
2862
+ // Name the shape, not just the verdict: "churn" and "a list item moved in or out" are very
2863
+ // different findings when a repaint unexpectedly costs a whole-document render.
2864
+ return this.bail(`needsRemount (li change or churn): +${bodyDiff.added.length} -${bodyDiff.removed.length} ` +
2865
+ `~${bodyDiff.substituted.length} moved=${bodyDiff.moved.length} of ${plan.body.length}`);
2866
+ }
2788
2867
  const fnState = this.notesDiff("footnotes", plan.footnotes);
2789
2868
  const enState = this.notesDiff("endnotes", plan.endnotes);
2790
2869
  if (fnState === null || enState === null)