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.
Files changed (99) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +411 -0
  3. package/dist/esm/components/AreaHighlight.d.ts +82 -0
  4. package/dist/esm/components/AreaHighlight.js +109 -0
  5. package/dist/esm/components/AreaHighlight.js.map +1 -0
  6. package/dist/esm/components/DrawingCanvas.d.ts +48 -0
  7. package/dist/esm/components/DrawingCanvas.js +277 -0
  8. package/dist/esm/components/DrawingCanvas.js.map +1 -0
  9. package/dist/esm/components/DrawingHighlight.d.ts +70 -0
  10. package/dist/esm/components/DrawingHighlight.js +164 -0
  11. package/dist/esm/components/DrawingHighlight.js.map +1 -0
  12. package/dist/esm/components/FreetextHighlight.d.ts +112 -0
  13. package/dist/esm/components/FreetextHighlight.js +193 -0
  14. package/dist/esm/components/FreetextHighlight.js.map +1 -0
  15. package/dist/esm/components/HighlightLayer.d.ts +49 -0
  16. package/dist/esm/components/HighlightLayer.js +37 -0
  17. package/dist/esm/components/HighlightLayer.js.map +1 -0
  18. package/dist/esm/components/ImageHighlight.d.ts +63 -0
  19. package/dist/esm/components/ImageHighlight.js +65 -0
  20. package/dist/esm/components/ImageHighlight.js.map +1 -0
  21. package/dist/esm/components/MonitoredHighlightContainer.d.ts +37 -0
  22. package/dist/esm/components/MonitoredHighlightContainer.js +42 -0
  23. package/dist/esm/components/MonitoredHighlightContainer.js.map +1 -0
  24. package/dist/esm/components/MouseMonitor.d.ts +34 -0
  25. package/dist/esm/components/MouseMonitor.js +30 -0
  26. package/dist/esm/components/MouseMonitor.js.map +1 -0
  27. package/dist/esm/components/MouseSelection.d.ts +66 -0
  28. package/dist/esm/components/MouseSelection.js +122 -0
  29. package/dist/esm/components/MouseSelection.js.map +1 -0
  30. package/dist/esm/components/PdfHighlighter.d.ts +184 -0
  31. package/dist/esm/components/PdfHighlighter.js +410 -0
  32. package/dist/esm/components/PdfHighlighter.js.map +1 -0
  33. package/dist/esm/components/PdfLoader.d.ts +55 -0
  34. package/dist/esm/components/PdfLoader.js +57 -0
  35. package/dist/esm/components/PdfLoader.js.map +1 -0
  36. package/dist/esm/components/ShapeCanvas.d.ts +51 -0
  37. package/dist/esm/components/ShapeCanvas.js +205 -0
  38. package/dist/esm/components/ShapeCanvas.js.map +1 -0
  39. package/dist/esm/components/ShapeHighlight.d.ts +107 -0
  40. package/dist/esm/components/ShapeHighlight.js +140 -0
  41. package/dist/esm/components/ShapeHighlight.js.map +1 -0
  42. package/dist/esm/components/SignaturePad.d.ts +40 -0
  43. package/dist/esm/components/SignaturePad.js +138 -0
  44. package/dist/esm/components/SignaturePad.js.map +1 -0
  45. package/dist/esm/components/TextHighlight.d.ts +93 -0
  46. package/dist/esm/components/TextHighlight.js +115 -0
  47. package/dist/esm/components/TextHighlight.js.map +1 -0
  48. package/dist/esm/components/TipContainer.d.ts +27 -0
  49. package/dist/esm/components/TipContainer.js +58 -0
  50. package/dist/esm/components/TipContainer.js.map +1 -0
  51. package/dist/esm/contexts/HighlightContext.d.ts +44 -0
  52. package/dist/esm/contexts/HighlightContext.js +16 -0
  53. package/dist/esm/contexts/HighlightContext.js.map +1 -0
  54. package/dist/esm/contexts/PdfHighlighterContext.d.ts +89 -0
  55. package/dist/esm/contexts/PdfHighlighterContext.js +16 -0
  56. package/dist/esm/contexts/PdfHighlighterContext.js.map +1 -0
  57. package/dist/esm/index.d.ts +19 -0
  58. package/dist/esm/index.js +19 -0
  59. package/dist/esm/index.js.map +1 -0
  60. package/dist/esm/lib/coordinates.d.ts +16 -0
  61. package/dist/esm/lib/coordinates.js +69 -0
  62. package/dist/esm/lib/coordinates.js.map +1 -0
  63. package/dist/esm/lib/export-pdf.d.ts +81 -0
  64. package/dist/esm/lib/export-pdf.js +511 -0
  65. package/dist/esm/lib/export-pdf.js.map +1 -0
  66. package/dist/esm/lib/get-bounding-rect.d.ts +3 -0
  67. package/dist/esm/lib/get-bounding-rect.js +35 -0
  68. package/dist/esm/lib/get-bounding-rect.js.map +1 -0
  69. package/dist/esm/lib/get-client-rects.d.ts +3 -0
  70. package/dist/esm/lib/get-client-rects.js +43 -0
  71. package/dist/esm/lib/get-client-rects.js.map +1 -0
  72. package/dist/esm/lib/group-highlights-by-page.d.ts +6 -0
  73. package/dist/esm/lib/group-highlights-by-page.js +23 -0
  74. package/dist/esm/lib/group-highlights-by-page.js.map +1 -0
  75. package/dist/esm/lib/optimize-client-rects.d.ts +3 -0
  76. package/dist/esm/lib/optimize-client-rects.js +65 -0
  77. package/dist/esm/lib/optimize-client-rects.js.map +1 -0
  78. package/dist/esm/lib/pdfjs-dom.d.ts +9 -0
  79. package/dist/esm/lib/pdfjs-dom.js +55 -0
  80. package/dist/esm/lib/pdfjs-dom.js.map +1 -0
  81. package/dist/esm/lib/screenshot.d.ts +4 -0
  82. package/dist/esm/lib/screenshot.js +24 -0
  83. package/dist/esm/lib/screenshot.js.map +1 -0
  84. package/dist/esm/style/AreaHighlight.css +134 -0
  85. package/dist/esm/style/DrawingCanvas.css +62 -0
  86. package/dist/esm/style/DrawingHighlight.css +184 -0
  87. package/dist/esm/style/FreetextHighlight.css +249 -0
  88. package/dist/esm/style/ImageHighlight.css +97 -0
  89. package/dist/esm/style/MouseSelection.css +15 -0
  90. package/dist/esm/style/PdfHighlighter.css +77 -0
  91. package/dist/esm/style/ShapeCanvas.css +47 -0
  92. package/dist/esm/style/ShapeHighlight.css +182 -0
  93. package/dist/esm/style/SignaturePad.css +83 -0
  94. package/dist/esm/style/TextHighlight.css +199 -0
  95. package/dist/esm/style/pdf_viewer.css +41 -0
  96. package/dist/esm/types.d.ts +213 -0
  97. package/dist/esm/types.js +2 -0
  98. package/dist/esm/types.js.map +1 -0
  99. 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,3 @@
1
+ import type { LTWHP } from "../types.js";
2
+ declare const optimizeClientRects: (clientRects: Array<LTWHP>) => Array<LTWHP>;
3
+ export default optimizeClientRects;
@@ -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":"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"}
@@ -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,4 @@
1
+ import { PDFViewer } from "pdfjs-dist/types/web/pdf_viewer";
2
+ import type { LTWH } from "../types";
3
+ declare const screenshot: (position: LTWH, pageNumber: number, viewer: PDFViewer) => string;
4
+ export default screenshot;
@@ -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
+ }