nuvra 0.4.1 → 0.6.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.
- package/README.md +241 -19
- package/dist/compare.vue.d.ts +19 -0
- package/dist/components/document-editor.vue.d.ts +59 -3
- package/dist/components/editor-canvas.vue.d.ts +9 -7
- package/dist/components/editor-changes.vue.d.ts +18 -0
- package/dist/components/editor-collaborators.vue.d.ts +17 -0
- package/dist/components/editor-comments.vue.d.ts +32 -0
- package/dist/components/editor-footnote-form.vue.d.ts +19 -0
- package/dist/components/editor-outline.vue.d.ts +36 -0
- package/dist/components/editor-slash-menu.vue.d.ts +13 -0
- package/dist/components/editor-toolbar.vue.d.ts +24 -1
- package/dist/core/collaboration.d.ts +25 -0
- package/dist/core/comments.d.ts +26 -0
- package/dist/core/dates.d.ts +8 -0
- package/dist/core/diff.d.ts +11 -0
- package/dist/core/document-templates.d.ts +22 -0
- package/dist/core/docx/export.d.ts +19 -0
- package/dist/core/docx/import.d.ts +19 -0
- package/dist/core/docx/zip.d.ts +23 -0
- package/dist/core/engine/dom.d.ts +40 -3
- package/dist/core/engine/editing.d.ts +11 -0
- package/dist/core/engine/engine.d.ts +161 -3
- package/dist/core/engine/input-rules.d.ts +3 -1
- package/dist/core/engine/marks.d.ts +50 -1
- package/dist/core/engine/schema.d.ts +9 -2
- package/dist/core/export.d.ts +13 -5
- package/dist/core/footnotes.d.ts +15 -0
- package/dist/core/icons.d.ts +1 -1
- package/dist/core/labels.d.ts +6 -2
- package/dist/core/locales/uz-cyrl.d.ts +3 -0
- package/dist/core/locales/uz.d.ts +72 -1
- package/dist/core/numbers.d.ts +19 -0
- package/dist/core/outline.d.ts +44 -0
- package/dist/core/page.d.ts +12 -2
- package/dist/core/pagination.d.ts +25 -3
- package/dist/core/pdf.d.ts +43 -0
- package/dist/core/signature.d.ts +15 -0
- package/dist/core/slash-commands.d.ts +19 -0
- package/dist/core/templates.d.ts +32 -0
- package/dist/core/transliterate.d.ts +13 -0
- package/dist/core/types.d.ts +1 -1
- package/dist/core/ui-state.d.ts +8 -0
- package/dist/editor.vue.d.ts +6 -2
- package/dist/export-B06RXLqn.js +96 -0
- package/dist/export-B06RXLqn.js.map +1 -0
- package/dist/footnotes-DBShImw7.js +11 -0
- package/dist/footnotes-DBShImw7.js.map +1 -0
- package/dist/form.vue.d.ts +39 -0
- package/dist/index.d.ts +28 -1
- package/dist/index.js +8391 -4198
- package/dist/index.js.map +1 -1
- package/dist/{page-DL7Oj2o8.js → page-DY5fdgcT.js} +10 -10
- package/dist/page-DY5fdgcT.js.map +1 -0
- package/dist/pdf-mIRjnoOP.js +70 -0
- package/dist/pdf-mIRjnoOP.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/zip-CpbwZtot.js +46 -0
- package/dist/zip-CpbwZtot.js.map +1 -0
- package/package.json +5 -2
- package/dist/export-VeTfgCEp.js +0 -117
- package/dist/export-VeTfgCEp.js.map +0 -1
- package/dist/page-DL7Oj2o8.js.map +0 -1
|
@@ -79,22 +79,22 @@ var e = {
|
|
|
79
79
|
left: "",
|
|
80
80
|
center: "",
|
|
81
81
|
right: ""
|
|
82
|
-
}), c = (e) => !!(e && (e.left || e.center || e.right)), l = [
|
|
82
|
+
}), c = (e) => !!(e && (e.left || e.center || e.right)), l = 9999, u = (e, t) => t + (e.firstPageNumber ?? 1) - 1, d = (e, t) => !(e.differentFirstPage && t === 1), f = [
|
|
83
83
|
"page",
|
|
84
84
|
"pages",
|
|
85
85
|
"date",
|
|
86
86
|
"title"
|
|
87
|
-
],
|
|
87
|
+
], p = RegExp(`\\{(${f.join("|")})\\}`, "g"), m = () => {
|
|
88
88
|
let e = /* @__PURE__ */ new Date(), t = (e) => String(e).padStart(2, "0");
|
|
89
89
|
return `${t(e.getDate())}.${t(e.getMonth() + 1)}.${e.getFullYear()}`;
|
|
90
|
-
},
|
|
90
|
+
}, h = (e, t) => e.replace(p, (e, n) => n === "page" ? String(t.page) : n === "pages" ? String(t.pages) : n === "title" ? t.title : m()), g = () => ({
|
|
91
91
|
text: "",
|
|
92
92
|
color: "#9ca3af",
|
|
93
93
|
diagonal: !0
|
|
94
|
-
}),
|
|
95
|
-
let i = r ? Math.sqrt(e * e + t * t) : e, a = Math.max(4, n.trim().length) *
|
|
96
|
-
return Math.round(Math.max(
|
|
97
|
-
},
|
|
94
|
+
}), _ = (e) => !!e?.text.trim(), v = .86, y = .62, b = 24, x = .4, S = (e, t, n, r) => {
|
|
95
|
+
let i = r ? Math.sqrt(e * e + t * t) : e, a = Math.max(4, n.trim().length) * y, o = i * v / a;
|
|
96
|
+
return Math.round(Math.max(b, Math.min(o, t * x)));
|
|
97
|
+
}, C = ({ size: t, orientation: r, margins: i }) => {
|
|
98
98
|
let o = e[t] ?? e.a4, s = r === "portrait";
|
|
99
99
|
return {
|
|
100
100
|
width: a(s ? o.width : o.height),
|
|
@@ -105,8 +105,8 @@ var e = {
|
|
|
105
105
|
marginBottom: a(i.bottom),
|
|
106
106
|
marginLeft: a(i.left)
|
|
107
107
|
};
|
|
108
|
-
},
|
|
108
|
+
}, w = (e, t) => Object.keys(e).every((n) => Math.abs(e[n] - t[n]) < i);
|
|
109
109
|
//#endregion
|
|
110
|
-
export {
|
|
110
|
+
export { s as a, C as c, w as d, u as f, S as h, e as i, c as l, d as m, t as n, o, h as p, l as r, g as s, f as t, _ as u };
|
|
111
111
|
|
|
112
|
-
//# sourceMappingURL=page-
|
|
112
|
+
//# sourceMappingURL=page-DY5fdgcT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-DY5fdgcT.js","names":[],"sources":["../src/core/page.ts"],"sourcesContent":["/** Supported paper formats. */\nexport type PageSizeKey = 'a3' | 'a4' | 'a5' | 'letter' | 'legal';\n/** Paper orientation. */\nexport type PageOrientation = 'portrait' | 'landscape';\n/** `page` shows sheets like a word processor, `web` a continuous surface. */\nexport type DocumentViewMode = 'page' | 'web';\n\n/** Page margins in millimetres. */\nexport interface PageMargins {\n /** Top margin. */\n top: number;\n /** Right margin. */\n right: number;\n /** Bottom margin. */\n bottom: number;\n /** Left margin. */\n left: number;\n}\n\n/** Text repeated in the top or bottom margin of every page, in three aligned parts as in office suites. */\nexport interface PageHeaderFooter {\n /** Left-aligned part. */\n left: string;\n /** Centred part. */\n center: string;\n /** Right-aligned part. */\n right: string;\n}\n\n/** Text drawn behind the content of every page, such as “DRAFT” or “COPY”. */\nexport interface PageWatermark {\n /** Text of the watermark; without it the page has none. */\n text: string;\n /** Colour of the text; it is drawn faintly, so a mid grey suits most documents. */\n color: string;\n /** Whether the text runs diagonally across the page instead of straight across it. */\n diagonal: boolean;\n}\n\n/** Page setup chosen by the user; the host can persist it with `v-model:page`. */\nexport interface PageSettings {\n /** Paper format. */\n size: PageSizeKey;\n /** Paper orientation. */\n orientation: PageOrientation;\n /** Margins in millimetres. */\n margins: PageMargins;\n /** Text repeated in the top margin of every page; omitted while the document has no header. */\n header?: PageHeaderFooter;\n /** Text repeated in the bottom margin of every page; omitted while the document has no footer. */\n footer?: PageHeaderFooter;\n /** Watermark drawn behind the text of every page; omitted while the document has none. */\n watermark?: PageWatermark;\n /** Whether the first page shows no header, footer or page number, as on title pages and letterheads. */\n differentFirstPage?: boolean;\n /** Number printed on the first page; the following pages count on from it. Defaults to 1. */\n firstPageNumber?: number;\n}\n\n/** Page geometry in CSS pixels, ready for layout. */\nexport interface PageMetrics {\n /** Sheet width. */\n width: number;\n /** Sheet height. */\n height: number;\n /** Grey space between two sheets. */\n gap: number;\n /** Top margin. */\n marginTop: number;\n /** Right margin. */\n marginRight: number;\n /** Bottom margin. */\n marginBottom: number;\n /** Left margin. */\n marginLeft: number;\n}\n\n/** Portrait dimensions of a paper format in millimetres. */\ninterface PaperSize {\n /** Name shown in the page setup. */\n label: string;\n /** Portrait width. */\n width: number;\n /** Portrait height. */\n height: number;\n}\n\n/** Paper sizes in millimetres (portrait). */\nexport const PAGE_SIZES: Record<PageSizeKey, PaperSize> = {\n a3: { label: 'A3', width: 297, height: 420 },\n a4: { label: 'A4', width: 210, height: 297 },\n a5: { label: 'A5', width: 148, height: 210 },\n letter: { label: 'Letter', width: 215.9, height: 279.4 },\n legal: { label: 'Legal', width: 215.9, height: 355.6 }\n};\n\n/** Margin presets offered by the page setup, in millimetres; the key doubles as the label suffix. */\nexport const MARGIN_PRESETS = [\n { key: 'normal', margins: { top: 25.4, right: 25.4, bottom: 25.4, left: 25.4 } },\n { key: 'narrow', margins: { top: 12.7, right: 12.7, bottom: 12.7, left: 12.7 } },\n { key: 'moderate', margins: { top: 25.4, right: 19.1, bottom: 25.4, left: 19.1 } },\n { key: 'wide', margins: { top: 25.4, right: 50.8, bottom: 25.4, left: 50.8 } },\n /** O‘zDSt 1.14 requisites for official documents. */\n { key: 'official', margins: { top: 20, right: 15, bottom: 20, left: 30 } }\n] as const satisfies ReadonlyArray<{ key: string; margins: PageMargins }>;\n\n/** Smallest zoom in percent; low enough for an A4 sheet to fit a phone screen. */\nexport const ZOOM_MIN = 30;\n/** Largest zoom in percent. */\nexport const ZOOM_MAX = 200;\n/** Zoom change per step of the zoom buttons and slider, in percent. */\nexport const ZOOM_STEP = 10;\n\n/** Grey space between two sheets in page view, in CSS pixels. */\nconst PAGE_GAP = 20;\n/** CSS pixels per millimetre at 96 DPI. */\nconst PX_PER_MM = 96 / 25.4;\n/** Margin differences below this many millimetres count as equal (rounding of unit conversions). */\nconst MARGIN_TOLERANCE_MM = 0.05;\n\n/** Converts millimetres to CSS pixels. */\nconst mmToPx = (value: number): number => value * PX_PER_MM;\n\n/** Default page setup: portrait A4 with normal margins. */\nexport const createPageSettings = (): PageSettings => ({\n size: 'a4',\n orientation: 'portrait',\n margins: { ...MARGIN_PRESETS[0].margins }\n});\n\n/** An empty header or footer, used when the user opens the form for the first time. */\nexport const createHeaderFooter = (): PageHeaderFooter => ({ left: '', center: '', right: '' });\n\n/** Whether a header or footer holds any text at all. */\nexport const hasHeaderFooterText = (value: PageHeaderFooter | undefined): boolean =>\n Boolean(value && (value.left || value.center || value.right));\n\n/** Largest first page number the page setup accepts. */\nexport const MAX_FIRST_PAGE_NUMBER = 9999;\n\n/** Number printed on a sheet, counted from 1 for the first sheet. */\nexport const pageNumberOf = (page: PageSettings, sheet: number): number => sheet + (page.firstPageNumber ?? 1) - 1;\n\n/** Whether the header, footer and page number are drawn on a sheet, counted from 1 for the first sheet. */\nexport const showsRunningTexts = (page: PageSettings, sheet: number): boolean =>\n !(page.differentFirstPage && sheet === 1);\n\n/** Tokens a header or footer text may contain, replaced when the text is drawn on a page. */\nexport const HEADER_FOOTER_TOKENS = ['page', 'pages', 'date', 'title'] as const;\n\n/** One of the tokens a header or footer text may contain. */\nexport type HeaderFooterToken = (typeof HEADER_FOOTER_TOKENS)[number];\n\n/** Values the tokens of a header or footer are replaced with. */\nexport interface HeaderFooterContext {\n /** Number printed on the page the text is drawn on. */\n page: number;\n /** Number of pages in the document, as Word counts them: every sheet, whatever number it prints. */\n pages: number;\n /** Document title. */\n title: string;\n}\n\n/** Pattern of the tokens, built from their names so both stay in step. */\nconst TOKEN_PATTERN = new RegExp(`\\\\{(${HEADER_FOOTER_TOKENS.join('|')})\\\\}`, 'g');\n\n/** Today's date as `dd.mm.yyyy`, the format used in Uzbek documents. */\nconst today = (): string => {\n const now = new Date();\n const twoDigits = (value: number) => String(value).padStart(2, '0');\n return `${twoDigits(now.getDate())}.${twoDigits(now.getMonth() + 1)}.${now.getFullYear()}`;\n};\n\n/** Replaces the `{page}`, `{pages}`, `{date}` and `{title}` tokens of a header or footer text. */\nexport const renderHeaderFooter = (text: string, context: HeaderFooterContext): string =>\n text.replace(TOKEN_PATTERN, (_, token: string) => {\n if (token === 'page') return String(context.page);\n if (token === 'pages') return String(context.pages);\n if (token === 'title') return context.title;\n return today();\n });\n\n/** An empty watermark in the default colour, used when the user opens the form for the first time. */\nexport const createWatermark = (): PageWatermark => ({ text: '', color: '#9ca3af', diagonal: true });\n\n/** Whether a watermark has any text to draw. */\nexport const hasWatermarkText = (value: PageWatermark | undefined): boolean => Boolean(value?.text.trim());\n\n/** How much of the paper the watermark text spans. */\nconst WATERMARK_FILL = 0.86;\n/** Average width of a character relative to the font size, used to fit the text onto the paper. */\nconst AVERAGE_CHARACTER_WIDTH = 0.62;\n/** Smallest watermark font size in pixels, so a short text is still large. */\nconst MIN_WATERMARK_SIZE = 24;\n/** Largest watermark font size, as a share of the paper height. */\nconst MAX_WATERMARK_HEIGHT_SHARE = 0.4;\n/** Angle the diagonal watermark is rotated by, in degrees. */\nexport const WATERMARK_ANGLE = -35;\n\n/** Font size in pixels at which a watermark text spans the paper, straight across it or diagonally. */\nexport const watermarkFontSize = (width: number, height: number, text: string, diagonal: boolean): number => {\n const span = diagonal ? Math.sqrt(width * width + height * height) : width;\n const characters = Math.max(4, text.trim().length) * AVERAGE_CHARACTER_WIDTH;\n const size = (span * WATERMARK_FILL) / characters;\n return Math.round(Math.max(MIN_WATERMARK_SIZE, Math.min(size, height * MAX_WATERMARK_HEIGHT_SHARE)));\n};\n\n/** Converts page settings into pixel geometry; an unknown paper size falls back to A4. */\nexport const getPageMetrics = ({ size, orientation, margins }: PageSettings): PageMetrics => {\n const paper = PAGE_SIZES[size] ?? PAGE_SIZES.a4;\n const portrait = orientation === 'portrait';\n return {\n width: mmToPx(portrait ? paper.width : paper.height),\n height: mmToPx(portrait ? paper.height : paper.width),\n gap: PAGE_GAP,\n marginTop: mmToPx(margins.top),\n marginRight: mmToPx(margins.right),\n marginBottom: mmToPx(margins.bottom),\n marginLeft: mmToPx(margins.left)\n };\n};\n\n/** Whether two margin sets are equal, used to highlight the matching preset. */\nexport const isSameMargins = (a: PageMargins, b: PageMargins): boolean =>\n (Object.keys(a) as Array<keyof PageMargins>).every(side => Math.abs(a[side] - b[side]) < MARGIN_TOLERANCE_MM);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
//#region src/core/pdf.ts
|
|
2
|
+
var e = 72 / 25.4, t = 96 / 25.4, n = 2, r = .92, i = "application/pdf", a = new TextEncoder(), o = (e) => {
|
|
3
|
+
let t = [], n = [], r = 0, i = (e) => {
|
|
4
|
+
let n = typeof e == "string" ? a.encode(e) : e;
|
|
5
|
+
t.push(n), r += n.length;
|
|
6
|
+
}, o = (e, t) => {
|
|
7
|
+
n[e] = r, i(`${e} 0 obj\n${t}\nendobj\n`);
|
|
8
|
+
}, s = e.map((e, t) => 3 + t * 3);
|
|
9
|
+
i("%PDF-1.4\n%âãÏÓ\n"), o(1, "<< /Type /Catalog /Pages 2 0 R >>"), o(2, `<< /Type /Pages /Kids [${s.map((e) => `${e} 0 R`).join(" ")}] /Count ${e.length} >>`), e.forEach((e, t) => {
|
|
10
|
+
let a = s[t] ?? 0, c = e.widthPt.toFixed(2), l = e.heightPt.toFixed(2);
|
|
11
|
+
o(a, `<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${c} ${l}] /Resources << /XObject << /Im0 ${a + 2} 0 R >> >> /Contents ${a + 1} 0 R >>`);
|
|
12
|
+
let u = `q ${c} 0 0 ${l} 0 0 cm /Im0 Do Q`;
|
|
13
|
+
o(a + 1, `<< /Length ${u.length} >>\nstream\n${u}\nendstream`), n[a + 2] = r, i(`${a + 2} 0 obj\n<< /Type /XObject /Subtype /Image /Width ${e.width} /Height ${e.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${e.jpeg.length} >>\nstream\n`), i(e.jpeg), i("\nendstream\nendobj\n");
|
|
14
|
+
});
|
|
15
|
+
let c = 3 + e.length * 3, l = r;
|
|
16
|
+
i(`xref\n0 ${c}\n${Array.from({ length: c }, (e, t) => t === 0 ? "0000000000 65535 f \n" : `${String(n[t] ?? 0).padStart(10, "0")} 00000 n \n`).join("")}trailer\n<< /Size ${c} /Root 1 0 R >>\nstartxref\n${l}\n%%EOF\n`);
|
|
17
|
+
let u = new Uint8Array(r), d = 0;
|
|
18
|
+
for (let e of t) u.set(e, d), d += e.length;
|
|
19
|
+
return u;
|
|
20
|
+
}, s = (e) => new Promise((t, n) => {
|
|
21
|
+
let r = new FileReader();
|
|
22
|
+
r.onload = () => t(String(r.result)), r.onerror = () => n(r.error), r.readAsDataURL(e);
|
|
23
|
+
}), c = async (e) => {
|
|
24
|
+
await Promise.all(Array.from(e.querySelectorAll("img")).map(async (e) => {
|
|
25
|
+
let t = e.getAttribute("src") ?? "";
|
|
26
|
+
if (!t.startsWith("data:")) try {
|
|
27
|
+
let n = await fetch(t, { mode: "cors" });
|
|
28
|
+
if (!n.ok) throw Error(String(n.status));
|
|
29
|
+
e.setAttribute("src", await s(await n.blob()));
|
|
30
|
+
} catch {
|
|
31
|
+
e.remove();
|
|
32
|
+
}
|
|
33
|
+
}));
|
|
34
|
+
}, l = (e) => new Promise((t, n) => {
|
|
35
|
+
let r = new Image();
|
|
36
|
+
r.onload = () => t(r), r.onerror = () => n(/* @__PURE__ */ Error("The page could not be drawn")), r.src = e;
|
|
37
|
+
}), u = async (e, t, n, r, i) => {
|
|
38
|
+
let a = new XMLSerializer(), o = `<svg xmlns="http://www.w3.org/2000/svg" width="${n}" height="${r}"><foreignObject x="0" y="0" width="100%" height="100%">${`<div xmlns="http://www.w3.org/1999/xhtml"><style>${t.replace(/]]>/g, "]] >")}</style>${a.serializeToString(e)}</div>`}</foreignObject></svg>`, s = await l(`data:image/svg+xml;charset=utf-8,${encodeURIComponent(o)}`), c = document.createElement("canvas");
|
|
39
|
+
c.width = Math.round(n * i.scale), c.height = Math.round(r * i.scale);
|
|
40
|
+
let u = c.getContext("2d");
|
|
41
|
+
if (!u) throw Error("Canvas is not available");
|
|
42
|
+
u.fillStyle = "#fff", u.fillRect(0, 0, c.width, c.height), u.drawImage(s, 0, 0, c.width, c.height);
|
|
43
|
+
let d = await new Promise((e) => c.toBlob(e, "image/jpeg", i.quality));
|
|
44
|
+
if (!d) throw Error("The page could not be encoded");
|
|
45
|
+
return {
|
|
46
|
+
jpeg: new Uint8Array(await d.arrayBuffer()),
|
|
47
|
+
width: c.width,
|
|
48
|
+
height: c.height
|
|
49
|
+
};
|
|
50
|
+
}, d = async (a, s, l = {}) => {
|
|
51
|
+
let d = {
|
|
52
|
+
scale: l.scale ?? n,
|
|
53
|
+
quality: l.quality ?? r
|
|
54
|
+
}, f = new DOMParser().parseFromString(a, "text/html"), p = Array.from(f.querySelectorAll("style"), (e) => e.textContent ?? "").join("\n");
|
|
55
|
+
await c(f.body);
|
|
56
|
+
let m = Array.from(f.querySelectorAll("section.doc-sheet")), h = [];
|
|
57
|
+
for (let n of m) {
|
|
58
|
+
let r = n.classList.contains("is-rotated"), i = r ? s.height : s.width, a = r ? s.width : s.height, o = await u(n, p, Math.round(i * t), Math.round(a * t), d);
|
|
59
|
+
h.push({
|
|
60
|
+
...o,
|
|
61
|
+
widthPt: i * e,
|
|
62
|
+
heightPt: a * e
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return new Blob([o(h)], { type: i });
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
export { i as PDF_MIME, d as renderPdf };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=pdf-mIRjnoOP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-mIRjnoOP.js","names":[],"sources":["../src/core/pdf.ts"],"sourcesContent":["/**\n * PDF download without the print dialog and without dependencies. Every sheet of the printable document is drawn into\n * a canvas through an SVG `foreignObject`, and the pictures are written into a PDF, one per page. The PDF looks like\n * the printout, but its text cannot be selected or searched.\n */\n\n/** A rendered page: a JPEG picture of the sheet and the paper size it is printed on. */\nexport interface PdfPage {\n /** JPEG data of the page picture. */\n jpeg: Uint8Array;\n /** Picture width in pixels. */\n width: number;\n /** Picture height in pixels. */\n height: number;\n /** Paper width in PDF points (1/72 inch). */\n widthPt: number;\n /** Paper height in PDF points. */\n heightPt: number;\n}\n\n/** Options of {@link renderPdf}. */\nexport interface PdfOptions {\n /** Pixels per CSS pixel of the page pictures; higher is sharper and larger. Defaults to 2. */\n scale?: number;\n /** JPEG quality between 0 and 1. Defaults to 0.92. */\n quality?: number;\n}\n\n/** PDF points per millimetre. */\nconst PT_PER_MM = 72 / 25.4;\n/** CSS pixels per millimetre at 96 DPI. */\nconst PX_PER_MM = 96 / 25.4;\nconst DEFAULT_SCALE = 2;\nconst DEFAULT_QUALITY = 0.92;\n/** MIME type of PDF files. */\nexport const PDF_MIME = 'application/pdf';\n\nconst encoder = new TextEncoder();\n\n/**\n * Writes JPEG pictures into a PDF document, one picture filling each page.\n *\n * @returns the PDF file content.\n */\nexport const buildPdf = (pages: readonly PdfPage[]): Uint8Array => {\n const chunks: Uint8Array[] = [];\n const offsets: number[] = [];\n let length = 0;\n const push = (chunk: Uint8Array | string) => {\n const bytes = typeof chunk === 'string' ? encoder.encode(chunk) : chunk;\n chunks.push(bytes);\n length += bytes.length;\n };\n /** Starts object `id`, remembering where it begins for the cross-reference table. */\n const object = (id: number, body: string) => {\n offsets[id] = length;\n push(`${id} 0 obj\\n${body}\\nendobj\\n`);\n };\n\n // Objects: 1 catalog, 2 page tree, then for every page: page, content stream, image.\n const pageIds = pages.map((_, index) => 3 + index * 3);\n push('%PDF-1.4\\n%âãÏÓ\\n');\n object(1, '<< /Type /Catalog /Pages 2 0 R >>');\n object(2, `<< /Type /Pages /Kids [${pageIds.map(id => `${id} 0 R`).join(' ')}] /Count ${pages.length} >>`);\n pages.forEach((page, index) => {\n const pageId = pageIds[index] ?? 0;\n const width = page.widthPt.toFixed(2);\n const height = page.heightPt.toFixed(2);\n object(\n pageId,\n `<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${width} ${height}] /Resources << /XObject << /Im0 ${pageId + 2} 0 R >> >> /Contents ${pageId + 1} 0 R >>`\n );\n const content = `q ${width} 0 0 ${height} 0 0 cm /Im0 Do Q`;\n object(pageId + 1, `<< /Length ${content.length} >>\\nstream\\n${content}\\nendstream`);\n offsets[pageId + 2] = length;\n push(\n `${pageId + 2} 0 obj\\n<< /Type /XObject /Subtype /Image /Width ${page.width} /Height ${page.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${page.jpeg.length} >>\\nstream\\n`\n );\n push(page.jpeg);\n push('\\nendstream\\nendobj\\n');\n });\n\n const count = 3 + pages.length * 3;\n const xref = length;\n const entries = Array.from({ length: count }, (_, id) =>\n id === 0 ? '0000000000 65535 f \\n' : `${String(offsets[id] ?? 0).padStart(10, '0')} 00000 n \\n`\n );\n push(`xref\\n0 ${count}\\n${entries.join('')}trailer\\n<< /Size ${count} /Root 1 0 R >>\\nstartxref\\n${xref}\\n%%EOF\\n`);\n\n const result = new Uint8Array(length);\n let position = 0;\n for (const chunk of chunks) {\n result.set(chunk, position);\n position += chunk.length;\n }\n return result;\n};\n\n/** Reads a blob as a data URL. */\nconst toDataUrl = (blob: Blob) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result));\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(blob);\n });\n\n/**\n * Embeds images as data URLs, so the canvas they are drawn into stays readable. Images that cannot be fetched (for\n * example from a server without CORS) are left out of the PDF rather than breaking it.\n */\nconst embedImages = async (root: ParentNode) => {\n await Promise.all(\n Array.from(root.querySelectorAll('img')).map(async image => {\n const source = image.getAttribute('src') ?? '';\n if (source.startsWith('data:')) return;\n try {\n const response = await fetch(source, { mode: 'cors' });\n if (!response.ok) throw new Error(String(response.status));\n image.setAttribute('src', await toDataUrl(await response.blob()));\n } catch {\n image.remove();\n }\n })\n );\n};\n\n/** Loads an image and waits until it can be drawn. */\nconst loadImage = (source: string) =>\n new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error('The page could not be drawn'));\n image.src = source;\n });\n\n/** Draws one sheet into a JPEG picture. */\nconst renderSheet = async (\n sheet: Element,\n css: string,\n widthPx: number,\n heightPx: number,\n options: Required<PdfOptions>\n): Promise<{ jpeg: Uint8Array; width: number; height: number }> => {\n const serializer = new XMLSerializer();\n const body = `<div xmlns=\"http://www.w3.org/1999/xhtml\"><style>${css.replace(/]]>/g, ']] >')}</style>${serializer.serializeToString(sheet)}</div>`;\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${widthPx}\" height=\"${heightPx}\"><foreignObject x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">${body}</foreignObject></svg>`;\n const image = await loadImage(`data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`);\n const canvas = document.createElement('canvas');\n canvas.width = Math.round(widthPx * options.scale);\n canvas.height = Math.round(heightPx * options.scale);\n const context = canvas.getContext('2d');\n if (!context) throw new Error('Canvas is not available');\n context.fillStyle = '#fff';\n context.fillRect(0, 0, canvas.width, canvas.height);\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n const blob = await new Promise<Blob | null>(resolve => canvas.toBlob(resolve, 'image/jpeg', options.quality));\n if (!blob) throw new Error('The page could not be encoded');\n return { jpeg: new Uint8Array(await blob.arrayBuffer()), width: canvas.width, height: canvas.height };\n};\n\n/**\n * Turns the printable HTML of a paginated document (one `section.doc-sheet` per page) into a PDF.\n *\n * @param printableHtml Standalone HTML as built for printing from the page view.\n * @param paper Paper width and height in millimetres, in the chosen orientation.\n */\nexport const renderPdf = async (\n printableHtml: string,\n paper: { width: number; height: number },\n options: PdfOptions = {}\n): Promise<Blob> => {\n const settings: Required<PdfOptions> = {\n scale: options.scale ?? DEFAULT_SCALE,\n quality: options.quality ?? DEFAULT_QUALITY\n };\n const parsed = new DOMParser().parseFromString(printableHtml, 'text/html');\n const css = Array.from(parsed.querySelectorAll('style'), style => style.textContent ?? '').join('\\n');\n await embedImages(parsed.body);\n const sheets = Array.from(parsed.querySelectorAll('section.doc-sheet'));\n const pages: PdfPage[] = [];\n for (const sheet of sheets) {\n // A sheet turned by a section break is printed on turned paper.\n const rotated = sheet.classList.contains('is-rotated');\n const width = rotated ? paper.height : paper.width;\n const height = rotated ? paper.width : paper.height;\n const picture = await renderSheet(\n sheet,\n css,\n Math.round(width * PX_PER_MM),\n Math.round(height * PX_PER_MM),\n settings\n );\n pages.push({ ...picture, widthPt: width * PT_PER_MM, heightPt: height * PT_PER_MM });\n }\n return new Blob([buildPdf(pages) as BlobPart], { type: PDF_MIME });\n};\n"],"mappings":"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"}
|
package/dist/style.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.doc-icon[data-v-4e391eda]{flex:none}.doc-bubble[data-v-588db7c2]{z-index:2100;box-sizing:border-box;border:1px solid var(--nuvra-border-light);color:var(--nuvra-text);background:var(--nuvra-bg-overlay);border-radius:8px;align-items:center;gap:1px;margin:0;padding:3px;display:flex;position:fixed;inset:auto;overflow:visible;box-shadow:0 6px 20px #10182829}.doc-bubble.is-hidden[data-v-588db7c2]{visibility:hidden}.doc-bubble__divider[data-v-588db7c2]{background:var(--nuvra-border-lighter);flex:0 0 1px;align-self:stretch;margin:3px 4px}.doc-bubble .doc-tb-button.is-danger[data-v-588db7c2]:hover:not(:disabled){color:var(--nuvra-color-danger);background:var(--nuvra-color-danger-soft)}.doc-bubble__link[data-v-588db7c2]{max-width:260px;color:var(--nuvra-color-primary);align-items:center;gap:5px;padding:0 6px;font-size:12px;text-decoration:none;display:inline-flex}.doc-bubble__link span[data-v-588db7c2]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.doc-bubble__form[data-v-588db7c2]{gap:4px;width:280px;display:flex}.object-overlay[data-v-7da0d742]{z-index:3;pointer-events:none;position:absolute;inset:0}.object-overlay__image[data-v-7da0d742]{box-sizing:border-box;outline-offset:1px;outline:2px solid #3b82f6;position:absolute}.object-overlay__handle[data-v-7da0d742]{box-sizing:border-box;pointer-events:auto;background:#fff;border:1.5px solid #3b82f6;border-radius:2px;width:10px;height:10px;position:absolute}.object-overlay__handle.is-top-left[data-v-7da0d742]{cursor:nwse-resize;top:-6px;left:-6px}.object-overlay__handle.is-top-right[data-v-7da0d742]{cursor:nesw-resize;top:-6px;right:-6px}.object-overlay__handle.is-bottom-left[data-v-7da0d742]{cursor:nesw-resize;bottom:-6px;left:-6px}.object-overlay__handle.is-bottom-right[data-v-7da0d742]{cursor:nwse-resize;bottom:-6px;right:-6px}.object-overlay__size[data-v-7da0d742]{color:#fff;background:#101828bf;border-radius:4px;padding:2px 6px;font:11px/16px system-ui,sans-serif;position:absolute;bottom:4px;right:4px}.object-overlay__guide[data-v-7da0d742]{border-left:1px dashed #3b82f6;width:0;position:absolute}.doc-ruler[data-v-0d39d609]{box-sizing:border-box;border:1px solid var(--nuvra-border-lighter);background:var(--nuvra-fill);-webkit-user-select:none;user-select:none;border-radius:4px;height:26px;position:relative}.doc-ruler__text-area[data-v-0d39d609]{background:var(--nuvra-bg);position:absolute;top:0;bottom:0}.doc-ruler__tick[data-v-0d39d609]{background:var(--nuvra-text-placeholder);pointer-events:none;width:1px;height:4px;margin-top:-2px;position:absolute;top:50%}.doc-ruler__tick.is-labelled[data-v-0d39d609]{background:0 0}.doc-ruler__tick i[data-v-0d39d609]{color:var(--nuvra-text-muted);font:9px/1 system-ui,sans-serif;position:absolute;top:-5px;left:50%;transform:translate(-50%)}.doc-ruler__handle[data-v-0d39d609]{cursor:ew-resize;background:0 0;border:0;width:14px;height:8px;padding:0;position:absolute;transform:translate(-7px)}.doc-ruler__handle[data-v-0d39d609]:disabled{cursor:default}.doc-ruler__handle[data-v-0d39d609]:before{background:var(--nuvra-color-primary);content:"";opacity:.7;position:absolute;inset:1px 2px}.doc-ruler__handle[data-v-0d39d609]:hover:before,.doc-ruler__handle.is-dragging[data-v-0d39d609]:before{opacity:1}.doc-ruler__handle--first-line[data-v-0d39d609]{top:0}.doc-ruler__handle--first-line[data-v-0d39d609]:before{clip-path:polygon(0 0,100% 0,50% 100%)}.doc-ruler__handle--indent-left[data-v-0d39d609],.doc-ruler__handle--indent-right[data-v-0d39d609]{bottom:0}.doc-ruler__handle--indent-left[data-v-0d39d609]:before,.doc-ruler__handle--indent-right[data-v-0d39d609]:before{clip-path:polygon(50% 0,100% 100%,0 100%)}.doc-ruler__handle--margin[data-v-0d39d609]{height:8px;top:8px}.doc-ruler__handle--margin[data-v-0d39d609]:before{background:var(--nuvra-text-muted);border-radius:1px;inset:0 6px}.doc-ruler__guide[data-v-0d39d609]{background:var(--nuvra-color-primary);opacity:.5;pointer-events:none;width:1px;height:60vh;position:absolute;top:100%}.doc-canvas[data-v-1857b591]{box-sizing:border-box;min-height:0;padding:var(--doc-editor-canvas-padding);overscroll-behavior:contain;background:#e9ebef;flex:auto;position:relative;overflow:auto}.doc-canvas.is-auto[data-v-1857b591]{min-height:var(--doc-editor-min-height);max-height:var(--doc-editor-max-height);flex:none}.doc-canvas__sizer[data-v-1857b591]{margin:0 auto;position:relative}.doc-canvas__ruler[data-v-1857b591]{z-index:3;top:calc(-1 * var(--doc-editor-canvas-padding));box-sizing:border-box;width:max-content;min-width:calc(100% + 2 * var(--doc-editor-canvas-padding));margin:calc(-1 * var(--doc-editor-canvas-padding)) calc(-1 * var(--doc-editor-canvas-padding)) 16px;padding:8px var(--doc-editor-canvas-padding);background:inherit;position:sticky}.doc-canvas__ruler-track[data-v-1857b591]{margin:0 auto}.doc-canvas__stage[data-v-1857b591]{--page-height:1123px;--pages-height:1123px;--margin-top:96px;--margin-right:96px;--margin-bottom:96px;--margin-left:96px;--page-break-label:"";transform-origin:0 0;position:absolute;top:0;left:0}.doc-canvas.is-web .doc-canvas__stage[data-v-1857b591]{background:#fff;box-shadow:0 0 0 1px #1018280f,0 1px 4px #10182814}.doc-canvas__sheets[data-v-1857b591]{pointer-events:none;position:absolute;inset:0}.doc-canvas__sheet[data-v-1857b591]{width:100%;height:var(--page-height);background:#fff;position:absolute;left:0;box-shadow:0 0 0 1px #1018280f,0 2px 8px #1018281a}.doc-canvas__page-number[data-v-1857b591]{right:0;bottom:calc(var(--margin-bottom) / 2 - 8px);color:#98a2b3;text-align:center;font:11px/16px system-ui,sans-serif;position:absolute;left:0}.doc-canvas__watermark[data-v-1857b591]{letter-spacing:.06em;opacity:.16;text-transform:uppercase;white-space:nowrap;justify-content:center;align-items:center;font-family:Times New Roman,Times,serif;font-weight:700;line-height:1;display:flex;position:absolute;inset:0;overflow:hidden}.doc-canvas__running[data-v-1857b591]{right:var(--margin-right);left:var(--margin-left);color:#475467;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:12px;font:10pt/1.4 Times New Roman,Times,serif;display:grid;position:absolute}.doc-canvas__running span[data-v-1857b591]{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.doc-canvas__running span[data-v-1857b591]:nth-child(2){text-align:center}.doc-canvas__running span[data-v-1857b591]:nth-child(3){text-align:right}.doc-canvas__running--header[data-v-1857b591]{top:max(6px, calc(var(--margin-top) / 2 - 8px))}.doc-canvas__running--footer[data-v-1857b591]{bottom:max(6px, calc(var(--margin-bottom) / 2 - 8px))}.doc-canvas__content[data-v-1857b591]{box-sizing:border-box;min-height:inherit;caret-color:#1f2328;outline:none;position:relative}.doc-canvas.is-page .doc-canvas__content[data-v-1857b591]{min-height:var(--pages-height);padding:var(--margin-top) var(--margin-right) var(--margin-bottom) var(--margin-left)}.doc-canvas.is-web .doc-canvas__content[data-v-1857b591]{padding:40px 56px}.doc-canvas.is-auto.is-web .doc-canvas__content[data-v-1857b591]{padding:16px 20px}.doc-context-menu[data-v-4ef1fd0b]{z-index:3000;box-sizing:border-box;max-height:80vh;padding:var(--doc-popover-padding,4px);border:1px solid var(--nuvra-border-light);color:var(--nuvra-text);background:var(--nuvra-bg-overlay);box-shadow:var(--nuvra-shadow);text-align:left;border-radius:10px;margin:0;font-size:14px;line-height:1.4;position:fixed;inset:auto;overflow:auto}.doc-context-menu[data-v-4ef1fd0b]:not(.is-open){display:none}.find-bar[data-v-d9d0df82]{z-index:5;border:1px solid var(--nuvra-border-light);background:var(--nuvra-bg-overlay);box-shadow:var(--nuvra-shadow);border-radius:10px;align-items:flex-start;gap:2px;padding:5px;display:flex;position:absolute;top:8px;right:20px}.find-bar__rows[data-v-d9d0df82]{gap:5px;display:grid}.find-bar__row[data-v-d9d0df82]{align-items:center;gap:1px;display:flex}.find-bar__input[data-v-d9d0df82]{width:220px;margin-right:4px}.find-bar__count[data-v-d9d0df82]{color:var(--nuvra-text-muted);font-variant-numeric:tabular-nums;font-size:11px}.find-bar__chevron[data-v-d9d0df82]{transition:transform .15s}.is-active>.find-bar__chevron[data-v-d9d0df82]{transform:rotate(90deg)}.find-bar__text-button[data-v-d9d0df82]{padding:0 8px;font-size:12px}@container (width<=560px){.find-bar[data-v-d9d0df82]{left:8px;right:8px}.find-bar__rows[data-v-d9d0df82]{flex:auto;min-width:0}.find-bar__input[data-v-d9d0df82]{flex:auto;width:auto}}.status-bar[data-v-5c305db4]{border-top:1px solid var(--nuvra-border-lighter);min-height:32px;color:var(--nuvra-text-muted);background:var(--nuvra-bg);-webkit-user-select:none;user-select:none;flex:none;justify-content:space-between;align-items:center;gap:12px;padding:0 6px 0 12px;font-size:12px;display:flex}.status-bar__info[data-v-5c305db4]{white-space:nowrap;gap:14px;min-width:0;display:flex;overflow:hidden}.is-limit[data-v-5c305db4]{color:var(--nuvra-color-danger);font-weight:600}.status-bar__controls[data-v-5c305db4]{flex:none;align-items:center;gap:1px;display:flex}.status-bar .doc-tb-button[data-v-5c305db4]{min-width:24px;height:24px;font-size:12px}.status-bar__segmented[data-v-5c305db4]{background:var(--nuvra-fill);border-radius:7px;margin-right:6px;padding:2px;display:flex}.status-bar__segmented .doc-tb-button[data-v-5c305db4]{height:20px}.status-bar__segmented .doc-tb-button.is-active[data-v-5c305db4]{background:var(--nuvra-bg);box-shadow:0 1px 2px #1018281f}.status-bar__slider[data-v-5c305db4]{--slider-line:var(--nuvra-text-placeholder);--slider-thumb:var(--nuvra-text);cursor:pointer;background:linear-gradient(var(--slider-line), var(--slider-line)) calc(2px + (100% - 4px) * var(--v0fabfa1f)) 50% / 1px 8px no-repeat, linear-gradient(var(--slider-line), var(--slider-line)) 0 50% / 100% 1px no-repeat;appearance:none;width:100px;height:16px;margin:0 2px;padding:0}.status-bar__slider[data-v-5c305db4]:focus{outline:none}.status-bar__slider[data-v-5c305db4]::-webkit-slider-runnable-track{background:0 0;height:16px}.status-bar__slider[data-v-5c305db4]::-moz-range-track{background:0 0;height:16px}.status-bar__slider[data-v-5c305db4]::-webkit-slider-thumb{background:var(--slider-thumb);appearance:none;border:none;border-radius:1px;width:4px;height:12px;margin-top:2px;transition:background-color .15s}.status-bar__slider[data-v-5c305db4]::-moz-range-thumb{background:var(--slider-thumb);border:none;border-radius:1px;width:4px;height:12px;transition:background-color .15s}.status-bar__slider[data-v-5c305db4]:hover,.status-bar__slider[data-v-5c305db4]:active{--slider-thumb:var(--nuvra-color-primary)}.status-bar__slider[data-v-5c305db4]:focus-visible::-webkit-slider-thumb{outline:2px solid var(--nuvra-color-primary-border);outline-offset:1px}.status-bar__slider[data-v-5c305db4]:focus-visible::-moz-range-thumb{outline:2px solid var(--nuvra-color-primary-border);outline-offset:1px}.status-bar .status-bar__zoom-step[data-v-5c305db4]{min-width:20px;height:20px;padding:0}.status-bar__zoom[data-v-5c305db4]{font-variant-numeric:tabular-nums;min-width:40px}@container (width<=560px){.status-bar__slider[data-v-5c305db4],.status-bar__segmented[data-v-5c305db4]{display:none}}.doc-popover[data-v-cae67a7a],.doc-popover__reference[data-v-cae67a7a]{align-items:center;display:inline-flex}.doc-popover__panel[data-v-cae67a7a]{z-index:3000;box-sizing:border-box;padding:var(--doc-popover-padding,10px);border:1px solid var(--nuvra-border-light);color:var(--nuvra-text);background:var(--nuvra-bg-overlay);box-shadow:var(--nuvra-shadow);text-align:left;border-radius:10px;margin:0;font-size:14px;line-height:1.4;position:fixed;inset:auto;overflow:auto}.doc-popover__panel[data-v-cae67a7a]:not(.is-open){display:none}.color-picker[data-v-16f6edba]{align-items:center;display:inline-flex}.color-picker__apply[data-v-16f6edba]{min-width:26px;padding-bottom:3px;position:relative}.color-picker__letter[data-v-16f6edba]{font-family:Georgia,serif;font-size:15px;font-weight:700}.color-picker__bar[data-v-16f6edba]{border-radius:1px;height:3px;position:absolute;bottom:4px;left:6px;right:6px;box-shadow:inset 0 0 0 1px #0000001f}.palette[data-v-16f6edba]{gap:8px;display:grid}.palette__reset[data-v-16f6edba],.palette__custom[data-v-16f6edba]{height:28px;color:var(--nuvra-text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:0 6px;font-size:13px;display:flex}.palette__reset[data-v-16f6edba]:hover,.palette__custom[data-v-16f6edba]:hover{background:var(--nuvra-fill)}.palette__reset-swatch[data-v-16f6edba]{box-sizing:border-box;border:1px solid var(--nuvra-border);border-radius:3px;width:16px;height:16px}.palette__reset-swatch.is-text[data-v-16f6edba]{background:#1f2328}.palette__reset-swatch.is-highlight[data-v-16f6edba]{background:linear-gradient(to top right,#fff calc(50% - 1px),#e11d48 50%,#fff calc(50% + 1px))}.palette__grid[data-v-16f6edba]{grid-template-columns:repeat(10,18px);justify-content:space-between;gap:3px;display:grid}.palette__swatch[data-v-16f6edba]{cursor:pointer;border:1px solid #0000001f;border-radius:3px;width:18px;height:18px;padding:0;transition:transform .1s}.palette__swatch[data-v-16f6edba]:hover{transform:scale(1.15)}.palette__swatch.is-selected[data-v-16f6edba]{box-shadow:0 0 0 2px #fff, 0 0 0 3.5px var(--nuvra-color-primary)}.palette__custom input[data-v-16f6edba]{cursor:pointer;background:0 0;border:0;width:22px;height:22px;padding:0}.header-footer[data-v-e4cc7115]{color:var(--nuvra-text);gap:12px;display:grid}.header-footer__section[data-v-e4cc7115]{gap:6px;display:grid}.header-footer__section h4[data-v-e4cc7115]{color:var(--nuvra-text-strong);margin:0;font-size:12px;font-weight:600}.header-footer__grid[data-v-e4cc7115]{grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;display:grid}.header-footer__field[data-v-e4cc7115]{color:var(--nuvra-text-muted);gap:3px;font-size:11px;display:grid}.header-footer__tokens[data-v-e4cc7115]{flex-wrap:wrap;align-items:center;gap:4px;display:flex}.header-footer__actions[data-v-e4cc7115]{justify-content:space-between;align-items:center;gap:8px;display:flex}.header-footer__caption[data-v-e4cc7115]{color:var(--nuvra-text-muted);font-size:11px}.page-setup[data-v-c560a634]{color:var(--nuvra-text);gap:12px;display:grid}.page-setup__section[data-v-c560a634]{gap:6px;display:grid}.page-setup__section h4[data-v-c560a634]{color:var(--nuvra-text-strong);margin:0;font-size:12px;font-weight:600}.page-setup__grid[data-v-c560a634]{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;display:grid}.page-setup__grid--sizes[data-v-c560a634],.page-setup__grid--presets[data-v-c560a634]{grid-template-columns:repeat(3,minmax(0,1fr))}.page-setup__chip[data-v-c560a634]{border:1px solid var(--nuvra-border);min-width:0;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border-radius:6px;flex-direction:column;align-items:flex-start;gap:1px;padding:5px 8px;font-size:12px;display:flex}.page-setup__chip[data-v-c560a634]:hover{border-color:var(--nuvra-color-primary-border)}.page-setup__chip.is-active[data-v-c560a634]{border-color:var(--nuvra-color-primary);color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-soft)}.page-setup__chip--row[data-v-c560a634]{flex-direction:row;align-items:center;gap:6px}.page-setup__chip small[data-v-c560a634]{color:var(--nuvra-text-muted);white-space:nowrap;font-size:10px}.page-setup__caption[data-v-c560a634]{color:var(--nuvra-text-muted);margin-top:4px;font-size:11px}.page-setup__field[data-v-c560a634]{color:var(--nuvra-text-muted);gap:3px;font-size:11px;display:grid}.page-setup__color[data-v-c560a634]{height:28px;padding:2px}.page-setup__checkbox[data-v-c560a634]{align-self:end;padding-bottom:4px}.table-picker[data-v-e2298f4b]{gap:6px;display:grid}.table-picker__grid[data-v-e2298f4b]{grid-template-columns:repeat(10,16px);gap:3px;display:grid}.table-picker__cell[data-v-e2298f4b]{border:1px solid var(--nuvra-border);background:var(--nuvra-bg);cursor:pointer;border-radius:2px;width:16px;height:16px;padding:0}.table-picker__cell.is-active[data-v-e2298f4b]{border-color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-muted)}.table-picker__size[data-v-e2298f4b]{color:var(--nuvra-text);text-align:center;font-size:12px}.doc-toolbar[data-v-26218e39]{box-sizing:border-box;border-bottom:1px solid var(--nuvra-border-lighter);background:var(--nuvra-bg);scrollbar-width:thin;flex:none;align-items:center;gap:2px;min-height:40px;padding:5px 8px;display:flex;overflow-x:auto}.doc-toolbar__group[data-v-26218e39]{flex:none;align-items:center;gap:1px;display:flex}.doc-toolbar__divider[data-v-26218e39]{background:var(--nuvra-border-lighter);flex:0 0 1px;align-self:stretch;margin:4px 5px}.doc-toolbar__spacer[data-v-26218e39]{flex:auto;min-width:8px}.doc-toolbar__group--end[data-v-26218e39]{background:var(--nuvra-bg);padding-left:6px;position:sticky;right:0}.doc-toolbar__block[data-v-26218e39]{width:108px}.doc-toolbar__font[data-v-26218e39]{width:118px}.doc-toolbar__size[data-v-26218e39]{text-align:center;width:44px;height:28px;padding:0 4px}.doc-toolbar[data-v-26218e39] .doc-toolbar__size-menu{min-width:96px}.doc-toolbar__form[data-v-26218e39]{gap:8px;display:grid}.doc-toolbar__field[data-v-26218e39]{color:var(--nuvra-text-muted);gap:4px;font-size:12px;display:grid}.doc-toolbar__form-actions[data-v-26218e39]{justify-content:flex-end;gap:6px;display:flex}.doc-toolbar__caption[data-v-26218e39]{color:var(--nuvra-text-muted);text-align:center;font-size:11px}.doc-toolbar__inline-form[data-v-26218e39]{gap:6px;display:flex}.doc-toolbar__characters[data-v-26218e39]{grid-template-columns:repeat(9,minmax(0,1fr));gap:2px;display:grid}.doc-toolbar__characters button[data-v-26218e39]{height:26px;color:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0;font-size:15px}.doc-toolbar__characters button[data-v-26218e39]:hover{background:var(--nuvra-fill)}.doc-content{color:#1f2328;white-space:pre-wrap;overflow-wrap:break-word;tab-size:4;font-family:Times New Roman,Times,serif;font-size:12pt;line-height:1.5}.doc-content :is(p,h1,h2,h3,h4,h5,h6):not([dir]){unicode-bidi:plaintext}.doc-content p{margin:0 0 6pt}.doc-content h1,.doc-content h2,.doc-content h3,.doc-content h4,.doc-content h5,.doc-content h6{margin:0 0 6pt;padding-top:6pt;font-weight:700;line-height:1.25}.doc-content h1{font-size:20pt}.doc-content h2{font-size:16pt}.doc-content h3{font-size:14pt}.doc-content h4{font-size:12pt}.doc-content h5{font-size:11pt}.doc-content h6{font-size:10pt}.doc-content ul,.doc-content ol{margin:0 0 6pt;padding-left:24pt}.doc-content li>p{margin-bottom:2pt}.doc-content ul[data-type=taskList]{padding-left:2pt;list-style:none}.doc-content ul[data-type=taskList] li{align-items:flex-start;gap:6pt;display:flex}.doc-content ul[data-type=taskList] li>label{-webkit-user-select:none;user-select:none;flex:none;margin-top:.3em}.doc-content ul[data-type=taskList] li>div{flex:auto;min-width:0}.doc-content ul[data-type=taskList] li[data-checked=true]>div{color:#667085;text-decoration:line-through}.doc-content blockquote{color:#475467;border-left:3px solid #b3c5f5;margin:0 0 6pt;padding:2pt 0 2pt 12pt}.doc-content blockquote>p:last-child,.doc-content li>p:last-child,.doc-content td>p:last-child,.doc-content th>p:last-child{margin-bottom:0}.doc-content pre{white-space:pre-wrap;background:#f4f6f8;border-radius:4px;margin:0 0 6pt;padding:8pt 10pt;font-family:Consolas,Courier New,monospace;font-size:10pt;line-height:1.45}.doc-content code{background:#eef1f4;border-radius:3px;padding:1px 4px;font-family:Consolas,Courier New,monospace;font-size:.9em}.doc-content pre code{font-size:inherit;background:0 0;padding:0}.doc-content hr{border:0;border-bottom:1px solid #c4cad4;height:0;margin:0 0 6pt;padding-top:6pt}.doc-content a{color:#1d4ed8;text-decoration:underline}.doc-content mark{color:inherit;border-radius:2px;padding:0 1px}.doc-content img{max-width:100%;height:auto}.doc-content img[data-align=left]{margin:0 auto 6pt 0;display:block}.doc-content img[data-align=center]{margin:0 auto 6pt;display:block}.doc-content img[data-align=right]{margin:0 0 6pt auto;display:block}.doc-content table{border-collapse:collapse;table-layout:fixed;width:100%;margin:0 0 6pt}.doc-content td,.doc-content th{box-sizing:border-box;vertical-align:top;border:1px solid #8f99a8;min-width:1em;padding:3pt 5pt}.doc-content th{text-align:left;background:#f2f4f7;font-weight:700}.doc-content .doc-page-break{break-after:page;page-break-after:always;height:0}:where(.document-editor){--nuvra-color-primary:#409eff;--nuvra-color-primary-hover:#79bbff;--nuvra-color-primary-border:#a0cfff;--nuvra-color-primary-muted:#c6e2ff;--nuvra-color-primary-soft:#ecf5ff;--nuvra-color-on-primary:#fff;--nuvra-color-danger:#f56c6c;--nuvra-color-danger-soft:#fef0f0;--nuvra-text-strong:#303133;--nuvra-text:#606266;--nuvra-text-muted:#909399;--nuvra-text-placeholder:#a8abb2;--nuvra-text-disabled:#c0c4cc;--nuvra-border:#dcdfe6;--nuvra-border-hover:#c0c4cc;--nuvra-border-light:#e4e7ed;--nuvra-border-lighter:#ebeef5;--nuvra-fill:#f5f7fa;--nuvra-bg:#fff;--nuvra-bg-overlay:#fff;--nuvra-shadow:0 0 12px #0000001f;--nuvra-fullscreen-z-index:2000}:where(.dark .document-editor,[data-theme=dark] .document-editor){--nuvra-color-primary-hover:#66b1ff;--nuvra-color-primary-border:#2a598a;--nuvra-color-primary-muted:#213d5b;--nuvra-color-primary-soft:#18222c;--nuvra-color-danger-soft:#2b1d1d;--nuvra-text-strong:#e5eaf3;--nuvra-text:#cfd3dc;--nuvra-text-muted:#a3a6ad;--nuvra-text-placeholder:#8d9095;--nuvra-text-disabled:#6c6e72;--nuvra-border:#4c4d4f;--nuvra-border-hover:#6c6e72;--nuvra-border-light:#414243;--nuvra-border-lighter:#363637;--nuvra-fill:#262727;--nuvra-bg:#141414;--nuvra-bg-overlay:#1d1e1f;--nuvra-shadow:0 0 12px #000000b8}.doc-content.is-format-painter{cursor:copy}.doc-content.doc-show-marks p:after,.doc-content.doc-show-marks h1:after,.doc-content.doc-show-marks h2:after,.doc-content.doc-show-marks h3:after,.doc-content.doc-show-marks h4:after,.doc-content.doc-show-marks h5:after,.doc-content.doc-show-marks h6:after{content:"¶";color:var(--nuvra-color-primary);opacity:.55;pointer-events:none;-webkit-user-select:none;user-select:none;margin-left:1px;font-family:system-ui,sans-serif;font-weight:400}.doc-tb-button{box-sizing:border-box;min-width:28px;height:28px;color:var(--nuvra-text);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;justify-content:center;align-items:center;gap:4px;padding:0 5px;font-size:13px;line-height:1;transition:background-color .12s,color .12s;display:inline-flex}.doc-tb-button:hover:not(:disabled){background:var(--nuvra-fill)}.doc-tb-button:focus-visible{outline:2px solid var(--nuvra-color-primary);outline-offset:-2px}.doc-tb-button.is-active{color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-soft)}.doc-tb-button:disabled{color:var(--nuvra-text-disabled);cursor:not-allowed}.doc-tb-button--select{justify-content:space-between;padding:0 4px 0 7px}.doc-tb-button--caret{min-width:16px;padding:0 2px}.doc-tb-button__label{text-overflow:ellipsis;overflow:hidden}.doc-menu{--doc-popover-padding:4px}.doc-menu__items{min-width:168px;display:grid}.doc-menu__item{box-sizing:border-box;width:100%;color:var(--nuvra-text);font:inherit;text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;outline:none;align-items:center;gap:8px;padding:5px 12px 5px 8px;font-size:13px;line-height:20px;display:flex}.doc-menu__item:hover,.doc-menu__item:focus-visible{color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-soft)}.doc-menu__item.is-selected{color:var(--nuvra-color-primary);font-weight:600}.doc-menu__item.is-danger:hover,.doc-menu__item.is-danger:focus-visible{color:var(--nuvra-color-danger);background:var(--nuvra-color-danger-soft)}.doc-menu__item:disabled{color:var(--nuvra-text-disabled);cursor:default;background:0 0}.doc-menu__divider{background:var(--nuvra-border-lighter);height:1px;margin:4px 0}.doc-menu__hint{color:var(--nuvra-text-placeholder);margin-left:auto;padding-left:20px;font-size:11px;font-weight:400}.doc-menu__h1{font-size:18px;font-weight:700}.doc-menu__h2{font-size:16px;font-weight:700}.doc-menu__h3{font-size:15px;font-weight:700}.doc-menu__h4{font-size:14px;font-weight:700}.doc-input{box-sizing:border-box;border:1px solid var(--nuvra-border);width:100%;min-width:0;height:24px;color:var(--nuvra-text);background:var(--nuvra-bg);font:inherit;border-radius:4px;outline:none;margin:0;padding:0 7px;font-size:12px;transition:border-color .12s}.doc-input::placeholder{color:var(--nuvra-text-placeholder)}.doc-input:hover{border-color:var(--nuvra-border-hover)}.doc-input:focus,.doc-input:focus-within{border-color:var(--nuvra-color-primary)}.doc-input--affix{align-items:center;gap:6px;display:inline-flex}.doc-input--affix input{min-width:0;height:100%;color:inherit;font:inherit;background:0 0;border:0;outline:none;flex:auto;margin:0;padding:0}.doc-input--affix input::placeholder{color:var(--nuvra-text-placeholder)}.doc-btn{box-sizing:border-box;border:1px solid var(--nuvra-border);height:24px;color:var(--nuvra-text);background:var(--nuvra-bg);font:inherit;white-space:nowrap;cursor:pointer;border-radius:4px;flex:none;justify-content:center;align-items:center;gap:5px;margin:0;padding:0 11px;font-size:12px;line-height:1;transition:background-color .12s,border-color .12s,color .12s;display:inline-flex}.doc-btn:hover:not(:disabled){border-color:var(--nuvra-color-primary-muted);color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-soft)}.doc-btn:focus-visible{outline:2px solid var(--nuvra-color-primary-border);outline-offset:1px}.doc-btn:disabled{border-color:var(--nuvra-border-lighter);color:var(--nuvra-text-placeholder);cursor:not-allowed}.doc-btn--primary{border-color:var(--nuvra-color-primary);color:var(--nuvra-color-on-primary);background:var(--nuvra-color-primary)}.doc-btn--primary:hover:not(:disabled){border-color:var(--nuvra-color-primary-hover);color:var(--nuvra-color-on-primary);background:var(--nuvra-color-primary-hover)}.doc-btn--primary:disabled{border-color:var(--nuvra-color-primary-border);color:var(--nuvra-color-on-primary);background:var(--nuvra-color-primary-border)}.doc-btn--danger-text{color:var(--nuvra-color-danger);background:0 0;border-color:#0000}.doc-btn--danger-text:hover:not(:disabled){color:var(--nuvra-color-danger);background:var(--nuvra-color-danger-soft);border-color:#0000}.doc-checkbox{color:var(--nuvra-text);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;font-size:12px;display:inline-flex}.doc-checkbox input{width:13px;height:13px;accent-color:var(--nuvra-color-primary);cursor:pointer;margin:0}.doc-spin{animation:1s linear infinite doc-spin}@keyframes doc-spin{to{transform:rotate(360deg)}}.doc-canvas .doc-content{--doc-placeholder:""}.doc-canvas .doc-content.is-empty>p:first-child:before{float:left;color:#98a2b3;content:var(--doc-placeholder);pointer-events:none;height:0}.doc-canvas .doc-content .doc-page-break{cursor:default;-webkit-user-select:none;user-select:none;height:18px;margin-bottom:6pt;position:relative}.doc-canvas .doc-content .doc-page-break:before{content:"";border-top:1px dashed #98a2b3;position:absolute;top:50%;left:0;right:0}.doc-canvas .doc-content .doc-page-break:after{color:#667085;letter-spacing:.04em;text-transform:uppercase;content:var(--page-break-label);background:#fff;padding:0 8px;font:10px/16px system-ui,sans-serif;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.doc-canvas .doc-content td,.doc-canvas .doc-content th{position:relative}.doc-canvas .doc-content .doc-cell-selected:after{content:"";pointer-events:none;background:#3b82f629;position:absolute;inset:0}.doc-canvas .doc-content.has-cell-selection ::selection{background:0 0}.doc-canvas .doc-content.is-column-resize,.doc-canvas .doc-content.is-column-resize *{cursor:col-resize}.doc-canvas .doc-content ul[data-type=taskList] input[type=checkbox]{cursor:pointer}.doc-canvas .doc-content a{cursor:text}::highlight(doc-search){background-color:#facc1573}::highlight(doc-search-current){background-color:#f973168c}.document-editor[data-v-bae82913]{--doc-editor-canvas-padding:50px;--doc-editor-height:760px;--doc-editor-min-height:240px;--doc-editor-max-height:600px;box-sizing:border-box;width:100%;min-width:0;height:var(--doc-editor-height);border:1px solid var(--nuvra-border);background:var(--nuvra-bg);border-radius:10px;flex-direction:column;min-height:360px;transition:border-color .16s;display:flex;position:relative;overflow:hidden;container-type:inline-size}.document-editor[data-v-bae82913]:focus-within{border-color:var(--nuvra-color-primary-border)}.document-editor.is-auto-height[data-v-bae82913]{height:auto;min-height:0}.document-editor.is-fullscreen[data-v-bae82913]{z-index:var(--nuvra-fullscreen-z-index);border:0;border-radius:0;height:100dvh;position:fixed;inset:0}.document-editor__body[data-v-bae82913]{flex-direction:column;flex:auto;min-height:0;display:flex;position:relative}.document-editor__source[data-v-bae82913]{box-sizing:border-box;color:#1f2328;resize:none;tab-size:2;background:#fbfcfd;border:0;outline:none;flex:auto;min-height:0;margin:0;padding:16px 20px;font:13px/1.6 ui-monospace,SFMono-Regular,Consolas,monospace}.document-editor__uploading[data-v-bae82913]{color:#fff;pointer-events:none;background:#101828cc;border-radius:999px;padding:6px 12px;font-size:12px;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}
|
|
1
|
+
.doc-content{color:#1f2328;white-space:pre-wrap;overflow-wrap:break-word;tab-size:4;font-family:Times New Roman,Times,serif;font-size:12pt;line-height:1.5}.doc-content :is(p,h1,h2,h3,h4,h5,h6):not([dir]){unicode-bidi:plaintext}.doc-content p{margin:0 0 6pt}.doc-content h1,.doc-content h2,.doc-content h3,.doc-content h4,.doc-content h5,.doc-content h6{margin:0 0 6pt;padding-top:6pt;font-weight:700;line-height:1.25}.doc-content h1{font-size:20pt}.doc-content h2{font-size:16pt}.doc-content h3{font-size:14pt}.doc-content h4{font-size:12pt}.doc-content h5{font-size:11pt}.doc-content h6{font-size:10pt}.doc-content ul,.doc-content ol{margin:0 0 6pt;padding-left:24pt}.doc-content li>p{margin-bottom:2pt}.doc-content ol[data-numbering=legal],.doc-content ol[data-numbering=legal] ol{counter-reset:doc-legal;padding-left:0;list-style:none}.doc-content ol[data-numbering=legal]>li,.doc-content ol[data-numbering=legal] ol>li{counter-increment:doc-legal;grid-template-columns:auto minmax(0,1fr);column-gap:6pt;display:grid}.doc-content ol[data-numbering=legal]>li:before,.doc-content ol[data-numbering=legal] ol>li:before{content:counters(doc-legal, ".") ".";grid-area:1/1}.doc-content ol[data-numbering=legal] li>*{grid-column:2}.doc-content ol[data-numbering=legal] ol{margin:2pt 0 0}.doc-content ul[data-type=taskList]{padding-left:2pt;list-style:none}.doc-content ul[data-type=taskList] li{align-items:flex-start;gap:6pt;display:flex}.doc-content ul[data-type=taskList] li>label{-webkit-user-select:none;user-select:none;flex:none;margin-top:.3em}.doc-content ul[data-type=taskList] li>div{flex:auto;min-width:0}.doc-content ul[data-type=taskList] li[data-checked=true]>div{color:#667085;text-decoration:line-through}.doc-content blockquote{color:#475467;border-left:3px solid #b3c5f5;margin:0 0 6pt;padding:2pt 0 2pt 12pt}.doc-content blockquote>p:last-child,.doc-content li>p:last-child,.doc-content td>p:last-child,.doc-content th>p:last-child{margin-bottom:0}.doc-content pre{white-space:pre-wrap;background:#f4f6f8;border-radius:4px;margin:0 0 6pt;padding:8pt 10pt;font-family:Consolas,Courier New,monospace;font-size:10pt;line-height:1.45}.doc-content code{background:#eef1f4;border-radius:3px;padding:1px 4px;font-family:Consolas,Courier New,monospace;font-size:.9em}.doc-content pre code{font-size:inherit;background:0 0;padding:0}.doc-content hr{border:0;border-bottom:1px solid #c4cad4;height:0;margin:0 0 6pt;padding-top:6pt}.doc-content a{color:#1d4ed8;text-decoration:underline}.doc-content mark{color:inherit;border-radius:2px;padding:0 1px}.doc-content img{max-width:100%;height:auto}.doc-content img[data-align=left]{margin:0 auto 6pt 0;display:block}.doc-content img[data-align=center]{margin:0 auto 6pt;display:block}.doc-content img[data-align=right]{margin:0 0 6pt auto;display:block}.doc-content table{border-collapse:collapse;table-layout:fixed;width:100%;margin:0 0 6pt}.doc-content td,.doc-content th{box-sizing:border-box;vertical-align:top;border:1px solid #8f99a8;min-width:1em;padding:3pt 5pt}.doc-content th{text-align:left;background:#f2f4f7;font-weight:700}.doc-content table[data-type=signature] td,.doc-content table[data-type=signature] th,.doc-content table[data-type=toc] td,.doc-content table[data-type=toc] th{background:0 0;border:0;padding:0 5pt}.doc-content table[data-type=toc] tr:first-child td{padding-bottom:6pt}.doc-content ins[data-change]{color:#15803d;text-decoration:underline}.doc-content del[data-change]{color:#b91c1c;text-decoration:line-through}.doc-content{counter-reset:doc-footnote}.doc-content sup[data-footnote]{counter-increment:doc-footnote}.doc-content sup[data-footnote]:empty:after{content:counter(doc-footnote)}.doc-footnotes{box-sizing:border-box;color:#1f2328;padding-top:4pt;font:10pt/1.3 Times New Roman,Times,serif}.doc-footnotes:before{content:"";border-top:1px solid #667085;width:33%;margin-bottom:3pt;display:block}.doc-footnotes p{text-align:justify;margin:0 0 2pt}.doc-content .doc-page-break{break-after:page;page-break-after:always;height:0}:where(.document-editor){--nuvra-color-primary:#409eff;--nuvra-color-primary-hover:#79bbff;--nuvra-color-primary-border:#a0cfff;--nuvra-color-primary-muted:#c6e2ff;--nuvra-color-primary-soft:#ecf5ff;--nuvra-color-on-primary:#fff;--nuvra-color-danger:#f56c6c;--nuvra-color-danger-soft:#fef0f0;--nuvra-text-strong:#303133;--nuvra-text:#606266;--nuvra-text-muted:#909399;--nuvra-text-placeholder:#a8abb2;--nuvra-text-disabled:#c0c4cc;--nuvra-border:#dcdfe6;--nuvra-border-hover:#c0c4cc;--nuvra-border-light:#e4e7ed;--nuvra-border-lighter:#ebeef5;--nuvra-fill:#f5f7fa;--nuvra-bg:#fff;--nuvra-bg-overlay:#fff;--nuvra-shadow:0 0 12px #0000001f;--nuvra-fullscreen-z-index:2000}:where(.dark .document-editor,[data-theme=dark] .document-editor){--nuvra-color-primary-hover:#66b1ff;--nuvra-color-primary-border:#2a598a;--nuvra-color-primary-muted:#213d5b;--nuvra-color-primary-soft:#18222c;--nuvra-color-danger-soft:#2b1d1d;--nuvra-text-strong:#e5eaf3;--nuvra-text:#cfd3dc;--nuvra-text-muted:#a3a6ad;--nuvra-text-placeholder:#8d9095;--nuvra-text-disabled:#6c6e72;--nuvra-border:#4c4d4f;--nuvra-border-hover:#6c6e72;--nuvra-border-light:#414243;--nuvra-border-lighter:#363637;--nuvra-fill:#262727;--nuvra-bg:#141414;--nuvra-bg-overlay:#1d1e1f;--nuvra-shadow:0 0 12px #000000b8}.doc-content.is-format-painter{cursor:copy}.doc-content.doc-show-marks p:after,.doc-content.doc-show-marks h1:after,.doc-content.doc-show-marks h2:after,.doc-content.doc-show-marks h3:after,.doc-content.doc-show-marks h4:after,.doc-content.doc-show-marks h5:after,.doc-content.doc-show-marks h6:after{content:"¶";color:var(--nuvra-color-primary);opacity:.55;pointer-events:none;-webkit-user-select:none;user-select:none;margin-left:1px;font-family:system-ui,sans-serif;font-weight:400}.doc-tb-button{box-sizing:border-box;min-width:28px;height:28px;color:var(--nuvra-text);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;justify-content:center;align-items:center;gap:4px;padding:0 5px;font-size:13px;line-height:1;transition:background-color .12s,color .12s;display:inline-flex}.doc-tb-button:hover:not(:disabled){background:var(--nuvra-fill)}.doc-tb-button:focus-visible{outline:2px solid var(--nuvra-color-primary);outline-offset:-2px}.doc-tb-button.is-active{color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-soft)}.doc-tb-button:disabled{color:var(--nuvra-text-disabled);cursor:not-allowed}.doc-tb-button--select{justify-content:space-between;padding:0 4px 0 7px}.doc-tb-button--caret{min-width:16px;padding:0 2px}.doc-tb-button__label{text-overflow:ellipsis;overflow:hidden}.doc-menu{--doc-popover-padding:4px}.doc-menu__items{min-width:168px;display:grid}.doc-menu__item{box-sizing:border-box;width:100%;color:var(--nuvra-text);font:inherit;text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;outline:none;align-items:center;gap:8px;padding:5px 12px 5px 8px;font-size:13px;line-height:20px;display:flex}.doc-menu__item:hover,.doc-menu__item:focus-visible{color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-soft)}.doc-menu__item.is-selected{color:var(--nuvra-color-primary);font-weight:600}.doc-menu__item.is-danger:hover,.doc-menu__item.is-danger:focus-visible{color:var(--nuvra-color-danger);background:var(--nuvra-color-danger-soft)}.doc-menu__item:disabled{color:var(--nuvra-text-disabled);cursor:default;background:0 0}.doc-menu__divider{background:var(--nuvra-border-lighter);height:1px;margin:4px 0}.doc-menu__hint{color:var(--nuvra-text-placeholder);margin-left:auto;padding-left:20px;font-size:11px;font-weight:400}.doc-menu__h1{font-size:18px;font-weight:700}.doc-menu__h2{font-size:16px;font-weight:700}.doc-menu__h3{font-size:15px;font-weight:700}.doc-menu__h4{font-size:14px;font-weight:700}.doc-input{box-sizing:border-box;border:1px solid var(--nuvra-border);width:100%;min-width:0;height:24px;color:var(--nuvra-text);background:var(--nuvra-bg);font:inherit;border-radius:4px;outline:none;margin:0;padding:0 7px;font-size:12px;transition:border-color .12s}.doc-input::placeholder{color:var(--nuvra-text-placeholder)}.doc-input:hover{border-color:var(--nuvra-border-hover)}.doc-input:focus,.doc-input:focus-within{border-color:var(--nuvra-color-primary)}.doc-input--affix{align-items:center;gap:6px;display:inline-flex}.doc-input--affix input{min-width:0;height:100%;color:inherit;font:inherit;background:0 0;border:0;outline:none;flex:auto;margin:0;padding:0}.doc-input--affix input::placeholder{color:var(--nuvra-text-placeholder)}.doc-btn{box-sizing:border-box;border:1px solid var(--nuvra-border);height:24px;color:var(--nuvra-text);background:var(--nuvra-bg);font:inherit;white-space:nowrap;cursor:pointer;border-radius:4px;flex:none;justify-content:center;align-items:center;gap:5px;margin:0;padding:0 11px;font-size:12px;line-height:1;transition:background-color .12s,border-color .12s,color .12s;display:inline-flex}.doc-btn:hover:not(:disabled){border-color:var(--nuvra-color-primary-muted);color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-soft)}.doc-btn:focus-visible{outline:2px solid var(--nuvra-color-primary-border);outline-offset:1px}.doc-btn:disabled{border-color:var(--nuvra-border-lighter);color:var(--nuvra-text-placeholder);cursor:not-allowed}.doc-btn--primary{border-color:var(--nuvra-color-primary);color:var(--nuvra-color-on-primary);background:var(--nuvra-color-primary)}.doc-btn--primary:hover:not(:disabled){border-color:var(--nuvra-color-primary-hover);color:var(--nuvra-color-on-primary);background:var(--nuvra-color-primary-hover)}.doc-btn--primary:disabled{border-color:var(--nuvra-color-primary-border);color:var(--nuvra-color-on-primary);background:var(--nuvra-color-primary-border)}.doc-btn--danger-text{color:var(--nuvra-color-danger);background:0 0;border-color:#0000}.doc-btn--danger-text:hover:not(:disabled){color:var(--nuvra-color-danger);background:var(--nuvra-color-danger-soft);border-color:#0000}.doc-checkbox{color:var(--nuvra-text);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;font-size:12px;display:inline-flex}.doc-checkbox input{width:13px;height:13px;accent-color:var(--nuvra-color-primary);cursor:pointer;margin:0}.doc-spin{animation:1s linear infinite doc-spin}@keyframes doc-spin{to{transform:rotate(360deg)}}.doc-canvas .doc-content{--doc-placeholder:""}.doc-canvas .doc-content.is-empty>p:first-child:before{float:left;color:#98a2b3;content:var(--doc-placeholder);pointer-events:none;height:0}.doc-canvas.is-page .doc-content>[data-doc-rotated]{margin-right:var(--rotated-shift,0px)}.doc-canvas.is-page .doc-content>table[data-doc-rotated]{width:calc(100% - var(--rotated-shift,0px))}.doc-canvas .doc-content .doc-page-break{cursor:default;-webkit-user-select:none;user-select:none;height:18px;margin-bottom:6pt;position:relative}.doc-canvas .doc-content .doc-page-break:before{content:"";border-top:1px dashed #98a2b3;position:absolute;top:50%;left:0;right:0}.doc-canvas .doc-content .doc-page-break:after{color:#667085;letter-spacing:.04em;text-transform:uppercase;content:var(--page-break-label);background:#fff;padding:0 8px;font:10px/16px system-ui,sans-serif;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.doc-canvas .doc-content .doc-section-break:before{border-top-style:double;border-top-width:3px}.doc-canvas .doc-content .doc-section-break[data-orientation=landscape]:after{content:var(--section-landscape-label)}.doc-canvas .doc-content .doc-section-break[data-orientation=portrait]:after{content:var(--section-portrait-label)}.doc-canvas .doc-content td,.doc-canvas .doc-content th{position:relative}.doc-canvas .doc-content .doc-cell-selected:after{content:"";pointer-events:none;background:#3b82f629;position:absolute;inset:0}.doc-canvas .doc-content.has-cell-selection ::selection{background:0 0}.doc-canvas .doc-content.is-column-resize,.doc-canvas .doc-content.is-column-resize *{cursor:col-resize}.doc-canvas .doc-content table[data-type=signature] td,.doc-canvas .doc-content table[data-type=signature] th{border:1px dashed #d0d5dd}.doc-canvas .doc-content sup[data-footnote]{color:var(--nuvra-color-primary,#409eff);cursor:pointer;border-radius:2px;padding:0 1px}.doc-canvas .doc-content sup[data-footnote]:hover{background:var(--nuvra-color-primary-soft,#ecf5ff)}.doc-canvas .doc-content span[data-comment]{background:#facc1538;border-bottom:2px solid #f5c542}.doc-canvas .doc-content span[data-comment].is-active{background:#facc1573}.doc-canvas .doc-content span[data-comment].is-resolved{background:0 0;border-bottom:0}.doc-canvas .doc-content table[data-type=toc]{outline-offset:2px;outline:1px dashed #d0d5dd}.doc-canvas .doc-content .doc-variable{color:var(--nuvra-color-primary,#409eff);background:color-mix(in srgb, var(--nuvra-color-primary,#409eff) 12%, transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--nuvra-color-primary,#409eff) 35%, transparent);cursor:default;-webkit-user-select:all;user-select:all;border-radius:3px;padding:0 3px}.doc-canvas .doc-content .doc-variable:before{content:attr(data-label)}.doc-canvas .doc-content .doc-variable.is-unknown{color:#b54708;background:#f790091f;box-shadow:inset 0 0 0 1px #f7900966}.doc-canvas .doc-content ul[data-type=taskList] input[type=checkbox]{cursor:pointer}.doc-canvas .doc-content a{cursor:text}::highlight(doc-search){background-color:#facc1573}::highlight(doc-search-current){background-color:#f973168c}.document-compare[data-v-f3136664]{box-sizing:border-box;border:1px solid var(--nuvra-border,#dcdfe6);background:#e9ebef;border-radius:10px;flex-direction:column;min-height:0;display:flex;overflow:hidden}.document-compare__summary[data-v-f3136664]{border-bottom:1px solid var(--nuvra-border,#dcdfe6);color:#606266;background:#fff;flex-wrap:wrap;gap:12px;padding:8px 14px;font:13px/1.4 system-ui,sans-serif;display:flex}.document-compare__count.is-ins[data-v-f3136664]{color:#15803d}.document-compare__count.is-del[data-v-f3136664]{color:#b91c1c}.document-compare__scroll[data-v-f3136664]{flex:auto;min-height:0;padding:24px;overflow:auto}.document-compare__sheet[data-v-f3136664]{box-sizing:border-box;background:#fff;max-width:794px;margin:0 auto;padding:48px 56px;box-shadow:0 0 0 1px #1018280f,0 2px 8px #1018281a}.document-compare__sheet[data-v-f3136664] ins.doc-diff-ins{color:#166534;background:#dcfce7;text-decoration:underline}.document-compare__sheet[data-v-f3136664] del.doc-diff-del{color:#991b1b;background:#fee2e2;text-decoration:line-through}.document-compare__sheet[data-v-f3136664] .doc-diff-block--ins{background:#f0fdf4;border-left:3px solid #22c55e;margin:0 -8px;padding:0 6px}.document-compare__sheet[data-v-f3136664] .doc-diff-block--del{opacity:.8;background:#fef2f2;border-left:3px solid #ef4444;margin:0 -8px;padding:0 6px;text-decoration:line-through}@media (width<=640px){.document-compare__scroll[data-v-f3136664]{padding:8px}.document-compare__sheet[data-v-f3136664]{padding:20px 16px}}.doc-icon[data-v-4e391eda]{flex:none}.doc-bubble[data-v-588db7c2]{z-index:2100;box-sizing:border-box;border:1px solid var(--nuvra-border-light);color:var(--nuvra-text);background:var(--nuvra-bg-overlay);border-radius:8px;align-items:center;gap:1px;margin:0;padding:3px;display:flex;position:fixed;inset:auto;overflow:visible;box-shadow:0 6px 20px #10182829}.doc-bubble.is-hidden[data-v-588db7c2]{visibility:hidden}.doc-bubble__divider[data-v-588db7c2]{background:var(--nuvra-border-lighter);flex:0 0 1px;align-self:stretch;margin:3px 4px}.doc-bubble .doc-tb-button.is-danger[data-v-588db7c2]:hover:not(:disabled){color:var(--nuvra-color-danger);background:var(--nuvra-color-danger-soft)}.doc-bubble__link[data-v-588db7c2]{max-width:260px;color:var(--nuvra-color-primary);align-items:center;gap:5px;padding:0 6px;font-size:12px;text-decoration:none;display:inline-flex}.doc-bubble__link span[data-v-588db7c2]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.doc-bubble__form[data-v-588db7c2]{gap:4px;width:280px;display:flex}.object-overlay[data-v-7da0d742]{z-index:3;pointer-events:none;position:absolute;inset:0}.object-overlay__image[data-v-7da0d742]{box-sizing:border-box;outline-offset:1px;outline:2px solid #3b82f6;position:absolute}.object-overlay__handle[data-v-7da0d742]{box-sizing:border-box;pointer-events:auto;background:#fff;border:1.5px solid #3b82f6;border-radius:2px;width:10px;height:10px;position:absolute}.object-overlay__handle.is-top-left[data-v-7da0d742]{cursor:nwse-resize;top:-6px;left:-6px}.object-overlay__handle.is-top-right[data-v-7da0d742]{cursor:nesw-resize;top:-6px;right:-6px}.object-overlay__handle.is-bottom-left[data-v-7da0d742]{cursor:nesw-resize;bottom:-6px;left:-6px}.object-overlay__handle.is-bottom-right[data-v-7da0d742]{cursor:nwse-resize;bottom:-6px;right:-6px}.object-overlay__size[data-v-7da0d742]{color:#fff;background:#101828bf;border-radius:4px;padding:2px 6px;font:11px/16px system-ui,sans-serif;position:absolute;bottom:4px;right:4px}.object-overlay__guide[data-v-7da0d742]{border-left:1px dashed #3b82f6;width:0;position:absolute}.doc-ruler[data-v-0d39d609]{box-sizing:border-box;border:1px solid var(--nuvra-border-lighter);background:var(--nuvra-fill);-webkit-user-select:none;user-select:none;border-radius:4px;height:26px;position:relative}.doc-ruler__text-area[data-v-0d39d609]{background:var(--nuvra-bg);position:absolute;top:0;bottom:0}.doc-ruler__tick[data-v-0d39d609]{background:var(--nuvra-text-placeholder);pointer-events:none;width:1px;height:4px;margin-top:-2px;position:absolute;top:50%}.doc-ruler__tick.is-labelled[data-v-0d39d609]{background:0 0}.doc-ruler__tick i[data-v-0d39d609]{color:var(--nuvra-text-muted);font:9px/1 system-ui,sans-serif;position:absolute;top:-5px;left:50%;transform:translate(-50%)}.doc-ruler__handle[data-v-0d39d609]{cursor:ew-resize;background:0 0;border:0;width:14px;height:8px;padding:0;position:absolute;transform:translate(-7px)}.doc-ruler__handle[data-v-0d39d609]:disabled{cursor:default}.doc-ruler__handle[data-v-0d39d609]:before{background:var(--nuvra-color-primary);content:"";opacity:.7;position:absolute;inset:1px 2px}.doc-ruler__handle[data-v-0d39d609]:hover:before,.doc-ruler__handle.is-dragging[data-v-0d39d609]:before{opacity:1}.doc-ruler__handle--first-line[data-v-0d39d609]{top:0}.doc-ruler__handle--first-line[data-v-0d39d609]:before{clip-path:polygon(0 0,100% 0,50% 100%)}.doc-ruler__handle--indent-left[data-v-0d39d609],.doc-ruler__handle--indent-right[data-v-0d39d609]{bottom:0}.doc-ruler__handle--indent-left[data-v-0d39d609]:before,.doc-ruler__handle--indent-right[data-v-0d39d609]:before{clip-path:polygon(50% 0,100% 100%,0 100%)}.doc-ruler__handle--margin[data-v-0d39d609]{height:8px;top:8px}.doc-ruler__handle--margin[data-v-0d39d609]:before{background:var(--nuvra-text-muted);border-radius:1px;inset:0 6px}.doc-ruler__guide[data-v-0d39d609]{background:var(--nuvra-color-primary);opacity:.5;pointer-events:none;width:1px;height:60vh;position:absolute;top:100%}.doc-canvas[data-v-7678bcdb]{box-sizing:border-box;min-height:0;padding:var(--doc-editor-canvas-padding);overscroll-behavior:contain;background:#e9ebef;flex:auto;position:relative;overflow:auto}.doc-canvas.is-auto[data-v-7678bcdb]{min-height:var(--doc-editor-min-height);max-height:var(--doc-editor-max-height);flex:none}.doc-canvas__sizer[data-v-7678bcdb]{margin:0 auto;position:relative}.doc-canvas__ruler[data-v-7678bcdb]{z-index:3;top:calc(-1 * var(--doc-editor-canvas-padding));box-sizing:border-box;width:max-content;min-width:calc(100% + 2 * var(--doc-editor-canvas-padding));margin:calc(-1 * var(--doc-editor-canvas-padding)) calc(-1 * var(--doc-editor-canvas-padding)) 16px;padding:8px var(--doc-editor-canvas-padding);background:inherit;position:sticky}.doc-canvas__ruler-track[data-v-7678bcdb]{margin:0 auto}.doc-canvas__stage[data-v-7678bcdb]{--page-height:1123px;--pages-height:1123px;--margin-top:96px;--margin-right:96px;--margin-bottom:96px;--margin-left:96px;--page-break-label:"";--section-landscape-label:"";--section-portrait-label:"";transform-origin:0 0;position:absolute;top:0;left:0}.doc-canvas.is-web .doc-canvas__stage[data-v-7678bcdb]{background:#fff;box-shadow:0 0 0 1px #1018280f,0 1px 4px #10182814}.doc-canvas__sheets[data-v-7678bcdb]{pointer-events:none;position:absolute;inset:0}.doc-canvas__sheet[data-v-7678bcdb]{width:100%;height:var(--page-height);background:#fff;position:absolute;left:0;box-shadow:0 0 0 1px #1018280f,0 2px 8px #1018281a}.doc-canvas__page-number[data-v-7678bcdb]{right:0;bottom:calc(var(--margin-bottom) / 2 - 8px);color:#98a2b3;text-align:center;font:11px/16px system-ui,sans-serif;position:absolute;left:0}.doc-canvas__watermark[data-v-7678bcdb]{letter-spacing:.06em;opacity:.16;text-transform:uppercase;white-space:nowrap;justify-content:center;align-items:center;font-family:Times New Roman,Times,serif;font-weight:700;line-height:1;display:flex;position:absolute;inset:0;overflow:hidden}.doc-canvas__footnotes[data-v-7678bcdb]{right:var(--margin-right);bottom:var(--margin-bottom);left:var(--margin-left);position:absolute}.doc-canvas.is-web .doc-canvas__web-footnotes[data-v-7678bcdb]{padding:0 56px 32px}.doc-canvas.is-auto.is-web .doc-canvas__web-footnotes[data-v-7678bcdb]{padding:0 20px 16px}.doc-canvas__running[data-v-7678bcdb]{right:var(--margin-right);left:var(--margin-left);color:#475467;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:12px;font:10pt/1.4 Times New Roman,Times,serif;display:grid;position:absolute}.doc-canvas__running span[data-v-7678bcdb]{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.doc-canvas__running span[data-v-7678bcdb]:nth-child(2){text-align:center}.doc-canvas__running span[data-v-7678bcdb]:nth-child(3){text-align:right}.doc-canvas__running--header[data-v-7678bcdb]{top:max(6px, calc(var(--margin-top) / 2 - 8px))}.doc-canvas__running--footer[data-v-7678bcdb]{bottom:max(6px, calc(var(--margin-bottom) / 2 - 8px))}.doc-canvas__content[data-v-7678bcdb]{box-sizing:border-box;min-height:inherit;caret-color:#1f2328;outline:none;position:relative}.doc-canvas.is-page .doc-canvas__content[data-v-7678bcdb]{width:var(--page-width);min-height:var(--pages-height);padding:var(--margin-top) var(--margin-right) var(--margin-bottom) var(--margin-left)}.doc-canvas.is-web .doc-canvas__content[data-v-7678bcdb]{padding:40px 56px}.doc-canvas.is-auto.is-web .doc-canvas__content[data-v-7678bcdb]{padding:16px 20px}.doc-changes[data-v-ca9e4ab5]{z-index:5;box-sizing:border-box;border-left:1px solid var(--nuvra-border);background:var(--nuvra-bg);width:min(300px,85%);box-shadow:var(--nuvra-shadow);color:var(--nuvra-text);flex-direction:column;font-size:13px;display:flex;position:absolute;top:0;bottom:0;right:0}.doc-changes__header[data-v-ca9e4ab5]{border-bottom:1px solid var(--nuvra-border);color:var(--nuvra-text-strong);justify-content:space-between;align-items:center;padding:6px 6px 6px 12px;font-weight:600;display:flex}.doc-changes__all[data-v-ca9e4ab5]{border-bottom:1px solid var(--nuvra-border-lighter);flex-wrap:wrap;gap:6px;padding:8px;display:flex}.doc-changes__list[data-v-ca9e4ab5]{flex:auto;align-content:start;gap:8px;min-height:0;padding:8px;display:grid;overflow:auto}.doc-changes__card[data-v-ca9e4ab5]{border:1px solid var(--nuvra-border-light);cursor:pointer;border-left-width:3px;border-radius:8px;gap:4px;padding:8px 10px;display:grid}.doc-changes__card.is-insert[data-v-ca9e4ab5]{border-left-color:#22c55e}.doc-changes__card.is-delete[data-v-ca9e4ab5]{border-left-color:#ef4444}.doc-changes__meta[data-v-ca9e4ab5]{color:var(--nuvra-text-muted);flex-wrap:wrap;align-items:baseline;gap:6px;font-size:11px;display:flex}.doc-changes__meta strong[data-v-ca9e4ab5]{color:var(--nuvra-text-strong);font-size:12px}.doc-changes__text[data-v-ca9e4ab5]{color:var(--nuvra-text-strong);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.doc-changes__card.is-delete .doc-changes__text[data-v-ca9e4ab5]{text-decoration:line-through}.doc-changes__tools[data-v-ca9e4ab5]{cursor:default;gap:2px;margin:2px -4px -2px;display:flex}.doc-changes__tools .doc-tb-button[data-v-ca9e4ab5]{height:24px;font-size:12px}.doc-changes__empty[data-v-ca9e4ab5]{color:var(--nuvra-text-muted);margin:0;padding:8px 4px}.doc-collaborators[data-v-9d98247b]{z-index:2;pointer-events:none;position:absolute;inset:0;overflow:hidden}.doc-collaborators__selection[data-v-9d98247b]{opacity:.22;position:absolute}.doc-collaborators__caret[data-v-9d98247b]{width:2px;margin-left:-1px;position:absolute}.doc-collaborators__name[data-v-9d98247b]{color:#fff;white-space:nowrap;border-radius:3px 3px 3px 0;padding:1px 5px;font:600 11px/16px system-ui,sans-serif;position:absolute;bottom:100%;left:-1px}.doc-comments[data-v-0ae8b470]{z-index:5;box-sizing:border-box;border-left:1px solid var(--nuvra-border);background:var(--nuvra-bg);width:min(300px,85%);box-shadow:var(--nuvra-shadow);color:var(--nuvra-text);flex-direction:column;font-size:13px;display:flex;position:absolute;top:0;bottom:0;right:0}.doc-comments__header[data-v-0ae8b470]{border-bottom:1px solid var(--nuvra-border);color:var(--nuvra-text-strong);justify-content:space-between;align-items:center;padding:6px 6px 6px 12px;font-weight:600;display:flex}.doc-comments__list[data-v-0ae8b470]{flex:auto;align-content:start;gap:8px;min-height:0;padding:8px;display:grid;overflow:auto}.doc-comments__card[data-v-0ae8b470]{border:1px solid var(--nuvra-border-light);background:var(--nuvra-bg);cursor:pointer;border-radius:8px;gap:4px;padding:8px 10px;display:grid}.doc-comments__card.is-active[data-v-0ae8b470],.doc-comments__card.is-draft[data-v-0ae8b470]{border-color:var(--nuvra-color-primary-border);box-shadow:0 0 0 2px var(--nuvra-color-primary-soft)}.doc-comments__card.is-draft[data-v-0ae8b470],.doc-comments__card.is-detached[data-v-0ae8b470]{cursor:default}.doc-comments__card.is-resolved[data-v-0ae8b470]{opacity:.7}.doc-comments__meta[data-v-0ae8b470]{color:var(--nuvra-text-muted);flex-wrap:wrap;align-items:baseline;gap:6px;font-size:11px;display:flex}.doc-comments__meta strong[data-v-0ae8b470]{color:var(--nuvra-text-strong);font-size:12px}.doc-comments__badge[data-v-0ae8b470]{color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-soft);border-radius:999px;padding:0 6px}.doc-comments__text[data-v-0ae8b470]{color:var(--nuvra-text-strong);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.doc-comments__note[data-v-0ae8b470]{color:var(--nuvra-color-danger);margin:0;font-size:11px}.doc-comments__reply-item[data-v-0ae8b470]{border-left:2px solid var(--nuvra-border-light);gap:2px;margin-left:8px;padding-left:8px;display:grid}.doc-comments__textarea[data-v-0ae8b470]{box-sizing:border-box;border:1px solid var(--nuvra-border);width:100%;color:var(--nuvra-text-strong);background:var(--nuvra-bg);font:inherit;resize:vertical;border-radius:6px;outline:none;padding:6px 8px}.doc-comments__textarea[data-v-0ae8b470]:focus{border-color:var(--nuvra-color-primary)}.doc-comments__reply[data-v-0ae8b470]{cursor:default;gap:6px;margin-top:4px;display:grid}.doc-comments__actions[data-v-0ae8b470]{justify-content:flex-end;gap:6px;display:flex}.doc-comments__tools[data-v-0ae8b470]{cursor:default;flex-wrap:wrap;gap:2px;margin:2px -4px -2px;display:flex}.doc-comments__tools .doc-tb-button[data-v-0ae8b470]{height:24px;font-size:12px}.doc-comments__delete[data-v-0ae8b470]{margin-left:auto}.doc-comments__delete[data-v-0ae8b470]:hover:not(:disabled){color:var(--nuvra-color-danger)}.doc-comments__empty[data-v-0ae8b470]{color:var(--nuvra-text-muted);margin:0;padding:8px 4px}.doc-context-menu[data-v-4ef1fd0b]{z-index:3000;box-sizing:border-box;max-height:80vh;padding:var(--doc-popover-padding,4px);border:1px solid var(--nuvra-border-light);color:var(--nuvra-text);background:var(--nuvra-bg-overlay);box-shadow:var(--nuvra-shadow);text-align:left;border-radius:10px;margin:0;font-size:14px;line-height:1.4;position:fixed;inset:auto;overflow:auto}.doc-context-menu[data-v-4ef1fd0b]:not(.is-open){display:none}.find-bar[data-v-d9d0df82]{z-index:5;border:1px solid var(--nuvra-border-light);background:var(--nuvra-bg-overlay);box-shadow:var(--nuvra-shadow);border-radius:10px;align-items:flex-start;gap:2px;padding:5px;display:flex;position:absolute;top:8px;right:20px}.find-bar__rows[data-v-d9d0df82]{gap:5px;display:grid}.find-bar__row[data-v-d9d0df82]{align-items:center;gap:1px;display:flex}.find-bar__input[data-v-d9d0df82]{width:220px;margin-right:4px}.find-bar__count[data-v-d9d0df82]{color:var(--nuvra-text-muted);font-variant-numeric:tabular-nums;font-size:11px}.find-bar__chevron[data-v-d9d0df82]{transition:transform .15s}.is-active>.find-bar__chevron[data-v-d9d0df82]{transform:rotate(90deg)}.find-bar__text-button[data-v-d9d0df82]{padding:0 8px;font-size:12px}@container (width<=560px){.find-bar[data-v-d9d0df82]{left:8px;right:8px}.find-bar__rows[data-v-d9d0df82]{flex:auto;min-width:0}.find-bar__input[data-v-d9d0df82]{flex:auto;width:auto}}.doc-footnote-form[data-v-c17c834c]{z-index:6;box-sizing:border-box;border:1px solid var(--nuvra-border-light);background:var(--nuvra-bg-overlay);box-shadow:var(--nuvra-shadow);color:var(--nuvra-text);border-radius:8px;gap:8px;padding:10px;font-size:12px;display:grid;position:absolute}.doc-footnote-form__label[data-v-c17c834c]{color:var(--nuvra-text-strong);gap:4px;font-weight:600;display:grid}.doc-footnote-form__text[data-v-c17c834c]{box-sizing:border-box;border:1px solid var(--nuvra-border);width:100%;color:var(--nuvra-text-strong);background:var(--nuvra-bg);font:inherit;resize:vertical;border-radius:6px;outline:none;padding:6px 8px;font-weight:400}.doc-footnote-form__text[data-v-c17c834c]:focus{border-color:var(--nuvra-color-primary)}.doc-footnote-form__actions[data-v-c17c834c]{justify-content:flex-end;gap:6px;display:flex}.doc-footnote-form__remove[data-v-c17c834c]{margin-right:auto}.doc-outline[data-v-6179ae8b]{z-index:5;box-sizing:border-box;border-right:1px solid var(--nuvra-border);background:var(--nuvra-bg);width:min(260px,80%);box-shadow:var(--nuvra-shadow);color:var(--nuvra-text);flex-direction:column;font-size:13px;display:flex;position:absolute;top:0;bottom:0;left:0}.doc-outline__header[data-v-6179ae8b]{border-bottom:1px solid var(--nuvra-border);color:var(--nuvra-text-strong);justify-content:space-between;align-items:center;padding:6px 6px 6px 12px;font-weight:600;display:flex}.doc-outline__tabs[data-v-6179ae8b]{border-bottom:1px solid var(--nuvra-border-lighter);gap:4px;padding:6px 6px 0;display:flex}.doc-outline__tab[data-v-6179ae8b]{color:var(--nuvra-text-muted);font:inherit;cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;padding:4px 10px 6px}.doc-outline__tab.is-active[data-v-6179ae8b]{border-bottom-color:var(--nuvra-color-primary);color:var(--nuvra-text-strong)}.doc-outline__list[data-v-6179ae8b]{flex:auto;min-height:0;margin:0;padding:6px;list-style:none;overflow:auto}.doc-outline__item[data-v-6179ae8b]{width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:baseline;gap:8px;padding:5px 8px;display:flex}.doc-outline__item[data-v-6179ae8b]:hover,.doc-outline__item[data-v-6179ae8b]:focus-visible{background:var(--nuvra-fill);outline:none}.doc-outline__item.is-level-1[data-v-6179ae8b]{font-weight:600}.doc-outline__text[data-v-6179ae8b]{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.doc-outline__page[data-v-6179ae8b]{color:var(--nuvra-text-muted);font-variant-numeric:tabular-nums;font-size:11px}.doc-outline__pages[data-v-6179ae8b]{align-content:start;justify-items:center;gap:10px;padding:10px 6px;display:grid}.doc-outline__thumbnail[data-v-6179ae8b]{cursor:pointer;background:0 0;border:0;border-radius:6px;justify-items:center;gap:4px;padding:4px;display:grid}.doc-outline__thumbnail:hover .doc-outline__frame[data-v-6179ae8b],.doc-outline__thumbnail:focus-visible .doc-outline__frame[data-v-6179ae8b]{outline:2px solid var(--nuvra-color-primary)}.doc-outline__thumbnail[data-v-6179ae8b]:focus-visible{outline:none}.doc-outline__frame[data-v-6179ae8b]{pointer-events:none;background:#fff;display:block;position:relative;overflow:hidden;box-shadow:0 0 0 1px #1018281f}.doc-outline__sheet[data-v-6179ae8b]{box-sizing:border-box;text-align:left;transform-origin:0 0;display:block;position:absolute;top:0;left:0;overflow:hidden}.doc-outline__empty[data-v-6179ae8b]{color:var(--nuvra-text-muted);margin:0;padding:16px 12px}.doc-slash-menu[data-v-b53ae3f1]{z-index:6;box-sizing:border-box;border:1px solid var(--nuvra-border-light);background:var(--nuvra-bg-overlay);box-shadow:var(--nuvra-shadow);border-radius:8px;align-content:start;padding:4px;position:absolute;overflow:auto}.doc-slash-menu .doc-menu__item.is-active[data-v-b53ae3f1]{color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-soft)}.doc-slash-menu__label[data-v-b53ae3f1]{text-overflow:ellipsis;overflow:hidden}.status-bar[data-v-5c305db4]{border-top:1px solid var(--nuvra-border-lighter);min-height:32px;color:var(--nuvra-text-muted);background:var(--nuvra-bg);-webkit-user-select:none;user-select:none;flex:none;justify-content:space-between;align-items:center;gap:12px;padding:0 6px 0 12px;font-size:12px;display:flex}.status-bar__info[data-v-5c305db4]{white-space:nowrap;gap:14px;min-width:0;display:flex;overflow:hidden}.is-limit[data-v-5c305db4]{color:var(--nuvra-color-danger);font-weight:600}.status-bar__controls[data-v-5c305db4]{flex:none;align-items:center;gap:1px;display:flex}.status-bar .doc-tb-button[data-v-5c305db4]{min-width:24px;height:24px;font-size:12px}.status-bar__segmented[data-v-5c305db4]{background:var(--nuvra-fill);border-radius:7px;margin-right:6px;padding:2px;display:flex}.status-bar__segmented .doc-tb-button[data-v-5c305db4]{height:20px}.status-bar__segmented .doc-tb-button.is-active[data-v-5c305db4]{background:var(--nuvra-bg);box-shadow:0 1px 2px #1018281f}.status-bar__slider[data-v-5c305db4]{--slider-line:var(--nuvra-text-placeholder);--slider-thumb:var(--nuvra-text);cursor:pointer;background:linear-gradient(var(--slider-line), var(--slider-line)) calc(2px + (100% - 4px) * var(--v0fabfa1f)) 50% / 1px 8px no-repeat, linear-gradient(var(--slider-line), var(--slider-line)) 0 50% / 100% 1px no-repeat;appearance:none;width:100px;height:16px;margin:0 2px;padding:0}.status-bar__slider[data-v-5c305db4]:focus{outline:none}.status-bar__slider[data-v-5c305db4]::-webkit-slider-runnable-track{background:0 0;height:16px}.status-bar__slider[data-v-5c305db4]::-moz-range-track{background:0 0;height:16px}.status-bar__slider[data-v-5c305db4]::-webkit-slider-thumb{background:var(--slider-thumb);appearance:none;border:none;border-radius:1px;width:4px;height:12px;margin-top:2px;transition:background-color .15s}.status-bar__slider[data-v-5c305db4]::-moz-range-thumb{background:var(--slider-thumb);border:none;border-radius:1px;width:4px;height:12px;transition:background-color .15s}.status-bar__slider[data-v-5c305db4]:hover,.status-bar__slider[data-v-5c305db4]:active{--slider-thumb:var(--nuvra-color-primary)}.status-bar__slider[data-v-5c305db4]:focus-visible::-webkit-slider-thumb{outline:2px solid var(--nuvra-color-primary-border);outline-offset:1px}.status-bar__slider[data-v-5c305db4]:focus-visible::-moz-range-thumb{outline:2px solid var(--nuvra-color-primary-border);outline-offset:1px}.status-bar .status-bar__zoom-step[data-v-5c305db4]{min-width:20px;height:20px;padding:0}.status-bar__zoom[data-v-5c305db4]{font-variant-numeric:tabular-nums;min-width:40px}@container (width<=560px){.status-bar__slider[data-v-5c305db4],.status-bar__segmented[data-v-5c305db4]{display:none}}.doc-popover[data-v-cae67a7a],.doc-popover__reference[data-v-cae67a7a]{align-items:center;display:inline-flex}.doc-popover__panel[data-v-cae67a7a]{z-index:3000;box-sizing:border-box;padding:var(--doc-popover-padding,10px);border:1px solid var(--nuvra-border-light);color:var(--nuvra-text);background:var(--nuvra-bg-overlay);box-shadow:var(--nuvra-shadow);text-align:left;border-radius:10px;margin:0;font-size:14px;line-height:1.4;position:fixed;inset:auto;overflow:auto}.doc-popover__panel[data-v-cae67a7a]:not(.is-open){display:none}.color-picker[data-v-16f6edba]{align-items:center;display:inline-flex}.color-picker__apply[data-v-16f6edba]{min-width:26px;padding-bottom:3px;position:relative}.color-picker__letter[data-v-16f6edba]{font-family:Georgia,serif;font-size:15px;font-weight:700}.color-picker__bar[data-v-16f6edba]{border-radius:1px;height:3px;position:absolute;bottom:4px;left:6px;right:6px;box-shadow:inset 0 0 0 1px #0000001f}.palette[data-v-16f6edba]{gap:8px;display:grid}.palette__reset[data-v-16f6edba],.palette__custom[data-v-16f6edba]{height:28px;color:var(--nuvra-text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:0 6px;font-size:13px;display:flex}.palette__reset[data-v-16f6edba]:hover,.palette__custom[data-v-16f6edba]:hover{background:var(--nuvra-fill)}.palette__reset-swatch[data-v-16f6edba]{box-sizing:border-box;border:1px solid var(--nuvra-border);border-radius:3px;width:16px;height:16px}.palette__reset-swatch.is-text[data-v-16f6edba]{background:#1f2328}.palette__reset-swatch.is-highlight[data-v-16f6edba]{background:linear-gradient(to top right,#fff calc(50% - 1px),#e11d48 50%,#fff calc(50% + 1px))}.palette__grid[data-v-16f6edba]{grid-template-columns:repeat(10,18px);justify-content:space-between;gap:3px;display:grid}.palette__swatch[data-v-16f6edba]{cursor:pointer;border:1px solid #0000001f;border-radius:3px;width:18px;height:18px;padding:0;transition:transform .1s}.palette__swatch[data-v-16f6edba]:hover{transform:scale(1.15)}.palette__swatch.is-selected[data-v-16f6edba]{box-shadow:0 0 0 2px #fff, 0 0 0 3.5px var(--nuvra-color-primary)}.palette__custom input[data-v-16f6edba]{cursor:pointer;background:0 0;border:0;width:22px;height:22px;padding:0}.header-footer[data-v-f0c03cd3]{color:var(--nuvra-text);gap:12px;display:grid}.header-footer__section[data-v-f0c03cd3]{gap:6px;display:grid}.header-footer__section h4[data-v-f0c03cd3]{color:var(--nuvra-text-strong);margin:0;font-size:12px;font-weight:600}.header-footer__grid[data-v-f0c03cd3]{grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;display:grid}.header-footer__field[data-v-f0c03cd3]{color:var(--nuvra-text-muted);gap:3px;font-size:11px;display:grid}.header-footer__tokens[data-v-f0c03cd3]{flex-wrap:wrap;align-items:center;gap:4px;display:flex}.header-footer__numbering[data-v-f0c03cd3]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 12px;font-size:12px;display:flex}.header-footer__check[data-v-f0c03cd3],.header-footer__number[data-v-f0c03cd3]{align-items:center;gap:6px;display:inline-flex}.header-footer__number .doc-input[data-v-f0c03cd3]{width:72px}.header-footer__actions[data-v-f0c03cd3]{justify-content:space-between;align-items:center;gap:8px;display:flex}.header-footer__caption[data-v-f0c03cd3]{color:var(--nuvra-text-muted);font-size:11px}.page-setup[data-v-c560a634]{color:var(--nuvra-text);gap:12px;display:grid}.page-setup__section[data-v-c560a634]{gap:6px;display:grid}.page-setup__section h4[data-v-c560a634]{color:var(--nuvra-text-strong);margin:0;font-size:12px;font-weight:600}.page-setup__grid[data-v-c560a634]{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;display:grid}.page-setup__grid--sizes[data-v-c560a634],.page-setup__grid--presets[data-v-c560a634]{grid-template-columns:repeat(3,minmax(0,1fr))}.page-setup__chip[data-v-c560a634]{border:1px solid var(--nuvra-border);min-width:0;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border-radius:6px;flex-direction:column;align-items:flex-start;gap:1px;padding:5px 8px;font-size:12px;display:flex}.page-setup__chip[data-v-c560a634]:hover{border-color:var(--nuvra-color-primary-border)}.page-setup__chip.is-active[data-v-c560a634]{border-color:var(--nuvra-color-primary);color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-soft)}.page-setup__chip--row[data-v-c560a634]{flex-direction:row;align-items:center;gap:6px}.page-setup__chip small[data-v-c560a634]{color:var(--nuvra-text-muted);white-space:nowrap;font-size:10px}.page-setup__caption[data-v-c560a634]{color:var(--nuvra-text-muted);margin-top:4px;font-size:11px}.page-setup__field[data-v-c560a634]{color:var(--nuvra-text-muted);gap:3px;font-size:11px;display:grid}.page-setup__color[data-v-c560a634]{height:28px;padding:2px}.page-setup__checkbox[data-v-c560a634]{align-self:end;padding-bottom:4px}.table-picker[data-v-e2298f4b]{gap:6px;display:grid}.table-picker__grid[data-v-e2298f4b]{grid-template-columns:repeat(10,16px);gap:3px;display:grid}.table-picker__cell[data-v-e2298f4b]{border:1px solid var(--nuvra-border);background:var(--nuvra-bg);cursor:pointer;border-radius:2px;width:16px;height:16px;padding:0}.table-picker__cell.is-active[data-v-e2298f4b]{border-color:var(--nuvra-color-primary);background:var(--nuvra-color-primary-muted)}.table-picker__size[data-v-e2298f4b]{color:var(--nuvra-text);text-align:center;font-size:12px}.doc-toolbar[data-v-86fd020e]{box-sizing:border-box;border-bottom:1px solid var(--nuvra-border-lighter);background:var(--nuvra-bg);scrollbar-width:thin;flex:none;align-items:center;gap:2px;min-height:40px;padding:5px 8px;display:flex;overflow-x:auto}.doc-toolbar__group[data-v-86fd020e]{flex:none;align-items:center;gap:1px;display:flex}.doc-toolbar__divider[data-v-86fd020e]{background:var(--nuvra-border-lighter);flex:0 0 1px;align-self:stretch;margin:4px 5px}.doc-toolbar__spacer[data-v-86fd020e]{flex:auto;min-width:8px}.doc-toolbar__group--end[data-v-86fd020e]{background:var(--nuvra-bg);padding-left:6px;position:sticky;right:0}.doc-toolbar__block[data-v-86fd020e]{width:108px}.doc-toolbar__font[data-v-86fd020e]{width:118px}.doc-toolbar__size[data-v-86fd020e]{text-align:center;width:44px;height:28px;padding:0 4px}.doc-toolbar[data-v-86fd020e] .doc-toolbar__size-menu{min-width:96px}.doc-toolbar__form[data-v-86fd020e]{gap:8px;display:grid}.doc-toolbar__field[data-v-86fd020e]{color:var(--nuvra-text-muted);gap:4px;font-size:12px;display:grid}.doc-toolbar__form-actions[data-v-86fd020e]{justify-content:flex-end;gap:6px;display:flex}.doc-toolbar__caption[data-v-86fd020e]{color:var(--nuvra-text-muted);text-align:center;font-size:11px}.doc-toolbar__inline-form[data-v-86fd020e]{gap:6px;display:flex}.doc-toolbar__characters[data-v-86fd020e]{grid-template-columns:repeat(9,minmax(0,1fr));gap:2px;display:grid}.doc-toolbar__characters button[data-v-86fd020e]{height:26px;color:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0;font-size:15px}.doc-toolbar__characters button[data-v-86fd020e]:hover{background:var(--nuvra-fill)}.document-editor[data-v-cd464dc9]{--doc-editor-canvas-padding:50px;--doc-editor-height:760px;--doc-editor-min-height:240px;--doc-editor-max-height:600px;box-sizing:border-box;width:100%;min-width:0;height:var(--doc-editor-height);border:1px solid var(--nuvra-border);background:var(--nuvra-bg);border-radius:10px;flex-direction:column;min-height:360px;transition:border-color .16s;display:flex;position:relative;overflow:hidden;container-type:inline-size}.document-editor[data-v-cd464dc9]:focus-within{border-color:var(--nuvra-color-primary-border)}.document-editor.is-auto-height[data-v-cd464dc9]{height:auto;min-height:0}.document-editor.is-fullscreen[data-v-cd464dc9]{z-index:var(--nuvra-fullscreen-z-index);border:0;border-radius:0;height:100dvh;position:fixed;inset:0}.document-editor__body[data-v-cd464dc9]{flex-direction:column;flex:auto;min-height:0;display:flex;position:relative}.document-editor__source[data-v-cd464dc9]{box-sizing:border-box;color:#1f2328;resize:none;tab-size:2;background:#fbfcfd;border:0;outline:none;flex:auto;min-height:0;margin:0;padding:16px 20px;font:13px/1.6 ui-monospace,SFMono-Regular,Consolas,monospace}.document-editor__uploading[data-v-cd464dc9]{color:#fff;pointer-events:none;background:#101828cc;border-radius:999px;padding:6px 12px;font-size:12px;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}.document-form[data-v-57d71548]{box-sizing:border-box;border:1px solid var(--nuvra-border,#dcdfe6);background:#e9ebef;border-radius:10px;padding:24px;overflow:auto}.document-form__sheet[data-v-57d71548]{box-sizing:border-box;background:#fff;max-width:794px;margin:0 auto;padding:48px 56px;box-shadow:0 0 0 1px #1018280f,0 2px 8px #1018281a}.document-form__sheet[data-v-57d71548] .doc-form-field input{box-sizing:content-box;max-width:100%;color:inherit;font:inherit;line-height:inherit;background:#ecf5ff;border:0;border-bottom:1px solid #409eff;border-radius:2px 2px 0 0;outline:none;margin:0 1px;padding:0 3px}.document-form__sheet[data-v-57d71548] .doc-form-field input:focus{background:#d9ecff;box-shadow:0 1px #409eff}.document-form__sheet[data-v-57d71548] .doc-form-field input::placeholder{color:#79bbff}.document-form__sheet[data-v-57d71548] .doc-form-field input.is-invalid{background:#fef0f0;border-bottom-color:#f56c6c}.document-form__sheet[data-v-57d71548] .doc-form-field input:read-only{background:0 0;border-bottom-color:#0000}@media (width<=640px){.document-form[data-v-57d71548]{padding:8px}.document-form__sheet[data-v-57d71548]{padding:20px 16px}}
|
|
2
2
|
/*$vite$:1*/
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region src/core/docx/zip.ts
|
|
2
|
+
var e = 33639248, t = 101010256, n = 2048, r = 23585, i = Array.from({ length: 256 }, (e, t) => {
|
|
3
|
+
let n = t;
|
|
4
|
+
for (let e = 0; e < 8; e += 1) n = n & 1 ? 3988292384 ^ n >>> 1 : n >>> 1;
|
|
5
|
+
return n >>> 0;
|
|
6
|
+
}), a = (e) => {
|
|
7
|
+
let t = 4294967295;
|
|
8
|
+
for (let n of e) t = (i[(t ^ n) & 255] ?? 0) ^ t >>> 8;
|
|
9
|
+
return (t ^ 4294967295) >>> 0;
|
|
10
|
+
}, o = (i) => {
|
|
11
|
+
let o = new TextEncoder(), s = i.map((e) => ({
|
|
12
|
+
...e,
|
|
13
|
+
nameBytes: o.encode(e.name),
|
|
14
|
+
crc: a(e.data)
|
|
15
|
+
})), c = s.reduce((e, t) => e + 30 + t.nameBytes.length + t.data.length, 0), l = s.reduce((e, t) => e + 46 + t.nameBytes.length, 0), u = new Uint8Array(c + l + 22), d = new DataView(u.buffer), f = 0, p = [];
|
|
16
|
+
for (let e of s) p.push(f), d.setUint32(f, 67324752, !0), d.setUint16(f + 4, 20, !0), d.setUint16(f + 6, n, !0), d.setUint16(f + 8, 0, !0), d.setUint16(f + 10, 0, !0), d.setUint16(f + 12, r, !0), d.setUint32(f + 14, e.crc, !0), d.setUint32(f + 18, e.data.length, !0), d.setUint32(f + 22, e.data.length, !0), d.setUint16(f + 26, e.nameBytes.length, !0), d.setUint16(f + 28, 0, !0), u.set(e.nameBytes, f + 30), u.set(e.data, f + 30 + e.nameBytes.length), f += 30 + e.nameBytes.length + e.data.length;
|
|
17
|
+
let m = f;
|
|
18
|
+
return s.forEach((t, i) => {
|
|
19
|
+
d.setUint32(f, e, !0), d.setUint16(f + 4, 20, !0), d.setUint16(f + 6, 20, !0), d.setUint16(f + 8, n, !0), d.setUint16(f + 10, 0, !0), d.setUint16(f + 12, 0, !0), d.setUint16(f + 14, r, !0), d.setUint32(f + 16, t.crc, !0), d.setUint32(f + 20, t.data.length, !0), d.setUint32(f + 24, t.data.length, !0), d.setUint16(f + 28, t.nameBytes.length, !0), d.setUint32(f + 42, p[i] ?? 0, !0), u.set(t.nameBytes, f + 46), f += 46 + t.nameBytes.length;
|
|
20
|
+
}), d.setUint32(f, t, !0), d.setUint16(f + 8, s.length, !0), d.setUint16(f + 10, s.length, !0), d.setUint32(f + 12, f - m, !0), d.setUint32(f + 16, m, !0), u;
|
|
21
|
+
}, s = async (e) => {
|
|
22
|
+
let t = new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate-raw"));
|
|
23
|
+
return new Uint8Array(await new Response(t).arrayBuffer());
|
|
24
|
+
}, c = async (n) => {
|
|
25
|
+
let r = n instanceof Uint8Array ? n : new Uint8Array(n), i = new DataView(r.buffer, r.byteOffset, r.byteLength), a = -1, o = Math.max(0, r.length - 22 - 65535);
|
|
26
|
+
for (let e = r.length - 22; e >= o; --e) if (i.getUint32(e, !0) === t) {
|
|
27
|
+
a = e;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
if (a < 0) throw Error("Not a ZIP archive");
|
|
31
|
+
let c = i.getUint16(a + 10, !0), l = i.getUint32(a + 16, !0), u = new TextDecoder(), d = /* @__PURE__ */ new Map();
|
|
32
|
+
for (let t = 0; t < c; t += 1) {
|
|
33
|
+
if (i.getUint32(l, !0) !== e) throw Error("Broken ZIP directory");
|
|
34
|
+
let t = i.getUint16(l + 10, !0), n = i.getUint32(l + 20, !0), a = i.getUint16(l + 28, !0), o = i.getUint16(l + 30, !0), c = i.getUint16(l + 32, !0), f = i.getUint32(l + 42, !0), p = u.decode(r.subarray(l + 46, l + 46 + a));
|
|
35
|
+
if (l += 46 + a + o + c, p.endsWith("/")) continue;
|
|
36
|
+
let m = i.getUint16(f + 26, !0), h = i.getUint16(f + 28, !0), g = f + 30 + m + h, _ = r.subarray(g, g + n);
|
|
37
|
+
if (t === 0) d.set(p, _.slice());
|
|
38
|
+
else if (t === 8) d.set(p, await s(_));
|
|
39
|
+
else throw Error(`Unsupported ZIP compression method ${t}`);
|
|
40
|
+
}
|
|
41
|
+
return d;
|
|
42
|
+
};
|
|
43
|
+
//#endregion
|
|
44
|
+
export { c as n, o as t };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=zip-CpbwZtot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip-CpbwZtot.js","names":[],"sources":["../src/core/docx/zip.ts"],"sourcesContent":["/**\n * Minimal ZIP container support for Office documents, without dependencies: writing stores files uncompressed, which\n * every ZIP reader (Word included) accepts; reading also inflates deflated entries with the browser's\n * `DecompressionStream`.\n */\n\n/** A file inside a ZIP archive. */\nexport interface ZipEntry {\n /** Path inside the archive, with forward slashes. */\n name: string;\n /** File content. */\n data: Uint8Array;\n}\n\nconst LOCAL_FILE_HEADER = 0x04_03_4b_50;\nconst CENTRAL_DIRECTORY_HEADER = 0x02_01_4b_50;\nconst END_OF_CENTRAL_DIRECTORY = 0x06_05_4b_50;\n/** Version 2.0, the version needed for stored and deflated files. */\nconst ZIP_VERSION = 20;\n/** General purpose flag telling readers that names are UTF-8. */\nconst UTF8_FLAG = 0x08_00;\nconst METHOD_STORED = 0;\nconst METHOD_DEFLATED = 8;\nconst LOCAL_HEADER_SIZE = 30;\nconst CENTRAL_HEADER_SIZE = 46;\nconst END_RECORD_SIZE = 22;\n/** Longest trailing comment a ZIP file may have, which bounds the search for the end record. */\nconst MAX_COMMENT_LENGTH = 0xff_ff;\n/** DOS date of 1 January 2026, 00:00; Office does not care about entry times. */\nconst DOS_DATE = ((2026 - 1980) << 9) | (1 << 5) | 1;\n\n/** CRC-32 lookup table (polynomial 0xEDB88320). */\nconst CRC_TABLE = Array.from({ length: 256 }, (_, index) => {\n let value = index;\n for (let bit = 0; bit < 8; bit += 1) value = value & 1 ? 0xed_b8_83_20 ^ (value >>> 1) : value >>> 1;\n return value >>> 0;\n});\n\n/** CRC-32 checksum of the data. */\nexport const crc32 = (data: Uint8Array): number => {\n let crc = 0xff_ff_ff_ff;\n for (const byte of data) crc = (CRC_TABLE[(crc ^ byte) & 0xff] ?? 0) ^ (crc >>> 8);\n return (crc ^ 0xff_ff_ff_ff) >>> 0;\n};\n\n/** Packs files into an uncompressed ZIP archive. */\nexport const createZip = (entries: ZipEntry[]): Uint8Array => {\n const encoder = new TextEncoder();\n const records = entries.map(entry => ({ ...entry, nameBytes: encoder.encode(entry.name), crc: crc32(entry.data) }));\n const localSize = records.reduce(\n (sum, record) => sum + LOCAL_HEADER_SIZE + record.nameBytes.length + record.data.length,\n 0\n );\n const centralSize = records.reduce((sum, record) => sum + CENTRAL_HEADER_SIZE + record.nameBytes.length, 0);\n const output = new Uint8Array(localSize + centralSize + END_RECORD_SIZE);\n const view = new DataView(output.buffer);\n let offset = 0;\n const offsets: number[] = [];\n\n for (const record of records) {\n offsets.push(offset);\n view.setUint32(offset, LOCAL_FILE_HEADER, true);\n view.setUint16(offset + 4, ZIP_VERSION, true);\n view.setUint16(offset + 6, UTF8_FLAG, true);\n view.setUint16(offset + 8, METHOD_STORED, true);\n view.setUint16(offset + 10, 0, true);\n view.setUint16(offset + 12, DOS_DATE, true);\n view.setUint32(offset + 14, record.crc, true);\n view.setUint32(offset + 18, record.data.length, true);\n view.setUint32(offset + 22, record.data.length, true);\n view.setUint16(offset + 26, record.nameBytes.length, true);\n view.setUint16(offset + 28, 0, true);\n output.set(record.nameBytes, offset + LOCAL_HEADER_SIZE);\n output.set(record.data, offset + LOCAL_HEADER_SIZE + record.nameBytes.length);\n offset += LOCAL_HEADER_SIZE + record.nameBytes.length + record.data.length;\n }\n\n const centralStart = offset;\n records.forEach((record, index) => {\n view.setUint32(offset, CENTRAL_DIRECTORY_HEADER, true);\n view.setUint16(offset + 4, ZIP_VERSION, true);\n view.setUint16(offset + 6, ZIP_VERSION, true);\n view.setUint16(offset + 8, UTF8_FLAG, true);\n view.setUint16(offset + 10, METHOD_STORED, true);\n view.setUint16(offset + 12, 0, true);\n view.setUint16(offset + 14, DOS_DATE, true);\n view.setUint32(offset + 16, record.crc, true);\n view.setUint32(offset + 20, record.data.length, true);\n view.setUint32(offset + 24, record.data.length, true);\n view.setUint16(offset + 28, record.nameBytes.length, true);\n view.setUint32(offset + 42, offsets[index] ?? 0, true);\n output.set(record.nameBytes, offset + CENTRAL_HEADER_SIZE);\n offset += CENTRAL_HEADER_SIZE + record.nameBytes.length;\n });\n\n view.setUint32(offset, END_OF_CENTRAL_DIRECTORY, true);\n view.setUint16(offset + 8, records.length, true);\n view.setUint16(offset + 10, records.length, true);\n view.setUint32(offset + 12, offset - centralStart, true);\n view.setUint32(offset + 16, centralStart, true);\n return output;\n};\n\n/** Inflates raw deflate data with the browser's streams API. */\nconst inflateRaw = async (data: Uint8Array): Promise<Uint8Array> => {\n const stream = new Blob([data as BlobPart]).stream().pipeThrough(new DecompressionStream('deflate-raw'));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n};\n\n/**\n * Reads every file of a ZIP archive. Stored and deflated entries are supported, which covers the files Office and\n * other editors write.\n *\n * @throws Error when the data is not a ZIP archive or uses an unsupported compression method.\n */\nexport const readZip = async (buffer: ArrayBuffer | Uint8Array): Promise<Map<string, Uint8Array>> => {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n let end = -1;\n const lowest = Math.max(0, bytes.length - END_RECORD_SIZE - MAX_COMMENT_LENGTH);\n for (let index = bytes.length - END_RECORD_SIZE; index >= lowest; index -= 1) {\n if (view.getUint32(index, true) === END_OF_CENTRAL_DIRECTORY) {\n end = index;\n break;\n }\n }\n if (end < 0) throw new Error('Not a ZIP archive');\n\n const count = view.getUint16(end + 10, true);\n let offset = view.getUint32(end + 16, true);\n const decoder = new TextDecoder();\n const files = new Map<string, Uint8Array>();\n for (let index = 0; index < count; index += 1) {\n if (view.getUint32(offset, true) !== CENTRAL_DIRECTORY_HEADER) throw new Error('Broken ZIP directory');\n const method = view.getUint16(offset + 10, true);\n const compressedSize = view.getUint32(offset + 20, true);\n const nameLength = view.getUint16(offset + 28, true);\n const extraLength = view.getUint16(offset + 30, true);\n const commentLength = view.getUint16(offset + 32, true);\n const localOffset = view.getUint32(offset + 42, true);\n const name = decoder.decode(\n bytes.subarray(offset + CENTRAL_HEADER_SIZE, offset + CENTRAL_HEADER_SIZE + nameLength)\n );\n offset += CENTRAL_HEADER_SIZE + nameLength + extraLength + commentLength;\n if (name.endsWith('/')) continue;\n\n const localNameLength = view.getUint16(localOffset + 26, true);\n const localExtraLength = view.getUint16(localOffset + 28, true);\n const start = localOffset + LOCAL_HEADER_SIZE + localNameLength + localExtraLength;\n const raw = bytes.subarray(start, start + compressedSize);\n if (method === METHOD_STORED) files.set(name, raw.slice());\n else if (method === METHOD_DEFLATED) files.set(name, await inflateRaw(raw));\n else throw new Error(`Unsupported ZIP compression method ${method}`);\n }\n return files;\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nuvra",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Word-style document editor for Vue 3: page view, tables, images, find & replace, print and Word export.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"vue",
|
|
@@ -46,7 +46,8 @@
|
|
|
46
46
|
"type-check": "vue-tsc --noEmit",
|
|
47
47
|
"biome": "biome check .",
|
|
48
48
|
"biome:fix": "biome check --write .",
|
|
49
|
-
"
|
|
49
|
+
"test": "vitest run",
|
|
50
|
+
"prepublishOnly": "run-s biome type-check test build"
|
|
50
51
|
},
|
|
51
52
|
"peerDependencies": {
|
|
52
53
|
"vue": "^3.5.0"
|
|
@@ -55,9 +56,11 @@
|
|
|
55
56
|
"@biomejs/biome": "2.3.12",
|
|
56
57
|
"@vitejs/plugin-vue": "^6.0.8",
|
|
57
58
|
"@vue/tsconfig": "^0.9.1",
|
|
59
|
+
"happy-dom": "^20.14.5",
|
|
58
60
|
"npm-run-all2": "^9.0.2",
|
|
59
61
|
"typescript": "~6.0.3",
|
|
60
62
|
"vite": "^8.2.2",
|
|
63
|
+
"vitest": "^5.0.0",
|
|
61
64
|
"vue": "^3.5.41",
|
|
62
65
|
"vue-tsc": "^3.3.11"
|
|
63
66
|
},
|
package/dist/export-VeTfgCEp.js
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { c as e, d as t, f as n, l as r, r as i } from "./page-DL7Oj2o8.js";
|
|
2
|
-
//#region src/styles/document-content.css?inline
|
|
3
|
-
var a = ".doc-content{color:#1f2328;white-space:pre-wrap;overflow-wrap:break-word;tab-size:4;font-family:Times New Roman,Times,serif;font-size:12pt;line-height:1.5}.doc-content :is(p,h1,h2,h3,h4,h5,h6):not([dir]){unicode-bidi:plaintext}.doc-content p{margin:0 0 6pt}.doc-content h1,.doc-content h2,.doc-content h3,.doc-content h4,.doc-content h5,.doc-content h6{margin:0 0 6pt;padding-top:6pt;font-weight:700;line-height:1.25}.doc-content h1{font-size:20pt}.doc-content h2{font-size:16pt}.doc-content h3{font-size:14pt}.doc-content h4{font-size:12pt}.doc-content h5{font-size:11pt}.doc-content h6{font-size:10pt}.doc-content ul,.doc-content ol{margin:0 0 6pt;padding-left:24pt}.doc-content li>p{margin-bottom:2pt}.doc-content ul[data-type=taskList]{padding-left:2pt;list-style:none}.doc-content ul[data-type=taskList] li{align-items:flex-start;gap:6pt;display:flex}.doc-content ul[data-type=taskList] li>label{-webkit-user-select:none;user-select:none;flex:none;margin-top:.3em}.doc-content ul[data-type=taskList] li>div{flex:auto;min-width:0}.doc-content ul[data-type=taskList] li[data-checked=true]>div{color:#667085;text-decoration:line-through}.doc-content blockquote{color:#475467;border-left:3px solid #b3c5f5;margin:0 0 6pt;padding:2pt 0 2pt 12pt}.doc-content blockquote>p:last-child,.doc-content li>p:last-child,.doc-content td>p:last-child,.doc-content th>p:last-child{margin-bottom:0}.doc-content pre{white-space:pre-wrap;background:#f4f6f8;border-radius:4px;margin:0 0 6pt;padding:8pt 10pt;font-family:Consolas,Courier New,monospace;font-size:10pt;line-height:1.45}.doc-content code{background:#eef1f4;border-radius:3px;padding:1px 4px;font-family:Consolas,Courier New,monospace;font-size:.9em}.doc-content pre code{font-size:inherit;background:0 0;padding:0}.doc-content hr{border:0;border-bottom:1px solid #c4cad4;height:0;margin:0 0 6pt;padding-top:6pt}.doc-content a{color:#1d4ed8;text-decoration:underline}.doc-content mark{color:inherit;border-radius:2px;padding:0 1px}.doc-content img{max-width:100%;height:auto}.doc-content img[data-align=left]{margin:0 auto 6pt 0;display:block}.doc-content img[data-align=center]{margin:0 auto 6pt;display:block}.doc-content img[data-align=right]{margin:0 0 6pt auto;display:block}.doc-content table{border-collapse:collapse;table-layout:fixed;width:100%;margin:0 0 6pt}.doc-content td,.doc-content th{box-sizing:border-box;vertical-align:top;border:1px solid #8f99a8;min-width:1em;padding:3pt 5pt}.doc-content th{text-align:left;background:#f2f4f7;font-weight:700}.doc-content .doc-page-break{break-after:page;page-break-after:always;height:0}", o = "", s = {
|
|
4
|
-
"&": "&",
|
|
5
|
-
"<": "<",
|
|
6
|
-
">": ">",
|
|
7
|
-
"\"": """,
|
|
8
|
-
"'": "'"
|
|
9
|
-
}, c = /<div[^>]*data-type="page-break"[^>]*><\/div>/g, l = "<br clear=\"all\" style=\"page-break-before: always\">", u = /[\\/:*?"<>|]+/g, d = "document", f = 6e4, p = 4, m = 96 / 25.4, h = .16, g = [
|
|
10
|
-
"left",
|
|
11
|
-
"center",
|
|
12
|
-
"right"
|
|
13
|
-
], _ = /(\{page\}|\{pages\})/g, v = {
|
|
14
|
-
position: "fixed",
|
|
15
|
-
left: "-10000px",
|
|
16
|
-
top: "0",
|
|
17
|
-
width: "1px",
|
|
18
|
-
height: "1px",
|
|
19
|
-
border: "0"
|
|
20
|
-
}, y = (e) => e.replace(/[&<>"']/g, (e) => s[e] ?? e), b = ({ size: e, orientation: t }) => {
|
|
21
|
-
let n = i[e] ?? i.a4, r = t === "portrait";
|
|
22
|
-
return {
|
|
23
|
-
width: r ? n.width : n.height,
|
|
24
|
-
height: r ? n.height : n.width
|
|
25
|
-
};
|
|
26
|
-
}, x = (e) => {
|
|
27
|
-
let { width: t, height: n } = b(e), { margins: r } = e;
|
|
28
|
-
return `size: ${t}mm ${n}mm; margin: ${r.top}mm ${r.right}mm ${r.bottom}mm ${r.left}mm;`;
|
|
29
|
-
}, S = (e) => Math.max(p, e / 2 - 2), C = "\n.doc-running { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 12px; color: #475467; font: 10pt/1.4 'Times New Roman', Times, serif; }\n.doc-running span { min-width: 0; overflow: hidden; white-space: pre-wrap; }\n.doc-running span:nth-child(2) { text-align: center; }\n.doc-running span:nth-child(3) { text-align: right; }", w = (n, r, i) => !n || !e(n) ? "" : `<div class="doc-running doc-running--${r}">${g.map((e) => `<span>${y(t(n[e], i))}</span>`).join("")}</div>`, T = (e) => r(e) && e ? `<div class="doc-watermark">${y(e.text.trim())}</div>` : "", E = (e, t) => {
|
|
30
|
-
let { watermark: i } = e;
|
|
31
|
-
if (!r(i) || !i) return "";
|
|
32
|
-
let { width: a, height: o } = b(e), s = n(a * m, o * m, i.text, i.diagonal), c = i.diagonal ? " transform: rotate(-35deg);" : "";
|
|
33
|
-
return `
|
|
34
|
-
.doc-watermark { position: ${t ? "fixed" : "absolute"}; inset: 0; display: flex; align-items: center; justify-content: center; overflow: hidden; color: ${i.color}; font: 700 ${s}px/1 'Times New Roman', Times, serif; letter-spacing: 0.06em; opacity: ${h}; text-transform: uppercase; white-space: nowrap; pointer-events: none;${c} }`;
|
|
35
|
-
}, D = (e, t, n) => e.map((r, i) => {
|
|
36
|
-
let a = {
|
|
37
|
-
page: i + 1,
|
|
38
|
-
pages: e.length,
|
|
39
|
-
title: n
|
|
40
|
-
}, o = w(t.header, "header", a), s = w(t.footer, "footer", a);
|
|
41
|
-
return `<section class="doc-sheet">${T(t.watermark)}${o}<article class="doc-content">${r}</article>${s}</section>`;
|
|
42
|
-
}).join(""), O = (e) => {
|
|
43
|
-
let { width: t, height: n } = b(e), { margins: r } = e;
|
|
44
|
-
return `@page { size: ${t}mm ${n}mm; margin: 0; }
|
|
45
|
-
.doc-sheet { position: relative; box-sizing: border-box; width: ${t}mm; min-height: ${n}mm; padding: ${r.top}mm ${r.right}mm ${r.bottom}mm ${r.left}mm; overflow: hidden; background: #fff; break-after: page; }
|
|
46
|
-
.doc-sheet:last-child { break-after: auto; }
|
|
47
|
-
.doc-running { position: absolute; right: ${r.right}mm; left: ${r.left}mm; }
|
|
48
|
-
.doc-running--header { top: ${S(r.top)}mm; }
|
|
49
|
-
.doc-running--footer { bottom: ${S(r.bottom)}mm; }${C}${E(e, !1)}`;
|
|
50
|
-
}, k = (e) => {
|
|
51
|
-
let { margins: t } = e;
|
|
52
|
-
return `@page { ${x(e)} }
|
|
53
|
-
.doc-running { position: fixed; right: 0; left: 0; }
|
|
54
|
-
.doc-running--header { top: -${S(t.top)}mm; }
|
|
55
|
-
.doc-running--footer { bottom: -${S(t.bottom)}mm; }${C}${E(e, !0)}`;
|
|
56
|
-
}, A = (e) => e.replace(u, " ").trim() || d, j = ({ html: e, pages: t, title: n, page: r }) => {
|
|
57
|
-
let i = t !== void 0 && t.length > 0, o = {
|
|
58
|
-
page: 1,
|
|
59
|
-
pages: 1,
|
|
60
|
-
title: n
|
|
61
|
-
}, s = `${T(r.watermark)}${w(r.header, "header", o)}${w(r.footer, "footer", o)}<article class="doc-content">${e}</article>`;
|
|
62
|
-
return `<!doctype html>
|
|
63
|
-
<html lang="uz">
|
|
64
|
-
<head>
|
|
65
|
-
<meta charset="utf-8">
|
|
66
|
-
<title>${y(n)}</title>
|
|
67
|
-
<style>${i ? O(r) : k(r)} html, body { margin: 0; background: #fff; } ${a}</style>
|
|
68
|
-
</head>
|
|
69
|
-
<body>${i && t ? D(t, r, n) : s}</body>
|
|
70
|
-
</html>`;
|
|
71
|
-
}, M = (e) => `<span style='mso-field-code:${e}'>1</span>`, N = (e) => !r(e) || !e ? "" : `<!--[if gte vml 1]><v:shapetype id="_x0000_t136" coordsize="21600,21600" o:spt="136" adj="10800" path="m@7,l@8,m@5,21600l@6,21600e"/><v:shape id="NuvraWatermark" type="#_x0000_t136" style='position:absolute;margin-left:0;margin-top:0;width:468pt;height:117pt;rotation:${e.diagonal ? 315 : 0};z-index:-251658752;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-position-vertical:center;mso-position-vertical-relative:margin' fillcolor="${y(e.color)}" stroked="f"><v:fill opacity="${h}"/><v:textpath style='font-family:"Times New Roman";font-size:1pt' string="${y(e.text.trim())}"/></v:shape><![endif]-->`, P = (n, r, i, a = "") => {
|
|
72
|
-
let o = n !== void 0 && e(n);
|
|
73
|
-
if (!o && !a) return "";
|
|
74
|
-
let s = (e) => e.split(_).map((e) => e === "{page}" ? M("PAGE") : e === "{pages}" ? M("NUMPAGES") : y(t(e, {
|
|
75
|
-
page: 1,
|
|
76
|
-
pages: 1,
|
|
77
|
-
title: i
|
|
78
|
-
}))).join(""), [c, l, u] = g.map((e) => o && n ? s(n[e]) : "");
|
|
79
|
-
return `<div style='mso-element:${r}' id='${r === "header" ? "h1" : "f1"}'>${a}
|
|
80
|
-
<table width="100%" style='border-collapse:collapse'><tr>
|
|
81
|
-
<td style='border:none;padding:0'>${c}</td>
|
|
82
|
-
<td style='border:none;padding:0;text-align:center'>${l}</td>
|
|
83
|
-
<td style='border:none;padding:0;text-align:right'>${u}</td>
|
|
84
|
-
</tr></table></div>`;
|
|
85
|
-
}, F = ({ html: e, title: t, page: n }) => {
|
|
86
|
-
let r = e.replace(c, l), i = P(n.header, "header", t, N(n.watermark)), s = P(n.footer, "footer", t), u = `${i ? " mso-header: h1;" : ""}${s ? " mso-footer: f1;" : ""}`;
|
|
87
|
-
return `${o}<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">
|
|
88
|
-
<head>
|
|
89
|
-
<meta charset="utf-8">
|
|
90
|
-
<title>${y(t)}</title>
|
|
91
|
-
<!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:Zoom>100</w:Zoom></w:WordDocument></xml><![endif]-->
|
|
92
|
-
<style>@page Section1 { ${x(n)}${u} } div.Section1 { page: Section1; } ${a}</style>
|
|
93
|
-
</head>
|
|
94
|
-
<body><div class="Section1 doc-content">${r}</div>${i}${s}</body>
|
|
95
|
-
</html>`;
|
|
96
|
-
}, I = (e, t, n) => {
|
|
97
|
-
let r = URL.createObjectURL(new Blob([e], { type: n })), i = document.createElement("a");
|
|
98
|
-
i.href = r, i.download = t, i.click(), setTimeout(() => URL.revokeObjectURL(r), 0);
|
|
99
|
-
}, L = (e) => {
|
|
100
|
-
let t = document.createElement("iframe");
|
|
101
|
-
t.setAttribute("aria-hidden", "true"), t.tabIndex = -1, Object.assign(t.style, v);
|
|
102
|
-
let n = () => t.remove();
|
|
103
|
-
t.onload = () => {
|
|
104
|
-
let e = t.contentWindow;
|
|
105
|
-
if (!e) return n();
|
|
106
|
-
let r = Array.from(e.document.images).filter((e) => !e.complete).map((e) => new Promise((t) => {
|
|
107
|
-
e.addEventListener("load", t, { once: !0 }), e.addEventListener("error", t, { once: !0 });
|
|
108
|
-
}));
|
|
109
|
-
Promise.allSettled(r).then(() => {
|
|
110
|
-
e.addEventListener("afterprint", () => setTimeout(n, 0), { once: !0 }), e.focus(), e.print(), setTimeout(n, f);
|
|
111
|
-
});
|
|
112
|
-
}, t.srcdoc = e, document.body.appendChild(t);
|
|
113
|
-
};
|
|
114
|
-
//#endregion
|
|
115
|
-
export { j as buildPrintableHtml, F as buildWordHtml, I as downloadFile, L as printHtml, A as toFileName };
|
|
116
|
-
|
|
117
|
-
//# sourceMappingURL=export-VeTfgCEp.js.map
|