@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.
- package/dist/{KeyboardShortcutsDialog-5ZsgieYf.js → KeyboardShortcutsDialog-00eb4Ova.js} +23 -0
- package/dist/KeyboardShortcutsDialog-EW9K4wuO.cjs +1 -0
- package/dist/MenuBar-DeogoqFP.js +3330 -0
- package/dist/MenuBar-bU4-4dnA.cjs +4 -0
- package/dist/{TablePropertiesDialog-DTCcLpPC.cjs → TablePropertiesDialog-BZLpFAkg.cjs} +1 -1
- package/dist/{TablePropertiesDialog-PR4ftalH.js → TablePropertiesDialog-CBTvM4Xy.js} +1 -1
- package/dist/composables/useCommentLifecycle.d.ts +3 -0
- package/dist/composables/useCommentManagement.d.ts +6 -0
- package/dist/composables/useFormattingActions.d.ts +2 -22
- package/dist/composables/useMenuActions.d.ts +1 -0
- package/dist/composables/useSelectionSync.d.ts +16 -0
- package/dist/composables/useWatermarkControls.d.ts +15 -0
- package/dist/composables.cjs +1 -1
- package/dist/composables.js +124 -209
- package/dist/dialogs.cjs +1 -1
- package/dist/dialogs.js +2 -2
- package/dist/docx-editor-vue.css +1 -1
- package/dist/index.cjs +9 -10
- package/dist/index.js +1373 -1210
- package/dist/ui.cjs +1 -1
- package/dist/ui.js +3 -3
- package/dist/useCommentSidebarItems-BHomCzpj.js +44 -0
- package/dist/useCommentSidebarItems-CbNvNCd3.cjs +1 -0
- package/dist/useDragAutoScroll-BT6oPYBj.cjs +1 -0
- package/dist/useDragAutoScroll-C56F_WS_.js +493 -0
- package/dist/utils/domQueries.d.ts +17 -6
- package/dist/utils/refApiQueries.d.ts +8 -44
- package/package.json +4 -4
- package/dist/KeyboardShortcutsDialog-DiG-tfJT.cjs +0 -1
- package/dist/MenuBar-DLXxthZk.js +0 -3365
- package/dist/MenuBar-De3YJFpj.cjs +0 -4
- package/dist/useTableResize-BcBdSaOE.js +0 -583
- package/dist/useTableResize-DTag4SY0.cjs +0 -1
- package/dist/utils/commentFactories.d.ts +0 -7
- 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
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
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
|
|
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
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
|
16
|
-
|
|
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.
|
|
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.
|
|
87
|
-
"@eigenpal/docx-editor-core": "^1.
|
|
88
|
-
"@eigenpal/docx-editor-i18n": "^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",
|