@eigenpal/docx-editor-vue 1.2.1 → 1.3.1

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 (35) hide show
  1. package/dist/{KeyboardShortcutsDialog-5ZsgieYf.js → KeyboardShortcutsDialog-00eb4Ova.js} +23 -0
  2. package/dist/KeyboardShortcutsDialog-EW9K4wuO.cjs +1 -0
  3. package/dist/MenuBar-DeogoqFP.js +3330 -0
  4. package/dist/MenuBar-bU4-4dnA.cjs +4 -0
  5. package/dist/{TablePropertiesDialog-DTCcLpPC.cjs → TablePropertiesDialog-BZLpFAkg.cjs} +1 -1
  6. package/dist/{TablePropertiesDialog-PR4ftalH.js → TablePropertiesDialog-CBTvM4Xy.js} +1 -1
  7. package/dist/composables/useCommentLifecycle.d.ts +3 -0
  8. package/dist/composables/useCommentManagement.d.ts +6 -0
  9. package/dist/composables/useFormattingActions.d.ts +2 -22
  10. package/dist/composables/useMenuActions.d.ts +1 -0
  11. package/dist/composables/useSelectionSync.d.ts +16 -0
  12. package/dist/composables/useWatermarkControls.d.ts +15 -0
  13. package/dist/composables.cjs +1 -1
  14. package/dist/composables.js +124 -209
  15. package/dist/dialogs.cjs +1 -1
  16. package/dist/dialogs.js +2 -2
  17. package/dist/docx-editor-vue.css +1 -1
  18. package/dist/index.cjs +9 -10
  19. package/dist/index.js +1373 -1210
  20. package/dist/ui.cjs +1 -1
  21. package/dist/ui.js +3 -3
  22. package/dist/useCommentSidebarItems-BHomCzpj.js +44 -0
  23. package/dist/useCommentSidebarItems-CbNvNCd3.cjs +1 -0
  24. package/dist/useDragAutoScroll-BT6oPYBj.cjs +1 -0
  25. package/dist/useDragAutoScroll-C56F_WS_.js +493 -0
  26. package/dist/utils/domQueries.d.ts +17 -6
  27. package/dist/utils/refApiQueries.d.ts +8 -44
  28. package/package.json +4 -4
  29. package/dist/KeyboardShortcutsDialog-DiG-tfJT.cjs +0 -1
  30. package/dist/MenuBar-DLXxthZk.js +0 -3365
  31. package/dist/MenuBar-De3YJFpj.cjs +0 -4
  32. package/dist/useTableResize-BcBdSaOE.js +0 -583
  33. package/dist/useTableResize-DTag4SY0.cjs +0 -1
  34. package/dist/utils/commentFactories.d.ts +0 -7
  35. package/dist/utils/paraTextHelpers.d.ts +0 -29
