react-pdf-highlighter-plus 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +411 -0
- package/dist/esm/components/AreaHighlight.d.ts +82 -0
- package/dist/esm/components/AreaHighlight.js +109 -0
- package/dist/esm/components/AreaHighlight.js.map +1 -0
- package/dist/esm/components/DrawingCanvas.d.ts +48 -0
- package/dist/esm/components/DrawingCanvas.js +277 -0
- package/dist/esm/components/DrawingCanvas.js.map +1 -0
- package/dist/esm/components/DrawingHighlight.d.ts +70 -0
- package/dist/esm/components/DrawingHighlight.js +164 -0
- package/dist/esm/components/DrawingHighlight.js.map +1 -0
- package/dist/esm/components/FreetextHighlight.d.ts +112 -0
- package/dist/esm/components/FreetextHighlight.js +193 -0
- package/dist/esm/components/FreetextHighlight.js.map +1 -0
- package/dist/esm/components/HighlightLayer.d.ts +49 -0
- package/dist/esm/components/HighlightLayer.js +37 -0
- package/dist/esm/components/HighlightLayer.js.map +1 -0
- package/dist/esm/components/ImageHighlight.d.ts +63 -0
- package/dist/esm/components/ImageHighlight.js +65 -0
- package/dist/esm/components/ImageHighlight.js.map +1 -0
- package/dist/esm/components/MonitoredHighlightContainer.d.ts +37 -0
- package/dist/esm/components/MonitoredHighlightContainer.js +42 -0
- package/dist/esm/components/MonitoredHighlightContainer.js.map +1 -0
- package/dist/esm/components/MouseMonitor.d.ts +34 -0
- package/dist/esm/components/MouseMonitor.js +30 -0
- package/dist/esm/components/MouseMonitor.js.map +1 -0
- package/dist/esm/components/MouseSelection.d.ts +66 -0
- package/dist/esm/components/MouseSelection.js +122 -0
- package/dist/esm/components/MouseSelection.js.map +1 -0
- package/dist/esm/components/PdfHighlighter.d.ts +184 -0
- package/dist/esm/components/PdfHighlighter.js +410 -0
- package/dist/esm/components/PdfHighlighter.js.map +1 -0
- package/dist/esm/components/PdfLoader.d.ts +55 -0
- package/dist/esm/components/PdfLoader.js +57 -0
- package/dist/esm/components/PdfLoader.js.map +1 -0
- package/dist/esm/components/ShapeCanvas.d.ts +51 -0
- package/dist/esm/components/ShapeCanvas.js +205 -0
- package/dist/esm/components/ShapeCanvas.js.map +1 -0
- package/dist/esm/components/ShapeHighlight.d.ts +107 -0
- package/dist/esm/components/ShapeHighlight.js +140 -0
- package/dist/esm/components/ShapeHighlight.js.map +1 -0
- package/dist/esm/components/SignaturePad.d.ts +40 -0
- package/dist/esm/components/SignaturePad.js +138 -0
- package/dist/esm/components/SignaturePad.js.map +1 -0
- package/dist/esm/components/TextHighlight.d.ts +93 -0
- package/dist/esm/components/TextHighlight.js +115 -0
- package/dist/esm/components/TextHighlight.js.map +1 -0
- package/dist/esm/components/TipContainer.d.ts +27 -0
- package/dist/esm/components/TipContainer.js +58 -0
- package/dist/esm/components/TipContainer.js.map +1 -0
- package/dist/esm/contexts/HighlightContext.d.ts +44 -0
- package/dist/esm/contexts/HighlightContext.js +16 -0
- package/dist/esm/contexts/HighlightContext.js.map +1 -0
- package/dist/esm/contexts/PdfHighlighterContext.d.ts +89 -0
- package/dist/esm/contexts/PdfHighlighterContext.js +16 -0
- package/dist/esm/contexts/PdfHighlighterContext.js.map +1 -0
- package/dist/esm/index.d.ts +19 -0
- package/dist/esm/index.js +19 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/coordinates.d.ts +16 -0
- package/dist/esm/lib/coordinates.js +69 -0
- package/dist/esm/lib/coordinates.js.map +1 -0
- package/dist/esm/lib/export-pdf.d.ts +81 -0
- package/dist/esm/lib/export-pdf.js +511 -0
- package/dist/esm/lib/export-pdf.js.map +1 -0
- package/dist/esm/lib/get-bounding-rect.d.ts +3 -0
- package/dist/esm/lib/get-bounding-rect.js +35 -0
- package/dist/esm/lib/get-bounding-rect.js.map +1 -0
- package/dist/esm/lib/get-client-rects.d.ts +3 -0
- package/dist/esm/lib/get-client-rects.js +43 -0
- package/dist/esm/lib/get-client-rects.js.map +1 -0
- package/dist/esm/lib/group-highlights-by-page.d.ts +6 -0
- package/dist/esm/lib/group-highlights-by-page.js +23 -0
- package/dist/esm/lib/group-highlights-by-page.js.map +1 -0
- package/dist/esm/lib/optimize-client-rects.d.ts +3 -0
- package/dist/esm/lib/optimize-client-rects.js +65 -0
- package/dist/esm/lib/optimize-client-rects.js.map +1 -0
- package/dist/esm/lib/pdfjs-dom.d.ts +9 -0
- package/dist/esm/lib/pdfjs-dom.js +55 -0
- package/dist/esm/lib/pdfjs-dom.js.map +1 -0
- package/dist/esm/lib/screenshot.d.ts +4 -0
- package/dist/esm/lib/screenshot.js +24 -0
- package/dist/esm/lib/screenshot.js.map +1 -0
- package/dist/esm/style/AreaHighlight.css +134 -0
- package/dist/esm/style/DrawingCanvas.css +62 -0
- package/dist/esm/style/DrawingHighlight.css +184 -0
- package/dist/esm/style/FreetextHighlight.css +249 -0
- package/dist/esm/style/ImageHighlight.css +97 -0
- package/dist/esm/style/MouseSelection.css +15 -0
- package/dist/esm/style/PdfHighlighter.css +77 -0
- package/dist/esm/style/ShapeCanvas.css +47 -0
- package/dist/esm/style/ShapeHighlight.css +182 -0
- package/dist/esm/style/SignaturePad.css +83 -0
- package/dist/esm/style/TextHighlight.css +199 -0
- package/dist/esm/style/pdf_viewer.css +41 -0
- package/dist/esm/types.d.ts +213 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-highlights-by-page.js","sourceRoot":"","sources":["../../../src/lib/group-highlights-by-page.ts"],"names":[],"mappings":"AAMA,MAAM,qBAAqB,GAAG,CAC5B,UAAoD,EACjC,EAAE,CACrB,UAAU,CAAC,MAAM,CAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;IACtD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,WAAW,GAAG;QAClB,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU;QAC1C,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;KAChE,CAAC;IAEF,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;QACjC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,qBAAqB,GAAG;YAC5B,GAAG,SAAS;YACZ,QAAQ,EAAE;gBACR,GAAG,SAAS,CAAC,QAAQ;gBACrB,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CACpC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CACzC;aACF;SACF,CAAC;QACF,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC,EAAE,EAAE,CAAC,CAAC;AAET,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const sort = (rects) => rects.sort((A, B) => {
|
|
2
|
+
const top = (A.pageNumber || 0) * A.top - (B.pageNumber || 0) * B.top;
|
|
3
|
+
if (top === 0) {
|
|
4
|
+
return A.left - B.left;
|
|
5
|
+
}
|
|
6
|
+
return top;
|
|
7
|
+
});
|
|
8
|
+
const overlaps = (A, B) => A.pageNumber === B.pageNumber &&
|
|
9
|
+
A.left <= B.left &&
|
|
10
|
+
B.left <= A.left + A.width;
|
|
11
|
+
const sameLine = (A, B, yMargin = 5) => A.pageNumber === B.pageNumber &&
|
|
12
|
+
Math.abs(A.top - B.top) < yMargin &&
|
|
13
|
+
Math.abs(A.height - B.height) < yMargin;
|
|
14
|
+
const inside = (A, B) => A.pageNumber === B.pageNumber &&
|
|
15
|
+
A.top > B.top &&
|
|
16
|
+
A.left > B.left &&
|
|
17
|
+
A.top + A.height < B.top + B.height &&
|
|
18
|
+
A.left + A.width < B.left + B.width;
|
|
19
|
+
const nextTo = (A, B, xMargin = 10) => {
|
|
20
|
+
const Aright = A.left + A.width;
|
|
21
|
+
const Bright = B.left + B.width;
|
|
22
|
+
return (A.pageNumber === B.pageNumber &&
|
|
23
|
+
A.left <= B.left &&
|
|
24
|
+
Aright <= Bright &&
|
|
25
|
+
B.left - Aright <= xMargin);
|
|
26
|
+
};
|
|
27
|
+
const extendWidth = (A, B) => {
|
|
28
|
+
// extend width of A to cover B
|
|
29
|
+
A.width = Math.max(B.width - A.left + B.left, A.width);
|
|
30
|
+
};
|
|
31
|
+
const optimizeClientRects = (clientRects) => {
|
|
32
|
+
const rects = sort(clientRects);
|
|
33
|
+
const toRemove = new Set();
|
|
34
|
+
const firstPass = rects.filter((rect) => {
|
|
35
|
+
return rects.every((otherRect) => {
|
|
36
|
+
return !inside(rect, otherRect);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
let passCount = 0;
|
|
40
|
+
while (passCount <= 2) {
|
|
41
|
+
firstPass.forEach((A) => {
|
|
42
|
+
firstPass.forEach((B) => {
|
|
43
|
+
if (A === B || toRemove.has(A) || toRemove.has(B)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (!sameLine(A, B)) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (overlaps(A, B)) {
|
|
50
|
+
extendWidth(A, B);
|
|
51
|
+
A.height = Math.max(A.height, B.height);
|
|
52
|
+
toRemove.add(B);
|
|
53
|
+
}
|
|
54
|
+
if (nextTo(A, B)) {
|
|
55
|
+
extendWidth(A, B);
|
|
56
|
+
toRemove.add(B);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
passCount += 1;
|
|
61
|
+
}
|
|
62
|
+
return firstPass.filter((rect) => !toRemove.has(rect));
|
|
63
|
+
};
|
|
64
|
+
export default optimizeClientRects;
|
|
65
|
+
//# sourceMappingURL=optimize-client-rects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize-client-rects.js","sourceRoot":"","sources":["../../../src/lib/optimize-client-rects.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG,CAAC,KAAmB,EAAE,EAAE,CACnC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IAClB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;IAEtE,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,CAAC;AAEL,MAAM,QAAQ,GAAG,CAAC,CAAQ,EAAE,CAAQ,EAAE,EAAE,CACtC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;IAC7B,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;IAChB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;AAE7B,MAAM,QAAQ,GAAG,CAAC,CAAQ,EAAE,CAAQ,EAAE,OAAO,GAAG,CAAC,EAAE,EAAE,CACnD,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;IAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO;IACjC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;AAE1C,MAAM,MAAM,GAAG,CAAC,CAAQ,EAAE,CAAQ,EAAE,EAAE,CACpC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;IAC7B,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG;IACb,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;IACf,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM;IACnC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;AAEtC,MAAM,MAAM,GAAG,CAAC,CAAQ,EAAE,CAAQ,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;IAClD,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;IAChC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;IAEhC,OAAO,CACL,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;QAC7B,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;QAChB,MAAM,IAAI,MAAM;QAChB,CAAC,CAAC,IAAI,GAAG,MAAM,IAAI,OAAO,CAC3B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,CAAQ,EAAE,CAAQ,EAAE,EAAE;IACzC,+BAA+B;IAC/B,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,WAAyB,EAAgB,EAAE;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAEhC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;IAE3B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACtC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE;YAC/B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,SAAS,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACtB,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClD,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACpB,OAAO;gBACT,CAAC;gBAED,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACnB,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAClB,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;oBAExC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACjB,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAElB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,SAAS,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Page } from "../types";
|
|
2
|
+
export declare const getDocument: (elm: any) => Document;
|
|
3
|
+
export declare const getWindow: (elm: any) => typeof window;
|
|
4
|
+
export declare const isHTMLElement: (elm: any) => boolean;
|
|
5
|
+
export declare const isHTMLCanvasElement: (elm: any) => boolean;
|
|
6
|
+
export declare const asElement: (x: any) => HTMLElement;
|
|
7
|
+
export declare const getPageFromElement: (target: HTMLElement) => Page | null;
|
|
8
|
+
export declare const getPagesFromRange: (range: Range) => Page[];
|
|
9
|
+
export declare const findOrCreateContainerLayer: (container: HTMLElement, className: string) => Element | null;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export const getDocument = (elm) => (elm || {}).ownerDocument || document;
|
|
2
|
+
export const getWindow = (elm) => (getDocument(elm) || {}).defaultView || window;
|
|
3
|
+
export const isHTMLElement = (elm) => elm instanceof HTMLElement || elm instanceof getWindow(elm).HTMLElement;
|
|
4
|
+
export const isHTMLCanvasElement = (elm) => elm instanceof HTMLCanvasElement ||
|
|
5
|
+
elm instanceof getWindow(elm).HTMLCanvasElement;
|
|
6
|
+
export const asElement = (x) => x;
|
|
7
|
+
export const getPageFromElement = (target) => {
|
|
8
|
+
const node = asElement(target.closest(".page"));
|
|
9
|
+
if (!node || !isHTMLElement(node)) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const number = Number(asElement(node).dataset.pageNumber);
|
|
13
|
+
return { node, number };
|
|
14
|
+
};
|
|
15
|
+
export const getPagesFromRange = (range) => {
|
|
16
|
+
const startParentElement = range.startContainer.parentElement;
|
|
17
|
+
const endParentElement = range.endContainer.parentElement;
|
|
18
|
+
if (!isHTMLElement(startParentElement) || !isHTMLElement(endParentElement)) {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
const startPage = getPageFromElement(asElement(startParentElement));
|
|
22
|
+
const endPage = getPageFromElement(asElement(endParentElement));
|
|
23
|
+
if (!startPage?.number || !endPage?.number) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
if (startPage.number === endPage.number) {
|
|
27
|
+
return [startPage];
|
|
28
|
+
}
|
|
29
|
+
if (startPage.number === endPage.number - 1) {
|
|
30
|
+
return [startPage, endPage];
|
|
31
|
+
}
|
|
32
|
+
const pages = [];
|
|
33
|
+
let currentPageNumber = startPage.number;
|
|
34
|
+
const document = startPage.node.ownerDocument;
|
|
35
|
+
while (currentPageNumber <= endPage.number) {
|
|
36
|
+
const currentPage = getPageFromElement(document.querySelector(`[data-page-number='${currentPageNumber}'`));
|
|
37
|
+
if (currentPage) {
|
|
38
|
+
pages.push(currentPage);
|
|
39
|
+
}
|
|
40
|
+
currentPageNumber++;
|
|
41
|
+
}
|
|
42
|
+
return pages;
|
|
43
|
+
};
|
|
44
|
+
export const findOrCreateContainerLayer = (container, className) => {
|
|
45
|
+
const doc = getDocument(container);
|
|
46
|
+
let layer = container.querySelector(`.${className}`);
|
|
47
|
+
// To ensure predictable zIndexing, wait until the pdfjs element has children.
|
|
48
|
+
if (!layer && container.children.length) {
|
|
49
|
+
layer = doc.createElement("div");
|
|
50
|
+
layer.className = className;
|
|
51
|
+
container.appendChild(layer);
|
|
52
|
+
}
|
|
53
|
+
return layer;
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=pdfjs-dom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdfjs-dom.js","sourceRoot":"","sources":["../../../src/lib/pdfjs-dom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { isHTMLCanvasElement } from "./pdfjs-dom";
|
|
2
|
+
const getAreaAsPng = (canvas, position) => {
|
|
3
|
+
const { left, top, width, height } = position;
|
|
4
|
+
const doc = canvas ? canvas.ownerDocument : null;
|
|
5
|
+
// @TODO: cache this?
|
|
6
|
+
const newCanvas = doc && doc.createElement("canvas");
|
|
7
|
+
if (!newCanvas || !isHTMLCanvasElement(newCanvas)) {
|
|
8
|
+
return "";
|
|
9
|
+
}
|
|
10
|
+
newCanvas.width = width;
|
|
11
|
+
newCanvas.height = height;
|
|
12
|
+
const newCanvasContext = newCanvas.getContext("2d");
|
|
13
|
+
if (!newCanvasContext || !canvas) {
|
|
14
|
+
return "";
|
|
15
|
+
}
|
|
16
|
+
const dpr = window.devicePixelRatio;
|
|
17
|
+
newCanvasContext.drawImage(canvas, left * dpr, top * dpr, width * dpr, height * dpr, 0, 0, width, height);
|
|
18
|
+
return newCanvas.toDataURL("image/png");
|
|
19
|
+
};
|
|
20
|
+
const screenshot = (position, pageNumber, viewer) => {
|
|
21
|
+
return getAreaAsPng(viewer.getPageView(pageNumber - 1).canvas, position);
|
|
22
|
+
};
|
|
23
|
+
export default screenshot;
|
|
24
|
+
//# sourceMappingURL=screenshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../../src/lib/screenshot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,YAAY,GAAG,CAAC,MAAyB,EAAE,QAAc,EAAU,EAAE;IACzE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAE9C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,qBAAqB;IACrB,MAAM,SAAS,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAErD,IAAI,CAAC,SAAS,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;IACxB,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;IAE1B,MAAM,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAEpD,IAAI,CAAC,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAW,MAAM,CAAC,gBAAgB,CAAC;IAE5C,gBAAgB,CAAC,SAAS,CACxB,MAAM,EACN,IAAI,GAAG,GAAG,EACV,GAAG,GAAG,GAAG,EACT,KAAK,GAAG,GAAG,EACX,MAAM,GAAG,GAAG,EACZ,CAAC,EACD,CAAC,EACD,KAAK,EACL,MAAM,CACP,CAAC;IAEF,OAAO,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,QAAc,EAAE,UAAkB,EAAE,MAAiB,EAAE,EAAE;IAC3E,OAAO,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
.AreaHighlight {
|
|
2
|
+
position: absolute;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.AreaHighlight__part {
|
|
6
|
+
cursor: pointer;
|
|
7
|
+
position: absolute;
|
|
8
|
+
background: rgba(255, 226, 143, 1);
|
|
9
|
+
transition: background 0.3s;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.AreaHighlight--scrolledTo .AreaHighlight__part {
|
|
13
|
+
background: #ff4141;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Toolbar wrapper - creates hover bridge between toolbar and highlight */
|
|
17
|
+
.AreaHighlight__toolbar-wrapper {
|
|
18
|
+
z-index: 10;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* Toolbar - appears on hover */
|
|
22
|
+
.AreaHighlight__toolbar {
|
|
23
|
+
display: flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
gap: 4px;
|
|
26
|
+
padding: 2px 4px;
|
|
27
|
+
background: rgba(0, 0, 0, 0.7);
|
|
28
|
+
border-radius: 4px;
|
|
29
|
+
opacity: 0;
|
|
30
|
+
pointer-events: none;
|
|
31
|
+
transition: opacity 0.2s ease;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.AreaHighlight__toolbar--visible {
|
|
35
|
+
opacity: 1;
|
|
36
|
+
pointer-events: auto;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.AreaHighlight__style-button,
|
|
40
|
+
.AreaHighlight__delete-button {
|
|
41
|
+
display: flex;
|
|
42
|
+
align-items: center;
|
|
43
|
+
justify-content: center;
|
|
44
|
+
width: 20px;
|
|
45
|
+
height: 20px;
|
|
46
|
+
border: none;
|
|
47
|
+
background: transparent;
|
|
48
|
+
cursor: pointer;
|
|
49
|
+
color: white;
|
|
50
|
+
border-radius: 3px;
|
|
51
|
+
padding: 0;
|
|
52
|
+
transition: background 0.2s;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.AreaHighlight__style-button:hover {
|
|
56
|
+
background: rgba(255, 255, 255, 0.2);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.AreaHighlight__delete-button:hover {
|
|
60
|
+
background: rgba(255, 100, 100, 0.6);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* Style Panel */
|
|
64
|
+
.AreaHighlight__style-panel {
|
|
65
|
+
margin-top: 4px;
|
|
66
|
+
background: rgba(0, 0, 0, 0.9);
|
|
67
|
+
border-radius: 6px;
|
|
68
|
+
padding: 8px;
|
|
69
|
+
min-width: 160px;
|
|
70
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.AreaHighlight__style-row {
|
|
74
|
+
display: flex;
|
|
75
|
+
align-items: center;
|
|
76
|
+
justify-content: space-between;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.AreaHighlight__style-row label {
|
|
80
|
+
color: #ccc;
|
|
81
|
+
font-size: 11px;
|
|
82
|
+
text-transform: uppercase;
|
|
83
|
+
letter-spacing: 0.5px;
|
|
84
|
+
margin-right: 8px;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* Color options */
|
|
88
|
+
.AreaHighlight__color-options {
|
|
89
|
+
display: flex;
|
|
90
|
+
align-items: center;
|
|
91
|
+
gap: 6px;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.AreaHighlight__color-presets {
|
|
95
|
+
display: flex;
|
|
96
|
+
gap: 4px;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.AreaHighlight__color-preset {
|
|
100
|
+
width: 18px;
|
|
101
|
+
height: 18px;
|
|
102
|
+
border: 2px solid transparent;
|
|
103
|
+
border-radius: 50%;
|
|
104
|
+
cursor: pointer;
|
|
105
|
+
transition: transform 0.2s, border-color 0.2s;
|
|
106
|
+
padding: 0;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.AreaHighlight__color-preset:hover {
|
|
110
|
+
transform: scale(1.15);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.AreaHighlight__color-preset.active {
|
|
114
|
+
border-color: #b958ff;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.AreaHighlight__color-options input[type="color"] {
|
|
118
|
+
width: 24px;
|
|
119
|
+
height: 24px;
|
|
120
|
+
padding: 0;
|
|
121
|
+
border: none;
|
|
122
|
+
border-radius: 4px;
|
|
123
|
+
cursor: pointer;
|
|
124
|
+
background: transparent;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.AreaHighlight__color-options input[type="color"]::-webkit-color-swatch-wrapper {
|
|
128
|
+
padding: 0;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.AreaHighlight__color-options input[type="color"]::-webkit-color-swatch {
|
|
132
|
+
border: 1px solid #666;
|
|
133
|
+
border-radius: 4px;
|
|
134
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
.DrawingCanvas {
|
|
2
|
+
position: absolute;
|
|
3
|
+
top: 0;
|
|
4
|
+
left: 0;
|
|
5
|
+
z-index: 5;
|
|
6
|
+
cursor: crosshair;
|
|
7
|
+
touch-action: none;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.DrawingCanvas__controls {
|
|
11
|
+
position: fixed;
|
|
12
|
+
bottom: 20px;
|
|
13
|
+
left: 50%;
|
|
14
|
+
transform: translateX(-50%);
|
|
15
|
+
display: flex;
|
|
16
|
+
gap: 10px;
|
|
17
|
+
padding: 10px 20px;
|
|
18
|
+
background-color: rgba(43, 46, 51, 0.95);
|
|
19
|
+
border-radius: 8px;
|
|
20
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
|
|
21
|
+
z-index: 10;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.DrawingCanvas__controls button {
|
|
25
|
+
padding: 8px 16px;
|
|
26
|
+
border: none;
|
|
27
|
+
border-radius: 4px;
|
|
28
|
+
cursor: pointer;
|
|
29
|
+
font-size: 14px;
|
|
30
|
+
transition: background-color 0.2s, transform 0.1s;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.DrawingCanvas__controls button:hover {
|
|
34
|
+
transform: scale(1.02);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.DrawingCanvas__doneButton {
|
|
38
|
+
background-color: #4CAF50;
|
|
39
|
+
color: white;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.DrawingCanvas__doneButton:hover {
|
|
43
|
+
background-color: #45a049;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.DrawingCanvas__cancelButton {
|
|
47
|
+
background-color: #f44336;
|
|
48
|
+
color: white;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.DrawingCanvas__cancelButton:hover {
|
|
52
|
+
background-color: #da190b;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.DrawingCanvas__clearButton {
|
|
56
|
+
background-color: #ff9800;
|
|
57
|
+
color: white;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.DrawingCanvas__clearButton:hover {
|
|
61
|
+
background-color: #e68a00;
|
|
62
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
.DrawingHighlight {
|
|
2
|
+
position: absolute;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.DrawingHighlight__container {
|
|
6
|
+
width: 100%;
|
|
7
|
+
height: 100%;
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
border-radius: 4px;
|
|
11
|
+
overflow: visible;
|
|
12
|
+
transition: box-shadow 0.2s ease;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.DrawingHighlight__container:hover {
|
|
16
|
+
box-shadow: 2px 2px 12px rgba(0, 0, 0, 0.3);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.DrawingHighlight__toolbar {
|
|
20
|
+
display: flex;
|
|
21
|
+
align-items: center;
|
|
22
|
+
gap: 4px;
|
|
23
|
+
padding: 2px 4px;
|
|
24
|
+
background: rgba(0, 0, 0, 0.6);
|
|
25
|
+
border-radius: 4px;
|
|
26
|
+
position: absolute;
|
|
27
|
+
top: 4px;
|
|
28
|
+
left: 4px;
|
|
29
|
+
z-index: 10;
|
|
30
|
+
opacity: 0;
|
|
31
|
+
transition: opacity 0.2s ease;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.DrawingHighlight__container:hover .DrawingHighlight__toolbar {
|
|
35
|
+
opacity: 1;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.DrawingHighlight__drag-handle {
|
|
39
|
+
display: flex;
|
|
40
|
+
align-items: center;
|
|
41
|
+
justify-content: center;
|
|
42
|
+
width: 20px;
|
|
43
|
+
height: 20px;
|
|
44
|
+
cursor: grab;
|
|
45
|
+
color: white;
|
|
46
|
+
border-radius: 3px;
|
|
47
|
+
transition: background 0.2s;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.DrawingHighlight__drag-handle:hover {
|
|
51
|
+
background: rgba(255, 255, 255, 0.2);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.DrawingHighlight__drag-handle:active {
|
|
55
|
+
cursor: grabbing;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.DrawingHighlight__content {
|
|
59
|
+
flex: 1;
|
|
60
|
+
display: flex;
|
|
61
|
+
align-items: center;
|
|
62
|
+
justify-content: center;
|
|
63
|
+
overflow: hidden;
|
|
64
|
+
border-radius: 4px;
|
|
65
|
+
/* Transparent background for drawings */
|
|
66
|
+
background: transparent;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.DrawingHighlight__image {
|
|
70
|
+
max-width: 100%;
|
|
71
|
+
max-height: 100%;
|
|
72
|
+
object-fit: contain;
|
|
73
|
+
pointer-events: none;
|
|
74
|
+
user-select: none;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.DrawingHighlight--scrolledTo .DrawingHighlight__container {
|
|
78
|
+
box-shadow: 0 0 0 3px #ff4141, 2px 2px 8px rgba(0, 0, 0, 0.2);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Style edit button */
|
|
82
|
+
.DrawingHighlight__style-button {
|
|
83
|
+
display: flex;
|
|
84
|
+
align-items: center;
|
|
85
|
+
justify-content: center;
|
|
86
|
+
width: 20px;
|
|
87
|
+
height: 20px;
|
|
88
|
+
padding: 0;
|
|
89
|
+
background: transparent;
|
|
90
|
+
border: none;
|
|
91
|
+
cursor: pointer;
|
|
92
|
+
color: white;
|
|
93
|
+
border-radius: 3px;
|
|
94
|
+
transition: background 0.2s;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.DrawingHighlight__style-button:hover {
|
|
98
|
+
background: rgba(255, 255, 255, 0.2);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* Style controls dropdown */
|
|
102
|
+
.DrawingHighlight__style-controls {
|
|
103
|
+
position: absolute;
|
|
104
|
+
top: 28px;
|
|
105
|
+
left: 4px;
|
|
106
|
+
background: rgba(0, 0, 0, 0.85);
|
|
107
|
+
border-radius: 6px;
|
|
108
|
+
padding: 8px;
|
|
109
|
+
z-index: 20;
|
|
110
|
+
display: flex;
|
|
111
|
+
flex-direction: column;
|
|
112
|
+
gap: 8px;
|
|
113
|
+
min-width: 120px;
|
|
114
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.DrawingHighlight__color-picker {
|
|
118
|
+
display: flex;
|
|
119
|
+
gap: 4px;
|
|
120
|
+
flex-wrap: wrap;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.DrawingHighlight__color-button {
|
|
124
|
+
width: 20px;
|
|
125
|
+
height: 20px;
|
|
126
|
+
border: 2px solid transparent;
|
|
127
|
+
border-radius: 50%;
|
|
128
|
+
cursor: pointer;
|
|
129
|
+
transition: transform 0.2s, border-color 0.2s;
|
|
130
|
+
padding: 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.DrawingHighlight__color-button:hover {
|
|
134
|
+
transform: scale(1.15);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.DrawingHighlight__color-button.active {
|
|
138
|
+
border-color: #b958ff;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.DrawingHighlight__width-picker {
|
|
142
|
+
display: flex;
|
|
143
|
+
gap: 4px;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.DrawingHighlight__width-button {
|
|
147
|
+
background: transparent;
|
|
148
|
+
color: #f5f5f5;
|
|
149
|
+
border: 1px solid #666;
|
|
150
|
+
border-radius: 4px;
|
|
151
|
+
cursor: pointer;
|
|
152
|
+
font-size: 10px;
|
|
153
|
+
padding: 2px 6px;
|
|
154
|
+
transition: color 0.2s, border-color 0.2s, background-color 0.2s;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.DrawingHighlight__width-button:hover {
|
|
158
|
+
border-color: #b958ff;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.DrawingHighlight__width-button.active {
|
|
162
|
+
color: #b958ff;
|
|
163
|
+
border-color: #b958ff;
|
|
164
|
+
background-color: rgba(185, 88, 255, 0.2);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.DrawingHighlight__delete-button {
|
|
168
|
+
display: flex;
|
|
169
|
+
align-items: center;
|
|
170
|
+
justify-content: center;
|
|
171
|
+
width: 20px;
|
|
172
|
+
height: 20px;
|
|
173
|
+
border: none;
|
|
174
|
+
background: transparent;
|
|
175
|
+
cursor: pointer;
|
|
176
|
+
color: white;
|
|
177
|
+
border-radius: 3px;
|
|
178
|
+
padding: 0;
|
|
179
|
+
transition: background 0.2s;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.DrawingHighlight__delete-button:hover {
|
|
183
|
+
background: rgba(255, 100, 100, 0.6);
|
|
184
|
+
}
|