@pristy/pristy-libvue 2.21.1 → 2.21.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/{ActivityHistory-BGjkKWml.js → ActivityHistory-CYTsXlFs.js} +2 -2
  2. package/dist/{ActivityHistory-BGjkKWml.js.map → ActivityHistory-CYTsXlFs.js.map} +1 -1
  3. package/dist/{BookmarksComponent-DHIe0ttf.js → BookmarksComponent-BQRGDBtk.js} +2 -2
  4. package/dist/{BookmarksComponent-DHIe0ttf.js.map → BookmarksComponent-BQRGDBtk.js.map} +1 -1
  5. package/dist/{ChartWrapper-Zs8fU_KC.js → ChartWrapper-NLlDKzgW.js} +2 -2
  6. package/dist/{ChartWrapper-Zs8fU_KC.js.map → ChartWrapper-NLlDKzgW.js.map} +1 -1
  7. package/dist/{DisplayFileInDashboardComponent-VTGlXPxP.js → DisplayFileInDashboardComponent-Ba8OoyfR.js} +3 -3
  8. package/dist/{DisplayFileInDashboardComponent-VTGlXPxP.js.map → DisplayFileInDashboardComponent-Ba8OoyfR.js.map} +1 -1
  9. package/dist/{ExternalApps-B2alflcL.js → ExternalApps-cKv9ZUlp.js} +2 -2
  10. package/dist/{ExternalApps-B2alflcL.js.map → ExternalApps-cKv9ZUlp.js.map} +1 -1
  11. package/dist/{FavoriteList-CcY7AFMX.js → FavoriteList-NsYCMz7n.js} +2 -2
  12. package/dist/{FavoriteList-CcY7AFMX.js.map → FavoriteList-NsYCMz7n.js.map} +1 -1
  13. package/dist/{MarkdownComponent-LDoBl43h.js → MarkdownComponent-q21Q073I.js} +2 -2
  14. package/dist/{MarkdownComponent-LDoBl43h.js.map → MarkdownComponent-q21Q073I.js.map} +1 -1
  15. package/dist/{PDFComponent-BXyQNUhl.js → PDFComponent-CUgH5A5P.js} +3 -3
  16. package/dist/{PDFComponent-BXyQNUhl.js.map → PDFComponent-CUgH5A5P.js.map} +1 -1
  17. package/dist/{PdfConfigService-BKVsjC1W.js → PdfConfigService-DZN8iTaP.js} +2 -2
  18. package/dist/{PdfConfigService-BKVsjC1W.js.map → PdfConfigService-DZN8iTaP.js.map} +1 -1
  19. package/dist/{PdfToolsComponent-BC45mg3C.js → PdfToolsComponent-CynQg24K.js} +3 -3
  20. package/dist/{PdfToolsComponent-BC45mg3C.js.map → PdfToolsComponent-CynQg24K.js.map} +1 -1
  21. package/dist/{SearchInput-C3A2rG7G.js → SearchInput-CbErAaEm.js} +2 -2
  22. package/dist/{SearchInput-C3A2rG7G.js.map → SearchInput-CbErAaEm.js.map} +1 -1
  23. package/dist/{UnknownBlockType-CK5rOiTB.js → UnknownBlockType-BhseESPx.js} +2 -2
  24. package/dist/{UnknownBlockType-CK5rOiTB.js.map → UnknownBlockType-BhseESPx.js.map} +1 -1
  25. package/dist/{index-CPjFX5To.js → index-DyssYdtW.js} +4800 -4721
  26. package/dist/index-DyssYdtW.js.map +1 -0
  27. package/dist/pristy-libvue.css +1 -1
  28. package/dist/pristy-libvue.es.js +1 -1
  29. package/dist/pristy-libvue.umd.js +17 -17
  30. package/dist/pristy-libvue.umd.js.map +1 -1
  31. package/dist/src/components/layouts/AppLayout.vue.d.ts +60 -1
  32. package/dist/src/components/layouts/AppLayout.vue.d.ts.map +1 -1
  33. package/dist/src/components/layouts/AppMobileLayout.vue.d.ts +60 -2
  34. package/dist/src/components/layouts/AppMobileLayout.vue.d.ts.map +1 -1
  35. package/dist/src/components/layouts/AppSubmenu.vue.d.ts.map +1 -1
  36. package/dist/src/components/navigation/ContentListView.vue.d.ts.map +1 -1
  37. package/dist/src/services/AlfrescoFileService.d.ts.map +1 -1
  38. package/dist/src/services/IconeService.d.ts.map +1 -1
  39. package/package.json +1 -1
  40. package/dist/index-CPjFX5To.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PdfToolsComponent-BC45mg3C.js","sources":["../src/components/pdfTools/SaveAsPopup.vue","../src/services/PdfCommentService.js","../src/services/PdfRedactionService.js","../src/services/PdfTextService.js","../src/components/pdfTools/PdfToolsComponent.vue"],"sourcesContent":["<!--\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n-->\n\n<template>\n <PrimeDialog\n :visible=\"visible\"\n modal\n :header=\"$t('pdfTools.saveAs.title')\"\n class=\"dialog-save-as\"\n @update:visible=\"$emit('close')\"\n @show=\"onDialogShow\"\n >\n <div class=\"save-as-form\">\n <div class=\"form-field\">\n <label for=\"filename\">{{ $t(\"pdfTools.saveAs.filenameLabel\") }}</label>\n <PrimeInputText id=\"filename\" v-model=\"filename\" />\n </div>\n\n <div class=\"form-field\">\n <label for=\"location\">{{ $t(\"pdfTools.saveAs.folderLabel\") }}</label>\n <div class=\"input-group\">\n <PrimeInputText id=\"location\" readonly :value=\"selectedFolderName\" />\n <PrimeButton\n :icon=\"\n isExplorerVisible ? 'ri-arrow-up-s-line' : 'ri-arrow-down-s-line'\n \"\n :label=\"$t('pdfTools.saveAs.browse')\"\n @click=\"isExplorerVisible = !isExplorerVisible\"\n />\n </div>\n </div>\n\n <div v-if=\"isExplorerVisible\" class=\"explorer-container\">\n <TreeExplorer\n :current-node=\"initialNode\"\n show-user-home\n :show-files=\"false\"\n @selectNode=\"onNodeSelect\"\n />\n </div>\n </div>\n <template #footer>\n <PrimeButton\n :label=\"$t('pdfTools.common.cancel')\"\n icon=\"ri-close-line\"\n text\n @click=\"$emit('close')\"\n />\n <PrimeButton\n :label=\"$t('pdfTools.common.save')\"\n icon=\"ri-check-line\"\n @click=\"save\"\n :disabled=\"!filename || !selectedFolderId\"\n />\n </template>\n </PrimeDialog>\n</template>\n\n<script setup>\nimport { ref, defineProps, defineEmits } from \"vue\";\nimport PrimeDialog from \"primevue/dialog\";\nimport PrimeInputText from \"primevue/inputtext\";\nimport PrimeButton from \"primevue/button\";\nimport TreeExplorer from \"@/components/TreeExplorer.vue\";\nimport { useI18n } from \"vue-i18n\";\nimport alfrescoNodeService from \"@/services/AlfrescoNodeService.js\";\n\nconst { t } = useI18n();\n\nconst props = defineProps({\n visible: Boolean,\n defaultFilename: {\n type: String,\n default: null,\n },\n parentFolderNode: {\n type: Object,\n default: null,\n },\n});\n\nconst emit = defineEmits([\"close\", \"save\"]);\n\nconst filename = ref(\"\");\nconst initialNode = ref(null);\nconst isExplorerVisible = ref(false);\nconst selectedFolderId = ref(null);\nconst selectedFolderName = ref(\"\");\n\nconst onDialogShow = () => {\n filename.value =\n props.defaultFilename || t(\"pdfTools.saveAs.defaultFilename\");\n initialNode.value = props.parentFolderNode;\n selectedFolderId.value = props.parentFolderNode?.id;\n selectedFolderName.value = props.parentFolderNode?.name;\n isExplorerVisible.value = false;\n};\n\nconst onNodeSelect = async (nodeData) => {\n if (!nodeData || !nodeData.isFolder) {\n return;\n }\n if (nodeData.name === \"documentLibrary\") {\n selectedFolderId.value = nodeData.id;\n if (nodeData.parentId) {\n try {\n const parentNode = await alfrescoNodeService.getNode(nodeData.parentId);\n selectedFolderName.value =\n parentNode.properties[\"cm:title\"] || parentNode.name;\n } catch (e) {\n console.error(\"Could not fetch parent node name\", e);\n selectedFolderName.value = nodeData.name;\n }\n } else {\n selectedFolderName.value = nodeData.name;\n }\n } else {\n selectedFolderId.value = nodeData.id;\n selectedFolderName.value = nodeData.name;\n }\n isExplorerVisible.value = false;\n};\n\nconst save = () => {\n if (selectedFolderId.value) {\n emit(\"save\", {\n filename: filename.value,\n folderId: selectedFolderId.value,\n });\n }\n};\n</script>\n\n<!-- Non-scoped: Dialog teleported to body -->\n<style>\n.dialog-save-as {\n width: 35rem;\n}\n</style>\n\n<style scoped>\n.save-as-form {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n}\n\n.form-field label {\n font-weight: 500;\n font-size: 0.875rem;\n}\n\n.input-group {\n display: flex;\n}\n\n.input-group :deep(.p-inputtext) {\n flex: 1;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group :deep(.p-button) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.explorer-container {\n margin-top: 0.75rem;\n border: 1px solid var(--p-surface-border);\n padding: 0.5rem;\n overflow-y: auto;\n max-height: 20rem;\n border-radius: 0.375rem;\n}\n</style>\n","/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\nimport { PDFHexString, PDFName } from \"pdf-lib\";\n\n/** Yellow of the note icon, as PDF colour components. */\nconst COMMENT_COLOR = [1, 0.92, 0.23];\n\n/** Annotation flag 4: print the annotation along with the page. */\nconst FLAG_PRINT = 4;\n\n/**\n * @typedef {Object} CommentAnchor\n * @property {number} x left edge, in PDF coordinates\n * @property {number} y bottom edge, in PDF coordinates\n * @property {number} size side of the square icon, in points\n */\n\n/**\n * Attach a comment to a page as a real PDF annotation.\n *\n * A comment belongs beside the page, not inside it: drawing it into the\n * content stream would print it over the document and merge it with the\n * content for good. As an annotation it stays a note a reader can open, and\n * the page itself is left untouched.\n *\n * @param {Object} params\n * @param {import(\"pdf-lib\").PDFDocument} params.doc\n * @param {import(\"pdf-lib\").PDFPage} params.page page to annotate\n * @param {CommentAnchor} params.rect where the note icon sits\n * @param {string} params.text content of the note\n * @param {string} params.title title shown by the viewer\n */\nexport const addCommentAnnotation = ({ doc, page, rect, text, title }) => {\n const content = String(text ?? \"\");\n if (!content.trim()) {\n return;\n }\n\n const annotation = doc.context.obj({\n Type: \"Annot\",\n Subtype: \"Text\",\n // Icon used by the viewer for this note\n Name: \"Comment\",\n Rect: [rect.x, rect.y, rect.x + rect.size, rect.y + rect.size],\n // fromText encodes as UTF-16BE: a plain string would break accents\n Contents: PDFHexString.fromText(content),\n T: PDFHexString.fromText(String(title ?? \"\")),\n C: COMMENT_COLOR,\n F: FLAG_PRINT,\n });\n\n page.node.addAnnot(doc.context.register(annotation));\n};\n\n/**\n * List the comments already carried by a page.\n *\n * The editing preview only knows about the overlay being built, so without\n * this the comments merged into the document become invisible: those just\n * applied, and those a document arrives with.\n *\n * @param {import(\"pdf-lib\").PDFPage} page\n * @returns {{x: number, y: number, size: number, text: string}[]} comments,\n * positioned in PDF coordinates\n */\nexport const readCommentAnnotations = (page) => {\n const annots = page.node.Annots();\n if (!annots) {\n return [];\n }\n\n const comments = [];\n for (let index = 0; index < annots.size(); index++) {\n const annot = annots.lookup(index);\n if (annot?.get(PDFName.of(\"Subtype\")) !== PDFName.of(\"Text\")) {\n continue;\n }\n const rect = annot.get(PDFName.of(\"Rect\"))?.asRectangle();\n if (!rect) {\n continue;\n }\n const contents = annot.get(PDFName.of(\"Contents\"));\n comments.push({\n x: rect.x,\n y: rect.y,\n size: Math.max(rect.width, rect.height),\n text:\n typeof contents?.decodeText === \"function\" ? contents.decodeText() : \"\",\n });\n }\n return comments;\n};\n\n/**\n * Drop every comment from a page, leaving its other annotations in place.\n *\n * Comments are rewritten from scratch on every apply, so that moving,\n * editing or deleting one in the editor is reflected in the document.\n *\n * @param {import(\"pdf-lib\").PDFPage} page\n */\nexport const removeCommentAnnotations = (page) => {\n const annots = page.node.Annots();\n if (!annots) {\n return;\n }\n\n // Walk backwards: removing shifts every later index\n for (let index = annots.size() - 1; index >= 0; index--) {\n if (\n annots.lookup(index)?.get(PDFName.of(\"Subtype\")) === PDFName.of(\"Text\")\n ) {\n annots.remove(index);\n }\n }\n};\n","/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\n\n/** PDF user space unit: 72 points per inch. */\nconst POINTS_PER_INCH = 72;\n\n/** Resolution of the flattened page, high enough to stay readable in print. */\nexport const REDACTION_DPI = 200;\n\n/**\n * Largest canvas the rasterization is allowed to allocate. Browsers cap canvas\n * area (Safari and iOS around 16.7 Mpx) and silently return a blank bitmap when\n * the cap is exceeded, so the resolution is lowered rather than risking an\n * empty page.\n */\nconst MAX_CANVAS_PIXELS = 16_000_000;\n\n/**\n * @typedef {Object} PageFractionRect\n * @property {number} x left edge, as a fraction of the page width (0..1)\n * @property {number} y top edge, as a fraction of the page height (0..1)\n * @property {number} w width, as a fraction of the page width (0..1)\n * @property {number} h height, as a fraction of the page height (0..1)\n */\n\n/**\n * Render a PDF page off-screen and burn the redaction masks into the pixels.\n *\n * The page is rendered from the PDF itself at a fixed resolution, not copied\n * from the on-screen canvas: the quality of an archived document must not\n * depend on the zoom level in use when the user applied the redaction.\n *\n * Redaction must be destructive: the masked content has to disappear from the\n * exported image itself. Drawing the masks as PDF objects on top of an\n * untouched raster would leave the original content readable to anyone\n * extracting the background image or removing the covering object.\n *\n * Masks are expressed as fractions of the page so that they stay independent\n * from both the screen resolution and the render resolution.\n *\n * @param {Object} params\n * @param {Object} params.pdfPage pdf.js PDFPageProxy of the page to flatten\n * @param {PageFractionRect[]} [params.redactions] areas to destroy\n * @param {number} [params.dpi] target resolution of the rendered page\n * @param {number} [params.quality] JPEG quality of the exported image\n * @param {string} [params.mimeType] MIME type of the exported image\n * @param {number} [params.maxPixels] canvas area budget\n * @param {function(): HTMLCanvasElement} [params.createCanvas] canvas factory\n * @returns {Promise<string>} data URL of the flattened page\n */\nexport const rasterizeRedactedPage = async ({\n pdfPage,\n redactions = [],\n dpi = REDACTION_DPI,\n quality = 0.85,\n mimeType = \"image/jpeg\",\n maxPixels = MAX_CANVAS_PIXELS,\n createCanvas = () => document.createElement(\"canvas\"),\n}) => {\n let scale = dpi / POINTS_PER_INCH;\n const wanted = pdfPage.getViewport({ scale });\n const wantedPixels = wanted.width * wanted.height;\n if (wantedPixels > maxPixels) {\n // Round down so the budget is never exceeded by a rounding error\n scale =\n Math.floor(scale * Math.sqrt(maxPixels / wantedPixels) * 10000) / 10000;\n }\n\n const viewport = pdfPage.getViewport({ scale });\n const canvas = createCanvas();\n canvas.width = Math.floor(viewport.width);\n canvas.height = Math.floor(viewport.height);\n\n const ctx = canvas.getContext(\"2d\");\n await pdfPage.render({ canvasContext: ctx, viewport }).promise;\n\n if (redactions.length > 0) {\n ctx.fillStyle = \"#000000\";\n for (const rect of redactions) {\n ctx.fillRect(\n rect.x * canvas.width,\n rect.y * canvas.height,\n rect.w * canvas.width,\n rect.h * canvas.height,\n );\n }\n }\n\n return canvas.toDataURL(mimeType, quality);\n};\n","/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\n\n/**\n * Spacing between two consecutive baselines, as a multiple of the font size.\n * Shared by the on-screen preview and the PDF output so both stay aligned.\n */\nexport const LINE_HEIGHT_RATIO = 1.2;\n\n/** Minimum width of a text box, so an empty text stays selectable. */\nconst MIN_BLOCK_WIDTH = 8;\n\n/**\n * Scale factor converting a PDF point into overlay canvas pixels.\n *\n * Font sizes are stored in PDF points, the only unit that means anything in\n * the produced document. The preview must convert them for the current render,\n * otherwise the same text appears at a different size depending on the zoom\n * level and on the device pixel ratio.\n *\n * @param {Object} params\n * @param {number} params.overlayWidth width of the overlay canvas, in pixels\n * @param {number} params.pageWidthPt width of the PDF page, in points\n * @returns {number} pixels per point\n */\nexport const overlayPixelsPerPoint = ({ overlayWidth, pageWidthPt }) => {\n if (!pageWidthPt || !overlayWidth) {\n return 1;\n }\n return overlayWidth / pageWidthPt;\n};\n\n/**\n * Split a text into lines on explicit newlines only.\n *\n * Text is anchored on a point, not fitted into a box: it never wraps on its\n * own, so no line can be silently dropped for lack of room.\n *\n * @param {string} text\n * @returns {string[]} lines, empty ones included\n */\nexport const splitTextLines = (text) => String(text ?? \"\").split(/\\r?\\n/);\n\n/**\n * Measure the box occupied by a text block.\n *\n * @param {Object} params\n * @param {string[]} params.lines\n * @param {number} params.fontSize font size, in the unit of `measureLine`\n * @param {function(string): number} params.measureLine measures one line\n * @returns {{w: number, h: number}} block size, in the same unit\n */\nexport const measureTextBlock = ({ lines, fontSize, measureLine }) => {\n const widths = lines.map((line) => measureLine(line));\n return {\n w: Math.max(MIN_BLOCK_WIDTH, ...widths),\n h: lines.length * fontSize * LINE_HEIGHT_RATIO,\n };\n};\n\n/**\n * Baseline position of one line, in PDF coordinates.\n *\n * Everything here is expressed in the PDF coordinate system, measured from the\n * bottom of the page: mixing it with a top-down origin is the kind of mistake\n * that silently drops text off the visible area.\n *\n * @param {Object} params\n * @param {number} params.topY top of the text block, in PDF coordinates\n * @param {number} params.lineIndex zero-based index of the line\n * @param {number} params.fontSize font size, in points\n * @param {number} params.ascentPt height of the font above its baseline\n * @returns {number} baseline position, in PDF coordinates\n */\nexport const pdfBaselineY = ({ topY, lineIndex, fontSize, ascentPt }) =>\n topY - lineIndex * fontSize * LINE_HEIGHT_RATIO - ascentPt;\n","<!--\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n-->\n\n<template>\n <div class=\"pdf-tools-page\">\n <div class=\"pdf-tools-header\">\n <h1>\n {{ $t(\"pdfTools.title\") }}\n <span v-if=\"currentFilename\">— {{ currentFilename }}</span>\n </h1>\n <PrimeButton\n v-if=\"closable\"\n severity=\"secondary\"\n class=\"flex-shrink-0\"\n icon=\"ri-close-line\"\n :label=\"$t('pdfTools.closeEditor')\"\n @click=\"closeEditor\"\n />\n </div>\n\n <div v-if=\"isLoading\" class=\"loading-container\">\n <PrimeProgressSpinner />\n <p>{{ $t(\"pdfTools.loading\") }}</p>\n </div>\n\n <div v-if=\"error\" class=\"error-container\">\n <PrimeMessage severity=\"error\">{{ error }}</PrimeMessage>\n </div>\n\n <div v-if=\"!isLoading && !error\" class=\"pdf-editor-layout\">\n <div class=\"pdf-tools-sidebar\">\n <div class=\"card\">\n <h2>{{ $t(\"pdfTools.sidebar.actions\") }}</h2>\n <div class=\"sidebar-form\">\n <PrimeButton\n icon=\"ri-save-2-line\"\n :label=\"$t('pdfTools.sidebar.saveNewVersion')\"\n @click=\"saveChanges\"\n />\n <PrimeButton\n severity=\"secondary\"\n class=\"btn-mt\"\n icon=\"ri-file-copy-2-line\"\n :label=\"$t('pdfTools.sidebar.saveAs')\"\n @click=\"openSaveAsPopup('saveAs')\"\n />\n <PrimeDivider />\n <div class=\"form-field\">\n <h3>{{ $t(\"pdfTools.sidebar.extractPages\") }}</h3>\n <PrimeButton\n :disabled=\"selectedPages.length === 0\"\n icon=\"ri-file-transfer-line\"\n :label=\"$t('pdfTools.sidebar.extractAndSave')\"\n @click=\"openSaveAsPopup('extract')\"\n />\n </div>\n <div class=\"form-field form-field--spaced\">\n <h3>{{ $t(\"pdfTools.sidebar.deletePages\") }}</h3>\n <PrimeButton\n :disabled=\"\n selectedPages.length === 0 ||\n pages.length === selectedPages.length\n \"\n severity=\"danger\"\n icon=\"ri-delete-bin-line\"\n :label=\"$t('pdfTools.sidebar.deleteSelectedPages')\"\n @click=\"deleteSelectedPages\"\n />\n </div>\n <div class=\"form-field form-field--spaced\">\n <h3>{{ $t(\"pdfTools.sidebar.insertPdf\") }}</h3>\n <div class=\"insert-buttons\">\n <PrimeFileUpload\n :auto=\"false\"\n :customUpload=\"false\"\n :showCancelButton=\"false\"\n :showUploadButton=\"false\"\n accept=\"application/pdf\"\n :choose-label=\"$t('pdfTools.sidebar.fromComputer')\"\n severity=\"secondary\"\n class=\"btn-full\"\n mode=\"basic\"\n name=\"pdfToInsert\"\n @select=\"onInsertPdfSelect\"\n />\n <PrimeButton\n severity=\"secondary\"\n icon=\"ri-cloud-line\"\n :label=\"$t('pdfTools.sidebar.fromPristy')\"\n @click=\"openInsertFromAlfrescoDialog\"\n />\n </div>\n </div>\n <div class=\"form-field form-field--spaced\">\n <h3>{{ $t(\"pdfTools.sidebar.addWatermark\") }}</h3>\n <PrimeInputText\n v-model=\"watermarkText\"\n :placeholder=\"$t('pdfTools.sidebar.watermarkTextPlaceholder')\"\n type=\"text\"\n />\n <div class=\"watermark-grid\">\n <div>\n <PrimeInputNumber\n v-model=\"watermarkAngle\"\n :max=\"360\"\n :min=\"-360\"\n :placeholder=\"$t('pdfTools.sidebar.angle')\"\n suffix=\"°\"\n />\n </div>\n <div>\n <PrimeInputNumber\n v-model=\"watermarkRepetitions\"\n :max=\"10\"\n :min=\"1\"\n :placeholder=\"$t('pdfTools.sidebar.repetitions')\"\n />\n </div>\n </div>\n <PrimeButton\n :disabled=\"!watermarkText || selectedPages.length === 0\"\n severity=\"secondary\"\n class=\"btn-mt\"\n icon=\"ri-paint-brush-line\"\n :label=\"$t('pdfTools.sidebar.addWatermarkButton')\"\n @click=\"addWatermark\"\n />\n </div>\n </div>\n </div>\n </div>\n <div class=\"pdf-preview-container\">\n <h2>{{ $t(\"pdfTools.pagePreview.title\") }}</h2>\n <VueDraggableNext\n v-model=\"pages\"\n class=\"page-grid\"\n ghost-class=\"ghost\"\n item-key=\"pageIndex\"\n @end=\"onDragEnd\"\n >\n <div\n v-for=\"element in pages\"\n :key=\"element.pageIndex\"\n class=\"page-grid-item\"\n >\n <div\n :class=\"{ selected: isPageSelected(element) }\"\n class=\"page-thumbnail\"\n @click=\"togglePageSelection(element)\"\n @dblclick.stop=\"openPageEditor(element)\"\n >\n <div class=\"page-selection\">\n <PrimeCheckbox binary :model-value=\"isPageSelected(element)\" />\n </div>\n <div class=\"page-actions\">\n <PrimeButton\n text\n rounded\n icon=\"ri-clockwise-line\"\n :aria-label=\"$t('pdf.rotationRigth')\"\n @click.stop=\"rotatePage(element)\"\n />\n <PrimeButton\n :aria-label=\"\n $t('pdfTools.pagePreview.openPagePreview', {\n pageNumber: element.pageNumber,\n })\n \"\n text\n rounded\n icon=\"ri-edit-box-line\"\n @click.stop=\"openPageEditor(element)\"\n />\n </div>\n <div class=\"thumbnail-content\">\n <VuePDF\n :annotations=\"false\"\n :page=\"element.pageNumber\"\n :pdf=\"pdf\"\n :scale=\"0.25\"\n :text=\"false\"\n />\n </div>\n <div class=\"page-number\">{{ element.pageNumber }}</div>\n </div>\n </div>\n </VueDraggableNext>\n </div>\n </div>\n\n <!-- Large preview / editing of a specific page -->\n <PrimeDialog\n v-model:visible=\"isPageEditorVisible\"\n :breakpoints=\"{ '960px': '95vw', '640px': '100vw' }\"\n :closeOnEscape=\"false\"\n :style=\"{ width: '85vw', maxWidth: '1400px', height: '90vh' }\"\n dismissableMask\n modal\n class=\"dialog-page-editor\"\n content-class=\"page-editor-dialog\"\n @hide=\"closePageEditor\"\n >\n <template #header>\n <div class=\"dialog-header\">\n <i class=\"ri-file-fill\" aria-hidden=\"true\" />\n <span>\n {{\n $t(\"pdfTools.pageEditor.title\", {\n pageNumber:\n (selectedPageForEdit || selectedPage)?.pageNumber || \"\",\n filename: currentFilename,\n })\n }}\n </span>\n </div>\n </template>\n\n <div class=\"page-editor-toolbar\">\n <PrimeButton\n text\n icon=\"ri-zoom-out-line\"\n :aria-label=\"$t('pdf.dezoom')\"\n @click=\"zoomOut\"\n />\n <PrimeButton\n text\n icon=\"ri-zoom-in-line\"\n :aria-label=\"$t('pdf.zoom')\"\n @click=\"zoomIn\"\n />\n <PrimeButton\n text\n :label=\"$t('pdfTools.pageEditor.fit')\"\n @click=\"fitToWidth\"\n />\n <span class=\"zoom-indicator\">{{ Math.round(pageZoom * 100) }}%</span>\n <span class=\"spacer\" />\n <PrimeButton\n text\n icon=\"ri-close-line\"\n :label=\"$t('pdfTools.pageEditor.close')\"\n @click=\"closePageEditor\"\n />\n </div>\n <div class=\"editor-layout\">\n <div class=\"tool-group\">\n <h4>{{ $t(\"pdfTools.pageEditor.tools.actions\") }}</h4>\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.SELECT }\"\n icon=\"ri-cursor-line\"\n :label=\"$t('pdfTools.pageEditor.tools.select')\"\n @click=\"setTool(EDITOR_TOOLS.SELECT)\"\n />\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.REDACT }\"\n icon=\"ri-eraser-fill\"\n :label=\"$t('pdfTools.pageEditor.tools.redact')\"\n @click=\"setTool(EDITOR_TOOLS.REDACT)\"\n />\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.HIGHLIGHT }\"\n icon=\"ri-mark-pen-line\"\n :label=\"$t('pdfTools.pageEditor.tools.highlight')\"\n @click=\"setTool(EDITOR_TOOLS.HIGHLIGHT)\"\n />\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.COMMENT }\"\n icon=\"ri-sticky-note-line\"\n :label=\"$t('pdfTools.pageEditor.tools.comment')\"\n @click=\"setTool(EDITOR_TOOLS.COMMENT)\"\n />\n <PrimeFileUpload\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.IMAGE }\"\n accept=\"image/*\"\n :choose-label=\"$t('pdfTools.pageEditor.tools.image')\"\n mode=\"basic\"\n name=\"image\"\n @select=\"onOverlayImageSelect\"\n />\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.SIGNATURE }\"\n icon=\"ri-ball-pen-line\"\n :label=\"$t('pdfTools.pageEditor.tools.signature')\"\n @click=\"openSignaturePad\"\n />\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.TEXT }\"\n icon=\"ri-font-size\"\n :label=\"$t('pdfTools.pageEditor.tools.text')\"\n @click=\"setTool(EDITOR_TOOLS.TEXT)\"\n />\n <div v-if=\"isTextPanelVisible\" class=\"text-settings\">\n <div class=\"form-field\">\n <label class=\"form-label\">{{\n $t(\"pdfTools.pageEditor.tools.font\")\n }}</label>\n <PrimeSelect\n v-model=\"textFont\"\n :options=\"textFontOptions\"\n class=\"input-full\"\n optionLabel=\"label\"\n optionValue=\"value\"\n />\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\" for=\"text-size-slider\">\n {{ $t(\"pdfTools.pageEditor.tools.size\") }} : {{ textSize }}\n </label>\n <PrimeSlider\n id=\"text-size-slider\"\n v-model=\"textSize\"\n :max=\"144\"\n :min=\"6\"\n class=\"input-full\"\n />\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\" id=\"text-color-label\">{{\n $t(\"pdfTools.pageEditor.tools.color\")\n }}</label>\n <div\n class=\"color-swatches\"\n role=\"group\"\n aria-labelledby=\"text-color-label\"\n >\n <button\n v-for=\"swatch in TEXT_COLOR_SWATCHES\"\n :key=\"swatch.value\"\n type=\"button\"\n class=\"color-swatch\"\n :class=\"{ selected: textColor === swatch.value }\"\n :style=\"{ backgroundColor: swatch.value }\"\n :aria-label=\"$t(`pdfTools.pageEditor.colors.${swatch.name}`)\"\n :aria-pressed=\"textColor === swatch.value\"\n @click=\"textColor = swatch.value\"\n ></button>\n </div>\n <label class=\"color-custom\">\n <input\n v-model=\"textColor\"\n type=\"color\"\n class=\"color-custom-input\"\n />\n <span>{{ $t(\"pdfTools.pageEditor.colors.custom\") }}</span>\n </label>\n </div>\n </div>\n <PrimeDivider />\n <PrimeButton\n :disabled=\"overlayItems.length === 0\"\n severity=\"info\"\n class=\"btn-full btn-mt-auto\"\n icon=\"ri-check-line\"\n :label=\"$t('pdfTools.pageEditor.apply')\"\n @click=\"applyOverlayEdits\"\n />\n <PrimeButton\n :disabled=\"overlayItems.length === 0\"\n severity=\"warn\"\n class=\"btn-full btn-mt-sm\"\n icon=\"ri-arrow-go-back-line\"\n :label=\"$t('pdfTools.pageEditor.cancel')\"\n @click=\"undoOverlay\"\n />\n <PrimeButton\n v-if=\"selectedItemIndex >= 0\"\n severity=\"danger\"\n class=\"btn-full btn-mt-sm\"\n icon=\"ri-delete-bin-line\"\n :label=\"$t('pdfTools.pageEditor.deleteSelected')\"\n @click=\"deleteSelectedItem\"\n />\n </div>\n <div\n class=\"page-editor-canvas\"\n @wheel.passive=\"syncOverlaySize\"\n @scroll.passive=\"syncOverlaySize\"\n >\n <div ref=\"pdfCanvasWrapper\" class=\"pdf-canvas-wrapper\">\n <VuePDF\n v-if=\"pdf && (selectedPageForEdit || selectedPage)\"\n annotations\n :page=\"(selectedPageForEdit || selectedPage).pageNumber\"\n :pdf=\"pdf\"\n :scale=\"pageZoom\"\n :text=\"false\"\n class=\"pdf-canvas-absolute\"\n />\n <canvas\n ref=\"overlayCanvas\"\n class=\"overlay-canvas\"\n @dblclick=\"onOverlayDoubleClick\"\n @mousedown=\"onOverlayMouseDown\"\n @mouseleave=\"onOverlayMouseLeave\"\n @mousemove=\"onOverlayMouseMove\"\n @mouseup=\"onOverlayMouseUp\"\n />\n <textarea\n v-if=\"textEditor.visible\"\n ref=\"textEditorInput\"\n v-model=\"textEditor.value\"\n :aria-label=\"inlineEditorLabels.label\"\n :placeholder=\"inlineEditorLabels.placeholder\"\n :style=\"textEditorStyle\"\n class=\"text-editor-input\"\n @blur=\"commitTextEditor\"\n @keydown.ctrl.enter.prevent=\"commitTextEditor\"\n ></textarea>\n </div>\n </div>\n </div>\n\n <template #footer>\n <div class=\"editor-footer\">\n <small>{{ $t(\"pdfTools.pageEditor.footerHint\") }}</small>\n </div>\n </template>\n </PrimeDialog>\n\n <!-- Signature pad dialog -->\n <PrimeDialog\n v-model:visible=\"isSignaturePadVisible\"\n modal\n class=\"dialog-signature-pad\"\n @hide=\"onCloseSignaturePad\"\n >\n <template #header>\n <div class=\"dialog-header\">\n <i class=\"ri-ball-pen-line\" aria-hidden=\"true\" />\n <span>{{ $t(\"pdfTools.signaturePad.title\") }}</span>\n </div>\n </template>\n <div class=\"signature-pad\">\n <canvas\n ref=\"signaturePadCanvas\"\n class=\"signature-canvas\"\n @mousedown=\"sigDown\"\n @mouseleave=\"sigUp\"\n @mousemove=\"sigMove\"\n @mouseup=\"sigUp\"\n @touchstart.prevent=\"sigTouchDown\"\n @touchmove.prevent=\"sigTouchMove\"\n @touchend.prevent=\"sigUp\"\n ></canvas>\n </div>\n <template #footer>\n <div class=\"dialog-footer-buttons\">\n <PrimeButton\n text\n :label=\"$t('pdfTools.signaturePad.clear')\"\n @click=\"sigClear\"\n />\n <PrimeButton\n text\n :label=\"$t('pdfTools.signaturePad.use')\"\n @click=\"sigUse\"\n />\n </div>\n </template>\n </PrimeDialog>\n\n <SaveAsPopup\n :default-filename=\"defaultFilename\"\n :visible=\"isSaveAsPopupVisible\"\n :parent-folder-node=\"parentFolderNode\"\n @close=\"isSaveAsPopupVisible = false\"\n @save=\"handleSaveAs\"\n />\n <!-- Dialog: Insert PDF from Alfresco -->\n <PrimeDialog\n :visible=\"isInsertFromAlfrescoVisible\"\n modal\n :header=\"$t('pdfTools.insertFromAlfresco.title')\"\n class=\"dialog-insert-pdf\"\n @update:visible=\"isInsertFromAlfrescoVisible = false\"\n >\n <PrimeTabs :value=\"0\" @update:value=\"onTabChange\">\n <PrimeTabList>\n <PrimeTab :value=\"0\">{{\n $t(\"pdfTools.insertFromAlfresco.browse\")\n }}</PrimeTab>\n <PrimeTab :value=\"1\">{{\n $t(\"pdfTools.insertFromAlfresco.search\")\n }}</PrimeTab>\n <PrimeTab :value=\"2\">{{\n $t(\"pdfTools.insertFromAlfresco.favorites\")\n }}</PrimeTab>\n <PrimeTab :value=\"3\">{{\n $t(\"pdfTools.insertFromAlfresco.linkOrId\")\n }}</PrimeTab>\n </PrimeTabList>\n <PrimeTabPanels>\n <PrimeTabPanel :value=\"0\">\n <TreeExplorer\n showUserHome\n showFiles\n @selectNode=\"onNodeSelectedFromTree\"\n />\n </PrimeTabPanel>\n <PrimeTabPanel :value=\"1\">\n <div class=\"search-input-group\">\n <PrimeInputText\n v-model=\"searchQuery\"\n :placeholder=\"\n $t('pdfTools.insertFromAlfresco.searchPlaceholder')\n \"\n @keyup.enter=\"performSearch\"\n />\n <PrimeButton\n icon=\"ri-search-line\"\n :aria-label=\"$t('search')\"\n @click=\"performSearch\"\n />\n </div>\n <div v-if=\"searchLoading\" class=\"inline-status\">\n <PrimeProgressSpinner class=\"spinner-sm\" strokeWidth=\"8\" />\n <span>{{ $t(\"pdfTools.insertFromAlfresco.searching\") }}</span>\n </div>\n <div\n v-else-if=\"!searchResults.length && searchPerformed\"\n class=\"text-muted\"\n >\n {{ $t(\"pdfTools.insertFromAlfresco.noPdfFound\") }}\n </div>\n <div v-else-if=\"searchResults.length\" class=\"favorites-layout\">\n <div class=\"favorites-list\">\n <div\n v-for=\"item in searchResults\"\n :key=\"item.id\"\n class=\"favorite-item\"\n :class=\"{\n 'favorite-item-selected': selectedPdf?.id === item.id,\n }\"\n @click=\"selectPdf(item)\"\n >\n <div class=\"item-content\">\n <i class=\"ri-file-pdf-line\" aria-hidden=\"true\" />\n <span v-tooltip.top=\"item.name\" class=\"text-ellipsis\">{{\n item.name\n }}</span>\n </div>\n </div>\n </div>\n <div class=\"favorites-preview\">\n <div v-if=\"!selectedPdf\" class=\"preview-placeholder\">\n <i class=\"ri-file-pdf-line preview-icon\" aria-hidden=\"true\" />\n <p class=\"text-muted\">\n {{ $t(\"pdfTools.insertFromAlfresco.selectPdfToPreview\") }}\n </p>\n </div>\n <div v-else-if=\"previewLoading\" class=\"preview-placeholder\">\n <PrimeProgressSpinner class=\"spinner-md\" strokeWidth=\"6\" />\n <p class=\"text-muted\">\n {{ $t(\"pdfTools.insertFromAlfresco.loadingPreview\") }}\n </p>\n </div>\n <div v-else-if=\"previewPdf\" class=\"preview-wrapper\">\n <div v-if=\"previewNumPages > 0\" class=\"preview-controls\">\n <PrimeButton\n icon=\"ri-arrow-left-s-line\"\n :aria-label=\"$t('pdf.previousPage')\"\n text\n size=\"small\"\n :disabled=\"previewCurrentPage <= 1\"\n @click=\"previewPreviousPage\"\n />\n <span class=\"page-info\">\n {{ previewCurrentPage }} / {{ previewNumPages }}\n </span>\n <PrimeButton\n icon=\"ri-arrow-right-s-line\"\n :aria-label=\"$t('pdf.nextPage')\"\n text\n size=\"small\"\n :disabled=\"previewCurrentPage >= previewNumPages\"\n @click=\"previewNextPage\"\n />\n </div>\n <div class=\"preview-content\">\n <VuePDF\n :pdf=\"previewPdf\"\n :page=\"previewCurrentPage\"\n :scale=\"0.6\"\n :annotations=\"false\"\n :text=\"false\"\n />\n </div>\n </div>\n </div>\n </div>\n </PrimeTabPanel>\n <PrimeTabPanel :value=\"2\">\n <div v-if=\"favoritesLoading\" class=\"inline-status\">\n <PrimeProgressSpinner class=\"spinner-sm\" strokeWidth=\"8\" />\n <span>{{ $t(\"pdfTools.insertFromAlfresco.loading\") }}</span>\n </div>\n <div v-else-if=\"!favoritePdfs.length\" class=\"text-muted\">\n {{ $t(\"pdfTools.insertFromAlfresco.noPdfFavorite\") }}\n </div>\n <div v-else class=\"favorites-layout\">\n <div class=\"favorites-list\">\n <div\n v-for=\"fav in favoritePdfs\"\n :key=\"fav.id\"\n class=\"favorite-item\"\n :class=\"{\n 'favorite-item-selected': selectedPdf?.id === fav.id,\n }\"\n @click=\"selectPdf(fav)\"\n >\n <div class=\"item-content\">\n <i class=\"ri-file-pdf-line\" aria-hidden=\"true\" />\n <span v-tooltip.top=\"fav.name\" class=\"text-ellipsis\">{{\n fav.name\n }}</span>\n </div>\n </div>\n </div>\n <div class=\"favorites-preview\">\n <div v-if=\"!selectedPdf\" class=\"preview-placeholder\">\n <i class=\"ri-file-pdf-line preview-icon\" aria-hidden=\"true\" />\n <p class=\"text-muted\">\n {{ $t(\"pdfTools.insertFromAlfresco.selectPdfToPreview\") }}\n </p>\n </div>\n <div v-else-if=\"previewLoading\" class=\"preview-placeholder\">\n <PrimeProgressSpinner class=\"spinner-md\" strokeWidth=\"6\" />\n <p class=\"text-muted\">\n {{ $t(\"pdfTools.insertFromAlfresco.loadingPreview\") }}\n </p>\n </div>\n <div v-else-if=\"previewPdf\" class=\"preview-wrapper\">\n <div v-if=\"previewNumPages > 0\" class=\"preview-controls\">\n <PrimeButton\n icon=\"ri-arrow-left-s-line\"\n :aria-label=\"$t('pdf.previousPage')\"\n text\n size=\"small\"\n :disabled=\"previewCurrentPage <= 1\"\n @click=\"previewPreviousPage\"\n />\n <span class=\"page-info\">\n {{ previewCurrentPage }} / {{ previewNumPages }}\n </span>\n <PrimeButton\n icon=\"ri-arrow-right-s-line\"\n :aria-label=\"$t('pdf.nextPage')\"\n text\n size=\"small\"\n :disabled=\"previewCurrentPage >= previewNumPages\"\n @click=\"previewNextPage\"\n />\n </div>\n <div class=\"preview-content\">\n <VuePDF\n :pdf=\"previewPdf\"\n :page=\"previewCurrentPage\"\n :scale=\"0.6\"\n :annotations=\"false\"\n :text=\"false\"\n />\n </div>\n </div>\n </div>\n </div>\n </PrimeTabPanel>\n <PrimeTabPanel :value=\"3\">\n <div class=\"sidebar-form\">\n <div class=\"form-field\">\n <label for=\"alfrescoNodeId\">{{\n $t(\"pdfTools.insertFromAlfresco.alfrescoIdUrl\")\n }}</label>\n <PrimeInputText\n id=\"alfrescoNodeId\"\n v-model=\"insertAlfrescoInput\"\n :placeholder=\"\n $t('pdfTools.insertFromAlfresco.alfrescoIdUrlHint')\n \"\n />\n <small class=\"form-hint\">\n {{ $t(\"pdfTools.insertFromAlfresco.alfrescoIdUrlHint\") }}\n </small>\n </div>\n </div>\n </PrimeTabPanel>\n </PrimeTabPanels>\n </PrimeTabs>\n <template #footer>\n <div class=\"insert-footer\">\n <div class=\"insert-footer-info\">\n <div v-if=\"selectedPdf\" class=\"selected-info\">\n <span class=\"selected-label\">{{\n $t(\"pdfTools.insertFromAlfresco.selected\")\n }}</span>\n <span v-tooltip.top=\"selectedPdf?.name\" class=\"selected-name\">\n {{ selectedPdf?.name }}\n </span>\n </div>\n <div class=\"error-msg\" v-if=\"selectionErrorMsg\">\n {{ selectionErrorMsg }}\n </div>\n </div>\n <div class=\"insert-footer-actions\">\n <PrimeButton\n :label=\"$t('pdfTools.insertFromAlfresco.cancel')\"\n text\n @click=\"isInsertFromAlfrescoVisible = false\"\n />\n <PrimeButton\n :disabled=\"!canConfirmInsert\"\n :label=\"$t('pdfTools.insertFromAlfresco.insert')\"\n icon=\"ri-add-line\"\n @click=\"confirmInsertFromAlfresco\"\n />\n </div>\n </div>\n </template>\n </PrimeDialog>\n </div>\n</template>\n\n<script setup>\nimport { computed, nextTick, onMounted, onUnmounted, ref, watch } from \"vue\";\nimport {\n degrees,\n PDFDocument,\n rgb,\n RotationTypes,\n StandardFonts,\n} from \"pdf-lib\";\nimport { usePDF, VuePDF } from \"@tato30/vue-pdf\";\nimport { buildPdfSourceRef } from \"@/services/PdfConfigService.js\";\nimport \"@tato30/vue-pdf/style.css\";\nimport { VueDraggableNext } from \"vue-draggable-next\";\nimport { useI18n } from \"vue-i18n\";\nimport PrimeProgressSpinner from \"primevue/progressspinner\";\nimport PrimeMessage from \"primevue/message\";\nimport PrimeButton from \"primevue/button\";\nimport PrimeCheckbox from \"primevue/checkbox\";\nimport PrimeInputText from \"primevue/inputtext\";\nimport PrimeInputNumber from \"primevue/inputnumber\";\nimport PrimeSlider from \"primevue/slider\";\nimport PrimeFileUpload from \"primevue/fileupload\";\nimport PrimeDivider from \"primevue/divider\";\nimport PrimeSelect from \"primevue/select\";\nimport PrimeDialog from \"primevue/dialog\";\nimport PrimeTabs from \"primevue/tabs\";\nimport PrimeTabList from \"primevue/tablist\";\nimport PrimeTab from \"primevue/tab\";\nimport PrimeTabPanels from \"primevue/tabpanels\";\nimport PrimeTabPanel from \"primevue/tabpanel\";\nimport SaveAsPopup from \"@/components/pdfTools/SaveAsPopup.vue\";\nimport alfrescoFileService from \"@/services/AlfrescoFileService.js\";\nimport alfrescoNodeService from \"@/services/AlfrescoNodeService.js\";\nimport {\n addCommentAnnotation,\n readCommentAnnotations,\n removeCommentAnnotations,\n} from \"@/services/PdfCommentService.js\";\nimport { rasterizeRedactedPage } from \"@/services/PdfRedactionService.js\";\nimport {\n LINE_HEIGHT_RATIO,\n measureTextBlock,\n overlayPixelsPerPoint,\n pdfBaselineY,\n splitTextLines,\n} from \"@/services/PdfTextService.js\";\nimport { useFavoritesStore } from \"@/stores/favorites.js\";\nimport { useSearchStore } from \"@/stores/search\";\nimport TreeExplorer from \"@/components/TreeExplorer.vue\";\n\nconst { t } = useI18n();\n\nconst props = defineProps({\n toast: { type: Object, required: true },\n id: { type: String, required: true },\n // The host application decides where closing leads, so the button is only\n // offered when it opts in and handles the event\n closable: { type: Boolean, default: false },\n});\n\nconst emit = defineEmits([\"close\"]);\n\n// Raised by every document change, cleared once the document is saved\nconst hasUnsavedChanges = ref(false);\n\n/** Leave the editor, warning first when changes were never saved. */\nconst closeEditor = () => {\n if (hasUnsavedChanges.value && !window.confirm(t(\"pdfTools.closeUnsaved\"))) {\n return;\n }\n emit(\"close\");\n};\n\nconst pdfDoc = ref(null);\nconst originalPdfBytes = ref(null);\nconst pages = ref([]);\nconst isLoading = ref(true);\nconst error = ref(null);\nconst selectedPage = ref(null);\nconst selectedPages = ref([]);\n// Page editor modal state\nconst isPageEditorVisible = ref(false);\nconst selectedPageForEdit = ref(null);\nconst pageZoom = ref(1);\n// Overlay editing state for page editor\nconst EDITOR_TOOLS = {\n SELECT: \"select\",\n REDACT: \"redact\",\n HIGHLIGHT: \"highlight\",\n COMMENT: \"comment\",\n IMAGE: \"image\",\n SIGNATURE: \"signature\",\n TEXT: \"text\",\n};\n/** Size of a comment anchor, in overlay pixels. */\nconst COMMENT_ANCHOR_SIZE = 24;\nconst currentTool = ref(EDITOR_TOOLS.SELECT); // select | redact | highlight | comment | image | signature | text\nconst overlayItems = ref([]); // {type, rect: {x,y,w,h} in PDF px at current render size, payload?}\nconst overlayImageFile = ref(null);\nconst signatureImageBytes = ref(null);\nconst pdfCanvasWrapper = ref(null);\nconst overlayCanvas = ref(null);\nconst textEditorInput = ref(null);\n// Inline input, anchored on the point the user clicked, shared by the text\n// and comment tools\nconst textEditor = ref({\n visible: false,\n tool: null,\n x: 0,\n y: 0,\n value: \"\",\n index: -1,\n});\nconst isSignaturePadVisible = ref(false);\nconst signaturePadCanvas = ref(null);\nlet sigDrawing = false;\nlet sigLast = null;\nlet isDrawing = false;\nlet startPoint = null;\nconst watermarkText = ref(\"\");\nconst watermarkAngle = ref(-45);\nconst watermarkRepetitions = ref(5);\n// Text tool settings\nconst textFontOptions = [\n { label: \"Helvetica\", value: \"Helvetica\" },\n { label: \"Times New Roman\", value: \"TimesRoman\" },\n { label: \"Courier\", value: \"Courier\" },\n];\n/** Common colours offered before falling back to a free colour choice. */\nconst TEXT_COLOR_SWATCHES = [\n { name: \"black\", value: \"#000000\" },\n { name: \"white\", value: \"#ffffff\" },\n { name: \"red\", value: \"#e53935\" },\n { name: \"orange\", value: \"#fb8c00\" },\n { name: \"yellow\", value: \"#fdd835\" },\n { name: \"green\", value: \"#43a047\" },\n { name: \"blue\", value: \"#1e88e5\" },\n { name: \"purple\", value: \"#8e24aa\" },\n];\n\nconst textFont = ref(\"Helvetica\");\nconst textSize = ref(18);\nconst textColor = ref(\"#000000\");\nconst parentId = ref(null);\nconst isSaveAsPopupVisible = ref(false);\nconst saveAsAction = ref(null); // 'saveAs' or 'extract'\nconst defaultFilename = ref(\"\");\nconst currentFilename = ref(\"\");\nconst currentNode = ref(null);\nconst parentFolderNode = ref(null);\n\n// Insert from Alfresco dialog state\nconst isInsertFromAlfrescoVisible = ref(false);\nconst insertAlfrescoInput = ref(\"\");\nconst selectionErrorMsg = ref(\"\");\n\n// Insert dialog enhanced state\nconst selectedPdf = ref(null); // stores selected node entry {id, name, content?.mimeType}\nconst canConfirmInsert = computed(() => {\n if (insertAlfrescoInput.value && parseNodeId(insertAlfrescoInput.value)) {\n return true;\n }\n return !!(selectedPdf.value && selectedPdf.value.id);\n});\n\n// Search state\nconst searchQuery = ref(\"\");\nconst searchResults = ref([]);\nconst searchLoading = ref(false);\nconst searchPerformed = ref(false);\n\n// Favorites state\nconst favoritePdfs = ref([]);\nconst favoritesLoading = ref(false);\nconst previewLoading = ref(false);\nconst previewPdfUrl = ref(null);\nconst { pdf: previewPdf } = usePDF(buildPdfSourceRef(previewPdfUrl));\nconst previewCurrentPage = ref(1);\nconst previewNumPages = ref(0);\n\nconst pdfUrl = ref(null);\nconst { pdf } = usePDF(buildPdfSourceRef(pdfUrl));\n\nonMounted(() => {\n const nodeId = props.id;\n if (nodeId) {\n loadPdfFromAlfresco(nodeId);\n } else {\n error.value = t(\"pdfTools.loadError\");\n isLoading.value = false;\n }\n});\n\nconst isPageSelected = (page) => {\n return selectedPages.value.some((p) => p.pageIndex === page.pageIndex);\n};\n\nconst togglePageSelection = (page) => {\n selectedPage.value = page;\n const index = selectedPages.value.findIndex(\n (p) => p.pageIndex === page.pageIndex,\n );\n if (index > -1) {\n selectedPages.value.splice(index, 1);\n } else {\n selectedPages.value.push(page);\n }\n};\n\nconst loadPdfFromAlfresco = async (nodeId) => {\n isLoading.value = true;\n error.value = null;\n try {\n const node = await alfrescoNodeService.getNode(nodeId);\n currentNode.value = node;\n parentId.value = node.parentId;\n currentFilename.value =\n (node &&\n (node.name || (node.properties && node.properties[\"cm:name\"]))) ||\n \"\";\n\n const contentUrl = alfrescoFileService.getContentUrl(nodeId);\n pdfUrl.value = contentUrl;\n\n const response = await fetch(contentUrl);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const arrayBuffer = await response.arrayBuffer();\n originalPdfBytes.value = new Uint8Array(arrayBuffer);\n\n await updatePageList(originalPdfBytes.value);\n if (pages.value.length > 0) {\n selectedPage.value = pages.value[0];\n }\n } catch (err) {\n console.error(\"Error loading PDF from Alfresco:\", err);\n error.value = t(\"pdfTools.loadError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst updatePageList = async (pdfBytes) => {\n pdfDoc.value = await PDFDocument.load(pdfBytes);\n const pageCount = pdfDoc.value.getPageCount();\n pages.value = Array.from({ length: pageCount }, (_, i) => ({\n pageIndex: i,\n pageNumber: i + 1,\n }));\n};\n\n/**\n * Saves the modified PDF document, updates the component's state, and refreshes the PDF preview.\n * This avoids code duplication across multiple modification functions.\n * @param {PDFDocument} doc The modified pdf-lib document object.\n * @param {object} [options]\n * @param {boolean} [options.updatePages=true] Whether to regenerate the page list (e.g., after add/remove/reorder).\n */\nconst _updatePdfAndRefreshState = async (doc, { updatePages = true } = {}) => {\n const newPdfBytes = await doc.save();\n originalPdfBytes.value = newPdfBytes;\n hasUnsavedChanges.value = true;\n\n const blob = new Blob([newPdfBytes], { type: \"application/pdf\" });\n if (pdfUrl.value && pdfUrl.value.startsWith(\"blob:\")) {\n URL.revokeObjectURL(pdfUrl.value);\n }\n pdfUrl.value = URL.createObjectURL(blob);\n\n if (updatePages) {\n await updatePageList(newPdfBytes);\n }\n};\n\nconst onDragEnd = async () => {\n if (!originalPdfBytes.value) {\n return;\n }\n isLoading.value = true;\n try {\n const newPdfDoc = await PDFDocument.create();\n const pageIndices = pages.value.map((p) => p.pageIndex);\n\n const sourcePdf = await PDFDocument.load(originalPdfBytes.value);\n const copiedPages = await newPdfDoc.copyPages(sourcePdf, pageIndices);\n copiedPages.forEach((page) => newPdfDoc.addPage(page));\n\n await _updatePdfAndRefreshState(newPdfDoc);\n } catch (err) {\n console.error(\"Error reordering pages:\", err);\n error.value = t(\"pdfTools.reorderError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst rotatePage = async (pageElement) => {\n if (!originalPdfBytes.value) {\n return;\n }\n\n isLoading.value = true;\n try {\n const doc = await PDFDocument.load(originalPdfBytes.value);\n const page = doc.getPage(pageElement.pageIndex);\n const currentRotation = page.getRotation().angle;\n page.setRotation({\n type: RotationTypes.Degrees,\n angle: (currentRotation + 90) % 360,\n });\n\n // Page list does not need to be updated as the number of pages is unchanged\n await _updatePdfAndRefreshState(doc, { updatePages: false });\n } catch (err) {\n console.error(\"Error rotating page:\", err);\n error.value = t(\"pdfTools.rotateError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst extractPages = async () => {\n if (selectedPages.value.length === 0 || !originalPdfBytes.value) {\n return null;\n }\n const newPdfDoc = await PDFDocument.create();\n const sourcePdf = await PDFDocument.load(originalPdfBytes.value);\n const pageIndices = selectedPages.value\n .map((p) => p.pageIndex)\n .sort((a, b) => a - b);\n const copiedPages = await newPdfDoc.copyPages(sourcePdf, pageIndices);\n copiedPages.forEach((page) => newPdfDoc.addPage(page));\n return await newPdfDoc.save();\n};\n\nconst deleteSelectedPages = async () => {\n if (!originalPdfBytes.value || selectedPages.value.length === 0) {\n return;\n }\n if (selectedPages.value.length === pages.value.length) {\n props.toast.add({\n severity: \"warn\",\n summary: t(\"pdfTools.common.warning\"),\n detail: t(\"pdfTools.deleteAllPagesWarning\"),\n life: 3000,\n });\n return;\n }\n isLoading.value = true;\n try {\n const src = await PDFDocument.load(originalPdfBytes.value);\n const total = src.getPageCount();\n const toDelete = new Set(selectedPages.value.map((p) => p.pageIndex));\n const keepIndices = [];\n for (let i = 0; i < total; i++) {\n if (!toDelete.has(i)) {\n keepIndices.push(i);\n }\n }\n const newDoc = await PDFDocument.create();\n const copied = await newDoc.copyPages(src, keepIndices);\n copied.forEach((p) => newDoc.addPage(p));\n\n await _updatePdfAndRefreshState(newDoc);\n selectedPages.value = [];\n\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.deleted\"),\n detail: t(\"pdfTools.pagesDeletedSuccess\"),\n life: 3000,\n });\n } catch (err) {\n console.error(\"Error deleting pages:\", err);\n error.value = t(\"pdfTools.deletePagesError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst openInsertFromAlfrescoDialog = async () => {\n insertAlfrescoInput.value = \"\";\n selectedPdf.value = null;\n selectionErrorMsg.value = \"\";\n isInsertFromAlfrescoVisible.value = true;\n};\n\nconst onTabChange = (tabValue) => {\n // Load favorites when switching to favorites tab (value 2: Browse=0, Search=1, Favorites=2)\n if (\n tabValue === 2 &&\n favoritePdfs.value.length === 0 &&\n !favoritesLoading.value\n ) {\n loadFavorites();\n }\n};\n\nconst confirmInsertFromAlfresco = async () => {\n let nodeId = null;\n if (selectedPdf.value?.id) {\n nodeId = selectedPdf.value.id;\n } else if (insertAlfrescoInput.value) {\n nodeId = parseNodeId(insertAlfrescoInput.value);\n }\n if (!nodeId) {\n props.toast.add({\n severity: \"warn\",\n summary: t(\"pdfTools.common.warning\"),\n detail: t(\"pdfTools.insertFromAlfresco.invalidInput\"),\n life: 3000,\n });\n return;\n }\n await insertPdfFromAlfresco(nodeId);\n isInsertFromAlfrescoVisible.value = false;\n};\n\nconst parseNodeId = (text) => {\n if (!text) {\n return null;\n }\n const trimmed = text.trim();\n // Direct ID (UUID-like)\n if (/^[0-9a-fA-F-]{20,}$/.test(trimmed)) {\n return trimmed;\n }\n // workspace://SpacesStore/<id>\n const ws = trimmed.match(/workspace:\\/\\/SpacesStore\\/([0-9a-fA-F-]{20,})/);\n if (ws && ws[1]) {\n return ws[1];\n }\n // URLs like .../nodes/<id> or routes containing the id in path\n const inNodes = trimmed.match(\n /\\b(nodes|preview|renditions|content)\\/?([0-9a-fA-F-]{20,})\\b/,\n );\n if (inNodes && inNodes[2]) {\n return inNodes[2];\n }\n // Hash routes e.g. .../#/pdf-tools/<id> or .../#/consultation-pdf/<id>\n const hash = trimmed.match(\n /#\\/(?:pdf-tools|consultation-pdf|edit-collabora)\\/([0-9a-fA-F-]{20,})/,\n );\n if (hash && hash[1]) {\n return hash[1];\n }\n // Fallback: try to find a 32+ hex segment\n const generic = trimmed.match(/([0-9a-fA-F]{20,})/);\n if (generic && generic[1]) {\n return generic[1];\n }\n return null;\n};\n\nconst selectPdf = async (node) => {\n if (node?.content?.mimeType !== \"application/pdf\") {\n return;\n }\n selectedPdf.value = node;\n selectionErrorMsg.value = \"\"; // Clear any previous error message\n\n // Load preview and reset to first page\n if (node?.id) {\n previewLoading.value = true;\n previewCurrentPage.value = 1;\n previewNumPages.value = 0; // Reset while loading\n try {\n const contentUrl = alfrescoFileService.getContentUrl(node.id);\n // Revoke old preview URL if exists\n if (previewPdfUrl.value && previewPdfUrl.value.startsWith(\"blob:\")) {\n URL.revokeObjectURL(previewPdfUrl.value);\n }\n previewPdfUrl.value = contentUrl;\n } catch (err) {\n console.error(\"Error loading PDF preview:\", err);\n previewPdfUrl.value = null;\n } finally {\n previewLoading.value = false;\n }\n }\n};\n\nconst previewNextPage = () => {\n if (previewCurrentPage.value < previewNumPages.value) {\n previewCurrentPage.value++;\n }\n};\n\nconst previewPreviousPage = () => {\n if (previewCurrentPage.value > 1) {\n previewCurrentPage.value--;\n }\n};\n\nconst onNodeSelectedFromTree = (nodeData) => {\n selectionErrorMsg.value = \"\";\n if (nodeData.isFolder) {\n selectedPdf.value = null;\n selectionErrorMsg.value = t(\n \"pdfTools.insertFromAlfresco.folderSelectError\",\n );\n } else if (nodeData.content?.mimeType !== \"application/pdf\") {\n selectedPdf.value = null;\n selectionErrorMsg.value = t(\n \"pdfTools.insertFromAlfresco.fileTypeNotAllowedError\",\n );\n } else {\n selectPdf(nodeData);\n }\n};\n\nconst performSearch = async () => {\n searchPerformed.value = true;\n if (!searchQuery.value || searchQuery.value.trim().length < 2) {\n searchResults.value = [];\n return;\n }\n searchLoading.value = true;\n try {\n // Use search store for a simple query, then filter to PDFs\n const store = useSearchStore();\n await store.queryStore(searchQuery.value);\n const entries = store.entries.map((e) => e.entry || e); // store shape\n searchResults.value = entries.filter(\n (e) => e.isFile && e.content?.mimeType === \"application/pdf\",\n );\n } catch (e) {\n console.error(\"performSearch\", e);\n searchResults.value = [];\n } finally {\n searchLoading.value = false;\n }\n};\n\nconst loadFavorites = async () => {\n favoritesLoading.value = true;\n try {\n const favoritesStore = useFavoritesStore();\n await favoritesStore.loadFavorites();\n\n // Filter to keep only PDFs and extract the file object\n favoritePdfs.value = favoritesStore.fileFavorites\n .filter(\n (fav) => fav?.target?.file?.content?.mimeType === \"application/pdf\",\n )\n .map((fav) => fav.target.file);\n } catch (e) {\n console.error(\"loadFavorites error:\", e);\n favoritePdfs.value = [];\n } finally {\n favoritesLoading.value = false;\n }\n};\n\nconst insertPdfFromAlfresco = async (nodeId) => {\n if (!originalPdfBytes.value) {\n return;\n }\n isLoading.value = true;\n try {\n // Optionally verify node and ensure mimeType is PDF\n const node = await alfrescoNodeService.getNode(nodeId);\n if (node.content?.mimeType !== \"application/pdf\") {\n throw new Error(t(\"pdfTools.invalidNodeForInsert\"));\n }\n const contentBlob = await alfrescoNodeService.getNodeContent(nodeId);\n const arrayBuffer = await contentBlob.arrayBuffer();\n const otherBytes = new Uint8Array(arrayBuffer);\n\n const current = await PDFDocument.load(originalPdfBytes.value);\n const other = await PDFDocument.load(otherBytes);\n const count = other.getPageCount();\n const importIndices = Array.from({ length: count }, (_, i) => i);\n const copied = await current.copyPages(other, importIndices);\n copied.forEach((p) => current.addPage(p));\n\n await _updatePdfAndRefreshState(current);\n selectedPages.value = [];\n\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.success\"),\n detail: t(\"pdfTools.insertFromPristySuccess\", { count }),\n life: 3000,\n });\n } catch (err) {\n console.error(\"Error inserting from Alfresco:\", err);\n error.value = err?.message || t(\"pdfTools.insertFromPristyError\");\n props.toast.add({\n severity: \"error\",\n summary: t(\"pdfTools.common.error\"),\n detail: error.value,\n life: 4000,\n });\n } finally {\n isLoading.value = false;\n }\n};\n\nconst onInsertPdfSelect = async (e) => {\n const file = e.files?.[0];\n if (!file) {\n return;\n }\n await insertPdfFile(file);\n};\n\nconst insertPdfFile = async (file) => {\n if (!originalPdfBytes.value) {\n return;\n }\n isLoading.value = true;\n try {\n const current = await PDFDocument.load(originalPdfBytes.value);\n const otherBytes = new Uint8Array(await file.arrayBuffer());\n const other = await PDFDocument.load(otherBytes);\n const count = other.getPageCount();\n const importIndices = Array.from({ length: count }, (_, i) => i);\n const copied = await current.copyPages(other, importIndices);\n copied.forEach((p) => current.addPage(p));\n\n await _updatePdfAndRefreshState(current);\n selectedPages.value = [];\n\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.success\"),\n detail: t(\"pdfTools.insertFromFileSuccess\", { count }),\n life: 3000,\n });\n } catch (err) {\n console.error(\"Error inserting PDF:\", err);\n error.value = t(\"pdfTools.insertError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst addWatermark = async () => {\n if (\n !watermarkText.value ||\n selectedPages.value.length === 0 ||\n !originalPdfBytes.value\n ) {\n return;\n }\n\n isLoading.value = true;\n try {\n const doc = await PDFDocument.load(originalPdfBytes.value);\n const pageIndices = selectedPages.value.map((p) => p.pageIndex);\n\n for (const pageIndex of pageIndices) {\n const page = doc.getPage(pageIndex);\n const { width, height } = page.getSize();\n\n for (let i = 0; i < watermarkRepetitions.value; i++) {\n page.drawText(watermarkText.value, {\n x: (width / (watermarkRepetitions.value + 1)) * (i + 1) - 150,\n y: (height / (watermarkRepetitions.value + 1)) * (i + 1),\n size: 50,\n color: rgb(0.95, 0.1, 0.1),\n opacity: 0.5,\n rotate: degrees(watermarkAngle.value),\n });\n }\n }\n\n await _updatePdfAndRefreshState(doc, { updatePages: false });\n } catch (err) {\n console.error(\"Error adding watermark:\", err);\n error.value = t(\"pdfTools.watermarkError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst saveChanges = async () => {\n if (!originalPdfBytes.value) {\n return;\n }\n isLoading.value = true;\n try {\n const blob = new Blob([originalPdfBytes.value], {\n type: \"application/pdf\",\n });\n const file = new File([blob], \"modified.pdf\", { type: \"application/pdf\" });\n const opts = {\n majorVersion: true,\n comment: \"File modified via Pristy Espaces PDF tools\",\n };\n await alfrescoNodeService.updateContentNode(props.id, file, opts);\n hasUnsavedChanges.value = false;\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.success\"),\n detail: t(\"pdfTools.saveSuccess\"),\n life: 3000,\n });\n } catch (err) {\n console.error(\"Error saving changes:\", err);\n props.toast.add({\n severity: \"error\",\n summary: t(\"pdfTools.common.error\"),\n detail: t(\"pdfTools.saveError\"),\n life: 3000,\n });\n } finally {\n isLoading.value = false;\n }\n};\n\nconst openSaveAsPopup = async (action) => {\n saveAsAction.value = action;\n defaultFilename.value = t(\"pdfTools.saveAs.defaultFilename\");\n if (currentNode.value && currentNode.value.parentId) {\n try {\n parentFolderNode.value = await alfrescoNodeService.getNode(\n currentNode.value.parentId,\n );\n } catch (e) {\n console.error(\"Could not fetch parent node for Save As dialog\", e);\n parentFolderNode.value = null;\n }\n } else {\n parentFolderNode.value = null;\n }\n\n isSaveAsPopupVisible.value = true;\n};\n\nconst handleSaveAs = async ({ filename, folderId }) => {\n isSaveAsPopupVisible.value = false;\n isLoading.value = true;\n try {\n let pdfBytesToSave;\n if (saveAsAction.value === \"extract\") {\n pdfBytesToSave = await extractPages();\n } else {\n pdfBytesToSave = originalPdfBytes.value;\n }\n\n if (!pdfBytesToSave) {\n throw new Error(t(\"pdfTools.noContentToSave\"));\n }\n\n const blob = new Blob([pdfBytesToSave], { type: \"application/pdf\" });\n const file = new File([blob], filename, { type: \"application/pdf\" });\n\n if (!folderId) {\n throw new Error(\"No destination folder selected.\");\n }\n\n await alfrescoFileService.uploadFile(folderId, {}, file);\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.success\"),\n detail: t(\"pdfTools.fileCreatedSuccess\", { filename }),\n life: 3000,\n });\n } catch (err) {\n console.error(`Error during \"Save As\":`, err);\n const detail =\n err.status === 409\n ? t(\"pdfTools.saveAs.conflictError\")\n : t(\"pdfTools.saveAsError\");\n\n props.toast.add({\n severity: \"error\",\n summary: t(\"pdfTools.common.error\"),\n detail,\n life: 4000,\n });\n } finally {\n isLoading.value = false;\n }\n};\n/**\n * Load the comments the document already carries as regular overlay items, so\n * they can be selected, moved, edited and deleted like the ones just placed.\n * They are rewritten from the overlay on every apply.\n */\nconst loadExistingComments = async () => {\n const page = selectedPageForEdit.value;\n overlayItems.value = overlayItems.value.filter(\n (item) => item.type !== EDITOR_TOOLS.COMMENT,\n );\n if (!originalPdfBytes.value || !page) {\n drawOverlay();\n return;\n }\n try {\n // Read from the current bytes rather than pdfDoc, which is only refreshed\n // when the page list changes\n const doc = await PDFDocument.load(originalPdfBytes.value);\n const pxPerPoint = overlayScale();\n const pageHeightPt = currentPageHeightPt.value;\n for (const comment of readCommentAnnotations(doc.getPage(page.pageIndex))) {\n overlayItems.value.push({\n type: EDITOR_TOOLS.COMMENT,\n rect: {\n x: comment.x * pxPerPoint,\n // PDF coordinates start from the bottom, the overlay from the top\n y: (pageHeightPt - (comment.y + comment.size)) * pxPerPoint,\n w: comment.size * pxPerPoint,\n h: comment.size * pxPerPoint,\n },\n payload: { text: comment.text },\n });\n }\n } catch (err) {\n console.error(\"Error reading existing comments:\", err);\n }\n drawOverlay();\n};\n\nconst openPageEditor = (page) => {\n selectedPageForEdit.value = page || selectedPage.value;\n isPageEditorVisible.value = true;\n pageZoom.value = 1;\n overlayItems.value = [];\n selectedItemIndex.value = -1;\n // Comments are positioned in overlay pixels, so the canvas must be sized first\n setTimeout(() => {\n syncOverlaySize();\n loadExistingComments();\n }, 200);\n};\n\nconst closePageEditor = () => {\n isPageEditorVisible.value = false;\n selectedPageForEdit.value = null;\n};\n\nconst zoomIn = () => {\n pageZoom.value = Math.min(4, pageZoom.value + 0.1);\n};\n\nconst zoomOut = () => {\n pageZoom.value = Math.max(0.2, pageZoom.value - 0.1);\n};\n\n// Overlay helpers and tools\nconst setTool = (tool) => {\n if (tool === EDITOR_TOOLS.REDACT) {\n const ok = window.confirm(t(\"pdfTools.redactWarning\"));\n if (ok) {\n currentTool.value = tool;\n }\n } else {\n currentTool.value = tool;\n }\n};\n\nconst onOverlayImageSelect = (e) => {\n overlayImageFile.value = e.files?.[0] || null;\n if (overlayImageFile.value) {\n // Clear previous signature bytes so real image takes precedence\n signatureImageBytes.value = null;\n currentTool.value = EDITOR_TOOLS.IMAGE;\n }\n};\n\nconst openSignaturePad = () => {\n isSignaturePadVisible.value = true;\n};\n\nconst undoOverlay = () => {\n overlayItems.value.pop();\n selectedItemIndex.value = -1;\n drawOverlay();\n};\n\n// Ensure an image/signature overlay has a preview bitmap to draw on the overlay canvas\nconst ensureItemPreview = async (item) => {\n if (\n !item ||\n item.type !== EDITOR_TOOLS.IMAGE ||\n item._loading ||\n item._bitmap\n ) {\n return;\n }\n item._loading = true;\n try {\n let sourceBlob = null;\n if (item.payload?.file) {\n // File is already a Blob\n sourceBlob = item.payload.file;\n } else if (item.payload?.signature) {\n // Signature bytes are PNG by construction of the signature pad\n sourceBlob = new Blob([new Uint8Array(item.payload.signature)], {\n type: \"image/png\",\n });\n }\n if (sourceBlob) {\n item._bitmap = await createImageBitmap(sourceBlob);\n // Redraw to show the image once loaded\n drawOverlay();\n }\n } catch (e) {\n console.warn(t(\"pdfTools.imagePreviewUnavailable\"), e);\n } finally {\n item._loading = false;\n }\n};\n\nconst getPdfCanvas = () => {\n const wrapper = pdfCanvasWrapper.value;\n if (!wrapper) {\n return null;\n }\n const canvases = Array.from(wrapper.querySelectorAll(\"canvas\"));\n if (canvases.length === 0) {\n return null;\n }\n // Choose the visible canvas with the largest area (VuePDF can create several)\n const visible = canvases.filter(\n (c) => c.offsetParent !== null && c.width > 0 && c.height > 0,\n );\n const list = visible.length ? visible : canvases;\n let best = list[0];\n let bestArea = 0;\n for (const c of list) {\n const r = c.getBoundingClientRect();\n const area = Math.max(0, r.width) * Math.max(0, r.height);\n if (area > bestArea) {\n best = c;\n bestArea = area;\n }\n }\n return best;\n};\n\nconst syncOverlaySize = () => {\n const base = getPdfCanvas();\n if (!base || !overlayCanvas.value) {\n return;\n }\n const rect = base.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n // overlay is absolutely positioned with inset:0 in CSS; avoid manual left/top to prevent offsets\n overlayCanvas.value.style.width = rect.width + \"px\";\n overlayCanvas.value.style.height = rect.height + \"px\";\n // Use DPR to keep overlay crisp\n overlayCanvas.value.width = Math.round(rect.width * dpr);\n overlayCanvas.value.height = Math.round(rect.height * dpr);\n drawOverlay();\n};\n\nconst toCanvasPoint = (evt) => {\n const canvasEl = overlayCanvas.value;\n if (!canvasEl) {\n return { x: 0, y: 0 };\n }\n const rect = canvasEl.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n return {\n x: (evt.clientX - rect.left) * dpr,\n y: (evt.clientY - rect.top) * dpr,\n };\n};\n\nlet draggingIndex = null;\nlet dragStart = null;\nlet resizingIndex = null;\nlet resizeCorner = null;\n\n/** Width of the edited page, in PDF points. */\nconst currentPageWidthPt = computed(() => {\n const page = selectedPageForEdit.value || selectedPage.value;\n if (!pdfDoc.value || !page) {\n return 0;\n }\n try {\n return pdfDoc.value.getPage(page.pageIndex).getSize().width;\n } catch (_) {\n return 0;\n }\n});\n\n/** Height of the edited page, in PDF points. */\nconst currentPageHeightPt = computed(() => {\n const page = selectedPageForEdit.value || selectedPage.value;\n if (!pdfDoc.value || !page) {\n return 0;\n }\n try {\n return pdfDoc.value.getPage(page.pageIndex).getSize().height;\n } catch (_) {\n return 0;\n }\n});\n\n/**\n * Overlay pixels per PDF point. Font sizes are stored in points, so the\n * preview has to convert them for the current zoom and device pixel ratio.\n */\nconst overlayScale = () =>\n overlayPixelsPerPoint({\n overlayWidth: overlayCanvas.value?.width || 0,\n pageWidthPt: currentPageWidthPt.value,\n });\n\nconst textFontPx = (payload) =>\n Math.max(1, (Number(payload?.size) || 18) * overlayScale());\n\n/** Box occupied by a text item, in overlay pixels. */\nconst measureTextItem = (text, payload) => {\n const ctx = overlayCanvas.value.getContext(\"2d\");\n const fontPx = textFontPx(payload);\n ctx.save();\n ctx.font = `${fontPx}px ${payload.font || \"Helvetica\"}`;\n const bounds = measureTextBlock({\n lines: splitTextLines(text),\n fontSize: fontPx,\n measureLine: (line) => ctx.measureText(line).width,\n });\n ctx.restore();\n return bounds;\n};\n\nconst textEditorStyle = computed(() => {\n const dpr = window.devicePixelRatio || 1;\n if (textEditor.value.tool === EDITOR_TOOLS.COMMENT) {\n // A comment carries no font size of its own in the page\n return {\n left: `${textEditor.value.x / dpr}px`,\n top: `${textEditor.value.y / dpr}px`,\n };\n }\n const payload =\n textEditor.value.index >= 0\n ? overlayItems.value[textEditor.value.index]?.payload\n : { size: textSize.value, font: textFont.value, color: textColor.value };\n const fontPx = textFontPx(payload) / dpr;\n return {\n left: `${textEditor.value.x / dpr}px`,\n top: `${textEditor.value.y / dpr}px`,\n font: `${fontPx}px ${payload?.font || \"Helvetica\"}`,\n lineHeight: LINE_HEIGHT_RATIO,\n color: payload?.color || \"#000000\",\n };\n});\n\n/** Index of the overlay item the panel and the selection frame act on. */\nconst selectedItemIndex = ref(-1);\n// Guards the panel -> item watcher while the panel is loaded from an item\nlet isSyncingTextPanel = false;\n\n/** The panel serves both placing a new text and editing the selected one. */\nconst isTextPanelVisible = computed(\n () =>\n currentTool.value === EDITOR_TOOLS.TEXT ||\n overlayItems.value[selectedItemIndex.value]?.type === EDITOR_TOOLS.TEXT,\n);\n\nconst selectItem = (index) => {\n selectedItemIndex.value = index;\n const item = overlayItems.value[index];\n if (item?.type === EDITOR_TOOLS.TEXT) {\n isSyncingTextPanel = true;\n textFont.value = item.payload?.font || \"Helvetica\";\n textSize.value = Number(item.payload?.size) || 18;\n textColor.value = item.payload?.color || \"#000000\";\n nextTick(() => {\n isSyncingTextPanel = false;\n });\n }\n drawOverlay();\n};\n\n// Changing the font, size or colour applies to the selected text right away\nwatch([textFont, textSize, textColor], () => {\n if (isSyncingTextPanel) {\n return;\n }\n const index = selectedItemIndex.value;\n const item = overlayItems.value[index];\n if (!item || item.type !== EDITOR_TOOLS.TEXT) {\n return;\n }\n const payload = {\n ...item.payload,\n font: textFont.value,\n size: textSize.value,\n color: textColor.value,\n };\n overlayItems.value[index] = {\n ...item,\n payload,\n rect: {\n x: item.rect.x,\n y: item.rect.y,\n ...measureTextItem(payload.text, payload),\n },\n };\n drawOverlay();\n});\n\n/** Remove the selected item, whichever tool created it. */\nconst deleteSelectedItem = () => {\n const index = selectedItemIndex.value;\n if (index < 0 || !overlayItems.value[index]) {\n return;\n }\n overlayItems.value.splice(index, 1);\n selectedItemIndex.value = -1;\n drawOverlay();\n};\n\n/**\n * Escape leaves the current tool rather than closing the whole editor: it\n * drops the text being typed, clears the selection and falls back to the\n * default tool.\n */\nconst onEditorKeyDown = (e) => {\n if (e.key === \"Escape\") {\n if (textEditor.value.visible) {\n cancelTextEditor();\n }\n selectedItemIndex.value = -1;\n currentTool.value = EDITOR_TOOLS.SELECT;\n drawOverlay();\n return;\n }\n // Delete must stay a plain keystroke while the user is typing\n const typing =\n textEditor.value.visible ||\n [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(e.target?.tagName);\n if (e.key === \"Delete\" && !typing) {\n deleteSelectedItem();\n }\n};\n\nwatch(isPageEditorVisible, (visible) => {\n if (visible) {\n document.addEventListener(\"keydown\", onEditorKeyDown);\n } else {\n document.removeEventListener(\"keydown\", onEditorKeyDown);\n }\n});\n\nonUnmounted(() => document.removeEventListener(\"keydown\", onEditorKeyDown));\n\n/** Wording of the inline input, which serves two different tools. */\nconst inlineEditorLabels = computed(() =>\n textEditor.value.tool === EDITOR_TOOLS.COMMENT\n ? {\n label: t(\"pdfTools.pageEditor.tools.comment\"),\n placeholder: t(\"pdfTools.pageEditor.commentPlaceholder\"),\n }\n : {\n label: t(\"pdfTools.pageEditor.textInputLabel\"),\n placeholder: t(\"pdfTools.pageEditor.textInputPlaceholder\"),\n },\n);\n\nconst openInlineEditor = (point, tool, index = -1) => {\n const existing = index >= 0 ? overlayItems.value[index] : null;\n textEditor.value = {\n visible: true,\n tool,\n x: existing ? existing.rect.x : point.x,\n y: existing ? existing.rect.y : point.y,\n value: existing ? String(existing.payload?.text || \"\") : \"\",\n index,\n };\n drawOverlay();\n nextTick(() => textEditorInput.value?.focus());\n};\n\nconst cancelTextEditor = () => {\n textEditor.value = { ...textEditor.value, visible: false, index: -1 };\n drawOverlay();\n};\n\n/** Turn the inline input into an overlay item, or drop it when left empty. */\nconst commitTextEditor = () => {\n if (!textEditor.value.visible) {\n return;\n }\n const { value: text, index, x, y, tool } = textEditor.value;\n textEditor.value = { ...textEditor.value, visible: false, index: -1 };\n if (!text.trim()) {\n if (index >= 0) {\n overlayItems.value.splice(index, 1);\n }\n drawOverlay();\n return;\n }\n if (tool === EDITOR_TOOLS.COMMENT) {\n const comment = {\n type: EDITOR_TOOLS.COMMENT,\n rect: { x, y, w: COMMENT_ANCHOR_SIZE, h: COMMENT_ANCHOR_SIZE },\n payload: { text },\n };\n if (index >= 0) {\n overlayItems.value[index] = {\n ...overlayItems.value[index],\n payload: { text },\n };\n } else {\n overlayItems.value.push(comment);\n }\n selectedItemIndex.value =\n index >= 0 ? index : overlayItems.value.length - 1;\n drawOverlay();\n return;\n }\n const payload =\n index >= 0\n ? { ...overlayItems.value[index].payload, text }\n : {\n text,\n font: textFont.value,\n size: textSize.value,\n color: textColor.value,\n };\n const rect = { x, y, ...measureTextItem(text, payload) };\n if (index >= 0) {\n overlayItems.value[index] = {\n ...overlayItems.value[index],\n rect,\n payload,\n };\n } else {\n overlayItems.value.push({ type: EDITOR_TOOLS.TEXT, rect, payload });\n }\n selectedItemIndex.value = index >= 0 ? index : overlayItems.value.length - 1;\n drawOverlay();\n};\n\nconst onOverlayDoubleClick = (e) => {\n const p = toCanvasPoint(e);\n const idx = hitTest(p);\n const type = idx !== -1 ? overlayItems.value[idx].type : null;\n if (type === EDITOR_TOOLS.TEXT || type === EDITOR_TOOLS.COMMENT) {\n openInlineEditor(p, type, idx);\n }\n};\n\nconst hitTest = (p) => {\n // iterate backwards so top-most wins\n for (let i = overlayItems.value.length - 1; i >= 0; i--) {\n const r = overlayItems.value[i].rect;\n if (p.x >= r.x && p.x <= r.x + r.w && p.y >= r.y && p.y <= r.y + r.h) {\n return i;\n }\n }\n return -1;\n};\n\nconst hitTestHandle = (p) => {\n const dpr = window.devicePixelRatio || 1;\n const s = 6 * dpr;\n const half = s / 2;\n for (let i = overlayItems.value.length - 1; i >= 0; i--) {\n const it = overlayItems.value[i];\n // Text is anchored on a point and sized by its content, so it has no\n // resize handles\n if (it.type !== EDITOR_TOOLS.IMAGE) {\n continue;\n }\n const r = it.rect;\n const corners = [\n { key: \"tl\", x: r.x, y: r.y },\n { key: \"tr\", x: r.x + r.w, y: r.y },\n { key: \"bl\", x: r.x, y: r.y + r.h },\n { key: \"br\", x: r.x + r.w, y: r.y + r.h },\n ];\n for (const c of corners) {\n if (\n p.x >= c.x - half &&\n p.x <= c.x + half &&\n p.y >= c.y - half &&\n p.y <= c.y + half\n ) {\n return { idx: i, corner: c.key };\n }\n }\n }\n return null;\n};\n\nconst onOverlayMouseDown = (e) => {\n if (textEditor.value.visible) {\n commitTextEditor();\n }\n if (\n currentTool.value === EDITOR_TOOLS.REDACT ||\n currentTool.value === EDITOR_TOOLS.HIGHLIGHT\n ) {\n isDrawing = true;\n startPoint = toCanvasPoint(e);\n } else if (\n currentTool.value === EDITOR_TOOLS.IMAGE ||\n currentTool.value === EDITOR_TOOLS.SELECT ||\n currentTool.value === EDITOR_TOOLS.TEXT ||\n currentTool.value === EDITOR_TOOLS.COMMENT\n ) {\n // If clicking on an existing image item, start dragging instead of creating a new one\n const p = toCanvasPoint(e);\n // Check resize handles first\n const handleHit = hitTestHandle(p);\n if (handleHit) {\n resizingIndex = handleHit.idx;\n resizeCorner = handleHit.corner;\n dragStart = { p, rect: { ...overlayItems.value[handleHit.idx].rect } };\n if (overlayCanvas.value) {\n overlayCanvas.value.style.cursor = \"nwse-resize\";\n }\n return;\n }\n const idx = hitTest(p);\n if (\n idx !== -1 &&\n (overlayItems.value[idx].type === EDITOR_TOOLS.IMAGE ||\n overlayItems.value[idx].type === EDITOR_TOOLS.TEXT ||\n overlayItems.value[idx].type === EDITOR_TOOLS.COMMENT)\n ) {\n selectItem(idx);\n draggingIndex = idx;\n dragStart = { p, rect: { ...overlayItems.value[idx].rect } };\n if (overlayCanvas.value) {\n overlayCanvas.value.style.cursor = \"move\";\n }\n return;\n }\n selectedItemIndex.value = -1;\n if (\n currentTool.value === EDITOR_TOOLS.TEXT ||\n currentTool.value === EDITOR_TOOLS.COMMENT\n ) {\n // Stop the browser from moving the focus out of the input we are about\n // to open and focus\n e.preventDefault();\n openInlineEditor(p, currentTool.value);\n return;\n }\n if (currentTool.value === EDITOR_TOOLS.IMAGE) {\n // Only create a new image when the image tool is active and a source is provided\n if (!overlayImageFile.value && !signatureImageBytes.value) {\n return;\n }\n // creation of a new image rectangle\n const newItem = {\n type: EDITOR_TOOLS.IMAGE,\n rect: { x: p.x, y: p.y, w: 150, h: 100 },\n payload: {\n file: overlayImageFile.value,\n signature: signatureImageBytes.value,\n },\n };\n overlayItems.value.push(newItem);\n // kick off async preview loading\n ensureItemPreview(newItem);\n drawOverlay();\n // After adding an image, deselect the tool and clear sources to avoid re-adding the same image\n currentTool.value = EDITOR_TOOLS.SELECT;\n overlayImageFile.value = null;\n signatureImageBytes.value = null;\n }\n }\n};\n\nconst onOverlayMouseMove = (e) => {\n // Resizing via handle\n if (resizingIndex !== null && resizeCorner) {\n const p = toCanvasPoint(e);\n const item = overlayItems.value[resizingIndex];\n if (item) {\n const r0 = dragStart.rect;\n let x = r0.x;\n let y = r0.y;\n let w = r0.w;\n let h = r0.h;\n const dx = p.x - dragStart.p.x;\n const dy = p.y - dragStart.p.y;\n if (resizeCorner === \"br\") {\n w = Math.max(10, r0.w + dx);\n h = Math.max(10, r0.h + dy);\n } else if (resizeCorner === \"tr\") {\n w = Math.max(10, r0.w + dx);\n h = Math.max(10, r0.h - dy);\n y = r0.y + dy;\n } else if (resizeCorner === \"bl\") {\n w = Math.max(10, r0.w - dx);\n x = r0.x + dx;\n h = Math.max(10, r0.h + dy);\n } else if (resizeCorner === \"tl\") {\n w = Math.max(10, r0.w - dx);\n x = r0.x + dx;\n h = Math.max(10, r0.h - dy);\n y = r0.y + dy;\n }\n item.rect.x = x;\n item.rect.y = y;\n item.rect.w = w;\n item.rect.h = h;\n drawOverlay();\n }\n return;\n }\n // Dragging existing item\n if (draggingIndex !== null) {\n const p = toCanvasPoint(e);\n const item = overlayItems.value[draggingIndex];\n if (item) {\n const dx = p.x - dragStart.p.x;\n const dy = p.y - dragStart.p.y;\n item.rect.x = dragStart.rect.x + dx;\n item.rect.y = dragStart.rect.y + dy;\n drawOverlay();\n }\n return;\n }\n if (!isDrawing || !startPoint) {\n return;\n }\n const p = toCanvasPoint(e);\n tempRect.value = {\n x: Math.min(startPoint.x, p.x),\n y: Math.min(startPoint.y, p.y),\n w: Math.abs(p.x - startPoint.x),\n h: Math.abs(p.y - startPoint.y),\n };\n drawOverlay();\n};\n\nconst onOverlayMouseUp = () => {\n if (draggingIndex !== null || resizingIndex !== null) {\n draggingIndex = null;\n resizingIndex = null;\n resizeCorner = null;\n dragStart = null;\n if (overlayCanvas.value) {\n overlayCanvas.value.style.cursor = \"crosshair\";\n }\n drawOverlay();\n return;\n }\n if (isDrawing && tempRect.value) {\n overlayItems.value.push({\n type: currentTool.value,\n rect: { ...tempRect.value },\n });\n }\n isDrawing = false;\n startPoint = null;\n tempRect.value = null;\n drawOverlay();\n};\n\nconst onOverlayMouseLeave = () => {\n if (isDrawing) {\n isDrawing = false;\n startPoint = null;\n tempRect.value = null;\n drawOverlay();\n }\n};\n\nconst tempRect = ref(null);\n\nconst drawOverlay = () => {\n const selectedIdx = selectedItemIndex.value;\n const canvasEl = overlayCanvas.value;\n if (!canvasEl) {\n return;\n }\n const ctx = canvasEl.getContext(\"2d\");\n const dpr = window.devicePixelRatio || 1;\n ctx.clearRect(0, 0, canvasEl.width, canvasEl.height);\n\n const drawItem = (item, idx) => {\n // The item being edited is shown by the inline input, not twice\n if (textEditor.value.visible && idx === textEditor.value.index) {\n return;\n }\n if (item.type === EDITOR_TOOLS.REDACT) {\n ctx.fillStyle = \"rgba(0,0,0,1)\";\n ctx.fillRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n ctx.strokeStyle = \"rgba(0,0,0,1)\";\n ctx.strokeRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n } else if (item.type === EDITOR_TOOLS.HIGHLIGHT) {\n ctx.fillStyle = \"rgba(255, 235, 59, 0.4)\";\n ctx.fillRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n ctx.strokeStyle = \"rgba(255, 193, 7, 0.8)\";\n ctx.strokeRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n } else if (item.type === EDITOR_TOOLS.COMMENT) {\n drawCommentIcon(ctx, item.rect.x, item.rect.y, 20 * dpr);\n if (idx === selectedIdx) {\n // A comment has no size of its own, so no resize handles\n ctx.save();\n ctx.strokeStyle = \"#0ea5e9\";\n ctx.lineWidth = 2 * dpr;\n ctx.setLineDash([4 * dpr, 4 * dpr]);\n ctx.strokeRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n ctx.restore();\n }\n } else if (item.type === EDITOR_TOOLS.IMAGE) {\n // Try to ensure preview is available; this is async-safe\n ensureItemPreview(item);\n // Draw bitmap if loaded\n if (item._bitmap) {\n ctx.drawImage(\n item._bitmap,\n item.rect.x,\n item.rect.y,\n item.rect.w,\n item.rect.h,\n );\n }\n // Frame\n ctx.strokeStyle =\n idx === selectedIdx ? \"#0ea5e9\" : \"rgba(33,150,243,0.9)\";\n ctx.lineWidth = idx === selectedIdx ? 2 * dpr : 1 * dpr;\n ctx.strokeRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n if (idx === selectedIdx) {\n // draw simple handles\n ctx.fillStyle = \"#0ea5e9\";\n const s = 6 * dpr;\n const half = s / 2;\n const corners = [\n [item.rect.x, item.rect.y],\n [item.rect.x + item.rect.w, item.rect.y],\n [item.rect.x, item.rect.y + item.rect.h],\n [item.rect.x + item.rect.w, item.rect.y + item.rect.h],\n ];\n corners.forEach(([cx, cy]) => {\n ctx.fillRect(cx - half, cy - half, s, s);\n });\n }\n } else if (item.type === EDITOR_TOOLS.TEXT) {\n const payload = item.payload || {};\n // Size comes from the PDF, converted for the current render, so the\n // preview shows the size the text will actually have\n const fontPx = textFontPx(payload);\n ctx.save();\n ctx.fillStyle = payload.color || \"#000\";\n ctx.font = `${fontPx}px ${payload.font || \"Helvetica\"}`;\n ctx.textBaseline = \"top\";\n let ty = item.rect.y;\n // Lines are only those the user typed: nothing wraps, nothing is cut\n for (const line of splitTextLines(payload.text)) {\n ctx.fillText(line, item.rect.x, ty);\n ty += fontPx * LINE_HEIGHT_RATIO;\n }\n ctx.restore();\n // Discreet frame to show the block can be moved, no resize handles\n ctx.save();\n ctx.strokeStyle =\n idx === selectedIdx ? \"#0ea5e9\" : \"rgba(33,150,243,0.5)\";\n ctx.lineWidth = idx === selectedIdx ? 2 * dpr : 1 * dpr;\n ctx.setLineDash([4 * dpr, 4 * dpr]);\n ctx.strokeRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n ctx.restore();\n }\n };\n\n overlayItems.value.forEach(drawItem);\n if (tempRect.value) {\n const r = tempRect.value;\n ctx.setLineDash([6 * dpr, 4 * dpr]);\n ctx.strokeStyle =\n currentTool.value === EDITOR_TOOLS.REDACT ? \"black\" : \"goldenrod\";\n ctx.strokeRect(r.x, r.y, r.w, r.h);\n ctx.setLineDash([]);\n }\n};\n\nconst hexToRgb01 = (hex) => {\n const { r, g, b } = parseHexColor(hex);\n return { r, g, b };\n};\n\nconst parseHexColor = (hex) => {\n let h = (hex || \"\").toString().trim();\n if (h.startsWith(\"#\")) {\n h = h.slice(1);\n }\n if (h.length === 3) {\n h = h\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n const num = parseInt(h || \"000000\", 16);\n const r = ((num >> 16) & 255) / 255;\n const g = ((num >> 8) & 255) / 255;\n const b = (num & 255) / 255;\n return { r, g, b };\n};\n\nconst drawCommentIcon = (ctx, x, y, size) => {\n ctx.save();\n ctx.translate(x, y);\n ctx.fillStyle = \"#FFEB3B\";\n ctx.strokeStyle = \"#FBC02D\";\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.rect(0, 0, size, size);\n ctx.fill();\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(size * 0.6, 0);\n ctx.lineTo(size, size * 0.4);\n ctx.lineTo(size * 0.6, size * 0.4);\n ctx.closePath();\n ctx.fillStyle = \"#FDD835\";\n ctx.fill();\n ctx.restore();\n};\n\nconst applyOverlayEdits = async () => {\n if (!originalPdfBytes.value || !selectedPageForEdit.value) {\n return;\n }\n isLoading.value = true;\n try {\n const doc = await PDFDocument.load(originalPdfBytes.value);\n const originalIndex = selectedPageForEdit.value.pageIndex;\n let page = doc.getPage(originalIndex);\n const { width: pdfW, height: pdfH } = page.getSize();\n\n const base = getPdfCanvas();\n if (!base) {\n throw new Error(t(\"pdfTools.pdfRenderCanvasNotFound\"));\n }\n\n // If redaction is present, ask for confirmation then flatten the page to an image\n const hasRedact = overlayItems.value.some(\n (it) => it.type === EDITOR_TOOLS.REDACT,\n );\n if (hasRedact) {\n const ok = window.confirm(t(\"pdfTools.redactFlattenConfirm\"));\n if (!ok) {\n isLoading.value = false;\n return;\n }\n // Rasterize the page from the PDF itself, at a fixed resolution rather\n // than from the on-screen canvas, and burn the masks into the pixels:\n // covering the content with a PDF object would leave it readable.\n const renderedDoc = await pdf.value.promise;\n const pdfPage = await renderedDoc.getPage(originalIndex + 1);\n const overlay = overlayCanvas.value;\n const dataUrl = await rasterizeRedactedPage({\n pdfPage,\n // Masks are converted to page fractions so they no longer depend on\n // the screen resolution nor on the current zoom level.\n redactions: overlayItems.value\n .filter((it) => it.type === EDITOR_TOOLS.REDACT)\n .map((it) => ({\n x: it.rect.x / overlay.width,\n y: it.rect.y / overlay.height,\n w: it.rect.w / overlay.width,\n h: it.rect.h / overlay.height,\n })),\n });\n // Fetching from a data URL is a local operation, not a remote API call, so it doesn't violate the API service convention.\n const pngBytes = await (await fetch(dataUrl)).arrayBuffer();\n const bgImg = await doc.embedJpg(pngBytes);\n const newPage = doc.insertPage(originalIndex + 1, [pdfW, pdfH]);\n newPage.drawImage(bgImg, { x: 0, y: 0, width: pdfW, height: pdfH });\n // All overlays will be drawn on this new page\n page = newPage;\n // The old page will be deleted after applying the overlays\n }\n\n // VuePDF canvas measurements\n const baseRect = base.getBoundingClientRect(); // CSS px\n const baseW = base.width; // canvas pixels\n const baseH = base.height;\n\n // DPR used for the overlay\n const dpr = window.devicePixelRatio || 1;\n\n // Convert each item: overlay (px * dpr) -> CSS px -> base canvas px -> PDF coordinates\n const cssToBaseX = baseW / baseRect.width;\n const cssToBaseY = baseH / baseRect.height;\n\n const baseToPdfX = pdfW / baseW;\n const baseToPdfY = pdfH / baseH;\n\n // Comments live beside the content, so they are rewritten from the\n // overlay: moving, editing or deleting one has to reach the document\n removeCommentAnnotations(page);\n\n for (const item of overlayItems.value) {\n // overlay rect is in overlayCanvas px (so already multiplied by dpr)\n const cssX = item.rect.x / dpr;\n const cssY = item.rect.y / dpr;\n const cssW = item.rect.w / dpr;\n const cssH = item.rect.h / dpr;\n\n const baseX = cssX * cssToBaseX;\n const baseY = cssY * cssToBaseY;\n const baseWRect = cssW * cssToBaseX;\n const baseHRect = cssH * cssToBaseY;\n\n const w = baseWRect * baseToPdfX;\n const h = baseHRect * baseToPdfY;\n const x = baseX * baseToPdfX;\n // Y inversion: top origin (canvas) -> bottom (PDF)\n const y = pdfH - (baseY + baseHRect) * baseToPdfY;\n\n if (item.type === EDITOR_TOOLS.REDACT) {\n // Redactions are already burned into the rasterized page. Drawing a\n // black rectangle here would hide a rasterization failure instead of\n // making it visible.\n continue;\n } else if (item.type === EDITOR_TOOLS.HIGHLIGHT) {\n page.drawRectangle({\n x,\n y,\n width: w,\n height: h,\n color: rgb(1, 0.92, 0.23),\n opacity: 0.4,\n });\n } else if (item.type === EDITOR_TOOLS.COMMENT) {\n addCommentAnnotation({\n doc,\n page,\n rect: { x, y, size: Math.max(14, w) },\n text: item.payload?.text,\n title: t(\"pdfTools.pageEditor.tools.comment\"),\n });\n } else if (item.type === EDITOR_TOOLS.IMAGE) {\n let bytes = null;\n if (item.payload?.file) {\n bytes = await item.payload.file.arrayBuffer();\n } else if (item.payload?.signature) {\n bytes = item.payload.signature;\n }\n if (bytes) {\n let img;\n try {\n img = await doc.embedPng(bytes);\n } catch (_) {\n img = await doc.embedJpg(bytes);\n }\n page.drawImage(img, { x, y, width: w, height: h, opacity: 0.98 });\n }\n } else if (item.type === EDITOR_TOOLS.TEXT) {\n const payload = item.payload || {};\n const fontName =\n payload.font === \"TimesRoman\"\n ? StandardFonts.TimesRoman\n : payload.font === \"Courier\"\n ? StandardFonts.Courier\n : StandardFonts.Helvetica;\n const font = await doc.embedFont(fontName);\n const size = Math.max(6, Number(payload.size) || 18);\n const {\n r: rc,\n g: gc,\n b: bc,\n } = parseHexColor(payload.color || \"#000000\");\n // rect.y is the top of the block, so its PDF top edge is y + h\n const topY = y + h;\n const ascentPt = font.heightAtSize(size, { descender: false });\n splitTextLines(payload.text).forEach((line, lineIndex) => {\n if (!line) {\n return;\n }\n page.drawText(line, {\n x,\n y: pdfBaselineY({\n topY,\n lineIndex,\n fontSize: size,\n ascentPt,\n }),\n size,\n font,\n color: rgb(rc, gc, bc),\n });\n });\n }\n }\n\n const needsPageListUpdate = overlayItems.value.some(\n (it) => it.type === EDITOR_TOOLS.REDACT,\n );\n // If a replacement page was inserted for redaction, remove the old page\n if (needsPageListUpdate) {\n doc.removePage(originalIndex);\n }\n\n await _updatePdfAndRefreshState(doc, { updatePages: needsPageListUpdate });\n\n overlayItems.value = [];\n selectedItemIndex.value = -1;\n await loadExistingComments();\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.success\"),\n detail: t(\"pdfTools.pageEditor.applySuccess\"),\n life: 2000,\n });\n } catch (err) {\n console.error(\"Error applying overlay edits:\", err);\n props.toast.add({\n severity: \"error\",\n summary: t(\"pdfTools.common.error\"),\n detail: t(\"pdfTools.pageEditor.applyError\"),\n life: 3000,\n });\n } finally {\n isLoading.value = false;\n }\n};\n\n// Recompute overlay when zoom or page changes\nwatch(pageZoom, () => setTimeout(syncOverlaySize, 0));\nwatch(selectedPageForEdit, () => setTimeout(syncOverlaySize, 0));\n// Recompute on window resize to keep alignment\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", () => setTimeout(syncOverlaySize, 0));\n}\n\nconst fitToWidth = () => {\n // Heuristic: set zoom to fit typical A4 in dialog width (~80vw). Keep simple here.\n pageZoom.value = 1;\n setTimeout(syncOverlaySize, 0);\n};\n\n// Signature pad logic\nconst initSignaturePadSize = () => {\n const canvas = signaturePadCanvas.value;\n if (!canvas) {\n return;\n }\n const dpr = window.devicePixelRatio || 1;\n const width = 440;\n const height = 180;\n canvas.style.width = width + \"px\";\n canvas.style.height = height + \"px\";\n canvas.width = Math.round(width * dpr);\n canvas.height = Math.round(height * dpr);\n const ctx = canvas.getContext(\"2d\");\n ctx.fillStyle = \"#fff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n};\n\nconst onCloseSignaturePad = () => {\n sigClear();\n isSignaturePadVisible.value = false;\n};\n\nconst sigDown = (e) => {\n sigDrawing = true;\n sigLast = getSigPoint(e);\n};\nconst sigMove = (e) => {\n if (!sigDrawing) {\n return;\n }\n const p = getSigPoint(e);\n drawSigLine(sigLast, p);\n sigLast = p;\n};\nconst sigTouchDown = (e) => sigDown(e.touches[0]);\nconst sigTouchMove = (e) => sigMove(e.touches[0]);\nconst sigUp = () => {\n sigDrawing = false;\n sigLast = null;\n};\n\nconst getSigPoint = (evt) => {\n const canvas = signaturePadCanvas.value;\n const rect = canvas.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n const clientX = evt.clientX ?? evt.pageX;\n const clientY = evt.clientY ?? evt.pageY;\n return { x: (clientX - rect.left) * dpr, y: (clientY - rect.top) * dpr };\n};\n\nconst drawSigLine = (a, b) => {\n const canvas = signaturePadCanvas.value;\n const ctx = canvas.getContext(\"2d\");\n ctx.strokeStyle = \"#111827\";\n ctx.lineWidth = 3 * (window.devicePixelRatio || 1);\n ctx.lineCap = \"round\";\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.stroke();\n};\n\nconst sigClear = () => {\n const canvas = signaturePadCanvas.value;\n if (!canvas) {\n return;\n }\n const ctx = canvas.getContext(\"2d\");\n ctx.fillStyle = \"#fff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n};\n\nconst sigUse = () => {\n const canvas = signaturePadCanvas.value;\n if (!canvas) {\n return;\n }\n canvas.toBlob(async (blob) => {\n signatureImageBytes.value = await blob.arrayBuffer();\n currentTool.value = EDITOR_TOOLS.IMAGE;\n isSignaturePadVisible.value = false;\n });\n};\n\nwatch(isSignaturePadVisible, (v) => {\n if (v) {\n setTimeout(initSignaturePadSize, 0);\n }\n});\n\n// Watcher to get numPages when PDF loads\nwatch(previewPdf, async (newVal) => {\n if (!newVal) {\n previewNumPages.value = 0;\n return;\n }\n\n try {\n // Wait for the PDF document to load\n const pdfDoc = await newVal;\n previewNumPages.value = pdfDoc.numPages;\n } catch (err) {\n console.error(\"Error loading preview PDF:\", err);\n previewNumPages.value = 0;\n }\n});\n</script>\n\n<style scoped>\n.pdf-tools-page {\n padding: 2rem;\n}\n\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 50vh;\n}\n\n.pdf-editor-layout {\n display: flex;\n gap: 2rem;\n}\n\n.pdf-tools-sidebar {\n width: 350px;\n flex-shrink: 0;\n}\n\n.pdf-tools-sidebar .card {\n position: sticky;\n top: 1rem;\n background: #ffffff;\n border: 1px solid var(--surface-border, #e0e0e0);\n border-radius: 12px;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);\n padding: 1rem 1rem 0.5rem;\n}\n\n.pdf-tools-sidebar h3 {\n margin: 0 0 0.75rem;\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--text-color, #222);\n}\n\n/* Sidebar form layout (replaces p-fluid) */\n.sidebar-form {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.sidebar-form :deep(.p-button),\n.sidebar-form :deep(.p-fileupload) {\n width: 100%;\n}\n\n/* Form fields (replaces p-field) */\n.form-field {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n}\n\n.form-field--spaced {\n margin-top: 1rem;\n}\n\n.form-label {\n display: block;\n margin-bottom: 0.25rem;\n font-weight: 500;\n font-size: 0.875rem;\n}\n\n.form-hint {\n color: var(--p-text-muted-color, #6b7280);\n font-size: 0.8rem;\n}\n\n/* Buttons spacing helpers (replaces mt-2, mt-auto, etc.) */\n.btn-mt {\n margin-top: 0.5rem;\n}\n\n.btn-mt-sm {\n margin-top: 0.25rem;\n}\n\n.btn-mt-auto {\n margin-top: auto;\n}\n\n.btn-full {\n width: 100%;\n}\n\n/* Insert buttons stack (replaces flex flex-column gap-2) */\n.insert-buttons {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n/* Watermark grid (replaces grid + col-6) */\n.watermark-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0.5rem;\n margin-top: 0.5rem;\n}\n\n/* Page grid (replaces PrimeFlex grid + col-3) */\n.page-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 0.5rem;\n}\n\n.page-grid-item {\n min-width: 0;\n}\n\n/* Input full width (replaces w-full) */\n.input-full {\n width: 100%;\n}\n\n/* Fields and labels */\n.pdf-tools-sidebar :deep(.p-inputtext),\n.pdf-tools-sidebar :deep(.p-inputnumber-input) {\n width: 100%;\n}\n\n/* Page thumbnails */\n.page-thumbnail {\n position: relative;\n border: 2px solid #ccc;\n border-radius: 10px;\n margin-bottom: 10px;\n text-align: center;\n cursor: pointer;\n transition: all 0.2s;\n overflow: hidden;\n background-color: #f8f9fa;\n height: 150px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.page-thumbnail.selected {\n border-color: var(--primary-color);\n transform: scale(1.05);\n box-shadow: 0 0 0 3px rgba(48, 79, 254, 0.25);\n}\n\n.page-thumbnail:hover {\n border-color: #a0aec0;\n}\n\n.page-thumbnail:hover .page-actions {\n opacity: 1;\n}\n\n.page-actions {\n position: absolute;\n top: 5px;\n right: 5px;\n z-index: 10;\n opacity: 0;\n transition: opacity 0.2s;\n}\n\n.page-actions :deep(.p-button) {\n background: rgba(255, 255, 255, 0.9);\n border: 1px solid #e5e7eb;\n}\n\n.page-selection {\n position: absolute;\n top: 5px;\n left: 5px;\n z-index: 10;\n}\n\n.page-number {\n position: absolute;\n bottom: 5px;\n right: 5px;\n background-color: rgba(0, 0, 0, 0.5);\n color: white;\n padding: 2px 5px;\n border-radius: 3px;\n font-size: 0.8rem;\n font-weight: 600;\n}\n\n.pdf-preview-container {\n flex-grow: 1;\n}\n\n.thumbnail-content {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.page-thumbnail :deep(canvas) {\n max-width: 100%;\n max-height: 100%;\n height: auto;\n width: auto;\n pointer-events: none;\n}\n\n.ghost {\n opacity: 0.5;\n background: #c8ebfb;\n}\n\n/* Dialog shared styles */\n.dialog-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.dialog-footer-buttons {\n display: flex;\n gap: 0.5rem;\n}\n\n/* Page editor dialog */\n:deep(.page-editor-dialog) {\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.page-editor-toolbar {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid var(--surface-border, #e0e0e0);\n}\n\n.page-editor-toolbar .spacer {\n flex: 1;\n}\n\n.zoom-indicator {\n color: #6b7280;\n}\n\n/* Editor layout (replaces flex on editor body) */\n.editor-layout {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.editor-footer {\n display: flex;\n justify-content: space-between;\n width: 100%;\n}\n\n/* Tool group */\n.tool-group {\n position: sticky;\n top: 1rem;\n background: #ffffff;\n border: 1px solid var(--surface-border, #e0e0e0);\n border-radius: 12px;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);\n padding: 1rem 1rem 0.5rem;\n width: 12rem;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n}\n\n.tool-group :deep(.p-button),\n.tool-group :deep(.p-fileupload) {\n width: 100%;\n}\n\n.tool-group :deep(.p-button.active),\n.tool-group :deep(.p-fileupload.active) {\n background: #e0f2fe;\n border-color: #7dd3fc;\n color: #075985;\n box-shadow: 0 0 0 2px rgba(125, 211, 252, 0.35) inset;\n}\n\n.tool-group :deep(.p-button.active .p-button-icon) {\n color: #075985;\n}\n\n/* Text tool settings (replaces mt-2 container) */\n.text-settings {\n margin-top: 0.5rem;\n}\n\n/* Page editor canvas */\n.page-editor-canvas {\n flex: 1;\n min-height: 0;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n overflow: auto;\n background: #f8fafc;\n border-radius: 8px;\n scroll-behavior: smooth;\n flex: 1;\n}\n\n.page-editor-canvas :deep(canvas) {\n position: relative;\n}\n\n.pdf-canvas-wrapper {\n position: relative;\n}\n\n.pdf-canvas-absolute {\n position: absolute;\n}\n\n.overlay-canvas {\n position: absolute;\n inset: 0;\n pointer-events: auto;\n cursor: crosshair;\n top: 0;\n left: 0;\n}\n\n/* Signature pad */\n.pdf-tools-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1rem;\n}\n.pdf-tools-header :deep(.p-button-label) {\n white-space: nowrap;\n}\n.color-swatches {\n display: flex;\n flex-wrap: wrap;\n gap: 0.35rem;\n}\n.color-swatch {\n width: 1.5rem;\n height: 1.5rem;\n padding: 0;\n border: 1px solid var(--surface-border, #d1d5db);\n border-radius: 4px;\n cursor: pointer;\n}\n.color-swatch.selected {\n outline: 2px solid var(--primary-color, #0ea5e9);\n outline-offset: 1px;\n}\n.color-swatch:focus-visible {\n outline: 2px solid var(--primary-color, #0ea5e9);\n outline-offset: 2px;\n}\n/* The free colour choice is set apart from the presets: as a bare swatch it\n was indistinguishable from them */\n.color-custom {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-top: 0.5rem;\n cursor: pointer;\n font-size: 0.85rem;\n}\n.color-custom-input {\n width: 1.5rem;\n height: 1.5rem;\n padding: 0;\n border: 1px solid var(--surface-border, #d1d5db);\n border-radius: 4px;\n background: none;\n cursor: pointer;\n}\n.color-custom-input:focus-visible {\n outline: 2px solid var(--primary-color, #0ea5e9);\n outline-offset: 2px;\n}\n.text-editor-input {\n position: absolute;\n z-index: 2;\n min-width: 6rem;\n margin: 0;\n padding: 0;\n border: 1px dashed #0ea5e9;\n border-radius: 2px;\n background: rgba(255, 255, 255, 0.85);\n white-space: pre;\n overflow: hidden;\n resize: none;\n outline: none;\n}\n.signature-pad {\n width: 100%;\n}\n\n.signature-canvas {\n width: 100%;\n height: 180px;\n border: 1px dashed var(--surface-border, #e5e7eb);\n background: #fff;\n}\n\n/* Search input group (replaces p-inputgroup) */\n.search-input-group {\n display: flex;\n margin-bottom: 0.5rem;\n}\n\n.search-input-group :deep(.p-inputtext) {\n flex: 1;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.search-input-group :deep(.p-button) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n/* Inline status (replaces flex align-items-center gap-2) */\n.inline-status {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Text utilities (replaces PrimeFlex utility classes) */\n.text-muted {\n color: var(--p-text-muted-color, #6b7280);\n}\n\n.text-ellipsis {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.preview-icon {\n font-size: 3.5rem;\n color: var(--p-text-muted-color, #6b7280);\n}\n\n/* Item content in favorites/search lists (replaces flex align-items-center gap-2 flex-grow-1) */\n.item-content {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-grow: 1;\n min-width: 0;\n}\n\n/* Spinner sizes */\n.spinner-sm {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n.spinner-md {\n width: 3rem;\n height: 3rem;\n}\n\n/* Favorites layout */\n.favorites-layout {\n display: flex;\n gap: 1rem;\n height: 400px;\n}\n\n.favorites-list {\n flex: 0 0 300px;\n overflow-y: auto;\n border: 1px solid var(--surface-border, #e0e0e0);\n border-radius: 8px;\n padding: 0.5rem;\n}\n\n.favorite-item {\n display: flex;\n align-items: center;\n padding: 0.75rem;\n border-radius: 6px;\n cursor: pointer;\n transition: background-color 0.2s;\n margin-bottom: 0.25rem;\n}\n\n.favorite-item:hover {\n background-color: var(--surface-hover, #f5f5f5);\n}\n\n.favorite-item-selected {\n background-color: var(--primary-50, #e3f2fd);\n border: 1px solid var(--primary-200, #90caf9);\n}\n\n.favorites-preview {\n flex: 1;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--surface-border, #e0e0e0);\n border-radius: 8px;\n background-color: var(--surface-50, #fafafa);\n overflow: hidden;\n}\n\n.preview-wrapper {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.preview-controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.5rem;\n border-bottom: 1px solid var(--surface-border, #e0e0e0);\n background-color: white;\n}\n\n.preview-controls .page-info {\n min-width: 80px;\n text-align: center;\n font-weight: 500;\n color: var(--text-color, #333);\n}\n\n.preview-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n height: 100%;\n}\n\n.preview-content {\n flex: 1;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n overflow: auto;\n padding: 1rem;\n}\n\n.preview-content :deep(canvas) {\n max-width: 100%;\n height: auto;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n/* Insert dialog footer */\n.insert-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n width: 100%;\n}\n\n.insert-footer-info {\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n margin-right: 0.5rem;\n min-width: 0;\n}\n\n.selected-info {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n color: var(--p-text-muted-color, #6b7280);\n}\n\n.selected-label {\n flex-shrink: 0;\n color: var(--p-text-muted-color, #6b7280);\n}\n\n.selected-name {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 500;\n flex-grow: 1;\n}\n\n.error-msg {\n color: var(--p-red-500, #ef4444);\n font-size: 0.875rem;\n}\n\n.insert-footer-actions {\n display: flex;\n gap: 0.5rem;\n margin-left: auto;\n}\n\n/* Dialog sizes */\n/* Size is set through the :style prop: a scoped rule cannot reach the dialog,\n which is teleported out of this component's DOM tree */\n\n.dialog-signature-pad {\n width: 480px;\n}\n\n.dialog-insert-pdf {\n width: 60rem;\n}\n</style>\n"],"names":["t","useI18n","props","__props","emit","__emit","filename","ref","initialNode","isExplorerVisible","selectedFolderId","selectedFolderName","onDialogShow","onNodeSelect","nodeData","parentNode","alfrescoNodeService","e","save","_createBlock","_unref","PrimeDialog","$t","$emit","_createVNode","PrimeButton","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","_toDisplayString","PrimeInputText","$event","_hoisted_4","_hoisted_5","_hoisted_6","_cache","_openBlock","_createElementBlock","_hoisted_7","TreeExplorer","COMMENT_COLOR","FLAG_PRINT","addCommentAnnotation","doc","page","rect","text","title","content","annotation","PDFHexString","readCommentAnnotations","annots","comments","index","annot","PDFName","contents","removeCommentAnnotations","POINTS_PER_INCH","REDACTION_DPI","MAX_CANVAS_PIXELS","rasterizeRedactedPage","pdfPage","redactions","dpi","quality","mimeType","maxPixels","createCanvas","scale","wanted","wantedPixels","viewport","canvas","ctx","LINE_HEIGHT_RATIO","MIN_BLOCK_WIDTH","overlayPixelsPerPoint","overlayWidth","pageWidthPt","splitTextLines","measureTextBlock","lines","fontSize","measureLine","widths","line","pdfBaselineY","topY","lineIndex","ascentPt","COMMENT_ANCHOR_SIZE","hasUnsavedChanges","closeEditor","pdfDoc","originalPdfBytes","pages","isLoading","error","selectedPage","selectedPages","isPageEditorVisible","selectedPageForEdit","pageZoom","EDITOR_TOOLS","currentTool","overlayItems","overlayImageFile","signatureImageBytes","pdfCanvasWrapper","overlayCanvas","textEditorInput","textEditor","isSignaturePadVisible","signaturePadCanvas","sigDrawing","sigLast","isDrawing","startPoint","watermarkText","watermarkAngle","watermarkRepetitions","textFontOptions","TEXT_COLOR_SWATCHES","textFont","textSize","textColor","parentId","isSaveAsPopupVisible","saveAsAction","defaultFilename","currentFilename","currentNode","parentFolderNode","isInsertFromAlfrescoVisible","insertAlfrescoInput","selectionErrorMsg","selectedPdf","canConfirmInsert","computed","parseNodeId","searchQuery","searchResults","searchLoading","searchPerformed","favoritePdfs","favoritesLoading","previewLoading","previewPdfUrl","previewPdf","usePDF","buildPdfSourceRef","previewCurrentPage","previewNumPages","pdfUrl","pdf","onMounted","nodeId","loadPdfFromAlfresco","isPageSelected","p","togglePageSelection","node","contentUrl","alfrescoFileService","response","arrayBuffer","updatePageList","err","pdfBytes","PDFDocument","pageCount","_","i","_updatePdfAndRefreshState","updatePages","newPdfBytes","blob","onDragEnd","newPdfDoc","pageIndices","sourcePdf","rotatePage","pageElement","currentRotation","RotationTypes","extractPages","a","b","deleteSelectedPages","src","total","toDelete","keepIndices","newDoc","openInsertFromAlfrescoDialog","onTabChange","tabValue","loadFavorites","confirmInsertFromAlfresco","insertPdfFromAlfresco","trimmed","ws","inNodes","hash","generic","selectPdf","previewNextPage","previewPreviousPage","onNodeSelectedFromTree","performSearch","store","useSearchStore","entries","favoritesStore","useFavoritesStore","fav","otherBytes","current","other","count","importIndices","onInsertPdfSelect","file","insertPdfFile","addWatermark","pageIndex","width","height","rgb","degrees","saveChanges","opts","openSaveAsPopup","action","handleSaveAs","folderId","pdfBytesToSave","detail","loadExistingComments","item","drawOverlay","pxPerPoint","overlayScale","pageHeightPt","currentPageHeightPt","comment","openPageEditor","selectedItemIndex","syncOverlaySize","closePageEditor","zoomIn","zoomOut","setTool","tool","onOverlayImageSelect","openSignaturePad","undoOverlay","ensureItemPreview","sourceBlob","getPdfCanvas","wrapper","canvases","visible","c","list","best","bestArea","r","area","base","dpr","toCanvasPoint","evt","canvasEl","draggingIndex","dragStart","resizingIndex","resizeCorner","currentPageWidthPt","textFontPx","payload","measureTextItem","fontPx","bounds","textEditorStyle","isSyncingTextPanel","isTextPanelVisible","selectItem","nextTick","watch","deleteSelectedItem","onEditorKeyDown","cancelTextEditor","typing","onUnmounted","inlineEditorLabels","openInlineEditor","point","existing","commitTextEditor","x","y","onOverlayDoubleClick","idx","hitTest","type","hitTestHandle","half","it","corners","onOverlayMouseDown","handleHit","newItem","onOverlayMouseMove","r0","w","h","dx","dy","tempRect","onOverlayMouseUp","onOverlayMouseLeave","selectedIdx","drawItem","drawCommentIcon","s","cx","cy","ty","parseHexColor","hex","num","g","size","applyOverlayEdits","originalIndex","pdfW","pdfH","overlay","dataUrl","pngBytes","bgImg","newPage","baseRect","baseW","baseH","cssToBaseX","cssToBaseY","baseToPdfX","baseToPdfY","cssX","cssY","cssW","cssH","baseX","baseY","baseWRect","baseHRect","bytes","img","fontName","StandardFonts","font","rc","gc","bc","needsPageListUpdate","fitToWidth","initSignaturePadSize","onCloseSignaturePad","sigClear","sigDown","getSigPoint","sigMove","drawSigLine","sigTouchDown","sigTouchMove","sigUp","clientX","clientY","sigUse","v","newVal","PrimeProgressSpinner","PrimeMessage","_hoisted_8","_hoisted_9","PrimeDivider","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","PrimeFileUpload","_hoisted_14","_hoisted_15","PrimeInputNumber","_hoisted_16","VueDraggableNext","_Fragment","_renderList","element","_normalizeClass","_withModifiers","_hoisted_18","PrimeCheckbox","_hoisted_19","_hoisted_20","VuePDF","_hoisted_21","_hoisted_22","_hoisted_38","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","PrimeSelect","_hoisted_30","_hoisted_31","PrimeSlider","_hoisted_32","_hoisted_33","_hoisted_34","swatch","_normalizeStyle","_hoisted_36","_vModelText","_hoisted_39","_hoisted_41","_hoisted_40","SaveAsPopup","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_withDirectives","_hoisted_83","_createTextVNode","_hoisted_84","_hoisted_85","PrimeTabs","PrimeTabList","PrimeTab","PrimeTabPanels","PrimeTabPanel","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_51","_hoisted_52","_hoisted_59","_hoisted_61","_hoisted_62","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_67","_hoisted_68","_hoisted_60","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78"],"mappings":"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"}
1
+ {"version":3,"file":"PdfToolsComponent-CynQg24K.js","sources":["../src/components/pdfTools/SaveAsPopup.vue","../src/services/PdfCommentService.js","../src/services/PdfRedactionService.js","../src/services/PdfTextService.js","../src/components/pdfTools/PdfToolsComponent.vue"],"sourcesContent":["<!--\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n-->\n\n<template>\n <PrimeDialog\n :visible=\"visible\"\n modal\n :header=\"$t('pdfTools.saveAs.title')\"\n class=\"dialog-save-as\"\n @update:visible=\"$emit('close')\"\n @show=\"onDialogShow\"\n >\n <div class=\"save-as-form\">\n <div class=\"form-field\">\n <label for=\"filename\">{{ $t(\"pdfTools.saveAs.filenameLabel\") }}</label>\n <PrimeInputText id=\"filename\" v-model=\"filename\" />\n </div>\n\n <div class=\"form-field\">\n <label for=\"location\">{{ $t(\"pdfTools.saveAs.folderLabel\") }}</label>\n <div class=\"input-group\">\n <PrimeInputText id=\"location\" readonly :value=\"selectedFolderName\" />\n <PrimeButton\n :icon=\"\n isExplorerVisible ? 'ri-arrow-up-s-line' : 'ri-arrow-down-s-line'\n \"\n :label=\"$t('pdfTools.saveAs.browse')\"\n @click=\"isExplorerVisible = !isExplorerVisible\"\n />\n </div>\n </div>\n\n <div v-if=\"isExplorerVisible\" class=\"explorer-container\">\n <TreeExplorer\n :current-node=\"initialNode\"\n show-user-home\n :show-files=\"false\"\n @selectNode=\"onNodeSelect\"\n />\n </div>\n </div>\n <template #footer>\n <PrimeButton\n :label=\"$t('pdfTools.common.cancel')\"\n icon=\"ri-close-line\"\n text\n @click=\"$emit('close')\"\n />\n <PrimeButton\n :label=\"$t('pdfTools.common.save')\"\n icon=\"ri-check-line\"\n @click=\"save\"\n :disabled=\"!filename || !selectedFolderId\"\n />\n </template>\n </PrimeDialog>\n</template>\n\n<script setup>\nimport { ref, defineProps, defineEmits } from \"vue\";\nimport PrimeDialog from \"primevue/dialog\";\nimport PrimeInputText from \"primevue/inputtext\";\nimport PrimeButton from \"primevue/button\";\nimport TreeExplorer from \"@/components/TreeExplorer.vue\";\nimport { useI18n } from \"vue-i18n\";\nimport alfrescoNodeService from \"@/services/AlfrescoNodeService.js\";\n\nconst { t } = useI18n();\n\nconst props = defineProps({\n visible: Boolean,\n defaultFilename: {\n type: String,\n default: null,\n },\n parentFolderNode: {\n type: Object,\n default: null,\n },\n});\n\nconst emit = defineEmits([\"close\", \"save\"]);\n\nconst filename = ref(\"\");\nconst initialNode = ref(null);\nconst isExplorerVisible = ref(false);\nconst selectedFolderId = ref(null);\nconst selectedFolderName = ref(\"\");\n\nconst onDialogShow = () => {\n filename.value =\n props.defaultFilename || t(\"pdfTools.saveAs.defaultFilename\");\n initialNode.value = props.parentFolderNode;\n selectedFolderId.value = props.parentFolderNode?.id;\n selectedFolderName.value = props.parentFolderNode?.name;\n isExplorerVisible.value = false;\n};\n\nconst onNodeSelect = async (nodeData) => {\n if (!nodeData || !nodeData.isFolder) {\n return;\n }\n if (nodeData.name === \"documentLibrary\") {\n selectedFolderId.value = nodeData.id;\n if (nodeData.parentId) {\n try {\n const parentNode = await alfrescoNodeService.getNode(nodeData.parentId);\n selectedFolderName.value =\n parentNode.properties[\"cm:title\"] || parentNode.name;\n } catch (e) {\n console.error(\"Could not fetch parent node name\", e);\n selectedFolderName.value = nodeData.name;\n }\n } else {\n selectedFolderName.value = nodeData.name;\n }\n } else {\n selectedFolderId.value = nodeData.id;\n selectedFolderName.value = nodeData.name;\n }\n isExplorerVisible.value = false;\n};\n\nconst save = () => {\n if (selectedFolderId.value) {\n emit(\"save\", {\n filename: filename.value,\n folderId: selectedFolderId.value,\n });\n }\n};\n</script>\n\n<!-- Non-scoped: Dialog teleported to body -->\n<style>\n.dialog-save-as {\n width: 35rem;\n}\n</style>\n\n<style scoped>\n.save-as-form {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n}\n\n.form-field label {\n font-weight: 500;\n font-size: 0.875rem;\n}\n\n.input-group {\n display: flex;\n}\n\n.input-group :deep(.p-inputtext) {\n flex: 1;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group :deep(.p-button) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.explorer-container {\n margin-top: 0.75rem;\n border: 1px solid var(--p-surface-border);\n padding: 0.5rem;\n overflow-y: auto;\n max-height: 20rem;\n border-radius: 0.375rem;\n}\n</style>\n","/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\nimport { PDFHexString, PDFName } from \"pdf-lib\";\n\n/** Yellow of the note icon, as PDF colour components. */\nconst COMMENT_COLOR = [1, 0.92, 0.23];\n\n/** Annotation flag 4: print the annotation along with the page. */\nconst FLAG_PRINT = 4;\n\n/**\n * @typedef {Object} CommentAnchor\n * @property {number} x left edge, in PDF coordinates\n * @property {number} y bottom edge, in PDF coordinates\n * @property {number} size side of the square icon, in points\n */\n\n/**\n * Attach a comment to a page as a real PDF annotation.\n *\n * A comment belongs beside the page, not inside it: drawing it into the\n * content stream would print it over the document and merge it with the\n * content for good. As an annotation it stays a note a reader can open, and\n * the page itself is left untouched.\n *\n * @param {Object} params\n * @param {import(\"pdf-lib\").PDFDocument} params.doc\n * @param {import(\"pdf-lib\").PDFPage} params.page page to annotate\n * @param {CommentAnchor} params.rect where the note icon sits\n * @param {string} params.text content of the note\n * @param {string} params.title title shown by the viewer\n */\nexport const addCommentAnnotation = ({ doc, page, rect, text, title }) => {\n const content = String(text ?? \"\");\n if (!content.trim()) {\n return;\n }\n\n const annotation = doc.context.obj({\n Type: \"Annot\",\n Subtype: \"Text\",\n // Icon used by the viewer for this note\n Name: \"Comment\",\n Rect: [rect.x, rect.y, rect.x + rect.size, rect.y + rect.size],\n // fromText encodes as UTF-16BE: a plain string would break accents\n Contents: PDFHexString.fromText(content),\n T: PDFHexString.fromText(String(title ?? \"\")),\n C: COMMENT_COLOR,\n F: FLAG_PRINT,\n });\n\n page.node.addAnnot(doc.context.register(annotation));\n};\n\n/**\n * List the comments already carried by a page.\n *\n * The editing preview only knows about the overlay being built, so without\n * this the comments merged into the document become invisible: those just\n * applied, and those a document arrives with.\n *\n * @param {import(\"pdf-lib\").PDFPage} page\n * @returns {{x: number, y: number, size: number, text: string}[]} comments,\n * positioned in PDF coordinates\n */\nexport const readCommentAnnotations = (page) => {\n const annots = page.node.Annots();\n if (!annots) {\n return [];\n }\n\n const comments = [];\n for (let index = 0; index < annots.size(); index++) {\n const annot = annots.lookup(index);\n if (annot?.get(PDFName.of(\"Subtype\")) !== PDFName.of(\"Text\")) {\n continue;\n }\n const rect = annot.get(PDFName.of(\"Rect\"))?.asRectangle();\n if (!rect) {\n continue;\n }\n const contents = annot.get(PDFName.of(\"Contents\"));\n comments.push({\n x: rect.x,\n y: rect.y,\n size: Math.max(rect.width, rect.height),\n text:\n typeof contents?.decodeText === \"function\" ? contents.decodeText() : \"\",\n });\n }\n return comments;\n};\n\n/**\n * Drop every comment from a page, leaving its other annotations in place.\n *\n * Comments are rewritten from scratch on every apply, so that moving,\n * editing or deleting one in the editor is reflected in the document.\n *\n * @param {import(\"pdf-lib\").PDFPage} page\n */\nexport const removeCommentAnnotations = (page) => {\n const annots = page.node.Annots();\n if (!annots) {\n return;\n }\n\n // Walk backwards: removing shifts every later index\n for (let index = annots.size() - 1; index >= 0; index--) {\n if (\n annots.lookup(index)?.get(PDFName.of(\"Subtype\")) === PDFName.of(\"Text\")\n ) {\n annots.remove(index);\n }\n }\n};\n","/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\n\n/** PDF user space unit: 72 points per inch. */\nconst POINTS_PER_INCH = 72;\n\n/** Resolution of the flattened page, high enough to stay readable in print. */\nexport const REDACTION_DPI = 200;\n\n/**\n * Largest canvas the rasterization is allowed to allocate. Browsers cap canvas\n * area (Safari and iOS around 16.7 Mpx) and silently return a blank bitmap when\n * the cap is exceeded, so the resolution is lowered rather than risking an\n * empty page.\n */\nconst MAX_CANVAS_PIXELS = 16_000_000;\n\n/**\n * @typedef {Object} PageFractionRect\n * @property {number} x left edge, as a fraction of the page width (0..1)\n * @property {number} y top edge, as a fraction of the page height (0..1)\n * @property {number} w width, as a fraction of the page width (0..1)\n * @property {number} h height, as a fraction of the page height (0..1)\n */\n\n/**\n * Render a PDF page off-screen and burn the redaction masks into the pixels.\n *\n * The page is rendered from the PDF itself at a fixed resolution, not copied\n * from the on-screen canvas: the quality of an archived document must not\n * depend on the zoom level in use when the user applied the redaction.\n *\n * Redaction must be destructive: the masked content has to disappear from the\n * exported image itself. Drawing the masks as PDF objects on top of an\n * untouched raster would leave the original content readable to anyone\n * extracting the background image or removing the covering object.\n *\n * Masks are expressed as fractions of the page so that they stay independent\n * from both the screen resolution and the render resolution.\n *\n * @param {Object} params\n * @param {Object} params.pdfPage pdf.js PDFPageProxy of the page to flatten\n * @param {PageFractionRect[]} [params.redactions] areas to destroy\n * @param {number} [params.dpi] target resolution of the rendered page\n * @param {number} [params.quality] JPEG quality of the exported image\n * @param {string} [params.mimeType] MIME type of the exported image\n * @param {number} [params.maxPixels] canvas area budget\n * @param {function(): HTMLCanvasElement} [params.createCanvas] canvas factory\n * @returns {Promise<string>} data URL of the flattened page\n */\nexport const rasterizeRedactedPage = async ({\n pdfPage,\n redactions = [],\n dpi = REDACTION_DPI,\n quality = 0.85,\n mimeType = \"image/jpeg\",\n maxPixels = MAX_CANVAS_PIXELS,\n createCanvas = () => document.createElement(\"canvas\"),\n}) => {\n let scale = dpi / POINTS_PER_INCH;\n const wanted = pdfPage.getViewport({ scale });\n const wantedPixels = wanted.width * wanted.height;\n if (wantedPixels > maxPixels) {\n // Round down so the budget is never exceeded by a rounding error\n scale =\n Math.floor(scale * Math.sqrt(maxPixels / wantedPixels) * 10000) / 10000;\n }\n\n const viewport = pdfPage.getViewport({ scale });\n const canvas = createCanvas();\n canvas.width = Math.floor(viewport.width);\n canvas.height = Math.floor(viewport.height);\n\n const ctx = canvas.getContext(\"2d\");\n await pdfPage.render({ canvasContext: ctx, viewport }).promise;\n\n if (redactions.length > 0) {\n ctx.fillStyle = \"#000000\";\n for (const rect of redactions) {\n ctx.fillRect(\n rect.x * canvas.width,\n rect.y * canvas.height,\n rect.w * canvas.width,\n rect.h * canvas.height,\n );\n }\n }\n\n return canvas.toDataURL(mimeType, quality);\n};\n","/*\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n */\n\n/**\n * Spacing between two consecutive baselines, as a multiple of the font size.\n * Shared by the on-screen preview and the PDF output so both stay aligned.\n */\nexport const LINE_HEIGHT_RATIO = 1.2;\n\n/** Minimum width of a text box, so an empty text stays selectable. */\nconst MIN_BLOCK_WIDTH = 8;\n\n/**\n * Scale factor converting a PDF point into overlay canvas pixels.\n *\n * Font sizes are stored in PDF points, the only unit that means anything in\n * the produced document. The preview must convert them for the current render,\n * otherwise the same text appears at a different size depending on the zoom\n * level and on the device pixel ratio.\n *\n * @param {Object} params\n * @param {number} params.overlayWidth width of the overlay canvas, in pixels\n * @param {number} params.pageWidthPt width of the PDF page, in points\n * @returns {number} pixels per point\n */\nexport const overlayPixelsPerPoint = ({ overlayWidth, pageWidthPt }) => {\n if (!pageWidthPt || !overlayWidth) {\n return 1;\n }\n return overlayWidth / pageWidthPt;\n};\n\n/**\n * Split a text into lines on explicit newlines only.\n *\n * Text is anchored on a point, not fitted into a box: it never wraps on its\n * own, so no line can be silently dropped for lack of room.\n *\n * @param {string} text\n * @returns {string[]} lines, empty ones included\n */\nexport const splitTextLines = (text) => String(text ?? \"\").split(/\\r?\\n/);\n\n/**\n * Measure the box occupied by a text block.\n *\n * @param {Object} params\n * @param {string[]} params.lines\n * @param {number} params.fontSize font size, in the unit of `measureLine`\n * @param {function(string): number} params.measureLine measures one line\n * @returns {{w: number, h: number}} block size, in the same unit\n */\nexport const measureTextBlock = ({ lines, fontSize, measureLine }) => {\n const widths = lines.map((line) => measureLine(line));\n return {\n w: Math.max(MIN_BLOCK_WIDTH, ...widths),\n h: lines.length * fontSize * LINE_HEIGHT_RATIO,\n };\n};\n\n/**\n * Baseline position of one line, in PDF coordinates.\n *\n * Everything here is expressed in the PDF coordinate system, measured from the\n * bottom of the page: mixing it with a top-down origin is the kind of mistake\n * that silently drops text off the visible area.\n *\n * @param {Object} params\n * @param {number} params.topY top of the text block, in PDF coordinates\n * @param {number} params.lineIndex zero-based index of the line\n * @param {number} params.fontSize font size, in points\n * @param {number} params.ascentPt height of the font above its baseline\n * @returns {number} baseline position, in PDF coordinates\n */\nexport const pdfBaselineY = ({ topY, lineIndex, fontSize, ascentPt }) =>\n topY - lineIndex * fontSize * LINE_HEIGHT_RATIO - ascentPt;\n","<!--\n Copyright (C) 2022 - Jeci SARL - https://jeci.fr\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU Affero General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Affero General Public License for more details.\n\n You should have received a copy of the GNU Affero General Public License\n along with this program. If not, see https://www.gnu.org/licenses/agpl-3.0.html.\n-->\n\n<template>\n <div class=\"pdf-tools-page\">\n <div class=\"pdf-tools-header\">\n <h1>\n {{ $t(\"pdfTools.title\") }}\n <span v-if=\"currentFilename\">— {{ currentFilename }}</span>\n </h1>\n <PrimeButton\n v-if=\"closable\"\n severity=\"secondary\"\n class=\"flex-shrink-0\"\n icon=\"ri-close-line\"\n :label=\"$t('pdfTools.closeEditor')\"\n @click=\"closeEditor\"\n />\n </div>\n\n <div v-if=\"isLoading\" class=\"loading-container\">\n <PrimeProgressSpinner />\n <p>{{ $t(\"pdfTools.loading\") }}</p>\n </div>\n\n <div v-if=\"error\" class=\"error-container\">\n <PrimeMessage severity=\"error\">{{ error }}</PrimeMessage>\n </div>\n\n <div v-if=\"!isLoading && !error\" class=\"pdf-editor-layout\">\n <div class=\"pdf-tools-sidebar\">\n <div class=\"card\">\n <h2>{{ $t(\"pdfTools.sidebar.actions\") }}</h2>\n <div class=\"sidebar-form\">\n <PrimeButton\n icon=\"ri-save-2-line\"\n :label=\"$t('pdfTools.sidebar.saveNewVersion')\"\n @click=\"saveChanges\"\n />\n <PrimeButton\n severity=\"secondary\"\n class=\"btn-mt\"\n icon=\"ri-file-copy-2-line\"\n :label=\"$t('pdfTools.sidebar.saveAs')\"\n @click=\"openSaveAsPopup('saveAs')\"\n />\n <PrimeDivider />\n <div class=\"form-field\">\n <h3>{{ $t(\"pdfTools.sidebar.extractPages\") }}</h3>\n <PrimeButton\n :disabled=\"selectedPages.length === 0\"\n icon=\"ri-file-transfer-line\"\n :label=\"$t('pdfTools.sidebar.extractAndSave')\"\n @click=\"openSaveAsPopup('extract')\"\n />\n </div>\n <div class=\"form-field form-field--spaced\">\n <h3>{{ $t(\"pdfTools.sidebar.deletePages\") }}</h3>\n <PrimeButton\n :disabled=\"\n selectedPages.length === 0 ||\n pages.length === selectedPages.length\n \"\n severity=\"danger\"\n icon=\"ri-delete-bin-line\"\n :label=\"$t('pdfTools.sidebar.deleteSelectedPages')\"\n @click=\"deleteSelectedPages\"\n />\n </div>\n <div class=\"form-field form-field--spaced\">\n <h3>{{ $t(\"pdfTools.sidebar.insertPdf\") }}</h3>\n <div class=\"insert-buttons\">\n <PrimeFileUpload\n :auto=\"false\"\n :customUpload=\"false\"\n :showCancelButton=\"false\"\n :showUploadButton=\"false\"\n accept=\"application/pdf\"\n :choose-label=\"$t('pdfTools.sidebar.fromComputer')\"\n severity=\"secondary\"\n class=\"btn-full\"\n mode=\"basic\"\n name=\"pdfToInsert\"\n @select=\"onInsertPdfSelect\"\n />\n <PrimeButton\n severity=\"secondary\"\n icon=\"ri-cloud-line\"\n :label=\"$t('pdfTools.sidebar.fromPristy')\"\n @click=\"openInsertFromAlfrescoDialog\"\n />\n </div>\n </div>\n <div class=\"form-field form-field--spaced\">\n <h3>{{ $t(\"pdfTools.sidebar.addWatermark\") }}</h3>\n <PrimeInputText\n v-model=\"watermarkText\"\n :placeholder=\"$t('pdfTools.sidebar.watermarkTextPlaceholder')\"\n type=\"text\"\n />\n <div class=\"watermark-grid\">\n <div>\n <PrimeInputNumber\n v-model=\"watermarkAngle\"\n :max=\"360\"\n :min=\"-360\"\n :placeholder=\"$t('pdfTools.sidebar.angle')\"\n suffix=\"°\"\n />\n </div>\n <div>\n <PrimeInputNumber\n v-model=\"watermarkRepetitions\"\n :max=\"10\"\n :min=\"1\"\n :placeholder=\"$t('pdfTools.sidebar.repetitions')\"\n />\n </div>\n </div>\n <PrimeButton\n :disabled=\"!watermarkText || selectedPages.length === 0\"\n severity=\"secondary\"\n class=\"btn-mt\"\n icon=\"ri-paint-brush-line\"\n :label=\"$t('pdfTools.sidebar.addWatermarkButton')\"\n @click=\"addWatermark\"\n />\n </div>\n </div>\n </div>\n </div>\n <div class=\"pdf-preview-container\">\n <h2>{{ $t(\"pdfTools.pagePreview.title\") }}</h2>\n <VueDraggableNext\n v-model=\"pages\"\n class=\"page-grid\"\n ghost-class=\"ghost\"\n item-key=\"pageIndex\"\n @end=\"onDragEnd\"\n >\n <div\n v-for=\"element in pages\"\n :key=\"element.pageIndex\"\n class=\"page-grid-item\"\n >\n <div\n :class=\"{ selected: isPageSelected(element) }\"\n class=\"page-thumbnail\"\n @click=\"togglePageSelection(element)\"\n @dblclick.stop=\"openPageEditor(element)\"\n >\n <div class=\"page-selection\">\n <PrimeCheckbox binary :model-value=\"isPageSelected(element)\" />\n </div>\n <div class=\"page-actions\">\n <PrimeButton\n text\n rounded\n icon=\"ri-clockwise-line\"\n :aria-label=\"$t('pdf.rotationRigth')\"\n @click.stop=\"rotatePage(element)\"\n />\n <PrimeButton\n :aria-label=\"\n $t('pdfTools.pagePreview.openPagePreview', {\n pageNumber: element.pageNumber,\n })\n \"\n text\n rounded\n icon=\"ri-edit-box-line\"\n @click.stop=\"openPageEditor(element)\"\n />\n </div>\n <div class=\"thumbnail-content\">\n <VuePDF\n :annotations=\"false\"\n :page=\"element.pageNumber\"\n :pdf=\"pdf\"\n :scale=\"0.25\"\n :text=\"false\"\n />\n </div>\n <div class=\"page-number\">{{ element.pageNumber }}</div>\n </div>\n </div>\n </VueDraggableNext>\n </div>\n </div>\n\n <!-- Large preview / editing of a specific page -->\n <PrimeDialog\n v-model:visible=\"isPageEditorVisible\"\n :breakpoints=\"{ '960px': '95vw', '640px': '100vw' }\"\n :closeOnEscape=\"false\"\n :style=\"{ width: '85vw', maxWidth: '1400px', height: '90vh' }\"\n dismissableMask\n modal\n class=\"dialog-page-editor\"\n content-class=\"page-editor-dialog\"\n @hide=\"closePageEditor\"\n >\n <template #header>\n <div class=\"dialog-header\">\n <i class=\"ri-file-fill\" aria-hidden=\"true\" />\n <span>\n {{\n $t(\"pdfTools.pageEditor.title\", {\n pageNumber:\n (selectedPageForEdit || selectedPage)?.pageNumber || \"\",\n filename: currentFilename,\n })\n }}\n </span>\n </div>\n </template>\n\n <div class=\"page-editor-toolbar\">\n <PrimeButton\n text\n icon=\"ri-zoom-out-line\"\n :aria-label=\"$t('pdf.dezoom')\"\n @click=\"zoomOut\"\n />\n <PrimeButton\n text\n icon=\"ri-zoom-in-line\"\n :aria-label=\"$t('pdf.zoom')\"\n @click=\"zoomIn\"\n />\n <PrimeButton\n text\n :label=\"$t('pdfTools.pageEditor.fit')\"\n @click=\"fitToWidth\"\n />\n <span class=\"zoom-indicator\">{{ Math.round(pageZoom * 100) }}%</span>\n <span class=\"spacer\" />\n <PrimeButton\n text\n icon=\"ri-close-line\"\n :label=\"$t('pdfTools.pageEditor.close')\"\n @click=\"closePageEditor\"\n />\n </div>\n <div class=\"editor-layout\">\n <div class=\"tool-group\">\n <h4>{{ $t(\"pdfTools.pageEditor.tools.actions\") }}</h4>\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.SELECT }\"\n icon=\"ri-cursor-line\"\n :label=\"$t('pdfTools.pageEditor.tools.select')\"\n @click=\"setTool(EDITOR_TOOLS.SELECT)\"\n />\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.REDACT }\"\n icon=\"ri-eraser-fill\"\n :label=\"$t('pdfTools.pageEditor.tools.redact')\"\n @click=\"setTool(EDITOR_TOOLS.REDACT)\"\n />\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.HIGHLIGHT }\"\n icon=\"ri-mark-pen-line\"\n :label=\"$t('pdfTools.pageEditor.tools.highlight')\"\n @click=\"setTool(EDITOR_TOOLS.HIGHLIGHT)\"\n />\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.COMMENT }\"\n icon=\"ri-sticky-note-line\"\n :label=\"$t('pdfTools.pageEditor.tools.comment')\"\n @click=\"setTool(EDITOR_TOOLS.COMMENT)\"\n />\n <PrimeFileUpload\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.IMAGE }\"\n accept=\"image/*\"\n :choose-label=\"$t('pdfTools.pageEditor.tools.image')\"\n mode=\"basic\"\n name=\"image\"\n @select=\"onOverlayImageSelect\"\n />\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.SIGNATURE }\"\n icon=\"ri-ball-pen-line\"\n :label=\"$t('pdfTools.pageEditor.tools.signature')\"\n @click=\"openSignaturePad\"\n />\n <PrimeButton\n text\n severity=\"secondary\"\n :class=\"{ active: currentTool === EDITOR_TOOLS.TEXT }\"\n icon=\"ri-font-size\"\n :label=\"$t('pdfTools.pageEditor.tools.text')\"\n @click=\"setTool(EDITOR_TOOLS.TEXT)\"\n />\n <div v-if=\"isTextPanelVisible\" class=\"text-settings\">\n <div class=\"form-field\">\n <label class=\"form-label\">{{\n $t(\"pdfTools.pageEditor.tools.font\")\n }}</label>\n <PrimeSelect\n v-model=\"textFont\"\n :options=\"textFontOptions\"\n class=\"input-full\"\n optionLabel=\"label\"\n optionValue=\"value\"\n />\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\" for=\"text-size-slider\">\n {{ $t(\"pdfTools.pageEditor.tools.size\") }} : {{ textSize }}\n </label>\n <PrimeSlider\n id=\"text-size-slider\"\n v-model=\"textSize\"\n :max=\"144\"\n :min=\"6\"\n class=\"input-full\"\n />\n </div>\n <div class=\"form-field\">\n <label class=\"form-label\" id=\"text-color-label\">{{\n $t(\"pdfTools.pageEditor.tools.color\")\n }}</label>\n <div\n class=\"color-swatches\"\n role=\"group\"\n aria-labelledby=\"text-color-label\"\n >\n <button\n v-for=\"swatch in TEXT_COLOR_SWATCHES\"\n :key=\"swatch.value\"\n type=\"button\"\n class=\"color-swatch\"\n :class=\"{ selected: textColor === swatch.value }\"\n :style=\"{ backgroundColor: swatch.value }\"\n :aria-label=\"$t(`pdfTools.pageEditor.colors.${swatch.name}`)\"\n :aria-pressed=\"textColor === swatch.value\"\n @click=\"textColor = swatch.value\"\n ></button>\n </div>\n <label class=\"color-custom\">\n <input\n v-model=\"textColor\"\n type=\"color\"\n class=\"color-custom-input\"\n />\n <span>{{ $t(\"pdfTools.pageEditor.colors.custom\") }}</span>\n </label>\n </div>\n </div>\n <PrimeDivider />\n <PrimeButton\n :disabled=\"overlayItems.length === 0\"\n severity=\"info\"\n class=\"btn-full btn-mt-auto\"\n icon=\"ri-check-line\"\n :label=\"$t('pdfTools.pageEditor.apply')\"\n @click=\"applyOverlayEdits\"\n />\n <PrimeButton\n :disabled=\"overlayItems.length === 0\"\n severity=\"warn\"\n class=\"btn-full btn-mt-sm\"\n icon=\"ri-arrow-go-back-line\"\n :label=\"$t('pdfTools.pageEditor.cancel')\"\n @click=\"undoOverlay\"\n />\n <PrimeButton\n v-if=\"selectedItemIndex >= 0\"\n severity=\"danger\"\n class=\"btn-full btn-mt-sm\"\n icon=\"ri-delete-bin-line\"\n :label=\"$t('pdfTools.pageEditor.deleteSelected')\"\n @click=\"deleteSelectedItem\"\n />\n </div>\n <div\n class=\"page-editor-canvas\"\n @wheel.passive=\"syncOverlaySize\"\n @scroll.passive=\"syncOverlaySize\"\n >\n <div ref=\"pdfCanvasWrapper\" class=\"pdf-canvas-wrapper\">\n <VuePDF\n v-if=\"pdf && (selectedPageForEdit || selectedPage)\"\n annotations\n :page=\"(selectedPageForEdit || selectedPage).pageNumber\"\n :pdf=\"pdf\"\n :scale=\"pageZoom\"\n :text=\"false\"\n class=\"pdf-canvas-absolute\"\n />\n <canvas\n ref=\"overlayCanvas\"\n class=\"overlay-canvas\"\n @dblclick=\"onOverlayDoubleClick\"\n @mousedown=\"onOverlayMouseDown\"\n @mouseleave=\"onOverlayMouseLeave\"\n @mousemove=\"onOverlayMouseMove\"\n @mouseup=\"onOverlayMouseUp\"\n />\n <textarea\n v-if=\"textEditor.visible\"\n ref=\"textEditorInput\"\n v-model=\"textEditor.value\"\n :aria-label=\"inlineEditorLabels.label\"\n :placeholder=\"inlineEditorLabels.placeholder\"\n :style=\"textEditorStyle\"\n class=\"text-editor-input\"\n @blur=\"commitTextEditor\"\n @keydown.ctrl.enter.prevent=\"commitTextEditor\"\n ></textarea>\n </div>\n </div>\n </div>\n\n <template #footer>\n <div class=\"editor-footer\">\n <small>{{ $t(\"pdfTools.pageEditor.footerHint\") }}</small>\n </div>\n </template>\n </PrimeDialog>\n\n <!-- Signature pad dialog -->\n <PrimeDialog\n v-model:visible=\"isSignaturePadVisible\"\n modal\n class=\"dialog-signature-pad\"\n @hide=\"onCloseSignaturePad\"\n >\n <template #header>\n <div class=\"dialog-header\">\n <i class=\"ri-ball-pen-line\" aria-hidden=\"true\" />\n <span>{{ $t(\"pdfTools.signaturePad.title\") }}</span>\n </div>\n </template>\n <div class=\"signature-pad\">\n <canvas\n ref=\"signaturePadCanvas\"\n class=\"signature-canvas\"\n @mousedown=\"sigDown\"\n @mouseleave=\"sigUp\"\n @mousemove=\"sigMove\"\n @mouseup=\"sigUp\"\n @touchstart.prevent=\"sigTouchDown\"\n @touchmove.prevent=\"sigTouchMove\"\n @touchend.prevent=\"sigUp\"\n ></canvas>\n </div>\n <template #footer>\n <div class=\"dialog-footer-buttons\">\n <PrimeButton\n text\n :label=\"$t('pdfTools.signaturePad.clear')\"\n @click=\"sigClear\"\n />\n <PrimeButton\n text\n :label=\"$t('pdfTools.signaturePad.use')\"\n @click=\"sigUse\"\n />\n </div>\n </template>\n </PrimeDialog>\n\n <SaveAsPopup\n :default-filename=\"defaultFilename\"\n :visible=\"isSaveAsPopupVisible\"\n :parent-folder-node=\"parentFolderNode\"\n @close=\"isSaveAsPopupVisible = false\"\n @save=\"handleSaveAs\"\n />\n <!-- Dialog: Insert PDF from Alfresco -->\n <PrimeDialog\n :visible=\"isInsertFromAlfrescoVisible\"\n modal\n :header=\"$t('pdfTools.insertFromAlfresco.title')\"\n class=\"dialog-insert-pdf\"\n @update:visible=\"isInsertFromAlfrescoVisible = false\"\n >\n <PrimeTabs :value=\"0\" @update:value=\"onTabChange\">\n <PrimeTabList>\n <PrimeTab :value=\"0\">{{\n $t(\"pdfTools.insertFromAlfresco.browse\")\n }}</PrimeTab>\n <PrimeTab :value=\"1\">{{\n $t(\"pdfTools.insertFromAlfresco.search\")\n }}</PrimeTab>\n <PrimeTab :value=\"2\">{{\n $t(\"pdfTools.insertFromAlfresco.favorites\")\n }}</PrimeTab>\n <PrimeTab :value=\"3\">{{\n $t(\"pdfTools.insertFromAlfresco.linkOrId\")\n }}</PrimeTab>\n </PrimeTabList>\n <PrimeTabPanels>\n <PrimeTabPanel :value=\"0\">\n <TreeExplorer\n showUserHome\n showFiles\n @selectNode=\"onNodeSelectedFromTree\"\n />\n </PrimeTabPanel>\n <PrimeTabPanel :value=\"1\">\n <div class=\"search-input-group\">\n <PrimeInputText\n v-model=\"searchQuery\"\n :placeholder=\"\n $t('pdfTools.insertFromAlfresco.searchPlaceholder')\n \"\n @keyup.enter=\"performSearch\"\n />\n <PrimeButton\n icon=\"ri-search-line\"\n :aria-label=\"$t('search')\"\n @click=\"performSearch\"\n />\n </div>\n <div v-if=\"searchLoading\" class=\"inline-status\">\n <PrimeProgressSpinner class=\"spinner-sm\" strokeWidth=\"8\" />\n <span>{{ $t(\"pdfTools.insertFromAlfresco.searching\") }}</span>\n </div>\n <div\n v-else-if=\"!searchResults.length && searchPerformed\"\n class=\"text-muted\"\n >\n {{ $t(\"pdfTools.insertFromAlfresco.noPdfFound\") }}\n </div>\n <div v-else-if=\"searchResults.length\" class=\"favorites-layout\">\n <div class=\"favorites-list\">\n <div\n v-for=\"item in searchResults\"\n :key=\"item.id\"\n class=\"favorite-item\"\n :class=\"{\n 'favorite-item-selected': selectedPdf?.id === item.id,\n }\"\n @click=\"selectPdf(item)\"\n >\n <div class=\"item-content\">\n <i class=\"ri-file-pdf-line\" aria-hidden=\"true\" />\n <span v-tooltip.top=\"item.name\" class=\"text-ellipsis\">{{\n item.name\n }}</span>\n </div>\n </div>\n </div>\n <div class=\"favorites-preview\">\n <div v-if=\"!selectedPdf\" class=\"preview-placeholder\">\n <i class=\"ri-file-pdf-line preview-icon\" aria-hidden=\"true\" />\n <p class=\"text-muted\">\n {{ $t(\"pdfTools.insertFromAlfresco.selectPdfToPreview\") }}\n </p>\n </div>\n <div v-else-if=\"previewLoading\" class=\"preview-placeholder\">\n <PrimeProgressSpinner class=\"spinner-md\" strokeWidth=\"6\" />\n <p class=\"text-muted\">\n {{ $t(\"pdfTools.insertFromAlfresco.loadingPreview\") }}\n </p>\n </div>\n <div v-else-if=\"previewPdf\" class=\"preview-wrapper\">\n <div v-if=\"previewNumPages > 0\" class=\"preview-controls\">\n <PrimeButton\n icon=\"ri-arrow-left-s-line\"\n :aria-label=\"$t('pdf.previousPage')\"\n text\n size=\"small\"\n :disabled=\"previewCurrentPage <= 1\"\n @click=\"previewPreviousPage\"\n />\n <span class=\"page-info\">\n {{ previewCurrentPage }} / {{ previewNumPages }}\n </span>\n <PrimeButton\n icon=\"ri-arrow-right-s-line\"\n :aria-label=\"$t('pdf.nextPage')\"\n text\n size=\"small\"\n :disabled=\"previewCurrentPage >= previewNumPages\"\n @click=\"previewNextPage\"\n />\n </div>\n <div class=\"preview-content\">\n <VuePDF\n :pdf=\"previewPdf\"\n :page=\"previewCurrentPage\"\n :scale=\"0.6\"\n :annotations=\"false\"\n :text=\"false\"\n />\n </div>\n </div>\n </div>\n </div>\n </PrimeTabPanel>\n <PrimeTabPanel :value=\"2\">\n <div v-if=\"favoritesLoading\" class=\"inline-status\">\n <PrimeProgressSpinner class=\"spinner-sm\" strokeWidth=\"8\" />\n <span>{{ $t(\"pdfTools.insertFromAlfresco.loading\") }}</span>\n </div>\n <div v-else-if=\"!favoritePdfs.length\" class=\"text-muted\">\n {{ $t(\"pdfTools.insertFromAlfresco.noPdfFavorite\") }}\n </div>\n <div v-else class=\"favorites-layout\">\n <div class=\"favorites-list\">\n <div\n v-for=\"fav in favoritePdfs\"\n :key=\"fav.id\"\n class=\"favorite-item\"\n :class=\"{\n 'favorite-item-selected': selectedPdf?.id === fav.id,\n }\"\n @click=\"selectPdf(fav)\"\n >\n <div class=\"item-content\">\n <i class=\"ri-file-pdf-line\" aria-hidden=\"true\" />\n <span v-tooltip.top=\"fav.name\" class=\"text-ellipsis\">{{\n fav.name\n }}</span>\n </div>\n </div>\n </div>\n <div class=\"favorites-preview\">\n <div v-if=\"!selectedPdf\" class=\"preview-placeholder\">\n <i class=\"ri-file-pdf-line preview-icon\" aria-hidden=\"true\" />\n <p class=\"text-muted\">\n {{ $t(\"pdfTools.insertFromAlfresco.selectPdfToPreview\") }}\n </p>\n </div>\n <div v-else-if=\"previewLoading\" class=\"preview-placeholder\">\n <PrimeProgressSpinner class=\"spinner-md\" strokeWidth=\"6\" />\n <p class=\"text-muted\">\n {{ $t(\"pdfTools.insertFromAlfresco.loadingPreview\") }}\n </p>\n </div>\n <div v-else-if=\"previewPdf\" class=\"preview-wrapper\">\n <div v-if=\"previewNumPages > 0\" class=\"preview-controls\">\n <PrimeButton\n icon=\"ri-arrow-left-s-line\"\n :aria-label=\"$t('pdf.previousPage')\"\n text\n size=\"small\"\n :disabled=\"previewCurrentPage <= 1\"\n @click=\"previewPreviousPage\"\n />\n <span class=\"page-info\">\n {{ previewCurrentPage }} / {{ previewNumPages }}\n </span>\n <PrimeButton\n icon=\"ri-arrow-right-s-line\"\n :aria-label=\"$t('pdf.nextPage')\"\n text\n size=\"small\"\n :disabled=\"previewCurrentPage >= previewNumPages\"\n @click=\"previewNextPage\"\n />\n </div>\n <div class=\"preview-content\">\n <VuePDF\n :pdf=\"previewPdf\"\n :page=\"previewCurrentPage\"\n :scale=\"0.6\"\n :annotations=\"false\"\n :text=\"false\"\n />\n </div>\n </div>\n </div>\n </div>\n </PrimeTabPanel>\n <PrimeTabPanel :value=\"3\">\n <div class=\"sidebar-form\">\n <div class=\"form-field\">\n <label for=\"alfrescoNodeId\">{{\n $t(\"pdfTools.insertFromAlfresco.alfrescoIdUrl\")\n }}</label>\n <PrimeInputText\n id=\"alfrescoNodeId\"\n v-model=\"insertAlfrescoInput\"\n :placeholder=\"\n $t('pdfTools.insertFromAlfresco.alfrescoIdUrlHint')\n \"\n />\n <small class=\"form-hint\">\n {{ $t(\"pdfTools.insertFromAlfresco.alfrescoIdUrlHint\") }}\n </small>\n </div>\n </div>\n </PrimeTabPanel>\n </PrimeTabPanels>\n </PrimeTabs>\n <template #footer>\n <div class=\"insert-footer\">\n <div class=\"insert-footer-info\">\n <div v-if=\"selectedPdf\" class=\"selected-info\">\n <span class=\"selected-label\">{{\n $t(\"pdfTools.insertFromAlfresco.selected\")\n }}</span>\n <span v-tooltip.top=\"selectedPdf?.name\" class=\"selected-name\">\n {{ selectedPdf?.name }}\n </span>\n </div>\n <div class=\"error-msg\" v-if=\"selectionErrorMsg\">\n {{ selectionErrorMsg }}\n </div>\n </div>\n <div class=\"insert-footer-actions\">\n <PrimeButton\n :label=\"$t('pdfTools.insertFromAlfresco.cancel')\"\n text\n @click=\"isInsertFromAlfrescoVisible = false\"\n />\n <PrimeButton\n :disabled=\"!canConfirmInsert\"\n :label=\"$t('pdfTools.insertFromAlfresco.insert')\"\n icon=\"ri-add-line\"\n @click=\"confirmInsertFromAlfresco\"\n />\n </div>\n </div>\n </template>\n </PrimeDialog>\n </div>\n</template>\n\n<script setup>\nimport { computed, nextTick, onMounted, onUnmounted, ref, watch } from \"vue\";\nimport {\n degrees,\n PDFDocument,\n rgb,\n RotationTypes,\n StandardFonts,\n} from \"pdf-lib\";\nimport { usePDF, VuePDF } from \"@tato30/vue-pdf\";\nimport { buildPdfSourceRef } from \"@/services/PdfConfigService.js\";\nimport \"@tato30/vue-pdf/style.css\";\nimport { VueDraggableNext } from \"vue-draggable-next\";\nimport { useI18n } from \"vue-i18n\";\nimport PrimeProgressSpinner from \"primevue/progressspinner\";\nimport PrimeMessage from \"primevue/message\";\nimport PrimeButton from \"primevue/button\";\nimport PrimeCheckbox from \"primevue/checkbox\";\nimport PrimeInputText from \"primevue/inputtext\";\nimport PrimeInputNumber from \"primevue/inputnumber\";\nimport PrimeSlider from \"primevue/slider\";\nimport PrimeFileUpload from \"primevue/fileupload\";\nimport PrimeDivider from \"primevue/divider\";\nimport PrimeSelect from \"primevue/select\";\nimport PrimeDialog from \"primevue/dialog\";\nimport PrimeTabs from \"primevue/tabs\";\nimport PrimeTabList from \"primevue/tablist\";\nimport PrimeTab from \"primevue/tab\";\nimport PrimeTabPanels from \"primevue/tabpanels\";\nimport PrimeTabPanel from \"primevue/tabpanel\";\nimport SaveAsPopup from \"@/components/pdfTools/SaveAsPopup.vue\";\nimport alfrescoFileService from \"@/services/AlfrescoFileService.js\";\nimport alfrescoNodeService from \"@/services/AlfrescoNodeService.js\";\nimport {\n addCommentAnnotation,\n readCommentAnnotations,\n removeCommentAnnotations,\n} from \"@/services/PdfCommentService.js\";\nimport { rasterizeRedactedPage } from \"@/services/PdfRedactionService.js\";\nimport {\n LINE_HEIGHT_RATIO,\n measureTextBlock,\n overlayPixelsPerPoint,\n pdfBaselineY,\n splitTextLines,\n} from \"@/services/PdfTextService.js\";\nimport { useFavoritesStore } from \"@/stores/favorites.js\";\nimport { useSearchStore } from \"@/stores/search\";\nimport TreeExplorer from \"@/components/TreeExplorer.vue\";\n\nconst { t } = useI18n();\n\nconst props = defineProps({\n toast: { type: Object, required: true },\n id: { type: String, required: true },\n // The host application decides where closing leads, so the button is only\n // offered when it opts in and handles the event\n closable: { type: Boolean, default: false },\n});\n\nconst emit = defineEmits([\"close\"]);\n\n// Raised by every document change, cleared once the document is saved\nconst hasUnsavedChanges = ref(false);\n\n/** Leave the editor, warning first when changes were never saved. */\nconst closeEditor = () => {\n if (hasUnsavedChanges.value && !window.confirm(t(\"pdfTools.closeUnsaved\"))) {\n return;\n }\n emit(\"close\");\n};\n\nconst pdfDoc = ref(null);\nconst originalPdfBytes = ref(null);\nconst pages = ref([]);\nconst isLoading = ref(true);\nconst error = ref(null);\nconst selectedPage = ref(null);\nconst selectedPages = ref([]);\n// Page editor modal state\nconst isPageEditorVisible = ref(false);\nconst selectedPageForEdit = ref(null);\nconst pageZoom = ref(1);\n// Overlay editing state for page editor\nconst EDITOR_TOOLS = {\n SELECT: \"select\",\n REDACT: \"redact\",\n HIGHLIGHT: \"highlight\",\n COMMENT: \"comment\",\n IMAGE: \"image\",\n SIGNATURE: \"signature\",\n TEXT: \"text\",\n};\n/** Size of a comment anchor, in overlay pixels. */\nconst COMMENT_ANCHOR_SIZE = 24;\nconst currentTool = ref(EDITOR_TOOLS.SELECT); // select | redact | highlight | comment | image | signature | text\nconst overlayItems = ref([]); // {type, rect: {x,y,w,h} in PDF px at current render size, payload?}\nconst overlayImageFile = ref(null);\nconst signatureImageBytes = ref(null);\nconst pdfCanvasWrapper = ref(null);\nconst overlayCanvas = ref(null);\nconst textEditorInput = ref(null);\n// Inline input, anchored on the point the user clicked, shared by the text\n// and comment tools\nconst textEditor = ref({\n visible: false,\n tool: null,\n x: 0,\n y: 0,\n value: \"\",\n index: -1,\n});\nconst isSignaturePadVisible = ref(false);\nconst signaturePadCanvas = ref(null);\nlet sigDrawing = false;\nlet sigLast = null;\nlet isDrawing = false;\nlet startPoint = null;\nconst watermarkText = ref(\"\");\nconst watermarkAngle = ref(-45);\nconst watermarkRepetitions = ref(5);\n// Text tool settings\nconst textFontOptions = [\n { label: \"Helvetica\", value: \"Helvetica\" },\n { label: \"Times New Roman\", value: \"TimesRoman\" },\n { label: \"Courier\", value: \"Courier\" },\n];\n/** Common colours offered before falling back to a free colour choice. */\nconst TEXT_COLOR_SWATCHES = [\n { name: \"black\", value: \"#000000\" },\n { name: \"white\", value: \"#ffffff\" },\n { name: \"red\", value: \"#e53935\" },\n { name: \"orange\", value: \"#fb8c00\" },\n { name: \"yellow\", value: \"#fdd835\" },\n { name: \"green\", value: \"#43a047\" },\n { name: \"blue\", value: \"#1e88e5\" },\n { name: \"purple\", value: \"#8e24aa\" },\n];\n\nconst textFont = ref(\"Helvetica\");\nconst textSize = ref(18);\nconst textColor = ref(\"#000000\");\nconst parentId = ref(null);\nconst isSaveAsPopupVisible = ref(false);\nconst saveAsAction = ref(null); // 'saveAs' or 'extract'\nconst defaultFilename = ref(\"\");\nconst currentFilename = ref(\"\");\nconst currentNode = ref(null);\nconst parentFolderNode = ref(null);\n\n// Insert from Alfresco dialog state\nconst isInsertFromAlfrescoVisible = ref(false);\nconst insertAlfrescoInput = ref(\"\");\nconst selectionErrorMsg = ref(\"\");\n\n// Insert dialog enhanced state\nconst selectedPdf = ref(null); // stores selected node entry {id, name, content?.mimeType}\nconst canConfirmInsert = computed(() => {\n if (insertAlfrescoInput.value && parseNodeId(insertAlfrescoInput.value)) {\n return true;\n }\n return !!(selectedPdf.value && selectedPdf.value.id);\n});\n\n// Search state\nconst searchQuery = ref(\"\");\nconst searchResults = ref([]);\nconst searchLoading = ref(false);\nconst searchPerformed = ref(false);\n\n// Favorites state\nconst favoritePdfs = ref([]);\nconst favoritesLoading = ref(false);\nconst previewLoading = ref(false);\nconst previewPdfUrl = ref(null);\nconst { pdf: previewPdf } = usePDF(buildPdfSourceRef(previewPdfUrl));\nconst previewCurrentPage = ref(1);\nconst previewNumPages = ref(0);\n\nconst pdfUrl = ref(null);\nconst { pdf } = usePDF(buildPdfSourceRef(pdfUrl));\n\nonMounted(() => {\n const nodeId = props.id;\n if (nodeId) {\n loadPdfFromAlfresco(nodeId);\n } else {\n error.value = t(\"pdfTools.loadError\");\n isLoading.value = false;\n }\n});\n\nconst isPageSelected = (page) => {\n return selectedPages.value.some((p) => p.pageIndex === page.pageIndex);\n};\n\nconst togglePageSelection = (page) => {\n selectedPage.value = page;\n const index = selectedPages.value.findIndex(\n (p) => p.pageIndex === page.pageIndex,\n );\n if (index > -1) {\n selectedPages.value.splice(index, 1);\n } else {\n selectedPages.value.push(page);\n }\n};\n\nconst loadPdfFromAlfresco = async (nodeId) => {\n isLoading.value = true;\n error.value = null;\n try {\n const node = await alfrescoNodeService.getNode(nodeId);\n currentNode.value = node;\n parentId.value = node.parentId;\n currentFilename.value =\n (node &&\n (node.name || (node.properties && node.properties[\"cm:name\"]))) ||\n \"\";\n\n const contentUrl = alfrescoFileService.getContentUrl(nodeId);\n pdfUrl.value = contentUrl;\n\n const response = await fetch(contentUrl);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const arrayBuffer = await response.arrayBuffer();\n originalPdfBytes.value = new Uint8Array(arrayBuffer);\n\n await updatePageList(originalPdfBytes.value);\n if (pages.value.length > 0) {\n selectedPage.value = pages.value[0];\n }\n } catch (err) {\n console.error(\"Error loading PDF from Alfresco:\", err);\n error.value = t(\"pdfTools.loadError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst updatePageList = async (pdfBytes) => {\n pdfDoc.value = await PDFDocument.load(pdfBytes);\n const pageCount = pdfDoc.value.getPageCount();\n pages.value = Array.from({ length: pageCount }, (_, i) => ({\n pageIndex: i,\n pageNumber: i + 1,\n }));\n};\n\n/**\n * Saves the modified PDF document, updates the component's state, and refreshes the PDF preview.\n * This avoids code duplication across multiple modification functions.\n * @param {PDFDocument} doc The modified pdf-lib document object.\n * @param {object} [options]\n * @param {boolean} [options.updatePages=true] Whether to regenerate the page list (e.g., after add/remove/reorder).\n */\nconst _updatePdfAndRefreshState = async (doc, { updatePages = true } = {}) => {\n const newPdfBytes = await doc.save();\n originalPdfBytes.value = newPdfBytes;\n hasUnsavedChanges.value = true;\n\n const blob = new Blob([newPdfBytes], { type: \"application/pdf\" });\n if (pdfUrl.value && pdfUrl.value.startsWith(\"blob:\")) {\n URL.revokeObjectURL(pdfUrl.value);\n }\n pdfUrl.value = URL.createObjectURL(blob);\n\n if (updatePages) {\n await updatePageList(newPdfBytes);\n }\n};\n\nconst onDragEnd = async () => {\n if (!originalPdfBytes.value) {\n return;\n }\n isLoading.value = true;\n try {\n const newPdfDoc = await PDFDocument.create();\n const pageIndices = pages.value.map((p) => p.pageIndex);\n\n const sourcePdf = await PDFDocument.load(originalPdfBytes.value);\n const copiedPages = await newPdfDoc.copyPages(sourcePdf, pageIndices);\n copiedPages.forEach((page) => newPdfDoc.addPage(page));\n\n await _updatePdfAndRefreshState(newPdfDoc);\n } catch (err) {\n console.error(\"Error reordering pages:\", err);\n error.value = t(\"pdfTools.reorderError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst rotatePage = async (pageElement) => {\n if (!originalPdfBytes.value) {\n return;\n }\n\n isLoading.value = true;\n try {\n const doc = await PDFDocument.load(originalPdfBytes.value);\n const page = doc.getPage(pageElement.pageIndex);\n const currentRotation = page.getRotation().angle;\n page.setRotation({\n type: RotationTypes.Degrees,\n angle: (currentRotation + 90) % 360,\n });\n\n // Page list does not need to be updated as the number of pages is unchanged\n await _updatePdfAndRefreshState(doc, { updatePages: false });\n } catch (err) {\n console.error(\"Error rotating page:\", err);\n error.value = t(\"pdfTools.rotateError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst extractPages = async () => {\n if (selectedPages.value.length === 0 || !originalPdfBytes.value) {\n return null;\n }\n const newPdfDoc = await PDFDocument.create();\n const sourcePdf = await PDFDocument.load(originalPdfBytes.value);\n const pageIndices = selectedPages.value\n .map((p) => p.pageIndex)\n .sort((a, b) => a - b);\n const copiedPages = await newPdfDoc.copyPages(sourcePdf, pageIndices);\n copiedPages.forEach((page) => newPdfDoc.addPage(page));\n return await newPdfDoc.save();\n};\n\nconst deleteSelectedPages = async () => {\n if (!originalPdfBytes.value || selectedPages.value.length === 0) {\n return;\n }\n if (selectedPages.value.length === pages.value.length) {\n props.toast.add({\n severity: \"warn\",\n summary: t(\"pdfTools.common.warning\"),\n detail: t(\"pdfTools.deleteAllPagesWarning\"),\n life: 3000,\n });\n return;\n }\n isLoading.value = true;\n try {\n const src = await PDFDocument.load(originalPdfBytes.value);\n const total = src.getPageCount();\n const toDelete = new Set(selectedPages.value.map((p) => p.pageIndex));\n const keepIndices = [];\n for (let i = 0; i < total; i++) {\n if (!toDelete.has(i)) {\n keepIndices.push(i);\n }\n }\n const newDoc = await PDFDocument.create();\n const copied = await newDoc.copyPages(src, keepIndices);\n copied.forEach((p) => newDoc.addPage(p));\n\n await _updatePdfAndRefreshState(newDoc);\n selectedPages.value = [];\n\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.deleted\"),\n detail: t(\"pdfTools.pagesDeletedSuccess\"),\n life: 3000,\n });\n } catch (err) {\n console.error(\"Error deleting pages:\", err);\n error.value = t(\"pdfTools.deletePagesError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst openInsertFromAlfrescoDialog = async () => {\n insertAlfrescoInput.value = \"\";\n selectedPdf.value = null;\n selectionErrorMsg.value = \"\";\n isInsertFromAlfrescoVisible.value = true;\n};\n\nconst onTabChange = (tabValue) => {\n // Load favorites when switching to favorites tab (value 2: Browse=0, Search=1, Favorites=2)\n if (\n tabValue === 2 &&\n favoritePdfs.value.length === 0 &&\n !favoritesLoading.value\n ) {\n loadFavorites();\n }\n};\n\nconst confirmInsertFromAlfresco = async () => {\n let nodeId = null;\n if (selectedPdf.value?.id) {\n nodeId = selectedPdf.value.id;\n } else if (insertAlfrescoInput.value) {\n nodeId = parseNodeId(insertAlfrescoInput.value);\n }\n if (!nodeId) {\n props.toast.add({\n severity: \"warn\",\n summary: t(\"pdfTools.common.warning\"),\n detail: t(\"pdfTools.insertFromAlfresco.invalidInput\"),\n life: 3000,\n });\n return;\n }\n await insertPdfFromAlfresco(nodeId);\n isInsertFromAlfrescoVisible.value = false;\n};\n\nconst parseNodeId = (text) => {\n if (!text) {\n return null;\n }\n const trimmed = text.trim();\n // Direct ID (UUID-like)\n if (/^[0-9a-fA-F-]{20,}$/.test(trimmed)) {\n return trimmed;\n }\n // workspace://SpacesStore/<id>\n const ws = trimmed.match(/workspace:\\/\\/SpacesStore\\/([0-9a-fA-F-]{20,})/);\n if (ws && ws[1]) {\n return ws[1];\n }\n // URLs like .../nodes/<id> or routes containing the id in path\n const inNodes = trimmed.match(\n /\\b(nodes|preview|renditions|content)\\/?([0-9a-fA-F-]{20,})\\b/,\n );\n if (inNodes && inNodes[2]) {\n return inNodes[2];\n }\n // Hash routes e.g. .../#/pdf-tools/<id> or .../#/consultation-pdf/<id>\n const hash = trimmed.match(\n /#\\/(?:pdf-tools|consultation-pdf|edit-collabora)\\/([0-9a-fA-F-]{20,})/,\n );\n if (hash && hash[1]) {\n return hash[1];\n }\n // Fallback: try to find a 32+ hex segment\n const generic = trimmed.match(/([0-9a-fA-F]{20,})/);\n if (generic && generic[1]) {\n return generic[1];\n }\n return null;\n};\n\nconst selectPdf = async (node) => {\n if (node?.content?.mimeType !== \"application/pdf\") {\n return;\n }\n selectedPdf.value = node;\n selectionErrorMsg.value = \"\"; // Clear any previous error message\n\n // Load preview and reset to first page\n if (node?.id) {\n previewLoading.value = true;\n previewCurrentPage.value = 1;\n previewNumPages.value = 0; // Reset while loading\n try {\n const contentUrl = alfrescoFileService.getContentUrl(node.id);\n // Revoke old preview URL if exists\n if (previewPdfUrl.value && previewPdfUrl.value.startsWith(\"blob:\")) {\n URL.revokeObjectURL(previewPdfUrl.value);\n }\n previewPdfUrl.value = contentUrl;\n } catch (err) {\n console.error(\"Error loading PDF preview:\", err);\n previewPdfUrl.value = null;\n } finally {\n previewLoading.value = false;\n }\n }\n};\n\nconst previewNextPage = () => {\n if (previewCurrentPage.value < previewNumPages.value) {\n previewCurrentPage.value++;\n }\n};\n\nconst previewPreviousPage = () => {\n if (previewCurrentPage.value > 1) {\n previewCurrentPage.value--;\n }\n};\n\nconst onNodeSelectedFromTree = (nodeData) => {\n selectionErrorMsg.value = \"\";\n if (nodeData.isFolder) {\n selectedPdf.value = null;\n selectionErrorMsg.value = t(\n \"pdfTools.insertFromAlfresco.folderSelectError\",\n );\n } else if (nodeData.content?.mimeType !== \"application/pdf\") {\n selectedPdf.value = null;\n selectionErrorMsg.value = t(\n \"pdfTools.insertFromAlfresco.fileTypeNotAllowedError\",\n );\n } else {\n selectPdf(nodeData);\n }\n};\n\nconst performSearch = async () => {\n searchPerformed.value = true;\n if (!searchQuery.value || searchQuery.value.trim().length < 2) {\n searchResults.value = [];\n return;\n }\n searchLoading.value = true;\n try {\n // Use search store for a simple query, then filter to PDFs\n const store = useSearchStore();\n await store.queryStore(searchQuery.value);\n const entries = store.entries.map((e) => e.entry || e); // store shape\n searchResults.value = entries.filter(\n (e) => e.isFile && e.content?.mimeType === \"application/pdf\",\n );\n } catch (e) {\n console.error(\"performSearch\", e);\n searchResults.value = [];\n } finally {\n searchLoading.value = false;\n }\n};\n\nconst loadFavorites = async () => {\n favoritesLoading.value = true;\n try {\n const favoritesStore = useFavoritesStore();\n await favoritesStore.loadFavorites();\n\n // Filter to keep only PDFs and extract the file object\n favoritePdfs.value = favoritesStore.fileFavorites\n .filter(\n (fav) => fav?.target?.file?.content?.mimeType === \"application/pdf\",\n )\n .map((fav) => fav.target.file);\n } catch (e) {\n console.error(\"loadFavorites error:\", e);\n favoritePdfs.value = [];\n } finally {\n favoritesLoading.value = false;\n }\n};\n\nconst insertPdfFromAlfresco = async (nodeId) => {\n if (!originalPdfBytes.value) {\n return;\n }\n isLoading.value = true;\n try {\n // Optionally verify node and ensure mimeType is PDF\n const node = await alfrescoNodeService.getNode(nodeId);\n if (node.content?.mimeType !== \"application/pdf\") {\n throw new Error(t(\"pdfTools.invalidNodeForInsert\"));\n }\n const contentBlob = await alfrescoNodeService.getNodeContent(nodeId);\n const arrayBuffer = await contentBlob.arrayBuffer();\n const otherBytes = new Uint8Array(arrayBuffer);\n\n const current = await PDFDocument.load(originalPdfBytes.value);\n const other = await PDFDocument.load(otherBytes);\n const count = other.getPageCount();\n const importIndices = Array.from({ length: count }, (_, i) => i);\n const copied = await current.copyPages(other, importIndices);\n copied.forEach((p) => current.addPage(p));\n\n await _updatePdfAndRefreshState(current);\n selectedPages.value = [];\n\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.success\"),\n detail: t(\"pdfTools.insertFromPristySuccess\", { count }),\n life: 3000,\n });\n } catch (err) {\n console.error(\"Error inserting from Alfresco:\", err);\n error.value = err?.message || t(\"pdfTools.insertFromPristyError\");\n props.toast.add({\n severity: \"error\",\n summary: t(\"pdfTools.common.error\"),\n detail: error.value,\n life: 4000,\n });\n } finally {\n isLoading.value = false;\n }\n};\n\nconst onInsertPdfSelect = async (e) => {\n const file = e.files?.[0];\n if (!file) {\n return;\n }\n await insertPdfFile(file);\n};\n\nconst insertPdfFile = async (file) => {\n if (!originalPdfBytes.value) {\n return;\n }\n isLoading.value = true;\n try {\n const current = await PDFDocument.load(originalPdfBytes.value);\n const otherBytes = new Uint8Array(await file.arrayBuffer());\n const other = await PDFDocument.load(otherBytes);\n const count = other.getPageCount();\n const importIndices = Array.from({ length: count }, (_, i) => i);\n const copied = await current.copyPages(other, importIndices);\n copied.forEach((p) => current.addPage(p));\n\n await _updatePdfAndRefreshState(current);\n selectedPages.value = [];\n\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.success\"),\n detail: t(\"pdfTools.insertFromFileSuccess\", { count }),\n life: 3000,\n });\n } catch (err) {\n console.error(\"Error inserting PDF:\", err);\n error.value = t(\"pdfTools.insertError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst addWatermark = async () => {\n if (\n !watermarkText.value ||\n selectedPages.value.length === 0 ||\n !originalPdfBytes.value\n ) {\n return;\n }\n\n isLoading.value = true;\n try {\n const doc = await PDFDocument.load(originalPdfBytes.value);\n const pageIndices = selectedPages.value.map((p) => p.pageIndex);\n\n for (const pageIndex of pageIndices) {\n const page = doc.getPage(pageIndex);\n const { width, height } = page.getSize();\n\n for (let i = 0; i < watermarkRepetitions.value; i++) {\n page.drawText(watermarkText.value, {\n x: (width / (watermarkRepetitions.value + 1)) * (i + 1) - 150,\n y: (height / (watermarkRepetitions.value + 1)) * (i + 1),\n size: 50,\n color: rgb(0.95, 0.1, 0.1),\n opacity: 0.5,\n rotate: degrees(watermarkAngle.value),\n });\n }\n }\n\n await _updatePdfAndRefreshState(doc, { updatePages: false });\n } catch (err) {\n console.error(\"Error adding watermark:\", err);\n error.value = t(\"pdfTools.watermarkError\");\n } finally {\n isLoading.value = false;\n }\n};\n\nconst saveChanges = async () => {\n if (!originalPdfBytes.value) {\n return;\n }\n isLoading.value = true;\n try {\n const blob = new Blob([originalPdfBytes.value], {\n type: \"application/pdf\",\n });\n const file = new File([blob], \"modified.pdf\", { type: \"application/pdf\" });\n const opts = {\n majorVersion: true,\n comment: \"File modified via Pristy Espaces PDF tools\",\n };\n await alfrescoNodeService.updateContentNode(props.id, file, opts);\n hasUnsavedChanges.value = false;\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.success\"),\n detail: t(\"pdfTools.saveSuccess\"),\n life: 3000,\n });\n } catch (err) {\n console.error(\"Error saving changes:\", err);\n props.toast.add({\n severity: \"error\",\n summary: t(\"pdfTools.common.error\"),\n detail: t(\"pdfTools.saveError\"),\n life: 3000,\n });\n } finally {\n isLoading.value = false;\n }\n};\n\nconst openSaveAsPopup = async (action) => {\n saveAsAction.value = action;\n defaultFilename.value = t(\"pdfTools.saveAs.defaultFilename\");\n if (currentNode.value && currentNode.value.parentId) {\n try {\n parentFolderNode.value = await alfrescoNodeService.getNode(\n currentNode.value.parentId,\n );\n } catch (e) {\n console.error(\"Could not fetch parent node for Save As dialog\", e);\n parentFolderNode.value = null;\n }\n } else {\n parentFolderNode.value = null;\n }\n\n isSaveAsPopupVisible.value = true;\n};\n\nconst handleSaveAs = async ({ filename, folderId }) => {\n isSaveAsPopupVisible.value = false;\n isLoading.value = true;\n try {\n let pdfBytesToSave;\n if (saveAsAction.value === \"extract\") {\n pdfBytesToSave = await extractPages();\n } else {\n pdfBytesToSave = originalPdfBytes.value;\n }\n\n if (!pdfBytesToSave) {\n throw new Error(t(\"pdfTools.noContentToSave\"));\n }\n\n const blob = new Blob([pdfBytesToSave], { type: \"application/pdf\" });\n const file = new File([blob], filename, { type: \"application/pdf\" });\n\n if (!folderId) {\n throw new Error(\"No destination folder selected.\");\n }\n\n await alfrescoFileService.uploadFile(folderId, {}, file);\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.success\"),\n detail: t(\"pdfTools.fileCreatedSuccess\", { filename }),\n life: 3000,\n });\n } catch (err) {\n console.error(`Error during \"Save As\":`, err);\n const detail =\n err.status === 409\n ? t(\"pdfTools.saveAs.conflictError\")\n : t(\"pdfTools.saveAsError\");\n\n props.toast.add({\n severity: \"error\",\n summary: t(\"pdfTools.common.error\"),\n detail,\n life: 4000,\n });\n } finally {\n isLoading.value = false;\n }\n};\n/**\n * Load the comments the document already carries as regular overlay items, so\n * they can be selected, moved, edited and deleted like the ones just placed.\n * They are rewritten from the overlay on every apply.\n */\nconst loadExistingComments = async () => {\n const page = selectedPageForEdit.value;\n overlayItems.value = overlayItems.value.filter(\n (item) => item.type !== EDITOR_TOOLS.COMMENT,\n );\n if (!originalPdfBytes.value || !page) {\n drawOverlay();\n return;\n }\n try {\n // Read from the current bytes rather than pdfDoc, which is only refreshed\n // when the page list changes\n const doc = await PDFDocument.load(originalPdfBytes.value);\n const pxPerPoint = overlayScale();\n const pageHeightPt = currentPageHeightPt.value;\n for (const comment of readCommentAnnotations(doc.getPage(page.pageIndex))) {\n overlayItems.value.push({\n type: EDITOR_TOOLS.COMMENT,\n rect: {\n x: comment.x * pxPerPoint,\n // PDF coordinates start from the bottom, the overlay from the top\n y: (pageHeightPt - (comment.y + comment.size)) * pxPerPoint,\n w: comment.size * pxPerPoint,\n h: comment.size * pxPerPoint,\n },\n payload: { text: comment.text },\n });\n }\n } catch (err) {\n console.error(\"Error reading existing comments:\", err);\n }\n drawOverlay();\n};\n\nconst openPageEditor = (page) => {\n selectedPageForEdit.value = page || selectedPage.value;\n isPageEditorVisible.value = true;\n pageZoom.value = 1;\n overlayItems.value = [];\n selectedItemIndex.value = -1;\n // Comments are positioned in overlay pixels, so the canvas must be sized first\n setTimeout(() => {\n syncOverlaySize();\n loadExistingComments();\n }, 200);\n};\n\nconst closePageEditor = () => {\n isPageEditorVisible.value = false;\n selectedPageForEdit.value = null;\n};\n\nconst zoomIn = () => {\n pageZoom.value = Math.min(4, pageZoom.value + 0.1);\n};\n\nconst zoomOut = () => {\n pageZoom.value = Math.max(0.2, pageZoom.value - 0.1);\n};\n\n// Overlay helpers and tools\nconst setTool = (tool) => {\n if (tool === EDITOR_TOOLS.REDACT) {\n const ok = window.confirm(t(\"pdfTools.redactWarning\"));\n if (ok) {\n currentTool.value = tool;\n }\n } else {\n currentTool.value = tool;\n }\n};\n\nconst onOverlayImageSelect = (e) => {\n overlayImageFile.value = e.files?.[0] || null;\n if (overlayImageFile.value) {\n // Clear previous signature bytes so real image takes precedence\n signatureImageBytes.value = null;\n currentTool.value = EDITOR_TOOLS.IMAGE;\n }\n};\n\nconst openSignaturePad = () => {\n isSignaturePadVisible.value = true;\n};\n\nconst undoOverlay = () => {\n overlayItems.value.pop();\n selectedItemIndex.value = -1;\n drawOverlay();\n};\n\n// Ensure an image/signature overlay has a preview bitmap to draw on the overlay canvas\nconst ensureItemPreview = async (item) => {\n if (\n !item ||\n item.type !== EDITOR_TOOLS.IMAGE ||\n item._loading ||\n item._bitmap\n ) {\n return;\n }\n item._loading = true;\n try {\n let sourceBlob = null;\n if (item.payload?.file) {\n // File is already a Blob\n sourceBlob = item.payload.file;\n } else if (item.payload?.signature) {\n // Signature bytes are PNG by construction of the signature pad\n sourceBlob = new Blob([new Uint8Array(item.payload.signature)], {\n type: \"image/png\",\n });\n }\n if (sourceBlob) {\n item._bitmap = await createImageBitmap(sourceBlob);\n // Redraw to show the image once loaded\n drawOverlay();\n }\n } catch (e) {\n console.warn(t(\"pdfTools.imagePreviewUnavailable\"), e);\n } finally {\n item._loading = false;\n }\n};\n\nconst getPdfCanvas = () => {\n const wrapper = pdfCanvasWrapper.value;\n if (!wrapper) {\n return null;\n }\n const canvases = Array.from(wrapper.querySelectorAll(\"canvas\"));\n if (canvases.length === 0) {\n return null;\n }\n // Choose the visible canvas with the largest area (VuePDF can create several)\n const visible = canvases.filter(\n (c) => c.offsetParent !== null && c.width > 0 && c.height > 0,\n );\n const list = visible.length ? visible : canvases;\n let best = list[0];\n let bestArea = 0;\n for (const c of list) {\n const r = c.getBoundingClientRect();\n const area = Math.max(0, r.width) * Math.max(0, r.height);\n if (area > bestArea) {\n best = c;\n bestArea = area;\n }\n }\n return best;\n};\n\nconst syncOverlaySize = () => {\n const base = getPdfCanvas();\n if (!base || !overlayCanvas.value) {\n return;\n }\n const rect = base.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n // overlay is absolutely positioned with inset:0 in CSS; avoid manual left/top to prevent offsets\n overlayCanvas.value.style.width = rect.width + \"px\";\n overlayCanvas.value.style.height = rect.height + \"px\";\n // Use DPR to keep overlay crisp\n overlayCanvas.value.width = Math.round(rect.width * dpr);\n overlayCanvas.value.height = Math.round(rect.height * dpr);\n drawOverlay();\n};\n\nconst toCanvasPoint = (evt) => {\n const canvasEl = overlayCanvas.value;\n if (!canvasEl) {\n return { x: 0, y: 0 };\n }\n const rect = canvasEl.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n return {\n x: (evt.clientX - rect.left) * dpr,\n y: (evt.clientY - rect.top) * dpr,\n };\n};\n\nlet draggingIndex = null;\nlet dragStart = null;\nlet resizingIndex = null;\nlet resizeCorner = null;\n\n/** Width of the edited page, in PDF points. */\nconst currentPageWidthPt = computed(() => {\n const page = selectedPageForEdit.value || selectedPage.value;\n if (!pdfDoc.value || !page) {\n return 0;\n }\n try {\n return pdfDoc.value.getPage(page.pageIndex).getSize().width;\n } catch (_) {\n return 0;\n }\n});\n\n/** Height of the edited page, in PDF points. */\nconst currentPageHeightPt = computed(() => {\n const page = selectedPageForEdit.value || selectedPage.value;\n if (!pdfDoc.value || !page) {\n return 0;\n }\n try {\n return pdfDoc.value.getPage(page.pageIndex).getSize().height;\n } catch (_) {\n return 0;\n }\n});\n\n/**\n * Overlay pixels per PDF point. Font sizes are stored in points, so the\n * preview has to convert them for the current zoom and device pixel ratio.\n */\nconst overlayScale = () =>\n overlayPixelsPerPoint({\n overlayWidth: overlayCanvas.value?.width || 0,\n pageWidthPt: currentPageWidthPt.value,\n });\n\nconst textFontPx = (payload) =>\n Math.max(1, (Number(payload?.size) || 18) * overlayScale());\n\n/** Box occupied by a text item, in overlay pixels. */\nconst measureTextItem = (text, payload) => {\n const ctx = overlayCanvas.value.getContext(\"2d\");\n const fontPx = textFontPx(payload);\n ctx.save();\n ctx.font = `${fontPx}px ${payload.font || \"Helvetica\"}`;\n const bounds = measureTextBlock({\n lines: splitTextLines(text),\n fontSize: fontPx,\n measureLine: (line) => ctx.measureText(line).width,\n });\n ctx.restore();\n return bounds;\n};\n\nconst textEditorStyle = computed(() => {\n const dpr = window.devicePixelRatio || 1;\n if (textEditor.value.tool === EDITOR_TOOLS.COMMENT) {\n // A comment carries no font size of its own in the page\n return {\n left: `${textEditor.value.x / dpr}px`,\n top: `${textEditor.value.y / dpr}px`,\n };\n }\n const payload =\n textEditor.value.index >= 0\n ? overlayItems.value[textEditor.value.index]?.payload\n : { size: textSize.value, font: textFont.value, color: textColor.value };\n const fontPx = textFontPx(payload) / dpr;\n return {\n left: `${textEditor.value.x / dpr}px`,\n top: `${textEditor.value.y / dpr}px`,\n font: `${fontPx}px ${payload?.font || \"Helvetica\"}`,\n lineHeight: LINE_HEIGHT_RATIO,\n color: payload?.color || \"#000000\",\n };\n});\n\n/** Index of the overlay item the panel and the selection frame act on. */\nconst selectedItemIndex = ref(-1);\n// Guards the panel -> item watcher while the panel is loaded from an item\nlet isSyncingTextPanel = false;\n\n/** The panel serves both placing a new text and editing the selected one. */\nconst isTextPanelVisible = computed(\n () =>\n currentTool.value === EDITOR_TOOLS.TEXT ||\n overlayItems.value[selectedItemIndex.value]?.type === EDITOR_TOOLS.TEXT,\n);\n\nconst selectItem = (index) => {\n selectedItemIndex.value = index;\n const item = overlayItems.value[index];\n if (item?.type === EDITOR_TOOLS.TEXT) {\n isSyncingTextPanel = true;\n textFont.value = item.payload?.font || \"Helvetica\";\n textSize.value = Number(item.payload?.size) || 18;\n textColor.value = item.payload?.color || \"#000000\";\n nextTick(() => {\n isSyncingTextPanel = false;\n });\n }\n drawOverlay();\n};\n\n// Changing the font, size or colour applies to the selected text right away\nwatch([textFont, textSize, textColor], () => {\n if (isSyncingTextPanel) {\n return;\n }\n const index = selectedItemIndex.value;\n const item = overlayItems.value[index];\n if (!item || item.type !== EDITOR_TOOLS.TEXT) {\n return;\n }\n const payload = {\n ...item.payload,\n font: textFont.value,\n size: textSize.value,\n color: textColor.value,\n };\n overlayItems.value[index] = {\n ...item,\n payload,\n rect: {\n x: item.rect.x,\n y: item.rect.y,\n ...measureTextItem(payload.text, payload),\n },\n };\n drawOverlay();\n});\n\n/** Remove the selected item, whichever tool created it. */\nconst deleteSelectedItem = () => {\n const index = selectedItemIndex.value;\n if (index < 0 || !overlayItems.value[index]) {\n return;\n }\n overlayItems.value.splice(index, 1);\n selectedItemIndex.value = -1;\n drawOverlay();\n};\n\n/**\n * Escape leaves the current tool rather than closing the whole editor: it\n * drops the text being typed, clears the selection and falls back to the\n * default tool.\n */\nconst onEditorKeyDown = (e) => {\n if (e.key === \"Escape\") {\n if (textEditor.value.visible) {\n cancelTextEditor();\n }\n selectedItemIndex.value = -1;\n currentTool.value = EDITOR_TOOLS.SELECT;\n drawOverlay();\n return;\n }\n // Delete must stay a plain keystroke while the user is typing\n const typing =\n textEditor.value.visible ||\n [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(e.target?.tagName);\n if (e.key === \"Delete\" && !typing) {\n deleteSelectedItem();\n }\n};\n\nwatch(isPageEditorVisible, (visible) => {\n if (visible) {\n document.addEventListener(\"keydown\", onEditorKeyDown);\n } else {\n document.removeEventListener(\"keydown\", onEditorKeyDown);\n }\n});\n\nonUnmounted(() => document.removeEventListener(\"keydown\", onEditorKeyDown));\n\n/** Wording of the inline input, which serves two different tools. */\nconst inlineEditorLabels = computed(() =>\n textEditor.value.tool === EDITOR_TOOLS.COMMENT\n ? {\n label: t(\"pdfTools.pageEditor.tools.comment\"),\n placeholder: t(\"pdfTools.pageEditor.commentPlaceholder\"),\n }\n : {\n label: t(\"pdfTools.pageEditor.textInputLabel\"),\n placeholder: t(\"pdfTools.pageEditor.textInputPlaceholder\"),\n },\n);\n\nconst openInlineEditor = (point, tool, index = -1) => {\n const existing = index >= 0 ? overlayItems.value[index] : null;\n textEditor.value = {\n visible: true,\n tool,\n x: existing ? existing.rect.x : point.x,\n y: existing ? existing.rect.y : point.y,\n value: existing ? String(existing.payload?.text || \"\") : \"\",\n index,\n };\n drawOverlay();\n nextTick(() => textEditorInput.value?.focus());\n};\n\nconst cancelTextEditor = () => {\n textEditor.value = { ...textEditor.value, visible: false, index: -1 };\n drawOverlay();\n};\n\n/** Turn the inline input into an overlay item, or drop it when left empty. */\nconst commitTextEditor = () => {\n if (!textEditor.value.visible) {\n return;\n }\n const { value: text, index, x, y, tool } = textEditor.value;\n textEditor.value = { ...textEditor.value, visible: false, index: -1 };\n if (!text.trim()) {\n if (index >= 0) {\n overlayItems.value.splice(index, 1);\n }\n drawOverlay();\n return;\n }\n if (tool === EDITOR_TOOLS.COMMENT) {\n const comment = {\n type: EDITOR_TOOLS.COMMENT,\n rect: { x, y, w: COMMENT_ANCHOR_SIZE, h: COMMENT_ANCHOR_SIZE },\n payload: { text },\n };\n if (index >= 0) {\n overlayItems.value[index] = {\n ...overlayItems.value[index],\n payload: { text },\n };\n } else {\n overlayItems.value.push(comment);\n }\n selectedItemIndex.value =\n index >= 0 ? index : overlayItems.value.length - 1;\n drawOverlay();\n return;\n }\n const payload =\n index >= 0\n ? { ...overlayItems.value[index].payload, text }\n : {\n text,\n font: textFont.value,\n size: textSize.value,\n color: textColor.value,\n };\n const rect = { x, y, ...measureTextItem(text, payload) };\n if (index >= 0) {\n overlayItems.value[index] = {\n ...overlayItems.value[index],\n rect,\n payload,\n };\n } else {\n overlayItems.value.push({ type: EDITOR_TOOLS.TEXT, rect, payload });\n }\n selectedItemIndex.value = index >= 0 ? index : overlayItems.value.length - 1;\n drawOverlay();\n};\n\nconst onOverlayDoubleClick = (e) => {\n const p = toCanvasPoint(e);\n const idx = hitTest(p);\n const type = idx !== -1 ? overlayItems.value[idx].type : null;\n if (type === EDITOR_TOOLS.TEXT || type === EDITOR_TOOLS.COMMENT) {\n openInlineEditor(p, type, idx);\n }\n};\n\nconst hitTest = (p) => {\n // iterate backwards so top-most wins\n for (let i = overlayItems.value.length - 1; i >= 0; i--) {\n const r = overlayItems.value[i].rect;\n if (p.x >= r.x && p.x <= r.x + r.w && p.y >= r.y && p.y <= r.y + r.h) {\n return i;\n }\n }\n return -1;\n};\n\nconst hitTestHandle = (p) => {\n const dpr = window.devicePixelRatio || 1;\n const s = 6 * dpr;\n const half = s / 2;\n for (let i = overlayItems.value.length - 1; i >= 0; i--) {\n const it = overlayItems.value[i];\n // Text is anchored on a point and sized by its content, so it has no\n // resize handles\n if (it.type !== EDITOR_TOOLS.IMAGE) {\n continue;\n }\n const r = it.rect;\n const corners = [\n { key: \"tl\", x: r.x, y: r.y },\n { key: \"tr\", x: r.x + r.w, y: r.y },\n { key: \"bl\", x: r.x, y: r.y + r.h },\n { key: \"br\", x: r.x + r.w, y: r.y + r.h },\n ];\n for (const c of corners) {\n if (\n p.x >= c.x - half &&\n p.x <= c.x + half &&\n p.y >= c.y - half &&\n p.y <= c.y + half\n ) {\n return { idx: i, corner: c.key };\n }\n }\n }\n return null;\n};\n\nconst onOverlayMouseDown = (e) => {\n if (textEditor.value.visible) {\n commitTextEditor();\n }\n if (\n currentTool.value === EDITOR_TOOLS.REDACT ||\n currentTool.value === EDITOR_TOOLS.HIGHLIGHT\n ) {\n isDrawing = true;\n startPoint = toCanvasPoint(e);\n } else if (\n currentTool.value === EDITOR_TOOLS.IMAGE ||\n currentTool.value === EDITOR_TOOLS.SELECT ||\n currentTool.value === EDITOR_TOOLS.TEXT ||\n currentTool.value === EDITOR_TOOLS.COMMENT\n ) {\n // If clicking on an existing image item, start dragging instead of creating a new one\n const p = toCanvasPoint(e);\n // Check resize handles first\n const handleHit = hitTestHandle(p);\n if (handleHit) {\n resizingIndex = handleHit.idx;\n resizeCorner = handleHit.corner;\n dragStart = { p, rect: { ...overlayItems.value[handleHit.idx].rect } };\n if (overlayCanvas.value) {\n overlayCanvas.value.style.cursor = \"nwse-resize\";\n }\n return;\n }\n const idx = hitTest(p);\n if (\n idx !== -1 &&\n (overlayItems.value[idx].type === EDITOR_TOOLS.IMAGE ||\n overlayItems.value[idx].type === EDITOR_TOOLS.TEXT ||\n overlayItems.value[idx].type === EDITOR_TOOLS.COMMENT)\n ) {\n selectItem(idx);\n draggingIndex = idx;\n dragStart = { p, rect: { ...overlayItems.value[idx].rect } };\n if (overlayCanvas.value) {\n overlayCanvas.value.style.cursor = \"move\";\n }\n return;\n }\n selectedItemIndex.value = -1;\n if (\n currentTool.value === EDITOR_TOOLS.TEXT ||\n currentTool.value === EDITOR_TOOLS.COMMENT\n ) {\n // Stop the browser from moving the focus out of the input we are about\n // to open and focus\n e.preventDefault();\n openInlineEditor(p, currentTool.value);\n return;\n }\n if (currentTool.value === EDITOR_TOOLS.IMAGE) {\n // Only create a new image when the image tool is active and a source is provided\n if (!overlayImageFile.value && !signatureImageBytes.value) {\n return;\n }\n // creation of a new image rectangle\n const newItem = {\n type: EDITOR_TOOLS.IMAGE,\n rect: { x: p.x, y: p.y, w: 150, h: 100 },\n payload: {\n file: overlayImageFile.value,\n signature: signatureImageBytes.value,\n },\n };\n overlayItems.value.push(newItem);\n // kick off async preview loading\n ensureItemPreview(newItem);\n drawOverlay();\n // After adding an image, deselect the tool and clear sources to avoid re-adding the same image\n currentTool.value = EDITOR_TOOLS.SELECT;\n overlayImageFile.value = null;\n signatureImageBytes.value = null;\n }\n }\n};\n\nconst onOverlayMouseMove = (e) => {\n // Resizing via handle\n if (resizingIndex !== null && resizeCorner) {\n const p = toCanvasPoint(e);\n const item = overlayItems.value[resizingIndex];\n if (item) {\n const r0 = dragStart.rect;\n let x = r0.x;\n let y = r0.y;\n let w = r0.w;\n let h = r0.h;\n const dx = p.x - dragStart.p.x;\n const dy = p.y - dragStart.p.y;\n if (resizeCorner === \"br\") {\n w = Math.max(10, r0.w + dx);\n h = Math.max(10, r0.h + dy);\n } else if (resizeCorner === \"tr\") {\n w = Math.max(10, r0.w + dx);\n h = Math.max(10, r0.h - dy);\n y = r0.y + dy;\n } else if (resizeCorner === \"bl\") {\n w = Math.max(10, r0.w - dx);\n x = r0.x + dx;\n h = Math.max(10, r0.h + dy);\n } else if (resizeCorner === \"tl\") {\n w = Math.max(10, r0.w - dx);\n x = r0.x + dx;\n h = Math.max(10, r0.h - dy);\n y = r0.y + dy;\n }\n item.rect.x = x;\n item.rect.y = y;\n item.rect.w = w;\n item.rect.h = h;\n drawOverlay();\n }\n return;\n }\n // Dragging existing item\n if (draggingIndex !== null) {\n const p = toCanvasPoint(e);\n const item = overlayItems.value[draggingIndex];\n if (item) {\n const dx = p.x - dragStart.p.x;\n const dy = p.y - dragStart.p.y;\n item.rect.x = dragStart.rect.x + dx;\n item.rect.y = dragStart.rect.y + dy;\n drawOverlay();\n }\n return;\n }\n if (!isDrawing || !startPoint) {\n return;\n }\n const p = toCanvasPoint(e);\n tempRect.value = {\n x: Math.min(startPoint.x, p.x),\n y: Math.min(startPoint.y, p.y),\n w: Math.abs(p.x - startPoint.x),\n h: Math.abs(p.y - startPoint.y),\n };\n drawOverlay();\n};\n\nconst onOverlayMouseUp = () => {\n if (draggingIndex !== null || resizingIndex !== null) {\n draggingIndex = null;\n resizingIndex = null;\n resizeCorner = null;\n dragStart = null;\n if (overlayCanvas.value) {\n overlayCanvas.value.style.cursor = \"crosshair\";\n }\n drawOverlay();\n return;\n }\n if (isDrawing && tempRect.value) {\n overlayItems.value.push({\n type: currentTool.value,\n rect: { ...tempRect.value },\n });\n }\n isDrawing = false;\n startPoint = null;\n tempRect.value = null;\n drawOverlay();\n};\n\nconst onOverlayMouseLeave = () => {\n if (isDrawing) {\n isDrawing = false;\n startPoint = null;\n tempRect.value = null;\n drawOverlay();\n }\n};\n\nconst tempRect = ref(null);\n\nconst drawOverlay = () => {\n const selectedIdx = selectedItemIndex.value;\n const canvasEl = overlayCanvas.value;\n if (!canvasEl) {\n return;\n }\n const ctx = canvasEl.getContext(\"2d\");\n const dpr = window.devicePixelRatio || 1;\n ctx.clearRect(0, 0, canvasEl.width, canvasEl.height);\n\n const drawItem = (item, idx) => {\n // The item being edited is shown by the inline input, not twice\n if (textEditor.value.visible && idx === textEditor.value.index) {\n return;\n }\n if (item.type === EDITOR_TOOLS.REDACT) {\n ctx.fillStyle = \"rgba(0,0,0,1)\";\n ctx.fillRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n ctx.strokeStyle = \"rgba(0,0,0,1)\";\n ctx.strokeRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n } else if (item.type === EDITOR_TOOLS.HIGHLIGHT) {\n ctx.fillStyle = \"rgba(255, 235, 59, 0.4)\";\n ctx.fillRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n ctx.strokeStyle = \"rgba(255, 193, 7, 0.8)\";\n ctx.strokeRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n } else if (item.type === EDITOR_TOOLS.COMMENT) {\n drawCommentIcon(ctx, item.rect.x, item.rect.y, 20 * dpr);\n if (idx === selectedIdx) {\n // A comment has no size of its own, so no resize handles\n ctx.save();\n ctx.strokeStyle = \"#0ea5e9\";\n ctx.lineWidth = 2 * dpr;\n ctx.setLineDash([4 * dpr, 4 * dpr]);\n ctx.strokeRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n ctx.restore();\n }\n } else if (item.type === EDITOR_TOOLS.IMAGE) {\n // Try to ensure preview is available; this is async-safe\n ensureItemPreview(item);\n // Draw bitmap if loaded\n if (item._bitmap) {\n ctx.drawImage(\n item._bitmap,\n item.rect.x,\n item.rect.y,\n item.rect.w,\n item.rect.h,\n );\n }\n // Frame\n ctx.strokeStyle =\n idx === selectedIdx ? \"#0ea5e9\" : \"rgba(33,150,243,0.9)\";\n ctx.lineWidth = idx === selectedIdx ? 2 * dpr : 1 * dpr;\n ctx.strokeRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n if (idx === selectedIdx) {\n // draw simple handles\n ctx.fillStyle = \"#0ea5e9\";\n const s = 6 * dpr;\n const half = s / 2;\n const corners = [\n [item.rect.x, item.rect.y],\n [item.rect.x + item.rect.w, item.rect.y],\n [item.rect.x, item.rect.y + item.rect.h],\n [item.rect.x + item.rect.w, item.rect.y + item.rect.h],\n ];\n corners.forEach(([cx, cy]) => {\n ctx.fillRect(cx - half, cy - half, s, s);\n });\n }\n } else if (item.type === EDITOR_TOOLS.TEXT) {\n const payload = item.payload || {};\n // Size comes from the PDF, converted for the current render, so the\n // preview shows the size the text will actually have\n const fontPx = textFontPx(payload);\n ctx.save();\n ctx.fillStyle = payload.color || \"#000\";\n ctx.font = `${fontPx}px ${payload.font || \"Helvetica\"}`;\n ctx.textBaseline = \"top\";\n let ty = item.rect.y;\n // Lines are only those the user typed: nothing wraps, nothing is cut\n for (const line of splitTextLines(payload.text)) {\n ctx.fillText(line, item.rect.x, ty);\n ty += fontPx * LINE_HEIGHT_RATIO;\n }\n ctx.restore();\n // Discreet frame to show the block can be moved, no resize handles\n ctx.save();\n ctx.strokeStyle =\n idx === selectedIdx ? \"#0ea5e9\" : \"rgba(33,150,243,0.5)\";\n ctx.lineWidth = idx === selectedIdx ? 2 * dpr : 1 * dpr;\n ctx.setLineDash([4 * dpr, 4 * dpr]);\n ctx.strokeRect(item.rect.x, item.rect.y, item.rect.w, item.rect.h);\n ctx.restore();\n }\n };\n\n overlayItems.value.forEach(drawItem);\n if (tempRect.value) {\n const r = tempRect.value;\n ctx.setLineDash([6 * dpr, 4 * dpr]);\n ctx.strokeStyle =\n currentTool.value === EDITOR_TOOLS.REDACT ? \"black\" : \"goldenrod\";\n ctx.strokeRect(r.x, r.y, r.w, r.h);\n ctx.setLineDash([]);\n }\n};\n\nconst hexToRgb01 = (hex) => {\n const { r, g, b } = parseHexColor(hex);\n return { r, g, b };\n};\n\nconst parseHexColor = (hex) => {\n let h = (hex || \"\").toString().trim();\n if (h.startsWith(\"#\")) {\n h = h.slice(1);\n }\n if (h.length === 3) {\n h = h\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n const num = parseInt(h || \"000000\", 16);\n const r = ((num >> 16) & 255) / 255;\n const g = ((num >> 8) & 255) / 255;\n const b = (num & 255) / 255;\n return { r, g, b };\n};\n\nconst drawCommentIcon = (ctx, x, y, size) => {\n ctx.save();\n ctx.translate(x, y);\n ctx.fillStyle = \"#FFEB3B\";\n ctx.strokeStyle = \"#FBC02D\";\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.rect(0, 0, size, size);\n ctx.fill();\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(size * 0.6, 0);\n ctx.lineTo(size, size * 0.4);\n ctx.lineTo(size * 0.6, size * 0.4);\n ctx.closePath();\n ctx.fillStyle = \"#FDD835\";\n ctx.fill();\n ctx.restore();\n};\n\nconst applyOverlayEdits = async () => {\n if (!originalPdfBytes.value || !selectedPageForEdit.value) {\n return;\n }\n isLoading.value = true;\n try {\n const doc = await PDFDocument.load(originalPdfBytes.value);\n const originalIndex = selectedPageForEdit.value.pageIndex;\n let page = doc.getPage(originalIndex);\n const { width: pdfW, height: pdfH } = page.getSize();\n\n const base = getPdfCanvas();\n if (!base) {\n throw new Error(t(\"pdfTools.pdfRenderCanvasNotFound\"));\n }\n\n // If redaction is present, ask for confirmation then flatten the page to an image\n const hasRedact = overlayItems.value.some(\n (it) => it.type === EDITOR_TOOLS.REDACT,\n );\n if (hasRedact) {\n const ok = window.confirm(t(\"pdfTools.redactFlattenConfirm\"));\n if (!ok) {\n isLoading.value = false;\n return;\n }\n // Rasterize the page from the PDF itself, at a fixed resolution rather\n // than from the on-screen canvas, and burn the masks into the pixels:\n // covering the content with a PDF object would leave it readable.\n const renderedDoc = await pdf.value.promise;\n const pdfPage = await renderedDoc.getPage(originalIndex + 1);\n const overlay = overlayCanvas.value;\n const dataUrl = await rasterizeRedactedPage({\n pdfPage,\n // Masks are converted to page fractions so they no longer depend on\n // the screen resolution nor on the current zoom level.\n redactions: overlayItems.value\n .filter((it) => it.type === EDITOR_TOOLS.REDACT)\n .map((it) => ({\n x: it.rect.x / overlay.width,\n y: it.rect.y / overlay.height,\n w: it.rect.w / overlay.width,\n h: it.rect.h / overlay.height,\n })),\n });\n // Fetching from a data URL is a local operation, not a remote API call, so it doesn't violate the API service convention.\n const pngBytes = await (await fetch(dataUrl)).arrayBuffer();\n const bgImg = await doc.embedJpg(pngBytes);\n const newPage = doc.insertPage(originalIndex + 1, [pdfW, pdfH]);\n newPage.drawImage(bgImg, { x: 0, y: 0, width: pdfW, height: pdfH });\n // All overlays will be drawn on this new page\n page = newPage;\n // The old page will be deleted after applying the overlays\n }\n\n // VuePDF canvas measurements\n const baseRect = base.getBoundingClientRect(); // CSS px\n const baseW = base.width; // canvas pixels\n const baseH = base.height;\n\n // DPR used for the overlay\n const dpr = window.devicePixelRatio || 1;\n\n // Convert each item: overlay (px * dpr) -> CSS px -> base canvas px -> PDF coordinates\n const cssToBaseX = baseW / baseRect.width;\n const cssToBaseY = baseH / baseRect.height;\n\n const baseToPdfX = pdfW / baseW;\n const baseToPdfY = pdfH / baseH;\n\n // Comments live beside the content, so they are rewritten from the\n // overlay: moving, editing or deleting one has to reach the document\n removeCommentAnnotations(page);\n\n for (const item of overlayItems.value) {\n // overlay rect is in overlayCanvas px (so already multiplied by dpr)\n const cssX = item.rect.x / dpr;\n const cssY = item.rect.y / dpr;\n const cssW = item.rect.w / dpr;\n const cssH = item.rect.h / dpr;\n\n const baseX = cssX * cssToBaseX;\n const baseY = cssY * cssToBaseY;\n const baseWRect = cssW * cssToBaseX;\n const baseHRect = cssH * cssToBaseY;\n\n const w = baseWRect * baseToPdfX;\n const h = baseHRect * baseToPdfY;\n const x = baseX * baseToPdfX;\n // Y inversion: top origin (canvas) -> bottom (PDF)\n const y = pdfH - (baseY + baseHRect) * baseToPdfY;\n\n if (item.type === EDITOR_TOOLS.REDACT) {\n // Redactions are already burned into the rasterized page. Drawing a\n // black rectangle here would hide a rasterization failure instead of\n // making it visible.\n continue;\n } else if (item.type === EDITOR_TOOLS.HIGHLIGHT) {\n page.drawRectangle({\n x,\n y,\n width: w,\n height: h,\n color: rgb(1, 0.92, 0.23),\n opacity: 0.4,\n });\n } else if (item.type === EDITOR_TOOLS.COMMENT) {\n addCommentAnnotation({\n doc,\n page,\n rect: { x, y, size: Math.max(14, w) },\n text: item.payload?.text,\n title: t(\"pdfTools.pageEditor.tools.comment\"),\n });\n } else if (item.type === EDITOR_TOOLS.IMAGE) {\n let bytes = null;\n if (item.payload?.file) {\n bytes = await item.payload.file.arrayBuffer();\n } else if (item.payload?.signature) {\n bytes = item.payload.signature;\n }\n if (bytes) {\n let img;\n try {\n img = await doc.embedPng(bytes);\n } catch (_) {\n img = await doc.embedJpg(bytes);\n }\n page.drawImage(img, { x, y, width: w, height: h, opacity: 0.98 });\n }\n } else if (item.type === EDITOR_TOOLS.TEXT) {\n const payload = item.payload || {};\n const fontName =\n payload.font === \"TimesRoman\"\n ? StandardFonts.TimesRoman\n : payload.font === \"Courier\"\n ? StandardFonts.Courier\n : StandardFonts.Helvetica;\n const font = await doc.embedFont(fontName);\n const size = Math.max(6, Number(payload.size) || 18);\n const {\n r: rc,\n g: gc,\n b: bc,\n } = parseHexColor(payload.color || \"#000000\");\n // rect.y is the top of the block, so its PDF top edge is y + h\n const topY = y + h;\n const ascentPt = font.heightAtSize(size, { descender: false });\n splitTextLines(payload.text).forEach((line, lineIndex) => {\n if (!line) {\n return;\n }\n page.drawText(line, {\n x,\n y: pdfBaselineY({\n topY,\n lineIndex,\n fontSize: size,\n ascentPt,\n }),\n size,\n font,\n color: rgb(rc, gc, bc),\n });\n });\n }\n }\n\n const needsPageListUpdate = overlayItems.value.some(\n (it) => it.type === EDITOR_TOOLS.REDACT,\n );\n // If a replacement page was inserted for redaction, remove the old page\n if (needsPageListUpdate) {\n doc.removePage(originalIndex);\n }\n\n await _updatePdfAndRefreshState(doc, { updatePages: needsPageListUpdate });\n\n overlayItems.value = [];\n selectedItemIndex.value = -1;\n await loadExistingComments();\n props.toast.add({\n severity: \"success\",\n summary: t(\"pdfTools.common.success\"),\n detail: t(\"pdfTools.pageEditor.applySuccess\"),\n life: 2000,\n });\n } catch (err) {\n console.error(\"Error applying overlay edits:\", err);\n props.toast.add({\n severity: \"error\",\n summary: t(\"pdfTools.common.error\"),\n detail: t(\"pdfTools.pageEditor.applyError\"),\n life: 3000,\n });\n } finally {\n isLoading.value = false;\n }\n};\n\n// Recompute overlay when zoom or page changes\nwatch(pageZoom, () => setTimeout(syncOverlaySize, 0));\nwatch(selectedPageForEdit, () => setTimeout(syncOverlaySize, 0));\n// Recompute on window resize to keep alignment\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", () => setTimeout(syncOverlaySize, 0));\n}\n\nconst fitToWidth = () => {\n // Heuristic: set zoom to fit typical A4 in dialog width (~80vw). Keep simple here.\n pageZoom.value = 1;\n setTimeout(syncOverlaySize, 0);\n};\n\n// Signature pad logic\nconst initSignaturePadSize = () => {\n const canvas = signaturePadCanvas.value;\n if (!canvas) {\n return;\n }\n const dpr = window.devicePixelRatio || 1;\n const width = 440;\n const height = 180;\n canvas.style.width = width + \"px\";\n canvas.style.height = height + \"px\";\n canvas.width = Math.round(width * dpr);\n canvas.height = Math.round(height * dpr);\n const ctx = canvas.getContext(\"2d\");\n ctx.fillStyle = \"#fff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n};\n\nconst onCloseSignaturePad = () => {\n sigClear();\n isSignaturePadVisible.value = false;\n};\n\nconst sigDown = (e) => {\n sigDrawing = true;\n sigLast = getSigPoint(e);\n};\nconst sigMove = (e) => {\n if (!sigDrawing) {\n return;\n }\n const p = getSigPoint(e);\n drawSigLine(sigLast, p);\n sigLast = p;\n};\nconst sigTouchDown = (e) => sigDown(e.touches[0]);\nconst sigTouchMove = (e) => sigMove(e.touches[0]);\nconst sigUp = () => {\n sigDrawing = false;\n sigLast = null;\n};\n\nconst getSigPoint = (evt) => {\n const canvas = signaturePadCanvas.value;\n const rect = canvas.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n const clientX = evt.clientX ?? evt.pageX;\n const clientY = evt.clientY ?? evt.pageY;\n return { x: (clientX - rect.left) * dpr, y: (clientY - rect.top) * dpr };\n};\n\nconst drawSigLine = (a, b) => {\n const canvas = signaturePadCanvas.value;\n const ctx = canvas.getContext(\"2d\");\n ctx.strokeStyle = \"#111827\";\n ctx.lineWidth = 3 * (window.devicePixelRatio || 1);\n ctx.lineCap = \"round\";\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.stroke();\n};\n\nconst sigClear = () => {\n const canvas = signaturePadCanvas.value;\n if (!canvas) {\n return;\n }\n const ctx = canvas.getContext(\"2d\");\n ctx.fillStyle = \"#fff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n};\n\nconst sigUse = () => {\n const canvas = signaturePadCanvas.value;\n if (!canvas) {\n return;\n }\n canvas.toBlob(async (blob) => {\n signatureImageBytes.value = await blob.arrayBuffer();\n currentTool.value = EDITOR_TOOLS.IMAGE;\n isSignaturePadVisible.value = false;\n });\n};\n\nwatch(isSignaturePadVisible, (v) => {\n if (v) {\n setTimeout(initSignaturePadSize, 0);\n }\n});\n\n// Watcher to get numPages when PDF loads\nwatch(previewPdf, async (newVal) => {\n if (!newVal) {\n previewNumPages.value = 0;\n return;\n }\n\n try {\n // Wait for the PDF document to load\n const pdfDoc = await newVal;\n previewNumPages.value = pdfDoc.numPages;\n } catch (err) {\n console.error(\"Error loading preview PDF:\", err);\n previewNumPages.value = 0;\n }\n});\n</script>\n\n<style scoped>\n.pdf-tools-page {\n padding: 2rem;\n}\n\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 50vh;\n}\n\n.pdf-editor-layout {\n display: flex;\n gap: 2rem;\n}\n\n.pdf-tools-sidebar {\n width: 350px;\n flex-shrink: 0;\n}\n\n.pdf-tools-sidebar .card {\n position: sticky;\n top: 1rem;\n background: #ffffff;\n border: 1px solid var(--surface-border, #e0e0e0);\n border-radius: 12px;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);\n padding: 1rem 1rem 0.5rem;\n}\n\n.pdf-tools-sidebar h3 {\n margin: 0 0 0.75rem;\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--text-color, #222);\n}\n\n/* Sidebar form layout (replaces p-fluid) */\n.sidebar-form {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.sidebar-form :deep(.p-button),\n.sidebar-form :deep(.p-fileupload) {\n width: 100%;\n}\n\n/* Form fields (replaces p-field) */\n.form-field {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n}\n\n.form-field--spaced {\n margin-top: 1rem;\n}\n\n.form-label {\n display: block;\n margin-bottom: 0.25rem;\n font-weight: 500;\n font-size: 0.875rem;\n}\n\n.form-hint {\n color: var(--p-text-muted-color, #6b7280);\n font-size: 0.8rem;\n}\n\n/* Buttons spacing helpers (replaces mt-2, mt-auto, etc.) */\n.btn-mt {\n margin-top: 0.5rem;\n}\n\n.btn-mt-sm {\n margin-top: 0.25rem;\n}\n\n.btn-mt-auto {\n margin-top: auto;\n}\n\n.btn-full {\n width: 100%;\n}\n\n/* Insert buttons stack (replaces flex flex-column gap-2) */\n.insert-buttons {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n/* Watermark grid (replaces grid + col-6) */\n.watermark-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0.5rem;\n margin-top: 0.5rem;\n}\n\n/* Page grid (replaces PrimeFlex grid + col-3) */\n.page-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 0.5rem;\n}\n\n.page-grid-item {\n min-width: 0;\n}\n\n/* Input full width (replaces w-full) */\n.input-full {\n width: 100%;\n}\n\n/* Fields and labels */\n.pdf-tools-sidebar :deep(.p-inputtext),\n.pdf-tools-sidebar :deep(.p-inputnumber-input) {\n width: 100%;\n}\n\n/* Page thumbnails */\n.page-thumbnail {\n position: relative;\n border: 2px solid #ccc;\n border-radius: 10px;\n margin-bottom: 10px;\n text-align: center;\n cursor: pointer;\n transition: all 0.2s;\n overflow: hidden;\n background-color: #f8f9fa;\n height: 150px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.page-thumbnail.selected {\n border-color: var(--primary-color);\n transform: scale(1.05);\n box-shadow: 0 0 0 3px rgba(48, 79, 254, 0.25);\n}\n\n.page-thumbnail:hover {\n border-color: #a0aec0;\n}\n\n.page-thumbnail:hover .page-actions {\n opacity: 1;\n}\n\n.page-actions {\n position: absolute;\n top: 5px;\n right: 5px;\n z-index: 10;\n opacity: 0;\n transition: opacity 0.2s;\n}\n\n.page-actions :deep(.p-button) {\n background: rgba(255, 255, 255, 0.9);\n border: 1px solid #e5e7eb;\n}\n\n.page-selection {\n position: absolute;\n top: 5px;\n left: 5px;\n z-index: 10;\n}\n\n.page-number {\n position: absolute;\n bottom: 5px;\n right: 5px;\n background-color: rgba(0, 0, 0, 0.5);\n color: white;\n padding: 2px 5px;\n border-radius: 3px;\n font-size: 0.8rem;\n font-weight: 600;\n}\n\n.pdf-preview-container {\n flex-grow: 1;\n}\n\n.thumbnail-content {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.page-thumbnail :deep(canvas) {\n max-width: 100%;\n max-height: 100%;\n height: auto;\n width: auto;\n pointer-events: none;\n}\n\n.ghost {\n opacity: 0.5;\n background: #c8ebfb;\n}\n\n/* Dialog shared styles */\n.dialog-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.dialog-footer-buttons {\n display: flex;\n gap: 0.5rem;\n}\n\n/* Page editor dialog */\n:deep(.page-editor-dialog) {\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.page-editor-toolbar {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid var(--surface-border, #e0e0e0);\n}\n\n.page-editor-toolbar .spacer {\n flex: 1;\n}\n\n.zoom-indicator {\n color: #6b7280;\n}\n\n/* Editor layout (replaces flex on editor body) */\n.editor-layout {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.editor-footer {\n display: flex;\n justify-content: space-between;\n width: 100%;\n}\n\n/* Tool group */\n.tool-group {\n position: sticky;\n top: 1rem;\n background: #ffffff;\n border: 1px solid var(--surface-border, #e0e0e0);\n border-radius: 12px;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);\n padding: 1rem 1rem 0.5rem;\n width: 12rem;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n}\n\n.tool-group :deep(.p-button),\n.tool-group :deep(.p-fileupload) {\n width: 100%;\n}\n\n.tool-group :deep(.p-button.active),\n.tool-group :deep(.p-fileupload.active) {\n background: #e0f2fe;\n border-color: #7dd3fc;\n color: #075985;\n box-shadow: 0 0 0 2px rgba(125, 211, 252, 0.35) inset;\n}\n\n.tool-group :deep(.p-button.active .p-button-icon) {\n color: #075985;\n}\n\n/* Text tool settings (replaces mt-2 container) */\n.text-settings {\n margin-top: 0.5rem;\n}\n\n/* Page editor canvas */\n.page-editor-canvas {\n flex: 1;\n min-height: 0;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n overflow: auto;\n background: #f8fafc;\n border-radius: 8px;\n scroll-behavior: smooth;\n flex: 1;\n}\n\n.page-editor-canvas :deep(canvas) {\n position: relative;\n}\n\n.pdf-canvas-wrapper {\n position: relative;\n}\n\n.pdf-canvas-absolute {\n position: absolute;\n}\n\n.overlay-canvas {\n position: absolute;\n inset: 0;\n pointer-events: auto;\n cursor: crosshair;\n top: 0;\n left: 0;\n}\n\n/* Signature pad */\n.pdf-tools-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 1rem;\n}\n.pdf-tools-header :deep(.p-button-label) {\n white-space: nowrap;\n}\n.color-swatches {\n display: flex;\n flex-wrap: wrap;\n gap: 0.35rem;\n}\n.color-swatch {\n width: 1.5rem;\n height: 1.5rem;\n padding: 0;\n border: 1px solid var(--surface-border, #d1d5db);\n border-radius: 4px;\n cursor: pointer;\n}\n.color-swatch.selected {\n outline: 2px solid var(--primary-color, #0ea5e9);\n outline-offset: 1px;\n}\n.color-swatch:focus-visible {\n outline: 2px solid var(--primary-color, #0ea5e9);\n outline-offset: 2px;\n}\n/* The free colour choice is set apart from the presets: as a bare swatch it\n was indistinguishable from them */\n.color-custom {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-top: 0.5rem;\n cursor: pointer;\n font-size: 0.85rem;\n}\n.color-custom-input {\n width: 1.5rem;\n height: 1.5rem;\n padding: 0;\n border: 1px solid var(--surface-border, #d1d5db);\n border-radius: 4px;\n background: none;\n cursor: pointer;\n}\n.color-custom-input:focus-visible {\n outline: 2px solid var(--primary-color, #0ea5e9);\n outline-offset: 2px;\n}\n.text-editor-input {\n position: absolute;\n z-index: 2;\n min-width: 6rem;\n margin: 0;\n padding: 0;\n border: 1px dashed #0ea5e9;\n border-radius: 2px;\n background: rgba(255, 255, 255, 0.85);\n white-space: pre;\n overflow: hidden;\n resize: none;\n outline: none;\n}\n.signature-pad {\n width: 100%;\n}\n\n.signature-canvas {\n width: 100%;\n height: 180px;\n border: 1px dashed var(--surface-border, #e5e7eb);\n background: #fff;\n}\n\n/* Search input group (replaces p-inputgroup) */\n.search-input-group {\n display: flex;\n margin-bottom: 0.5rem;\n}\n\n.search-input-group :deep(.p-inputtext) {\n flex: 1;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.search-input-group :deep(.p-button) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n/* Inline status (replaces flex align-items-center gap-2) */\n.inline-status {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Text utilities (replaces PrimeFlex utility classes) */\n.text-muted {\n color: var(--p-text-muted-color, #6b7280);\n}\n\n.text-ellipsis {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.preview-icon {\n font-size: 3.5rem;\n color: var(--p-text-muted-color, #6b7280);\n}\n\n/* Item content in favorites/search lists (replaces flex align-items-center gap-2 flex-grow-1) */\n.item-content {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n flex-grow: 1;\n min-width: 0;\n}\n\n/* Spinner sizes */\n.spinner-sm {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n.spinner-md {\n width: 3rem;\n height: 3rem;\n}\n\n/* Favorites layout */\n.favorites-layout {\n display: flex;\n gap: 1rem;\n height: 400px;\n}\n\n.favorites-list {\n flex: 0 0 300px;\n overflow-y: auto;\n border: 1px solid var(--surface-border, #e0e0e0);\n border-radius: 8px;\n padding: 0.5rem;\n}\n\n.favorite-item {\n display: flex;\n align-items: center;\n padding: 0.75rem;\n border-radius: 6px;\n cursor: pointer;\n transition: background-color 0.2s;\n margin-bottom: 0.25rem;\n}\n\n.favorite-item:hover {\n background-color: var(--surface-hover, #f5f5f5);\n}\n\n.favorite-item-selected {\n background-color: var(--primary-50, #e3f2fd);\n border: 1px solid var(--primary-200, #90caf9);\n}\n\n.favorites-preview {\n flex: 1;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--surface-border, #e0e0e0);\n border-radius: 8px;\n background-color: var(--surface-50, #fafafa);\n overflow: hidden;\n}\n\n.preview-wrapper {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.preview-controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.5rem;\n border-bottom: 1px solid var(--surface-border, #e0e0e0);\n background-color: white;\n}\n\n.preview-controls .page-info {\n min-width: 80px;\n text-align: center;\n font-weight: 500;\n color: var(--text-color, #333);\n}\n\n.preview-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n height: 100%;\n}\n\n.preview-content {\n flex: 1;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n overflow: auto;\n padding: 1rem;\n}\n\n.preview-content :deep(canvas) {\n max-width: 100%;\n height: auto;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n/* Insert dialog footer */\n.insert-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n width: 100%;\n}\n\n.insert-footer-info {\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n margin-right: 0.5rem;\n min-width: 0;\n}\n\n.selected-info {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n color: var(--p-text-muted-color, #6b7280);\n}\n\n.selected-label {\n flex-shrink: 0;\n color: var(--p-text-muted-color, #6b7280);\n}\n\n.selected-name {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 500;\n flex-grow: 1;\n}\n\n.error-msg {\n color: var(--p-red-500, #ef4444);\n font-size: 0.875rem;\n}\n\n.insert-footer-actions {\n display: flex;\n gap: 0.5rem;\n margin-left: auto;\n}\n\n/* Dialog sizes */\n/* Size is set through the :style prop: a scoped rule cannot reach the dialog,\n which is teleported out of this component's DOM tree */\n\n.dialog-signature-pad {\n width: 480px;\n}\n\n.dialog-insert-pdf {\n width: 60rem;\n}\n</style>\n"],"names":["t","useI18n","props","__props","emit","__emit","filename","ref","initialNode","isExplorerVisible","selectedFolderId","selectedFolderName","onDialogShow","onNodeSelect","nodeData","parentNode","alfrescoNodeService","e","save","_createBlock","_unref","PrimeDialog","$t","$emit","_createVNode","PrimeButton","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","_toDisplayString","PrimeInputText","$event","_hoisted_4","_hoisted_5","_hoisted_6","_cache","_openBlock","_createElementBlock","_hoisted_7","TreeExplorer","COMMENT_COLOR","FLAG_PRINT","addCommentAnnotation","doc","page","rect","text","title","content","annotation","PDFHexString","readCommentAnnotations","annots","comments","index","annot","PDFName","contents","removeCommentAnnotations","POINTS_PER_INCH","REDACTION_DPI","MAX_CANVAS_PIXELS","rasterizeRedactedPage","pdfPage","redactions","dpi","quality","mimeType","maxPixels","createCanvas","scale","wanted","wantedPixels","viewport","canvas","ctx","LINE_HEIGHT_RATIO","MIN_BLOCK_WIDTH","overlayPixelsPerPoint","overlayWidth","pageWidthPt","splitTextLines","measureTextBlock","lines","fontSize","measureLine","widths","line","pdfBaselineY","topY","lineIndex","ascentPt","COMMENT_ANCHOR_SIZE","hasUnsavedChanges","closeEditor","pdfDoc","originalPdfBytes","pages","isLoading","error","selectedPage","selectedPages","isPageEditorVisible","selectedPageForEdit","pageZoom","EDITOR_TOOLS","currentTool","overlayItems","overlayImageFile","signatureImageBytes","pdfCanvasWrapper","overlayCanvas","textEditorInput","textEditor","isSignaturePadVisible","signaturePadCanvas","sigDrawing","sigLast","isDrawing","startPoint","watermarkText","watermarkAngle","watermarkRepetitions","textFontOptions","TEXT_COLOR_SWATCHES","textFont","textSize","textColor","parentId","isSaveAsPopupVisible","saveAsAction","defaultFilename","currentFilename","currentNode","parentFolderNode","isInsertFromAlfrescoVisible","insertAlfrescoInput","selectionErrorMsg","selectedPdf","canConfirmInsert","computed","parseNodeId","searchQuery","searchResults","searchLoading","searchPerformed","favoritePdfs","favoritesLoading","previewLoading","previewPdfUrl","previewPdf","usePDF","buildPdfSourceRef","previewCurrentPage","previewNumPages","pdfUrl","pdf","onMounted","nodeId","loadPdfFromAlfresco","isPageSelected","p","togglePageSelection","node","contentUrl","alfrescoFileService","response","arrayBuffer","updatePageList","err","pdfBytes","PDFDocument","pageCount","_","i","_updatePdfAndRefreshState","updatePages","newPdfBytes","blob","onDragEnd","newPdfDoc","pageIndices","sourcePdf","rotatePage","pageElement","currentRotation","RotationTypes","extractPages","a","b","deleteSelectedPages","src","total","toDelete","keepIndices","newDoc","openInsertFromAlfrescoDialog","onTabChange","tabValue","loadFavorites","confirmInsertFromAlfresco","insertPdfFromAlfresco","trimmed","ws","inNodes","hash","generic","selectPdf","previewNextPage","previewPreviousPage","onNodeSelectedFromTree","performSearch","store","useSearchStore","entries","favoritesStore","useFavoritesStore","fav","otherBytes","current","other","count","importIndices","onInsertPdfSelect","file","insertPdfFile","addWatermark","pageIndex","width","height","rgb","degrees","saveChanges","opts","openSaveAsPopup","action","handleSaveAs","folderId","pdfBytesToSave","detail","loadExistingComments","item","drawOverlay","pxPerPoint","overlayScale","pageHeightPt","currentPageHeightPt","comment","openPageEditor","selectedItemIndex","syncOverlaySize","closePageEditor","zoomIn","zoomOut","setTool","tool","onOverlayImageSelect","openSignaturePad","undoOverlay","ensureItemPreview","sourceBlob","getPdfCanvas","wrapper","canvases","visible","c","list","best","bestArea","r","area","base","dpr","toCanvasPoint","evt","canvasEl","draggingIndex","dragStart","resizingIndex","resizeCorner","currentPageWidthPt","textFontPx","payload","measureTextItem","fontPx","bounds","textEditorStyle","isSyncingTextPanel","isTextPanelVisible","selectItem","nextTick","watch","deleteSelectedItem","onEditorKeyDown","cancelTextEditor","typing","onUnmounted","inlineEditorLabels","openInlineEditor","point","existing","commitTextEditor","x","y","onOverlayDoubleClick","idx","hitTest","type","hitTestHandle","half","it","corners","onOverlayMouseDown","handleHit","newItem","onOverlayMouseMove","r0","w","h","dx","dy","tempRect","onOverlayMouseUp","onOverlayMouseLeave","selectedIdx","drawItem","drawCommentIcon","s","cx","cy","ty","parseHexColor","hex","num","g","size","applyOverlayEdits","originalIndex","pdfW","pdfH","overlay","dataUrl","pngBytes","bgImg","newPage","baseRect","baseW","baseH","cssToBaseX","cssToBaseY","baseToPdfX","baseToPdfY","cssX","cssY","cssW","cssH","baseX","baseY","baseWRect","baseHRect","bytes","img","fontName","StandardFonts","font","rc","gc","bc","needsPageListUpdate","fitToWidth","initSignaturePadSize","onCloseSignaturePad","sigClear","sigDown","getSigPoint","sigMove","drawSigLine","sigTouchDown","sigTouchMove","sigUp","clientX","clientY","sigUse","v","newVal","PrimeProgressSpinner","PrimeMessage","_hoisted_8","_hoisted_9","PrimeDivider","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","PrimeFileUpload","_hoisted_14","_hoisted_15","PrimeInputNumber","_hoisted_16","VueDraggableNext","_Fragment","_renderList","element","_normalizeClass","_withModifiers","_hoisted_18","PrimeCheckbox","_hoisted_19","_hoisted_20","VuePDF","_hoisted_21","_hoisted_22","_hoisted_38","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","PrimeSelect","_hoisted_30","_hoisted_31","PrimeSlider","_hoisted_32","_hoisted_33","_hoisted_34","swatch","_normalizeStyle","_hoisted_36","_vModelText","_hoisted_39","_hoisted_41","_hoisted_40","SaveAsPopup","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_withDirectives","_hoisted_83","_createTextVNode","_hoisted_84","_hoisted_85","PrimeTabs","PrimeTabList","PrimeTab","PrimeTabPanels","PrimeTabPanel","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_51","_hoisted_52","_hoisted_59","_hoisted_61","_hoisted_62","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_67","_hoisted_68","_hoisted_60","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78"],"mappings":"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"}