@@ -0,0 +1,493 @@
1
+ import { computed as e, onBeforeUnmount as t, onMounted as n, ref as r, shallowRef as i, unref as a, watch as o } from "vue";
2
+ import { EditorState as s } from "prosemirror-state";
3
+ import { getColumns as c, getMargins as l, getPageSize as u, measureTableBlock as d, resolveHeaderFooter as f } from "@eigenpal/docx-editor-core/layout-bridge";
4
+ import { applySdtFocus as p, buildBlockLookup as m, enclosingSdtGroupIds as h } from "@eigenpal/docx-editor-core/layout-painter";
5
+ import { createEmptyDoc as g, headerFooterToProseDoc as _, proseDocToBlocks as v, toProseDoc as y } from "@eigenpal/docx-editor-core/prosemirror/conversion";
6
+ import { schema as b } from "@eigenpal/docx-editor-core/prosemirror";
7
+ import { EditorView as x } from "prosemirror-view";
8
+ import { parseDocx as S } from "@eigenpal/docx-editor-core/docx/parser";
9
+ import { fromProseDoc as C } from "@eigenpal/docx-editor-core/prosemirror/conversion/fromProseDoc";
10
+ import { singletonManager as w } from "@eigenpal/docx-editor-core/prosemirror/schema";
11
+ import { createDocumentStylesPlugin as T, createSuggestionModePlugin as E, setSuggestionMode as ee } from "@eigenpal/docx-editor-core/prosemirror/plugins";
12
+ import { ExtensionManager as te, createStarterKit as ne } from "@eigenpal/docx-editor-core/prosemirror/extensions";
13
+ import { measureBlocksWithFloats as D, measureParagraph as O } from "@eigenpal/docx-editor-core/layout-bridge/measuring";
14
+ import { computeLayout as re, createLayoutScheduler as k, stripScrollFlag as ie } from "@eigenpal/docx-editor-core/editor";
15
+ import { DEFAULT_TEXTBOX_MARGINS as A, DEFAULT_TEXTBOX_WIDTH as j, assertExhaustiveFlowBlock as M } from "@eigenpal/docx-editor-core/layout-engine";
16
+ import { renderPages as ae } from "@eigenpal/docx-editor-core/layout-painter/renderPage";
17
+ import "prosemirror-view/style/prosemirror.css";
18
+ import "@eigenpal/docx-editor-core/prosemirror/editor.css";
19
+ import { MIN_CELL_WIDTH_TWIPS as N, MIN_ROW_HEIGHT_TWIPS as P, TWIPS_PER_PIXEL as F, commitColumnResize as oe, commitRightEdgeResize as I, commitRowResize as L, readColumnWidthAt as R, readColumnWidths as z, readRowHeight as B } from "@eigenpal/docx-editor-core/prosemirror/tableResize";
20
+ import { findVerticalScrollParent as V } from "@eigenpal/docx-editor-core/utils/findVerticalScrollParent";
21
+ import { AUTO_SCROLL_EDGE_ZONE as H, computeAutoScrollDelta as U } from "@eigenpal/docx-editor-core/utils/autoScroll";
22
+ //#region src/composables/useDocxEditor.ts
23
+ var se = 24;
24
+ function W(e, t, n, r) {
25
+ switch (e.kind) {
26
+ case "paragraph": return O(e, t, {
27
+ floatingZones: n,
28
+ paragraphYOffset: r ?? 0
29
+ });
30
+ case "table": return d(e, t, W);
31
+ case "image": {
32
+ let t = e;
33
+ return {
34
+ kind: "image",
35
+ width: t.width ?? 100,
36
+ height: t.height ?? 100
37
+ };
38
+ }
39
+ case "textBox": {
40
+ let t = e, n = t.margins ?? A, r = (t.width ?? j) - n.left - n.right, i = t.content.map((e) => O(e, r)), a = i.reduce((e, t) => e + t.totalHeight, 0), o = t.height ?? a + n.top + n.bottom;
41
+ return {
42
+ kind: "textBox",
43
+ width: t.width ?? j,
44
+ height: o,
45
+ innerMeasures: i
46
+ };
47
+ }
48
+ case "pageBreak": return { kind: "pageBreak" };
49
+ case "columnBreak": return { kind: "columnBreak" };
50
+ case "sectionBreak": return { kind: "sectionBreak" };
51
+ default: M(e, "vue useDocxEditor measureBlock");
52
+ }
53
+ }
54
+ function ce(e, t, n) {
55
+ return D(e, t, W, n);
56
+ }
57
+ function G(e) {
58
+ let { hiddenContainer: n, pagesContainer: d, readOnly: D = !1, pageGap: O = se, onChange: A, onError: j, onSelectionUpdate: M, externalPlugins: N = [], syncCoordinator: P, editorMode: F, author: oe } = e, I = i(null), L = i(null), R = i(null), z = r(!1), B = r(null), V = i(null), H = w;
59
+ function U(e) {
60
+ let t = d.value;
61
+ if (!t || !I.value) return;
62
+ let n = P?.getStateSeq() ?? 0;
63
+ P?.onLayoutStart();
64
+ let r = I.value.package?.document, i = r?.sections?.[0]?.properties ?? r?.finalSectionProperties ?? null, a = r?.finalSectionProperties ?? i, o = u(i), s = l(i), g = u(a), _ = l(a), v = c(i), y = c(a), b = o.w - s.left - s.right, x = I.value.package?.theme ?? null, S = I.value.package?.styles ?? null;
65
+ try {
66
+ let { header: n, footer: r, firstHeader: c, firstFooter: l } = f(I.value, i), { blocks: u, measures: d, layout: C, headerContentForRender: w, footerContentForRender: T, firstPageHeaderForRender: E, firstPageFooterForRender: ee, hasTitlePg: te, watermark: ne, footnotesByPage: D } = re({
67
+ state: e,
68
+ document: I.value,
69
+ pageSize: o,
70
+ margins: s,
71
+ columns: v,
72
+ finalPageSize: g,
73
+ finalMargins: _,
74
+ finalColumns: y,
75
+ pageGap: O,
76
+ contentWidth: b,
77
+ theme: x,
78
+ styles: S,
79
+ sectionProperties: i,
80
+ finalSectionProperties: a,
81
+ headerContent: n,
82
+ footerContent: r,
83
+ firstPageHeaderContent: c,
84
+ firstPageFooterContent: l,
85
+ measureBlocks: ce,
86
+ getHfPmDoc: (e) => X(e)?.state.doc ?? null
87
+ });
88
+ V.value = C;
89
+ let k = m(u, d);
90
+ ae(C.pages, t, {
91
+ pageGap: O,
92
+ showShadow: !0,
93
+ pageBackground: "#fff",
94
+ blockLookup: k,
95
+ theme: x,
96
+ headerContent: w,
97
+ footerContent: T,
98
+ firstPageHeaderContent: E,
99
+ firstPageFooterContent: ee,
100
+ titlePage: te,
101
+ watermark: ne,
102
+ footnotesByPage: D
103
+ }), t.style.overflowY = "auto", t.style.minHeight = "0";
104
+ for (let e of Array.from(t.children)) e.style.flexShrink = "0";
105
+ p(t, h(e.doc, e.selection.from, e.selection.to));
106
+ } catch (e) {
107
+ console.error("[useDocxEditor] Layout pipeline error:", e), j?.(e instanceof Error ? e : Error(String(e)));
108
+ } finally {
109
+ P?.onLayoutComplete(n);
110
+ }
111
+ }
112
+ let W = k(U);
113
+ function G() {
114
+ let e = n.value;
115
+ if (!e) return;
116
+ let t = I.value?.package?.styles, r = I.value ? y(I.value, { styles: t ?? void 0 }) : g(), i = E(!1), o = T(t), c = [
117
+ i,
118
+ ...N,
119
+ ...H.getPlugins() ?? [],
120
+ o
121
+ ], l = s.create({
122
+ doc: r,
123
+ schema: H.getSchema(),
124
+ plugins: c
125
+ });
126
+ R.value = l;
127
+ let u = new x(e, {
128
+ state: l,
129
+ editable: () => !a(D),
130
+ dispatchTransaction(e) {
131
+ if (!u) return;
132
+ ie(e, u.state.tr);
133
+ let t = u.state.apply(e);
134
+ if (u.updateState(t), R.value = t, e.docChanged) {
135
+ P?.incrementStateSeq(), W.schedule(t);
136
+ try {
137
+ if (I.value) {
138
+ let e = C(t.doc, I.value);
139
+ I.value = e, A?.(e);
140
+ }
141
+ } catch (e) {
142
+ console.error("[useDocxEditor] fromProseDoc error:", e);
143
+ }
144
+ }
145
+ if (P?.requestRender(), M?.(), !e.docChanged) {
146
+ let e = d.value;
147
+ e && p(e, h(t.doc, t.selection.from, t.selection.to));
148
+ }
149
+ }
150
+ });
151
+ L.value = u, z.value = !0, U(l), P?.requestRender();
152
+ }
153
+ o([
154
+ () => a(F),
155
+ () => a(oe),
156
+ L
157
+ ], ([e, t, n]) => {
158
+ n && ee(e === "suggesting", n.state, n.dispatch, t);
159
+ }, { immediate: !0 });
160
+ function K() {
161
+ W.cancel(), L.value &&= (L.value.destroy(), null), R.value = null, z.value = !1;
162
+ }
163
+ let q = { current: null }, J = /* @__PURE__ */ new Map(), Y = /* @__PURE__ */ new Map();
164
+ function le() {
165
+ if (q.current && q.current.isConnected) return q.current;
166
+ let e = window.document.createElement("div");
167
+ return e.dataset.hfHost = "true", e.style.cssText = "position: fixed; left: -9999px; top: 0; opacity: 0; z-index: -1; pointer-events: none;", window.document.body.appendChild(e), q.current = e, e;
168
+ }
169
+ function ue(e) {
170
+ let t = I.value?.package;
171
+ if (!t) return null;
172
+ if (t.headers) {
173
+ for (let [n, r] of t.headers) if (r === e) return n;
174
+ }
175
+ if (t.footers) {
176
+ for (let [n, r] of t.footers) if (r === e) return n;
177
+ }
178
+ return null;
179
+ }
180
+ function X(e) {
181
+ let t = ue(e);
182
+ return t ? J.get(t) ?? null : null;
183
+ }
184
+ function Z() {
185
+ let e = I.value?.package, t = le(), n = /* @__PURE__ */ new Set();
186
+ if (e?.headers) for (let t of e.headers.keys()) n.add(t);
187
+ if (e?.footers) for (let t of e.footers.keys()) n.add(t);
188
+ for (let [e, t] of J) n.has(e) || (t.destroy(), t.dom.parentElement?.remove(), Y.get(e)?.destroy(), Y.delete(e), J.delete(e));
189
+ if (!e) return;
190
+ let r = e.styles ?? null, i = e.theme ?? null, a = e.settings?.defaultTabStop ?? null;
191
+ for (let o of n) {
192
+ if (J.has(o)) continue;
193
+ let n = e.headers?.get(o) ?? e.footers?.get(o);
194
+ if (!n) continue;
195
+ let c = e.headers?.has(o) ? "header" : "footer", l = new te(ne());
196
+ l.buildSchema(), l.initializeRuntime(), Y.set(o, l);
197
+ let u = window.document.createElement("div");
198
+ u.dataset.hfRId = o, u.dataset.hfKind = c, t.appendChild(u);
199
+ let d = _(n.content, {
200
+ styles: r ?? void 0,
201
+ theme: i,
202
+ defaultTabStopTwips: a
203
+ }), f = T(r), p = s.create({
204
+ doc: d,
205
+ schema: b,
206
+ plugins: [...l.getPlugins(), f]
207
+ }), m = c, h = new x(u, {
208
+ state: p,
209
+ dispatchTransaction(e) {
210
+ let t = h.state.apply(e);
211
+ if (h.updateState(t), e.docChanged) {
212
+ let e = I.value?.package, n = (m === "header" ? e?.headers : e?.footers)?.get(o);
213
+ n && (n.content = v(t.doc));
214
+ }
215
+ e.docChanged && R.value && U(R.value), $.value?.(o, h, e.docChanged);
216
+ }
217
+ });
218
+ J.set(o, h);
219
+ }
220
+ }
221
+ function Q() {
222
+ for (let e of J.values()) e.destroy(), e.dom.parentElement?.remove();
223
+ J.clear();
224
+ for (let e of Y.values()) e.destroy();
225
+ Y.clear(), q.current &&= (q.current.remove(), null);
226
+ }
227
+ let $ = { value: null };
228
+ function de(e) {
229
+ $.value = e;
230
+ }
231
+ async function fe(e) {
232
+ B.value = null, z.value = !1;
233
+ try {
234
+ let t;
235
+ t = e instanceof Blob || e instanceof File ? await e.arrayBuffer() : e instanceof Uint8Array ? e.buffer.slice(e.byteOffset, e.byteOffset + e.byteLength) : e, I.value = await S(t), K(), Q(), G(), Z();
236
+ } catch (e) {
237
+ let t = e instanceof Error ? e : Error(String(e));
238
+ B.value = t.message, j?.(t);
239
+ }
240
+ }
241
+ function pe(e) {
242
+ B.value = null, I.value = e, K(), Q(), G(), Z();
243
+ }
244
+ async function me() {
245
+ if (!L.value || !I.value) return null;
246
+ let { repackDocx: e, createDocx: t } = await import("@eigenpal/docx-editor-core/docx/rezip"), { injectReplyRangeMarkers: n, injectTCReplyRangeMarkers: r } = await import("@eigenpal/docx-editor-core/docx"), i = C(L.value.state.doc, I.value), a = i.package.document?.comments ?? [];
247
+ i.package.document?.content && a.length > 0 && (n(i.package.document.content, a), r(i.package.document.content, a));
248
+ let o;
249
+ return o = i.originalBuffer ? await e(i) : await t(i), new Blob([o], { type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" });
250
+ }
251
+ function he() {
252
+ L.value?.focus();
253
+ }
254
+ function ge() {
255
+ K(), Q(), I.value = null;
256
+ }
257
+ function _e() {
258
+ return I.value;
259
+ }
260
+ t(() => {
261
+ ge();
262
+ });
263
+ function ve() {
264
+ return H.getCommands();
265
+ }
266
+ return {
267
+ editorView: L,
268
+ editorState: R,
269
+ isReady: z,
270
+ parseError: B,
271
+ layout: V,
272
+ loadBuffer: fe,
273
+ loadDocument: pe,
274
+ save: me,
275
+ focus: he,
276
+ destroy: ge,
277
+ getDocument: _e,
278
+ getCommands: ve,
279
+ reLayout() {
280
+ L.value && U(L.value.state);
281
+ },
282
+ getHfPmView: X,
283
+ syncHfPMs: Z,
284
+ setHfTransactionListener: de,
285
+ setDocument(e) {
286
+ I.value = e;
287
+ }
288
+ };
289
+ }
290
+ //#endregion
291
+ //#region src/composables/useZoom.ts
292
+ var K = .25, q = 4, J = .1, Y = [
293
+ .25,
294
+ .5,
295
+ .75,
296
+ 1,
297
+ 1.25,
298
+ 1.5,
299
+ 2,
300
+ 3,
301
+ 4
302
+ ];
303
+ function le(i = 1) {
304
+ let a = r(Math.max(K, Math.min(q, i))), o = e(() => Math.round(a.value * 100)), s = e(() => a.value <= K), c = e(() => a.value >= q);
305
+ function l(e) {
306
+ a.value = Math.max(K, Math.min(q, Math.round(e * 100) / 100));
307
+ }
308
+ function u() {
309
+ l(a.value + J);
310
+ }
311
+ function d() {
312
+ l(a.value - J);
313
+ }
314
+ function f() {
315
+ l(1);
316
+ }
317
+ function p(e) {
318
+ (e.ctrlKey || e.metaKey) && (e.preventDefault(), e.deltaY < 0 ? u() : d());
319
+ }
320
+ function m(e) {
321
+ (e.ctrlKey || e.metaKey) && (e.shiftKey || e.altKey || (e.key === "=" || e.key === "+" ? (e.preventDefault(), u()) : e.key === "-" ? (e.preventDefault(), d()) : e.key === "0" && (e.preventDefault(), f())));
322
+ }
323
+ function h() {
324
+ n(() => document.addEventListener("keydown", m)), t(() => document.removeEventListener("keydown", m));
325
+ }
326
+ return {
327
+ zoom: a,
328
+ zoomPercent: o,
329
+ isMinZoom: s,
330
+ isMaxZoom: c,
331
+ setZoom: l,
332
+ zoomIn: u,
333
+ zoomOut: d,
334
+ resetZoom: f,
335
+ handleWheel: p,
336
+ handleKeyDown: m,
337
+ installShortcuts: h,
338
+ ZOOM_PRESETS: Y
339
+ };
340
+ }
341
+ //#endregion
342
+ //#region src/composables/useTableResize.ts
343
+ function ue() {
344
+ let e = {
345
+ active: !1,
346
+ startX: 0,
347
+ handle: null,
348
+ columnIndex: 0,
349
+ tablePmStart: 0,
350
+ origWidths: {
351
+ left: 0,
352
+ right: 0
353
+ }
354
+ }, t = {
355
+ active: !1,
356
+ startY: 0,
357
+ handle: null,
358
+ rowIndex: 0,
359
+ isEdge: !1,
360
+ tablePmStart: 0,
361
+ origHeight: 0
362
+ }, n = {
363
+ active: !1,
364
+ startX: 0,
365
+ handle: null,
366
+ columnIndex: 0,
367
+ tablePmStart: 0,
368
+ origWidth: 0
369
+ }, r = null;
370
+ function i() {
371
+ return e.active || t.active || n.active;
372
+ }
373
+ function a(i, a) {
374
+ let o = i.target;
375
+ return o?.classList ? o.classList.contains("layout-table-resize-handle") ? (i.preventDefault(), i.stopPropagation(), r = a, e.active = !0, e.startX = i.clientX, e.handle = o, o.classList.add("dragging"), e.columnIndex = parseInt(o.dataset.columnIndex ?? "0", 10), e.tablePmStart = parseInt(o.dataset.tablePmStart ?? "0", 10), X(a, e), !0) : o.classList.contains("layout-table-row-resize-handle") || o.classList.contains("layout-table-edge-handle-bottom") ? (i.preventDefault(), i.stopPropagation(), r = a, t.active = !0, t.startY = i.clientY, t.handle = o, t.isEdge = o.dataset.isEdge === "bottom", o.classList.add("dragging"), t.rowIndex = parseInt(o.dataset.rowIndex ?? "0", 10), t.tablePmStart = parseInt(o.dataset.tablePmStart ?? "0", 10), Z(a, t, o), !0) : o.classList.contains("layout-table-edge-handle-right") ? (i.preventDefault(), i.stopPropagation(), r = a, n.active = !0, n.startX = i.clientX, n.handle = o, o.classList.add("dragging"), n.columnIndex = parseInt(o.dataset.columnIndex ?? "0", 10), n.tablePmStart = parseInt(o.dataset.tablePmStart ?? "0", 10), Q(a, n), !0) : !1 : !1;
376
+ }
377
+ function o(r) {
378
+ if (e.active && e.handle) {
379
+ r.preventDefault();
380
+ let t = r.clientX - e.startX, n = parseFloat(e.handle.style.left);
381
+ e.handle.style.left = `${n + t}px`, e.startX = r.clientX;
382
+ let i = Math.round(t * F), a = e.origWidths.left + i, o = e.origWidths.right - i;
383
+ a >= N && o >= N && (e.origWidths = {
384
+ left: a,
385
+ right: o
386
+ });
387
+ return;
388
+ }
389
+ if (t.active && t.handle) {
390
+ r.preventDefault();
391
+ let e = r.clientY - t.startY, n = parseFloat(t.handle.style.top);
392
+ t.handle.style.top = `${n + e}px`, t.startY = r.clientY;
393
+ let i = Math.round(e * F), a = t.origHeight + i;
394
+ a >= P && (t.origHeight = a);
395
+ return;
396
+ }
397
+ if (n.active && n.handle) {
398
+ r.preventDefault();
399
+ let e = r.clientX - n.startX, t = parseFloat(n.handle.style.left);
400
+ n.handle.style.left = `${t + e}px`, n.startX = r.clientX;
401
+ let i = Math.round(e * F), a = n.origWidth + i;
402
+ a >= N && (n.origWidth = a);
403
+ }
404
+ }
405
+ function s(i) {
406
+ if (e.active) {
407
+ e.active = !1, e.handle?.classList.remove("dragging"), r && oe(r, {
408
+ pmStart: e.tablePmStart,
409
+ colIdx: e.columnIndex,
410
+ newLeft: e.origWidths.left,
411
+ newRight: e.origWidths.right
412
+ }), e.handle = null;
413
+ return;
414
+ }
415
+ if (t.active) {
416
+ t.active = !1, t.handle?.classList.remove("dragging"), r && L(r, {
417
+ pmStart: t.tablePmStart,
418
+ rowIdx: t.rowIndex,
419
+ newHeight: t.origHeight
420
+ }), t.handle = null;
421
+ return;
422
+ }
423
+ n.active && (n.active = !1, n.handle?.classList.remove("dragging"), r && I(r, {
424
+ pmStart: n.tablePmStart,
425
+ colIdx: n.columnIndex,
426
+ newWidth: n.origWidth
427
+ }), n.handle = null);
428
+ }
429
+ function c() {
430
+ return document.addEventListener("mousemove", o), document.addEventListener("mouseup", s), () => {
431
+ document.removeEventListener("mousemove", o), document.removeEventListener("mouseup", s);
432
+ };
433
+ }
434
+ return {
435
+ tryStartResize: a,
436
+ install: c,
437
+ isResizing: i
438
+ };
439
+ }
440
+ function X(e, t) {
441
+ let n = z(e, t.tablePmStart, t.columnIndex);
442
+ n && (t.origWidths = n);
443
+ }
444
+ function Z(e, t, n) {
445
+ let r = B(e, t.tablePmStart, t.rowIndex);
446
+ if (r != null) {
447
+ t.origHeight = r;
448
+ return;
449
+ }
450
+ let i = n.closest(".layout-table")?.querySelector(`[data-row-index="${t.rowIndex}"]`), a = i ? i.getBoundingClientRect().height : 30;
451
+ t.origHeight = Math.round(a * F);
452
+ }
453
+ function Q(e, t) {
454
+ let n = R(e, t.tablePmStart, t.columnIndex);
455
+ n != null && (t.origWidth = n);
456
+ }
457
+ //#endregion
458
+ //#region src/composables/useDragAutoScroll.ts
459
+ function $({ pagesContainer: e, onScrollExtendSelection: n }) {
460
+ let r = null, i = 0, a = 0, o = !1, s = null;
461
+ function c() {
462
+ if (s) return s;
463
+ let t = e.value;
464
+ return t ? (s = V(t), s) : null;
465
+ }
466
+ function l() {
467
+ o = !1, r !== null && (cancelAnimationFrame(r), r = null);
468
+ }
469
+ function u() {
470
+ if (!o) return;
471
+ let e = c();
472
+ if (!e) return;
473
+ let t = U(e.getBoundingClientRect(), a);
474
+ t !== 0 && (e.scrollTop += t, n(i, a)), r = requestAnimationFrame(u);
475
+ }
476
+ function d() {
477
+ o || (o = !0, r = requestAnimationFrame(u));
478
+ }
479
+ function f(e, t) {
480
+ if (i = e, a = t, !o) {
481
+ let e = c();
482
+ if (!e) return;
483
+ let n = e.getBoundingClientRect();
484
+ (t < n.top + H || t > n.bottom - H) && d();
485
+ }
486
+ }
487
+ return t(() => l()), {
488
+ updateMousePosition: f,
489
+ stopAutoScroll: l
490
+ };
491
+ }
492
+ //#endregion
493
+ export { G as i, ue as n, le as r, $ as t };
@@ -1,10 +1,21 @@
1
1
  import { EditorView } from 'prosemirror-view';
2
2
  /**
3
- * Find the body PM span containing `pmPos`. Scoped to body spans (which
4
- * carry both pmStart and pmEnd) so HF runs in the separate PM document
5
- * don't mis-resolve double-/triple-click selection.
3
+ * Resolve the painted header/footer instance nearest the viewport center the
4
+ * one the user is editing. The same HF is painted on every page (shared
5
+ * `r:id`), so the chrome outline must track the active page rather than snap to
6
+ * page one's copy (mirrors core's `getHfDomSnapshot` host pick; #691).
6
7
  */
7
- export declare function findElementAtPosition(container: HTMLElement, pmPos: number): HTMLElement | null;
8
+ export declare function nearestHfHostEl(position: 'header' | 'footer'): HTMLElement | null;
9
+ /**
10
+ * Find the painted span containing `pmPos`. By default scoped to body spans
11
+ * (which carry both pmStart and pmEnd) so HF runs in the separate PM document
12
+ * don't mis-resolve double-/triple-click selection. When `hfSection` is set
13
+ * (the user is editing a header/footer), scope to that section's painted host
14
+ * instead — the HF spans live in `.layout-page-header` / `.layout-page-footer`
15
+ * and carry PM positions from the HF document, so resolving against body spans
16
+ * would compute word/paragraph bounds from the wrong text (#691).
17
+ */
18
+ export declare function findElementAtPosition(container: HTMLElement, pmPos: number, hfSection?: 'header' | 'footer'): HTMLElement | null;
8
19
  /**
9
20
  * Smooth-scroll the viewport so the painted element at `pmPos` is
10
21
  * visible (48px top padding). Falls back to a CSS attribute selector
@@ -20,9 +31,9 @@ export declare function resolvePos(pagesContainer: HTMLElement | null, view: Edi
20
31
  * Double-click word selection — expand `pos` to its word bounds and
21
32
  * hand the resulting range to `setPmSelection`.
22
33
  */
23
- export declare function selectWord(pagesContainer: HTMLElement | null, pos: number, setPmSelection: (from: number, to: number) => void): void;
34
+ export declare function selectWord(pagesContainer: HTMLElement | null, pos: number, setPmSelection: (from: number, to: number) => void, hfSection?: 'header' | 'footer'): void;
24
35
  /**
25
36
  * Triple-click paragraph selection — expand `pos` to the enclosing
26
37
  * `.layout-paragraph` element's PM range.
27
38
  */
28
- export declare function selectParagraph(pagesContainer: HTMLElement | null, pos: number, setPmSelection: (from: number, to: number) => void): void;
39
+ export declare function selectParagraph(pagesContainer: HTMLElement | null, pos: number, setPmSelection: (from: number, to: number) => void, hfSection?: 'header' | 'footer'): void;
@@ -1,46 +1,10 @@
1
- import { EditorView } from 'prosemirror-view';
2
- import { Layout } from '@eigenpal/docx-editor-core/layout-engine';
3
- export interface FindInDocumentMatch {
4
- paraId: string;
5
- match: string;
6
- before: string;
7
- after: string;
8
- }
9
1
  /**
10
- * Walk the PM doc looking for `query`. Returns up to `limit` matches —
11
- * one per paragraph (rejects paragraphs where the query appears more
12
- * than once, mirroring `findTextInPmParagraph`'s ambiguity guard so the
13
- * LLM gets a clearer error than a silent mistarget).
2
+ * Pure ref-API query helpers read-only inspectors over the PM document
3
+ * and the paginated layout. Used by DocxEditor's `defineExpose` ref API
4
+ * (`findInDocument`, `getSelectionInfo`, `getPageContent`).
5
+ *
6
+ * Lifted to `@eigenpal/docx-editor-core/prosemirror/queries` and shared
7
+ * with the React adapter; re-exported here to keep existing import sites stable.
14
8
  */
15
- export declare function findInDocument(view: EditorView | null, query: string, opts?: {
16
- caseSensitive?: boolean;
17
- limit?: number;
18
- }): FindInDocumentMatch[];
19
- export interface SelectionInfo {
20
- paraId: string | null;
21
- selectedText: string;
22
- paragraphText: string;
23
- before: string;
24
- after: string;
25
- }
26
- /**
27
- * Describe the current selection in agent-readable form — paraId of the
28
- * containing paragraph, the selected text, the full paragraph text, and
29
- * the leading/trailing slices.
30
- */
31
- export declare function getSelectionInfo(view: EditorView | null): SelectionInfo | null;
32
- export interface PageContent {
33
- pageNumber: number;
34
- text: string;
35
- paragraphs: Array<{
36
- paraId: string;
37
- text: string;
38
- styleId?: string;
39
- }>;
40
- }
41
- /**
42
- * Collect paragraphs visible on `pageNumber` (1-indexed) from the
43
- * paginated `layout`. Dedupes by paraId so paragraphs split across page
44
- * boundaries are reported once.
45
- */
46
- export declare function getPageContent(view: EditorView | null, layout: Layout | null, pageNumber: number): PageContent | null;
9
+ export { findInDocument, getSelectionInfo, getPageContent, } from '@eigenpal/docx-editor-core/prosemirror/queries';
10
+ export type { FindInDocumentMatch, SelectionInfo, PageContent, } from '@eigenpal/docx-editor-core/prosemirror/queries';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eigenpal/docx-editor-vue",
3
- "version": "1.2.1",
3
+ "version": "1.3.1",
4
4
  "description": "Vue 3 DOCX editor adapter for @eigenpal/docx-editor-core.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -83,9 +83,9 @@
83
83
  "vue": "^3.3.0"
84
84
  },
85
85
  "dependencies": {
86
- "@eigenpal/docx-editor-agents": "^1.2.1",
87
- "@eigenpal/docx-editor-core": "^1.2.1",
88
- "@eigenpal/docx-editor-i18n": "^1.2.1"
86
+ "@eigenpal/docx-editor-agents": "^1.3.1",
87
+ "@eigenpal/docx-editor-core": "^1.3.1",
88
+ "@eigenpal/docx-editor-i18n": "^1.3.1"
89
89
  },
90
90
  "keywords": [
91
91
  "docx",