@h4md1/visual-image-tool 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -5
- package/dist/{visual-image-tool.js → visual-image-tool.cjs} +257 -165
- package/dist/visual-image-tool.cjs.map +1 -0
- package/dist/visual-image-tool.esm.js +257 -162
- package/dist/visual-image-tool.esm.js.map +1 -1
- package/dist/visual-image-tool.umd.js +1 -1
- package/dist/visual-image-tool.umd.js.map +1 -1
- package/package.json +24 -8
- package/src/index.js +3 -6
- package/src/visual-image-tool.js +255 -155
- package/src/visual-image-tool.test.js +150 -0
- package/dist/visual-image-tool.js.map +0 -1
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import VisualImageTool from "./visual-image-tool.js";
|
|
3
|
+
|
|
4
|
+
const TRANSPARENT_PNG =
|
|
5
|
+
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";
|
|
6
|
+
|
|
7
|
+
describe("VisualImageTool", () => {
|
|
8
|
+
let container;
|
|
9
|
+
let imageElement;
|
|
10
|
+
let instance;
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
container = document.createElement("div");
|
|
14
|
+
document.body.appendChild(container);
|
|
15
|
+
|
|
16
|
+
imageElement = document.createElement("img");
|
|
17
|
+
imageElement.src = TRANSPARENT_PNG;
|
|
18
|
+
Object.defineProperty(imageElement, "naturalWidth", {
|
|
19
|
+
value: 100,
|
|
20
|
+
configurable: true,
|
|
21
|
+
});
|
|
22
|
+
Object.defineProperty(imageElement, "naturalHeight", {
|
|
23
|
+
value: 100,
|
|
24
|
+
configurable: true,
|
|
25
|
+
});
|
|
26
|
+
container.appendChild(imageElement);
|
|
27
|
+
|
|
28
|
+
instance = new VisualImageTool({ imageElement });
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
instance?.destroy();
|
|
33
|
+
document.body.removeChild(container);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("should initialize with default focus point at origin", () => {
|
|
37
|
+
expect(instance.getFocusPoint()).toEqual({ x: 0, y: 0 });
|
|
38
|
+
expect(instance.state.focusActive).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("should toggle focus point visibility without requiring a coordinate change", () => {
|
|
42
|
+
instance.setFocusPoint(40, 60);
|
|
43
|
+
instance.toggleFocusPoint(true);
|
|
44
|
+
|
|
45
|
+
expect(instance.state.focusActive).toBe(true);
|
|
46
|
+
expect(instance.state.focusMarker.style.display).toBe("block");
|
|
47
|
+
expect(instance.getFocusPoint()).toEqual({ x: 40, y: 60 });
|
|
48
|
+
|
|
49
|
+
instance.toggleFocusPoint(false);
|
|
50
|
+
expect(instance.state.focusActive).toBe(false);
|
|
51
|
+
expect(instance.state.focusMarker.style.display).toBe("none");
|
|
52
|
+
expect(instance.getFocusPoint()).toEqual({ x: 40, y: 60 });
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("should update the focus point via setFocusPoint", () => {
|
|
56
|
+
instance.setFocusPoint(50, 50);
|
|
57
|
+
expect(instance.getFocusPoint()).toEqual({ x: 50, y: 50 });
|
|
58
|
+
|
|
59
|
+
instance.setFocusPoint(25, 75);
|
|
60
|
+
expect(instance.getFocusPoint()).toEqual({ x: 25, y: 75 });
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("should expose public API methods", () => {
|
|
64
|
+
expect(typeof instance.getFocusPoint).toBe("function");
|
|
65
|
+
expect(typeof instance.setFocusPoint).toBe("function");
|
|
66
|
+
expect(typeof instance.toggleFocusPoint).toBe("function");
|
|
67
|
+
expect(typeof instance.toggleCropZone).toBe("function");
|
|
68
|
+
expect(typeof instance.destroy).toBe("function");
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("should remove overlay elements on destroy and allow a second call", () => {
|
|
72
|
+
instance.toggleFocusPoint(true);
|
|
73
|
+
instance.toggleCropZone(true);
|
|
74
|
+
const focusMarker = instance.state.focusMarker;
|
|
75
|
+
const cropOverlay = instance.state.cropOverlay;
|
|
76
|
+
|
|
77
|
+
expect(container.contains(focusMarker)).toBe(true);
|
|
78
|
+
expect(container.contains(cropOverlay)).toBe(true);
|
|
79
|
+
|
|
80
|
+
instance.destroy();
|
|
81
|
+
expect(instance.state).toBeNull();
|
|
82
|
+
expect(container.contains(focusMarker)).toBe(false);
|
|
83
|
+
expect(container.contains(cropOverlay)).toBe(false);
|
|
84
|
+
|
|
85
|
+
// Already destroyed; stop afterEach from tearing it down a second time.
|
|
86
|
+
instance = null;
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("should detach global listeners on destroy", () => {
|
|
90
|
+
// JSDOM swallows exceptions thrown inside a listener and reports them as
|
|
91
|
+
// an error event, so dispatching alone would look like a pass. Capture
|
|
92
|
+
// them instead.
|
|
93
|
+
const errors = [];
|
|
94
|
+
const onError = (event) => {
|
|
95
|
+
event.preventDefault();
|
|
96
|
+
errors.push(event.error ?? event.message);
|
|
97
|
+
};
|
|
98
|
+
window.addEventListener("error", onError);
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
instance.destroy();
|
|
102
|
+
instance = null;
|
|
103
|
+
|
|
104
|
+
// The handlers dereference this.state, which destroy() nulls out. A
|
|
105
|
+
// leaked listener therefore blows up on the next global event.
|
|
106
|
+
window.dispatchEvent(new Event("resize"));
|
|
107
|
+
document.dispatchEvent(new MouseEvent("mousemove", { bubbles: true }));
|
|
108
|
+
document.dispatchEvent(new MouseEvent("mouseup", { bubbles: true }));
|
|
109
|
+
} finally {
|
|
110
|
+
window.removeEventListener("error", onError);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
expect(errors).toEqual([]);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("should detach overlay listeners on destroy", () => {
|
|
117
|
+
instance.toggleFocusPoint(true);
|
|
118
|
+
instance.toggleCropZone(true);
|
|
119
|
+
const focusMarker = instance.state.focusMarker;
|
|
120
|
+
const cropHandle = instance.cropHandles[0];
|
|
121
|
+
|
|
122
|
+
expect(cropHandle).toBeDefined();
|
|
123
|
+
|
|
124
|
+
instance.destroy();
|
|
125
|
+
instance = null;
|
|
126
|
+
|
|
127
|
+
expect(() =>
|
|
128
|
+
focusMarker.dispatchEvent(new MouseEvent("mousedown", { bubbles: true })),
|
|
129
|
+
).not.toThrow();
|
|
130
|
+
expect(() =>
|
|
131
|
+
cropHandle.dispatchEvent(new MouseEvent("mousedown", { bubbles: true })),
|
|
132
|
+
).not.toThrow();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it("should be safe to destroy twice", () => {
|
|
136
|
+
instance.destroy();
|
|
137
|
+
expect(() => instance.destroy()).not.toThrow();
|
|
138
|
+
instance = null;
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it("should resize the crop zone from the handle that was grabbed", () => {
|
|
142
|
+
instance.toggleCropZone(true);
|
|
143
|
+
const handle = instance.cropHandles.find((h) => h.dataset.handle === "br");
|
|
144
|
+
|
|
145
|
+
handle.dispatchEvent(new MouseEvent("mousedown", { bubbles: true }));
|
|
146
|
+
|
|
147
|
+
expect(instance.interaction.cropResizing).toBe(true);
|
|
148
|
+
expect(instance.interaction.activeHandle).toBe("br");
|
|
149
|
+
});
|
|
150
|
+
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"visual-image-tool.js","sources":["../src/visual-image-tool.js","../src/index.js"],"sourcesContent":["/**\n * ImageTool - Un outil léger pour définir des points focaux et zones de recadrage sur des images\n * @module visual-image-tool\n */\n\nclass VisualImageTool {\n\t/**\n\t * Crée une instance de l'outil d'image\n\t * @param {Object} options - Options de configuration\n\t * @param {HTMLElement|string} options.imageElement - Élément image ou sélecteur CSS\n\t * @param {Object} [options.focusPoint] - Configuration du point focal\n\t * @param {boolean} [options.focusPoint.enabled=true] - Activer la fonctionnalité de point focal\n\t * @param {Object} [options.focusPoint.style] - Styles personnalisés pour le marqueur de point focal\n\t * @param {Object} [options.cropZone] - Configuration de la zone de recadrage\n\t * @param {boolean} [options.cropZone.enabled=true] - Activer la fonctionnalité de zone de recadrage\n\t * @param {Object} [options.cropZone.style] - Styles personnalisés pour l'overlay de recadrage\n\t * @param {Function} [options.onChange] - Callback appelé lors des changements\n\t */\n\tconstructor(options) {\n\t\t// Valider les options\n\t\tif (!options || !options.imageElement) {\n\t\t\tthrow new Error(\"L'élément image est requis\");\n\t\t}\n\n\t\t// Initialiser les propriétés\n\t\tthis.imageElement =\n\t\t\ttypeof options.imageElement === \"string\"\n\t\t\t\t? document.querySelector(options.imageElement)\n\t\t\t\t: options.imageElement;\n\n\t\tif (!this.imageElement || this.imageElement.tagName !== \"IMG\") {\n\t\t\tthrow new Error(\"Élément image invalide\");\n\t\t}\n\n\t\t// Options par défaut\n\t\tthis.options = {\n\t\t\tfocusPoint: {\n\t\t\t\tenabled: true,\n\t\t\t\tstyle: {\n\t\t\t\t\twidth: \"30px\",\n\t\t\t\t\theight: \"30px\",\n\t\t\t\t\tborder: \"3px solid white\",\n\t\t\t\t\tboxShadow: \"0 0 0 2px black, 0 0 5px rgba(0,0,0,0.5)\",\n\t\t\t\t\tbackgroundColor: \"rgba(255, 0, 0, 0.5)\",\n\t\t\t\t},\n\t\t\t\t...options.focusPoint,\n\t\t\t},\n\t\t\tcropZone: {\n\t\t\t\tenabled: true,\n\t\t\t\tstyle: {\n\t\t\t\t\tborder: \"1px dashed #fff\",\n\t\t\t\t\tbackgroundColor: \"rgba(0, 0, 0, 0.4)\",\n\t\t\t\t},\n\t\t\t\thandleStyle: {\n\t\t\t\t\twidth: \"14px\",\n\t\t\t\t\theight: \"14px\",\n\t\t\t\t\tbackgroundColor: \"white\",\n\t\t\t\t\tborder: \"2px solid black\",\n\t\t\t\t\tboxShadow: \"0 0 3px rgba(0,0,0,0.5)\",\n\t\t\t\t},\n\t\t\t\t...options.cropZone,\n\t\t\t},\n\t\t\tonChange: options.onChange || (() => {}),\n\t\t\tdebug: options.debug || false,\n\t\t};\n\n\t\t// État interne\n\t\tthis.state = {\n\t\t\tfocusMarker: null,\n\t\t\tcropOverlay: null,\n\t\t\tfocusActive: false,\n\t\t\tcropActive: false,\n\t\t\tfocusPoint: { x: 0, y: 0 },\n\t\t\tcropZone: { x: 0, y: 0, width: 0, height: 0 },\n\t\t\toriginalWidth: 1,\n\t\t\toriginalHeight: 1,\n\t\t\tdisplayWidth: 1,\n\t\t\tdisplayHeight: 1,\n\t\t\tscaleX: 1,\n\t\t\tscaleY: 1,\n\t\t};\n\n\t\t// Variables pour le suivi des interactions\n\t\tthis.interaction = {\n\t\t\tfocusDragging: false,\n\t\t\tfocusDragOffsetX: 0,\n\t\t\tfocusDragOffsetY: 0,\n\t\t\tcropDragging: false,\n\t\t\tcropResizing: false,\n\t\t\tactiveHandle: null,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\tstartWidth: 0,\n\t\t\tstartHeight: 0,\n\t\t\tstartMouseX: 0,\n\t\t\tstartMouseY: 0,\n\t\t};\n\n\t\t// Initialiser l'outil\n\t\tthis._init();\n\t}\n\n\t/**\n\t * Initialise l'outil d'image\n\t * @private\n\t */\n\t_init() {\n\t\t// Préparer le conteneur parent\n\t\tthis._prepareContainer();\n\n\t\t// Initialiser les dimensions\n\t\tthis._updateScaling();\n\n\t\t// Créer les éléments d'interface si activés\n\t\tif (this.options.focusPoint.enabled) {\n\t\t\tthis._createFocusMarker();\n\t\t}\n\n\t\tif (this.options.cropZone.enabled) {\n\t\t\tthis._createCropOverlay();\n\t\t}\n\n\t\t// Ajouter les écouteurs d'événements\n\t\tthis._setupEventListeners();\n\t}\n\n\t/**\n\t * Prépare le conteneur parent de l'image\n\t * @private\n\t */\n\t_prepareContainer() {\n\t\t// S'assurer que le parent est positionné\n\t\tif (this.imageElement.parentNode) {\n\t\t\tthis.imageElement.parentNode.style.position = \"relative\";\n\t\t}\n\t}\n\n\t/**\n\t * Met à jour les facteurs d'échelle\n\t * @private\n\t */\n\t_updateScaling() {\n\t\tthis.state.originalWidth = this.imageElement.naturalWidth || 1;\n\t\tthis.state.originalHeight = this.imageElement.naturalHeight || 1;\n\t\tthis.state.displayWidth = this.imageElement.offsetWidth;\n\t\tthis.state.displayHeight = this.imageElement.offsetHeight;\n\t\tthis.state.scaleX = this.state.displayWidth / this.state.originalWidth;\n\t\tthis.state.scaleY = this.state.displayHeight / this.state.originalHeight;\n\n\t\t// Repositionner les éléments si actifs\n\t\tif (this.state.focusActive) {\n\t\t\tthis._updateFocusMarkerPosition();\n\t\t}\n\n\t\tif (this.state.cropActive) {\n\t\t\tthis._updateCropOverlayPosition();\n\t\t}\n\t}\n\n\t/**\n\t * Convertit des coordonnées d'affichage en coordonnées originales\n\t * @private\n\t * @param {number} scaledX - Coordonnée X à l'échelle d'affichage\n\t * @param {number} scaledY - Coordonnée Y à l'échelle d'affichage\n\t * @returns {Object} Coordonnées originales\n\t */\n\t_toOriginalCoords(scaledX, scaledY) {\n\t\treturn {\n\t\t\tx: scaledX / this.state.scaleX,\n\t\t\ty: scaledY / this.state.scaleY,\n\t\t};\n\t}\n\n\t/**\n\t * Convertit des coordonnées originales en coordonnées d'affichage\n\t * @private\n\t * @param {number} originalX - Coordonnée X originale\n\t * @param {number} originalY - Coordonnée Y originale\n\t * @returns {Object} Coordonnées à l'échelle d'affichage\n\t */\n\t_toScaledCoords(originalX, originalY) {\n\t\treturn {\n\t\t\tx: originalX * this.state.scaleX,\n\t\t\ty: originalY * this.state.scaleY,\n\t\t};\n\t}\n\n\t/**\n\t * Crée le marqueur de point focal\n\t * @private\n\t */\n\t_createFocusMarker() {\n\t\tif (this.state.focusMarker) return;\n\n\t\tconst marker = document.createElement(\"div\");\n\t\tmarker.style.position = \"absolute\";\n\t\tmarker.style.width = this.options.focusPoint.style.width;\n\t\tmarker.style.height = this.options.focusPoint.style.height;\n\t\tmarker.style.border = this.options.focusPoint.style.border;\n\t\tmarker.style.boxShadow = this.options.focusPoint.style.boxShadow;\n\t\tmarker.style.backgroundColor =\n\t\t\tthis.options.focusPoint.style.backgroundColor;\n\t\tmarker.style.cursor = \"move\";\n\t\tmarker.style.display = \"none\";\n\t\tmarker.style.zIndex = \"999\";\n\t\tmarker.style.clipPath =\n\t\t\t\"polygon(40% 0%, 60% 0%, 60% 40%, 100% 40%, 100% 60%, 60% 60%, 60% 100%, 40% 100%, 40% 60%, 0% 60%, 0% 40%, 40% 40%)\";\n\n\t\tthis.imageElement.parentNode.appendChild(marker);\n\t\tthis.state.focusMarker = marker;\n\n\t\t// Ajouter les écouteurs d'événements au marqueur\n\t\tmarker.addEventListener(\n\t\t\t\"mousedown\",\n\t\t\tthis._handleFocusMarkerMouseDown.bind(this),\n\t\t);\n\t}\n\n\t/**\n\t * Gère l'événement mousedown sur le marqueur de point focal\n\t * @private\n\t * @param {MouseEvent} e - Événement mousedown\n\t */\n\t_handleFocusMarkerMouseDown(e) {\n\t\tthis.interaction.focusDragging = true;\n\t\tthis.state.focusMarker.style.cursor = \"grabbing\";\n\n\t\t// Calculer le décalage par rapport au centre du marqueur\n\t\tconst rect = this.state.focusMarker.getBoundingClientRect();\n\t\tthis.interaction.focusDragOffsetX =\n\t\t\te.clientX - (rect.left + rect.width / 2);\n\t\tthis.interaction.focusDragOffsetY =\n\t\t\te.clientY - (rect.top + rect.height / 2);\n\n\t\te.preventDefault();\n\t}\n\n\t/**\n\t * Crée l'overlay de zone de recadrage\n\t * @private\n\t */\n\t_createCropOverlay() {\n\t\tif (this.state.cropOverlay) return;\n\n\t\tconst overlay = document.createElement(\"div\");\n\t\toverlay.style.position = \"absolute\";\n\t\toverlay.style.border = this.options.cropZone.style.border;\n\t\toverlay.style.backgroundColor = this.options.cropZone.style.backgroundColor;\n\t\toverlay.style.boxSizing = \"border-box\";\n\t\toverlay.style.cursor = \"move\";\n\t\toverlay.style.display = \"none\";\n\t\toverlay.style.zIndex = \"998\";\n\n\t\t// Ajouter les poignées de redimensionnement\n\t\tconst handles = [\"tl\", \"tm\", \"tr\", \"ml\", \"mr\", \"bl\", \"bm\", \"br\"];\n\t\tfor (const handleType of handles) {\n\t\t\tconst handle = document.createElement(\"div\");\n\t\t\thandle.style.position = \"absolute\";\n\t\t\thandle.style.width = this.options.cropZone.handleStyle.width;\n\t\t\thandle.style.height = this.options.cropZone.handleStyle.height;\n\t\t\thandle.style.backgroundColor =\n\t\t\t\tthis.options.cropZone.handleStyle.backgroundColor;\n\t\t\thandle.style.border = this.options.cropZone.handleStyle.border;\n\t\t\thandle.style.boxShadow = this.options.cropZone.handleStyle.boxShadow;\n\t\t\thandle.style.boxSizing = \"border-box\";\n\t\t\thandle.dataset.handle = handleType;\n\n\t\t\t// Positionner la poignée\n\t\t\tswitch (handleType) {\n\t\t\t\tcase \"tl\": // Top-left\n\t\t\t\t\thandle.style.top = \"-7px\";\n\t\t\t\t\thandle.style.left = \"-7px\";\n\t\t\t\t\thandle.style.cursor = \"nwse-resize\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"tm\": // Top-middle\n\t\t\t\t\thandle.style.top = \"-7px\";\n\t\t\t\t\thandle.style.left = \"50%\";\n\t\t\t\t\thandle.style.marginLeft = \"-7px\";\n\t\t\t\t\thandle.style.cursor = \"ns-resize\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"tr\": // Top-right\n\t\t\t\t\thandle.style.top = \"-7px\";\n\t\t\t\t\thandle.style.right = \"-7px\";\n\t\t\t\t\thandle.style.cursor = \"nesw-resize\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ml\": // Middle-left\n\t\t\t\t\thandle.style.top = \"50%\";\n\t\t\t\t\thandle.style.left = \"-7px\";\n\t\t\t\t\thandle.style.marginTop = \"-7px\";\n\t\t\t\t\thandle.style.cursor = \"ew-resize\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"mr\": // Middle-right\n\t\t\t\t\thandle.style.top = \"50%\";\n\t\t\t\t\thandle.style.right = \"-7px\";\n\t\t\t\t\thandle.style.marginTop = \"-7px\";\n\t\t\t\t\thandle.style.cursor = \"ew-resize\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"bl\": // Bottom-left\n\t\t\t\t\thandle.style.bottom = \"-7px\";\n\t\t\t\t\thandle.style.left = \"-7px\";\n\t\t\t\t\thandle.style.cursor = \"nesw-resize\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"bm\": // Bottom-middle\n\t\t\t\t\thandle.style.bottom = \"-7px\";\n\t\t\t\t\thandle.style.left = \"50%\";\n\t\t\t\t\thandle.style.marginLeft = \"-7px\";\n\t\t\t\t\thandle.style.cursor = \"ns-resize\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"br\": // Bottom-right\n\t\t\t\t\thandle.style.bottom = \"-7px\";\n\t\t\t\t\thandle.style.right = \"-7px\";\n\t\t\t\t\thandle.style.cursor = \"nwse-resize\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Ajouter l'écouteur d'événement\n\t\t\thandle.addEventListener(\"mousedown\", (e) =>\n\t\t\t\tthis._handleCropHandleMouseDown(e, handleType),\n\t\t\t);\n\n\t\t\toverlay.appendChild(handle);\n\t\t}\n\n\t\t// Ajouter l'écouteur pour le déplacement de l'overlay\n\t\toverlay.addEventListener(\n\t\t\t\"mousedown\",\n\t\t\tthis._handleCropOverlayMouseDown.bind(this),\n\t\t);\n\n\t\tthis.imageElement.parentNode.appendChild(overlay);\n\t\tthis.state.cropOverlay = overlay;\n\t}\n\n\t/**\n\t * Gère l'événement mousedown sur une poignée de redimensionnement\n\t * @private\n\t * @param {MouseEvent} e - Événement mousedown\n\t * @param {string} handleType - Type de poignée\n\t */\n\t_handleCropHandleMouseDown(e, handleType) {\n\t\tthis.interaction.cropResizing = true;\n\t\tthis.interaction.activeHandle = handleType;\n\n\t\t// Enregistrer les dimensions et position initiales\n\t\tthis.interaction.startX =\n\t\t\tNumber.parseInt(this.state.cropOverlay.style.left, 10) || 0;\n\t\tthis.interaction.startY =\n\t\t\tNumber.parseInt(this.state.cropOverlay.style.top, 10) || 0;\n\t\tthis.interaction.startWidth = this.state.cropOverlay.offsetWidth;\n\t\tthis.interaction.startHeight = this.state.cropOverlay.offsetHeight;\n\t\tthis.interaction.startMouseX = e.clientX;\n\t\tthis.interaction.startMouseY = e.clientY;\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t}\n\n\t/**\n\t * Gère l'événement mousedown sur l'overlay de recadrage\n\t * @private\n\t * @param {MouseEvent} e - Événement mousedown\n\t */\n\t_handleCropOverlayMouseDown(e) {\n\t\t// Ignorer si on clique sur une poignée\n\t\tif (e.target !== this.state.cropOverlay) return;\n\n\t\tthis.interaction.cropDragging = true;\n\t\tthis.state.cropOverlay.style.cursor = \"grabbing\";\n\n\t\t// Enregistrer la position initiale\n\t\tthis.interaction.startX =\n\t\t\tNumber.parseInt(this.state.cropOverlay.style.left, 10) || 0;\n\t\tthis.interaction.startY =\n\t\t\tNumber.parseInt(this.state.cropOverlay.style.top, 10) || 0;\n\t\tthis.interaction.startMouseX = e.clientX;\n\t\tthis.interaction.startMouseY = e.clientY;\n\n\t\te.preventDefault();\n\t}\n\n\t/**\n\t * Configure les écouteurs d'événements globaux\n\t * @private\n\t */\n\t_setupEventListeners() {\n\t\t// Écouteur pour le redimensionnement de la fenêtre\n\t\twindow.addEventListener(\"resize\", this._updateScaling.bind(this));\n\n\t\t// Écouteur pour le chargement de l'image\n\t\tif (!this.imageElement.complete) {\n\t\t\tthis.imageElement.addEventListener(\n\t\t\t\t\"load\",\n\t\t\t\tthis._updateScaling.bind(this),\n\t\t\t);\n\t\t}\n\n\t\t// Écouteurs pour les interactions de souris\n\t\tdocument.addEventListener(\"mouseup\", this._handleMouseUp.bind(this));\n\t\tdocument.addEventListener(\"mousemove\", this._handleMouseMove.bind(this));\n\t}\n\n\t/**\n\t * Gère l'événement mouseup global\n\t * @private\n\t */\n\t_handleMouseUp() {\n\t\tif (this.interaction.focusDragging) {\n\t\t\tthis.interaction.focusDragging = false;\n\t\t\tif (this.state.focusMarker) this.state.focusMarker.style.cursor = \"move\";\n\t\t}\n\n\t\tif (this.interaction.cropDragging) {\n\t\t\tthis.interaction.cropDragging = false;\n\t\t\tif (this.state.cropOverlay) this.state.cropOverlay.style.cursor = \"move\";\n\t\t}\n\n\t\tthis.interaction.cropResizing = false;\n\t\tthis.interaction.activeHandle = null;\n\t\tdocument.body.style.cursor = \"default\";\n\t}\n\n\t/**\n\t * Gère l'événement mousemove global\n\t * @private\n\t * @param {MouseEvent} e - Événement mousemove\n\t */\n\t_handleMouseMove(e) {\n\t\t// Gestion du déplacement du point focal\n\t\tif (this.interaction.focusDragging && this.state.focusMarker) {\n\t\t\tthis._handleFocusMarkerDrag(e);\n\t\t}\n\n\t\t// Gestion du déplacement de la zone de recadrage\n\t\tif (this.interaction.cropDragging) {\n\t\t\tthis._handleCropOverlayDrag(e);\n\t\t}\n\n\t\t// Gestion du redimensionnement de la zone de recadrage\n\t\tif (this.interaction.cropResizing) {\n\t\t\tthis._handleCropOverlayResize(e);\n\t\t}\n\t}\n\n\t/**\n\t * Gère le déplacement du marqueur de point focal\n\t * @private\n\t * @param {MouseEvent} e - Événement mousemove\n\t */\n\t_handleFocusMarkerDrag(e) {\n\t\tconst imageRect = this.imageElement.getBoundingClientRect();\n\n\t\t// Calculer la position cible relative à l'image\n\t\tconst targetScaledX =\n\t\t\te.clientX - imageRect.left - this.interaction.focusDragOffsetX;\n\t\tconst targetScaledY =\n\t\t\te.clientY - imageRect.top - this.interaction.focusDragOffsetY;\n\n\t\t// Convertir en coordonnées originales\n\t\tconst original = this._toOriginalCoords(targetScaledX, targetScaledY);\n\n\t\t// Mettre à jour le point focal\n\t\tthis.setFocusPoint(original.x, original.y);\n\t}\n\n\t/**\n\t * Gère le déplacement de l'overlay de recadrage\n\t * @private\n\t * @param {MouseEvent} e - Événement mousemove\n\t */\n\t_handleCropOverlayDrag(e) {\n\t\tconst deltaX = e.clientX - this.interaction.startMouseX;\n\t\tconst deltaY = e.clientY - this.interaction.startMouseY;\n\n\t\t// Calculer la nouvelle position en pixels d'affichage\n\t\tconst newX = this.interaction.startX + deltaX;\n\t\tconst newY = this.interaction.startY + deltaY;\n\n\t\t// Convertir en coordonnées originales\n\t\tconst original = this._toOriginalCoords(newX, newY);\n\n\t\t// Obtenir les dimensions actuelles en coordonnées originales\n\t\tconst { width, height } = this.state.cropZone;\n\n\t\t// Mettre à jour la zone de recadrage\n\t\tthis.setCropZone(original.x, original.y, width, height);\n\t}\n\n\t/**\n\t * Gère le redimensionnement de l'overlay de recadrage\n\t * @private\n\t * @param {MouseEvent} e - Événement mousemove\n\t */\n\t_handleCropOverlayResize(e) {\n\t\tif (!this.interaction.activeHandle) return;\n\n\t\tconst deltaX = e.clientX - this.interaction.startMouseX;\n\t\tconst deltaY = e.clientY - this.interaction.startMouseY;\n\n\t\tlet newX = this.interaction.startX;\n\t\tlet newY = this.interaction.startY;\n\t\tlet newWidth = this.interaction.startWidth;\n\t\tlet newHeight = this.interaction.startHeight;\n\n\t\t// Ajuster en fonction de la poignée active\n\t\tif (this.interaction.activeHandle.includes(\"t\")) {\n\t\t\t// Top\n\t\t\tnewY = this.interaction.startY + deltaY;\n\t\t\tnewHeight = this.interaction.startHeight - deltaY;\n\t\t}\n\t\tif (this.interaction.activeHandle.includes(\"b\")) {\n\t\t\t// Bottom\n\t\t\tnewHeight = this.interaction.startHeight + deltaY;\n\t\t}\n\t\tif (this.interaction.activeHandle.includes(\"l\")) {\n\t\t\t// Left\n\t\t\tnewX = this.interaction.startX + deltaX;\n\t\t\tnewWidth = this.interaction.startWidth - deltaX;\n\t\t}\n\t\tif (this.interaction.activeHandle.includes(\"r\")) {\n\t\t\t// Right\n\t\t\tnewWidth = this.interaction.startWidth + deltaX;\n\t\t}\n\n\t\t// Empêcher les dimensions négatives\n\t\tif (newWidth < 10) {\n\t\t\tif (this.interaction.activeHandle.includes(\"l\")) {\n\t\t\t\tnewX = this.interaction.startX + this.interaction.startWidth - 10;\n\t\t\t}\n\t\t\tnewWidth = 10;\n\t\t}\n\t\tif (newHeight < 10) {\n\t\t\tif (this.interaction.activeHandle.includes(\"t\")) {\n\t\t\t\tnewY = this.interaction.startY + this.interaction.startHeight - 10;\n\t\t\t}\n\t\t\tnewHeight = 10;\n\t\t}\n\n\t\t// Convertir les coordonnées d'affichage en coordonnées originales\n\t\tconst originalX = newX / this.state.scaleX;\n\t\tconst originalY = newY / this.state.scaleY;\n\t\tconst originalWidth = newWidth / this.state.scaleX;\n\t\tconst originalHeight = newHeight / this.state.scaleY;\n\n\t\t// Mettre à jour la zone de recadrage\n\t\tthis.setCropZone(originalX, originalY, originalWidth, originalHeight);\n\t}\n\n\t/**\n\t * Met à jour la position du marqueur de point focal\n\t * @private\n\t */\n\t_updateFocusMarkerPosition() {\n\t\tif (!this.state.focusMarker) return;\n\n\t\tconst { x, y } = this.state.focusPoint;\n\n\t\t// Limiter les coordonnées aux dimensions de l'image\n\t\tconst clampedX = Math.max(0, Math.min(x, this.state.originalWidth));\n\t\tconst clampedY = Math.max(0, Math.min(y, this.state.originalHeight));\n\n\t\t// Mettre à jour l'état si les coordonnées ont été limitées\n\t\tif (x !== clampedX || y !== clampedY) {\n\t\t\tthis.state.focusPoint = { x: clampedX, y: clampedY };\n\t\t}\n\n\t\tconst scaled = this._toScaledCoords(clampedX, clampedY);\n\n\t\t// LOGGING: Validate padding offset\n\t\tif (this.options.debug) {\n\t\t\tconst container = this.imageElement.parentNode;\n\t\t\tconst computedStyle = window.getComputedStyle(container);\n\t\t\tconst paddingLeft = Number.parseFloat(computedStyle.paddingLeft);\n\t\t\tconst paddingTop = Number.parseFloat(computedStyle.paddingTop);\n\t\t\tconsole.log(\n\t\t\t\t\"[FocusMarker] scaled:\",\n\t\t\t\tscaled,\n\t\t\t\t\"paddingLeft:\",\n\t\t\t\tpaddingLeft,\n\t\t\t\t\"paddingTop:\",\n\t\t\t\tpaddingTop,\n\t\t\t\t\"containerRect:\",\n\t\t\t\tcontainer.getBoundingClientRect(),\n\t\t\t);\n\t\t}\n\n\t\t// Ajuster pour centrer le marqueur\n\t\t// Adjust for container padding (use unique variable names)\n\t\tlet focusPaddingLeft = 0;\n\t\tlet focusPaddingTop = 0;\n\t\t{\n\t\t\tconst container = this.imageElement.parentNode;\n\t\t\tconst computedStyle = window.getComputedStyle(container);\n\t\t\tfocusPaddingLeft = Number.parseFloat(computedStyle.paddingLeft);\n\t\t\tfocusPaddingTop = Number.parseFloat(computedStyle.paddingTop);\n\t\t}\n\n\t\tthis.state.focusMarker.style.left = `${\n\t\t\tscaled.x + focusPaddingLeft - this.state.focusMarker.offsetWidth / 2\n\t\t}px`;\n\t\tthis.state.focusMarker.style.top = `${\n\t\t\tscaled.y + focusPaddingTop - this.state.focusMarker.offsetHeight / 2\n\t\t}px`;\n\t\tif (this.options.debug) {\n\t\t\tconsole.log(\n\t\t\t\t\"[FocusMarker] style.left:\",\n\t\t\t\tthis.state.focusMarker.style.left,\n\t\t\t\t\"style.top:\",\n\t\t\t\tthis.state.focusMarker.style.top,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Met à jour la position et les dimensions de l'overlay de recadrage\n\t * @private\n\t */\n\t_updateCropOverlayPosition() {\n\t\tif (!this.state.cropOverlay) return;\n\n\t\tconst { x, y, width, height } = this.state.cropZone;\n\n\t\t// Limiter aux dimensions de l'image\n\t\tconst clampedX = Math.max(0, Math.min(x, this.state.originalWidth - width));\n\t\tconst clampedY = Math.max(\n\t\t\t0,\n\t\t\tMath.min(y, this.state.originalHeight - height),\n\t\t);\n\t\tconst clampedWidth = Math.max(\n\t\t\t10,\n\t\t\tMath.min(width, this.state.originalWidth - clampedX),\n\t\t);\n\t\tconst clampedHeight = Math.max(\n\t\t\t10,\n\t\t\tMath.min(height, this.state.originalHeight - clampedY),\n\t\t);\n\n\t\t// Mettre à jour l'état si les valeurs ont été limitées\n\t\tif (\n\t\t\tx !== clampedX ||\n\t\t\ty !== clampedY ||\n\t\t\twidth !== clampedWidth ||\n\t\t\theight !== clampedHeight\n\t\t) {\n\t\t\tthis.state.cropZone = {\n\t\t\t\tx: clampedX,\n\t\t\t\ty: clampedY,\n\t\t\t\twidth: clampedWidth,\n\t\t\t\theight: clampedHeight,\n\t\t\t};\n\t\t}\n\n\t\t// Convertir en coordonnées d'affichage\n\t\tconst scaled = this._toScaledCoords(clampedX, clampedY);\n\t\tconst scaledWidth = clampedWidth * this.state.scaleX;\n\t\tconst scaledHeight = clampedHeight * this.state.scaleY;\n\n\t\t// LOGGING: Validate padding offset\n\t\tif (this.options.debug) {\n\t\t\tconst container = this.imageElement.parentNode;\n\t\t\tconst computedStyle = window.getComputedStyle(container);\n\t\t\tconst paddingLeft = Number.parseFloat(computedStyle.paddingLeft);\n\t\t\tconst paddingTop = Number.parseFloat(computedStyle.paddingTop);\n\t\t\tconsole.log(\n\t\t\t\t\"[CropOverlay] scaled:\",\n\t\t\t\tscaled,\n\t\t\t\t\"paddingLeft:\",\n\t\t\t\tpaddingLeft,\n\t\t\t\t\"paddingTop:\",\n\t\t\t\tpaddingTop,\n\t\t\t\t\"containerRect:\",\n\t\t\t\tcontainer.getBoundingClientRect(),\n\t\t\t);\n\t\t}\n\n\t\t// Mettre à jour l'overlay\n\t\t// Adjust for container padding (use unique variable names)\n\t\tlet cropPaddingLeft = 0;\n\t\tlet cropPaddingTop = 0;\n\t\t{\n\t\t\tconst container = this.imageElement.parentNode;\n\t\t\tconst computedStyle = window.getComputedStyle(container);\n\t\t\tcropPaddingLeft = Number.parseFloat(computedStyle.paddingLeft);\n\t\t\tcropPaddingTop = Number.parseFloat(computedStyle.paddingTop);\n\t\t}\n\n\t\tthis.state.cropOverlay.style.left = `${scaled.x + cropPaddingLeft}px`;\n\t\tthis.state.cropOverlay.style.top = `${scaled.y + cropPaddingTop}px`;\n\t\tthis.state.cropOverlay.style.width = `${scaledWidth}px`;\n\t\tthis.state.cropOverlay.style.height = `${scaledHeight}px`;\n\t\tif (this.options.debug) {\n\t\t\tconsole.log(\n\t\t\t\t\"[CropOverlay] style.left:\",\n\t\t\t\tthis.state.cropOverlay.style.left,\n\t\t\t\t\"style.top:\",\n\t\t\t\tthis.state.cropOverlay.style.top,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Active ou désactive le point focal\n\t * @public\n\t * @param {boolean} active - État d'activation\n\t * @returns {ImageTool} Instance pour chaînage\n\t */\n\ttoggleFocusPoint(active) {\n\t\tif (!this.options.focusPoint.enabled) return this;\n\n\t\tconst isActive = active === undefined ? !this.state.focusActive : active;\n\n\t\tif (active && !this.state.focusActive) {\n\t\t\t// Activer le point focal\n\t\t\tif (!this.state.focusMarker) {\n\t\t\t\tthis._createFocusMarker();\n\t\t\t}\n\n\t\t\t// Positionner au centre de l'image par défaut si pas déjà défini\n\t\t\tif (this.state.focusPoint.x === 0 && this.state.focusPoint.y === 0) {\n\t\t\t\tthis.state.focusPoint = {\n\t\t\t\t\tx: this.state.originalWidth / 2,\n\t\t\t\t\ty: this.state.originalHeight / 2,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis._updateFocusMarkerPosition();\n\t\t\tthis.state.focusMarker.style.display = \"block\";\n\t\t\tthis.state.focusActive = true;\n\t\t} else if (!active && this.state.focusActive) {\n\t\t\t// Désactiver le point focal\n\t\t\tif (this.state.focusMarker) {\n\t\t\t\tthis.state.focusMarker.style.display = \"none\";\n\t\t\t}\n\t\t\tthis.state.focusActive = false;\n\t\t}\n\n\t\t// Notifier le changement\n\t\tthis._notifyChange();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Active ou désactive la zone de recadrage\n\t * @public\n\t * @param {boolean} active - État d'activation\n\t * @returns {ImageTool} Instance pour chaînage\n\t */\n\ttoggleCropZone(active) {\n\t\tif (!this.options.cropZone.enabled) return this;\n\n\t\tconst isActive = active === undefined ? !this.state.cropActive : active;\n\n\t\tif (active && !this.state.cropActive) {\n\t\t\t// Activer la zone de recadrage\n\t\t\tif (!this.state.cropOverlay) {\n\t\t\t\tthis._createCropOverlay();\n\t\t\t}\n\n\t\t\t// Définir une zone par défaut si pas déjà définie\n\t\t\tif (this.state.cropZone.width === 0 || this.state.cropZone.height === 0) {\n\t\t\t\tconst defaultWidth = this.state.originalWidth / 2;\n\t\t\t\tconst defaultHeight = this.state.originalHeight / 2;\n\t\t\t\tconst defaultX = (this.state.originalWidth - defaultWidth) / 2;\n\t\t\t\tconst defaultY = (this.state.originalHeight - defaultHeight) / 2;\n\n\t\t\t\tthis.state.cropZone = {\n\t\t\t\t\tx: defaultX,\n\t\t\t\t\ty: defaultY,\n\t\t\t\t\twidth: defaultWidth,\n\t\t\t\t\theight: defaultHeight,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis._updateCropOverlayPosition();\n\t\t\tthis.state.cropOverlay.style.display = \"block\";\n\t\t\tthis.state.cropActive = true;\n\t\t} else if (!active && this.state.cropActive) {\n\t\t\t// Désactiver la zone de recadrage\n\t\t\tif (this.state.cropOverlay) {\n\t\t\t\tthis.state.cropOverlay.style.display = \"none\";\n\t\t\t}\n\t\t\tthis.state.cropActive = false;\n\t\t}\n\n\t\t// Notifier le changement\n\t\tthis._notifyChange();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Définit la position du point focal\n\t * @public\n\t * @param {number} x - Coordonnée X en pixels originaux\n\t * @param {number} y - Coordonnée Y en pixels originaux\n\t * @returns {ImageTool} Instance pour chaînage\n\t */\n\tsetFocusPoint(x, y) {\n\t\t// Limiter les coordonnées aux dimensions de l'image\n\t\tconst clampedX = Math.max(0, Math.min(x, this.state.originalWidth));\n\t\tconst clampedY = Math.max(0, Math.min(y, this.state.originalHeight));\n\n\t\tthis.state.focusPoint = { x: clampedX, y: clampedY };\n\n\t\tif (this.state.focusActive && this.state.focusMarker) {\n\t\t\tthis._updateFocusMarkerPosition();\n\t\t}\n\n\t\t// Notifier le changement\n\t\tthis._notifyChange();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Définit la position et les dimensions de la zone de recadrage\n\t * @public\n\t * @param {number} x - Coordonnée X en pixels originaux\n\t * @param {number} y - Coordonnée Y en pixels originaux\n\t * @param {number} width - Largeur en pixels originaux\n\t * @param {number} height - Hauteur en pixels originaux\n\t * @returns {ImageTool} Instance pour chaînage\n\t */\n\tsetCropZone(x, y, width, height) {\n\t\t// Limiter aux dimensions de l'image\n\t\tconst clampedX = Math.max(0, Math.min(x, this.state.originalWidth - width));\n\t\tconst clampedY = Math.max(\n\t\t\t0,\n\t\t\tMath.min(y, this.state.originalHeight - height),\n\t\t);\n\t\tconst clampedWidth = Math.max(\n\t\t\t10,\n\t\t\tMath.min(width, this.state.originalWidth - clampedX),\n\t\t);\n\t\tconst clampedHeight = Math.max(\n\t\t\t10,\n\t\t\tMath.min(height, this.state.originalHeight - clampedY),\n\t\t);\n\n\t\tthis.state.cropZone = {\n\t\t\tx: clampedX,\n\t\t\ty: clampedY,\n\t\t\twidth: clampedWidth,\n\t\t\theight: clampedHeight,\n\t\t};\n\n\t\tif (this.state.cropActive && this.state.cropOverlay) {\n\t\t\tthis._updateCropOverlayPosition();\n\t\t}\n\n\t\t// Notifier le changement\n\t\tthis._notifyChange();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Obtient la position actuelle du point focal\n\t * @public\n\t * @returns {Object} Coordonnées du point focal {x, y}\n\t */\n\tgetFocusPoint() {\n\t\treturn { ...this.state.focusPoint };\n\t}\n\n\t/**\n\t * Obtient la position et les dimensions actuelles de la zone de recadrage\n\t * @public\n\t * @returns {Object} Zone de recadrage {x, y, width, height}\n\t */\n\tgetCropZone() {\n\t\treturn { ...this.state.cropZone };\n\t}\n\n\t/**\n\t * Obtient les dimensions originales de l'image\n\t * @public\n\t * @returns {Object} Dimensions {width, height}\n\t */\n\tgetImageDimensions() {\n\t\treturn {\n\t\t\twidth: this.state.originalWidth,\n\t\t\theight: this.state.originalHeight,\n\t\t};\n\t}\n\n\t/**\n\t * Notifie les changements via le callback\n\t * @private\n\t */\n\t_notifyChange() {\n\t\tif (typeof this.options.onChange === \"function\") {\n\t\t\tthis.options.onChange({\n\t\t\t\tfocusPoint: this.getFocusPoint(),\n\t\t\t\tcropZone: this.getCropZone(),\n\t\t\t\tfocusActive: this.state.focusActive,\n\t\t\t\tcropActive: this.state.cropActive,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Détruit l'instance et nettoie les ressources\n\t * @public\n\t */\n\tdestroy() {\n\t\t// Supprimer les éléments DOM\n\t\tif (this.state.focusMarker?.parentNode) {\n\t\t\tthis.state.focusMarker.parentNode.removeChild(this.state.focusMarker);\n\t\t}\n\n\t\tif (this.state.cropOverlay?.parentNode) {\n\t\t\tthis.state.cropOverlay.parentNode.removeChild(this.state.cropOverlay);\n\t\t}\n\n\t\t// Supprimer les écouteurs d'événements\n\t\twindow.removeEventListener(\"resize\", this._updateScaling.bind(this));\n\t\tdocument.removeEventListener(\"mouseup\", this._handleMouseUp.bind(this));\n\t\tdocument.removeEventListener(\"mousemove\", this._handleMouseMove.bind(this));\n\n\t\t// Réinitialiser l'état\n\t\tthis.state = null;\n\t\tthis.interaction = null;\n\t\tthis.options = null;\n\t\tthis.imageElement = null;\n\t}\n}\n\n// Exporter la classe\nexport default VisualImageTool;\n","/**\n * Point d'entrée principal pour le package image-tool\n * Exporte la classe VisualImageTool\n */\n\nimport VisualImageTool from \"./visual-image-tool.js\";\n\n// Exporter la classe comme export par défaut\nexport default VisualImageTool;\n\n// Exporter également comme export nommé pour plus de flexibilité\nexport { VisualImageTool };\n"],"names":[],"mappings":"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"}
|