@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.
@@ -1 +1 @@
1
- {"version":3,"file":"visual-image-tool.esm.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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"}
1
+ {"version":3,"file":"visual-image-tool.esm.js","sources":["../src/visual-image-tool.js"],"sourcesContent":["/**\n * ImageTool - A lightweight tool for defining focus points and crop zones on images\n * @module visual-image-tool\n */\n\nclass VisualImageTool {\n\t/**\n\t * Creates an instance of the image tool.\n\t * The focus point is initialized to `{x:0, y:0}` in `this.state`. When `toggleFocusPoint(true)` is called for the first time, if the focus point is still `{x:0, y:0}`, it will be automatically centered on the image.\n\t * @param {Object} options - Configuration options\n\t * @param {HTMLElement|string} options.imageElement - Image element or CSS selector\n\t * @param {Object} [options.focusPoint] - Focus point configuration\n\t * @param {boolean} [options.focusPoint.enabled=true] - Enable focus point functionality\n\t * @param {Object} [options.focusPoint.style] - Custom styles for the focus point marker\n\t * @param {Object} [options.cropZone] - Crop zone configuration\n\t * @param {boolean} [options.cropZone.enabled=true] - Enable crop zone functionality\n\t * @param {Object} [options.cropZone.style] - Custom styles for the crop overlay\n\t * @param {Function} [options.onChange] - Callback called on changes\n\t */\n\tconstructor(options) {\n\t\t// Validate options\n\t\tif (!options || !options.imageElement) {\n\t\t\tthrow new Error(\"Image element is required\");\n\t\t}\n\n\t\t// Initialize properties\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(\"Invalid image element\");\n\t\t}\n\n\t\t// Default options\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// Internal state\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// Handlers are bound once here: addEventListener and removeEventListener\n\t\t// must be handed the same function reference for removal to work.\n\t\tthis._boundUpdateScaling = this._updateScaling.bind(this);\n\t\tthis._boundHandleMouseUp = this._handleMouseUp.bind(this);\n\t\tthis._boundHandleMouseMove = this._handleMouseMove.bind(this);\n\t\tthis._boundFocusMarkerMouseDown =\n\t\t\tthis._handleFocusMarkerMouseDown.bind(this);\n\t\tthis._boundCropOverlayMouseDown =\n\t\t\tthis._handleCropOverlayMouseDown.bind(this);\n\t\tthis._boundCropHandleMouseDown = this._handleCropHandleMouseDown.bind(this);\n\n\t\t// Resize handles, tracked so their listeners can be removed on destroy\n\t\tthis.cropHandles = [];\n\n\t\t// Variables for tracking 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\tthis.spinnerElement = null;\n\t\tthis.initialLoadComplete = false;\n\n\t\t// Initialize the tool\n\t\tthis._init();\n\t}\n\n\t/**\n\t * Initializes the image tool\n\t * @private\n\t */\n\t_init() {\n\t\t// Prepare the parent container\n\t\tthis._prepareContainer();\n\n\t\t// Initialize dimensions\n\t\tthis._updateScaling();\n\n\t\t// Create UI elements if enabled\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// Add event listeners\n\t\tthis._setupEventListeners();\n\t}\n\n\t/**\n\t * Prepares the image's parent container\n\t * @private\n\t */\n\t_prepareContainer() {\n\t\t// Ensure the parent is positioned\n\t\tif (this.imageElement.parentNode) {\n\t\t\tthis.imageElement.parentNode.style.position = \"relative\";\n\n\t\t\t// Create spinner element\n\t\t\tthis.spinnerElement = document.createElement(\"div\");\n\t\t\tthis.spinnerElement.style.position = \"absolute\";\n\t\t\tthis.spinnerElement.style.top = \"50%\";\n\t\t\tthis.spinnerElement.style.left = \"50%\";\n\t\t\tthis.spinnerElement.style.transform = \"translate(-50%, -50%)\";\n\t\t\tthis.spinnerElement.style.width = \"40px\";\n\t\t\tthis.spinnerElement.style.height = \"40px\";\n\t\t\tthis.spinnerElement.style.border = \"4px solid #f3f3f3\"; // Light grey\n\t\t\tthis.spinnerElement.style.borderTop = \"4px solid #3498db\"; // Blue\n\t\t\tthis.spinnerElement.style.borderRadius = \"50%\";\n\t\t\tthis.spinnerElement.style.boxSizing = \"border-box\";\n\t\t\tthis.spinnerElement.style.zIndex = \"1000\"; // Ensure it's above other elements\n\t\t\tthis.spinnerElement.style.display = \"block\"; // Initially visible\n\t\t\tthis.spinnerElement.style.animation = \"spin 1s linear infinite\";\n\n\t\t\tthis.imageElement.parentNode.appendChild(this.spinnerElement);\n\n\t\t\t// Add CSS keyframes for spinner animation\n\t\t\tif (!document.getElementById(\"visual-image-tool-spinner-styles\")) {\n\t\t\t\tconst styleElement = document.createElement(\"style\");\n\t\t\t\tstyleElement.id = \"visual-image-tool-spinner-styles\";\n\t\t\t\tstyleElement.innerHTML = `\n@keyframes spin {\n 0% { transform: translate(-50%, -50%) rotate(0deg); }\n 100% { transform: translate(-50%, -50%) rotate(360deg); }\n}\n `;\n\t\t\t\tdocument.head.appendChild(styleElement);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Updates scaling factors\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\n\t\t// Hide spinner once image is loaded and dimensions are available\n\t\tif (\n\t\t\t!this.initialLoadComplete &&\n\t\t\tthis.spinnerElement &&\n\t\t\tthis.state.originalWidth > 1 &&\n\t\t\tthis.state.originalHeight > 1\n\t\t) {\n\t\t\tthis.spinnerElement.style.display = \"none\";\n\t\t\tthis.initialLoadComplete = true;\n\t\t}\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// Update spinner position during initial load if still visible\n\t\tif (!this.initialLoadComplete && this.spinnerElement) {\n\t\t\tthis.spinnerElement.style.top = `${this.state.displayHeight / 2}px`;\n\t\t\tthis.spinnerElement.style.left = `${this.state.displayWidth / 2}px`;\n\t\t}\n\n\t\t// Reposition elements if active\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 * Converts display coordinates to original coordinates\n\t * @private\n\t * @param {number} scaledX - X-coordinate at display scale\n\t * @param {number} scaledY - Y-coordinate at display scale\n\t * @returns {Object} Original coordinates {x, y}\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 * Converts original coordinates to display coordinates\n\t * @private\n\t * @param {number} originalX - Original X-coordinate\n\t * @param {number} originalY - Original Y-coordinate\n\t * @returns {Object} Display scale coordinates {x, y}\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 * Creates the focus point marker\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// Add event listeners to the marker\n\t\tmarker.addEventListener(\"mousedown\", this._boundFocusMarkerMouseDown);\n\t}\n\n\t/**\n\t * Handles mousedown event on the focus point marker\n\t * @private\n\t * @param {MouseEvent} e - Mousedown event\n\t */\n\t_handleFocusMarkerMouseDown(e) {\n\t\tthis.interaction.focusDragging = true;\n\t\tthis.state.focusMarker.style.cursor = \"grabbing\";\n\n\t\t// Calculate offset from marker center\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 * Creates the crop zone overlay\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// Add resize handles\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// Position the handle\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// Add event listener\n\t\t\thandle.addEventListener(\"mousedown\", this._boundCropHandleMouseDown);\n\n\t\t\toverlay.appendChild(handle);\n\t\t\tthis.cropHandles.push(handle);\n\t\t}\n\n\t\t// Add listener for overlay dragging\n\t\toverlay.addEventListener(\"mousedown\", this._boundCropOverlayMouseDown);\n\n\t\tthis.imageElement.parentNode.appendChild(overlay);\n\t\tthis.state.cropOverlay = overlay;\n\t}\n\n\t/**\n\t * Handles mousedown event on a resize handle\n\t * @private\n\t * @param {MouseEvent} e - Mousedown event\n\t */\n\t_handleCropHandleMouseDown(e) {\n\t\tconst handleType = e.currentTarget.dataset.handle;\n\n\t\tthis.interaction.cropResizing = true;\n\t\tthis.interaction.activeHandle = handleType;\n\n\t\t// Record initial dimensions and position\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 * Handles mousedown event on the crop overlay\n\t * @private\n\t * @param {MouseEvent} e - Mousedown event\n\t */\n\t_handleCropOverlayMouseDown(e) {\n\t\t// Ignore if clicking on a handle\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// Record initial position\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 * Sets up global event listeners\n\t * @private\n\t */\n\t_setupEventListeners() {\n\t\t// Listener for window resize\n\t\twindow.addEventListener(\"resize\", this._boundUpdateScaling);\n\n\t\t// Listener for image load\n\t\tif (!this.imageElement.complete) {\n\t\t\tthis.imageElement.addEventListener(\"load\", this._boundUpdateScaling);\n\t\t}\n\n\t\t// Listeners for mouse interactions\n\t\tdocument.addEventListener(\"mouseup\", this._boundHandleMouseUp);\n\t\tdocument.addEventListener(\"mousemove\", this._boundHandleMouseMove);\n\t}\n\n\t/**\n\t * Handles global mouseup event\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 * Handles global mousemove event\n\t * @private\n\t * @param {MouseEvent} e - Mousemove event\n\t */\n\t_handleMouseMove(e) {\n\t\t// Handle focus point dragging\n\t\tif (this.interaction.focusDragging && this.state.focusMarker) {\n\t\t\tthis._handleFocusMarkerDrag(e);\n\t\t}\n\n\t\t// Handle crop zone dragging\n\t\tif (this.interaction.cropDragging) {\n\t\t\tthis._handleCropOverlayDrag(e);\n\t\t}\n\n\t\t// Handle crop zone resizing\n\t\tif (this.interaction.cropResizing) {\n\t\t\tthis._handleCropOverlayResize(e);\n\t\t}\n\t}\n\n\t/**\n\t * Handles focus point marker drag\n\t * @private\n\t * @param {MouseEvent} e - Mousemove event\n\t */\n\t_handleFocusMarkerDrag(e) {\n\t\tconst imageRect = this.imageElement.getBoundingClientRect();\n\n\t\t// Calculate target position relative to the 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// Convert to original coordinates\n\t\tconst original = this._toOriginalCoords(targetScaledX, targetScaledY);\n\n\t\t// Update focus point\n\t\tthis.setFocusPoint(original.x, original.y);\n\t}\n\n\t/**\n\t * Handles crop overlay drag\n\t * @private\n\t * @param {MouseEvent} e - Mousemove event\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// Calculate new position in display pixels\n\t\tconst newX = this.interaction.startX + deltaX;\n\t\tconst newY = this.interaction.startY + deltaY;\n\n\t\t// Convert to original coordinates\n\t\tconst original = this._toOriginalCoords(newX, newY);\n\n\t\t// Get current dimensions in original coordinates\n\t\tconst { width, height } = this.state.cropZone;\n\n\t\t// Update crop zone\n\t\tthis.setCropZone(original.x, original.y, width, height);\n\t}\n\n\t/**\n\t * Handles crop overlay resize\n\t * @private\n\t * @param {MouseEvent} e - Mousemove event\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// Adjust based on active handle\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// Prevent negative dimensions\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// Convert display coordinates to original coordinates\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// Update crop zone\n\t\tthis.setCropZone(originalX, originalY, originalWidth, originalHeight);\n\t}\n\n\t/**\n\t * Updates the focus point marker position\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// Clamp coordinates to image dimensions\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// Update state if coordinates were clamped\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// Adjust to center the marker\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 * Updates the crop overlay position and dimensions\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// Clamp to image dimensions\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// Update state if values were clamped\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// Convert to display coordinates\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// Update 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 * Enables or disables the focus point.\n\t * If the focus point is at its initial state `{x:0, y:0}` (top-left corner), it will be moved to the center of the image when this method is called with `active = true` for the first time.\n\t * @public\n\t * @param {boolean} active - Activation state\n\t * @returns {VisualImageTool} Instance for chaining\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 (isActive && !this.state.focusActive) {\n\t\t\t// Enable focus point\n\t\t\tif (!this.state.focusMarker) {\n\t\t\t\tthis._createFocusMarker();\n\t\t\t}\n\n\t\t\t// Position at image center by default if not already set\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 (!isActive && this.state.focusActive) {\n\t\t\t// Disable focus point\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// Notify change\n\t\tthis._notifyChange();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Enables or disables the crop zone\n\t * @public\n\t * @param {boolean} active - Activation state\n\t * @returns {VisualImageTool} Instance for chaining\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 (isActive && !this.state.cropActive) {\n\t\t\t// Enable crop zone\n\t\t\tif (!this.state.cropOverlay) {\n\t\t\t\tthis._createCropOverlay();\n\t\t\t}\n\n\t\t\t// Define a default zone if not already set\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 (!isActive && this.state.cropActive) {\n\t\t\t// Disable crop zone\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// Notify change\n\t\tthis._notifyChange();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the focus point position\n\t * @public\n\t * @param {number} x - X-coordinate in original pixels\n\t * @param {number} y - Y-coordinate in original pixels\n\t * @returns {VisualImageTool} Instance for chaining\n\t */\n\tsetFocusPoint(x, y) {\n\t\t// Clamp coordinates to image dimensions\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// Notify change\n\t\tthis._notifyChange();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the crop zone position and dimensions\n\t * @public\n\t * @param {number} x - X-coordinate in original pixels\n\t * @param {number} y - Y-coordinate in original pixels\n\t * @param {number} width - Width in original pixels\n\t * @param {number} height - Height in original pixels\n\t * @returns {VisualImageTool} Instance for chaining\n\t */\n\tsetCropZone(x, y, width, height) {\n\t\t// Clamp to image dimensions\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// Notify change\n\t\tthis._notifyChange();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the current focus point position\n\t * @public\n\t * @returns {Object} Focus point coordinates {x, y}\n\t */\n\tgetFocusPoint() {\n\t\treturn { ...this.state.focusPoint };\n\t}\n\n\t/**\n\t * Gets the current crop zone position and dimensions\n\t * @public\n\t * @returns {Object} Crop zone {x, y, width, height}\n\t */\n\tgetCropZone() {\n\t\treturn { ...this.state.cropZone };\n\t}\n\n\t/**\n\t * Gets the original image dimensions\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 * Notifies changes via 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 * Destroys the instance and cleans up resources\n\t * @public\n\t */\n\tdestroy() {\n\t\t// Already destroyed\n\t\tif (!this.state) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove element listeners\n\t\tif (this.state.focusMarker) {\n\t\t\tthis.state.focusMarker.removeEventListener(\n\t\t\t\t\"mousedown\",\n\t\t\t\tthis._boundFocusMarkerMouseDown,\n\t\t\t);\n\t\t}\n\n\t\tif (this.state.cropOverlay) {\n\t\t\tthis.state.cropOverlay.removeEventListener(\n\t\t\t\t\"mousedown\",\n\t\t\t\tthis._boundCropOverlayMouseDown,\n\t\t\t);\n\t\t}\n\n\t\tfor (const handle of this.cropHandles) {\n\t\t\thandle.removeEventListener(\"mousedown\", this._boundCropHandleMouseDown);\n\t\t}\n\t\tthis.cropHandles = [];\n\n\t\t// Remove DOM elements\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\tif (this.spinnerElement?.parentNode) {\n\t\t\tthis.spinnerElement.parentNode.removeChild(this.spinnerElement);\n\t\t}\n\t\tthis.spinnerElement = null;\n\n\t\t// Remove global listeners\n\t\twindow.removeEventListener(\"resize\", this._boundUpdateScaling);\n\t\tdocument.removeEventListener(\"mouseup\", this._boundHandleMouseUp);\n\t\tdocument.removeEventListener(\"mousemove\", this._boundHandleMouseMove);\n\n\t\tif (this.imageElement) {\n\t\t\tthis.imageElement.removeEventListener(\"load\", this._boundUpdateScaling);\n\t\t}\n\n\t\t// Release bound handlers\n\t\tthis._boundUpdateScaling = null;\n\t\tthis._boundHandleMouseUp = null;\n\t\tthis._boundHandleMouseMove = null;\n\t\tthis._boundFocusMarkerMouseDown = null;\n\t\tthis._boundCropOverlayMouseDown = null;\n\t\tthis._boundCropHandleMouseDown = null;\n\n\t\t// Reset state\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// Export class\nexport default VisualImageTool;\n"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).VisualImageTool={})}(this,(function(t){"use strict";class e{constructor(t){if(!t||!t.imageElement)throw new Error("L'élément image est requis");if(this.imageElement="string"==typeof t.imageElement?document.querySelector(t.imageElement):t.imageElement,!this.imageElement||"IMG"!==this.imageElement.tagName)throw new Error("Élément image invalide");this.options={focusPoint:{enabled:!0,style:{width:"30px",height:"30px",border:"3px solid white",boxShadow:"0 0 0 2px black, 0 0 5px rgba(0,0,0,0.5)",backgroundColor:"rgba(255, 0, 0, 0.5)"},...t.focusPoint},cropZone:{enabled:!0,style:{border:"1px dashed #fff",backgroundColor:"rgba(0, 0, 0, 0.4)"},handleStyle:{width:"14px",height:"14px",backgroundColor:"white",border:"2px solid black",boxShadow:"0 0 3px rgba(0,0,0,0.5)"},...t.cropZone},onChange:t.onChange||(()=>{}),debug:t.debug||!1},this.state={focusMarker:null,cropOverlay:null,focusActive:!1,cropActive:!1,focusPoint:{x:0,y:0},cropZone:{x:0,y:0,width:0,height:0},originalWidth:1,originalHeight:1,displayWidth:1,displayHeight:1,scaleX:1,scaleY:1},this.interaction={focusDragging:!1,focusDragOffsetX:0,focusDragOffsetY:0,cropDragging:!1,cropResizing:!1,activeHandle:null,startX:0,startY:0,startWidth:0,startHeight:0,startMouseX:0,startMouseY:0},this._init()}_init(){this._prepareContainer(),this._updateScaling(),this.options.focusPoint.enabled&&this._createFocusMarker(),this.options.cropZone.enabled&&this._createCropOverlay(),this._setupEventListeners()}_prepareContainer(){this.imageElement.parentNode&&(this.imageElement.parentNode.style.position="relative")}_updateScaling(){this.state.originalWidth=this.imageElement.naturalWidth||1,this.state.originalHeight=this.imageElement.naturalHeight||1,this.state.displayWidth=this.imageElement.offsetWidth,this.state.displayHeight=this.imageElement.offsetHeight,this.state.scaleX=this.state.displayWidth/this.state.originalWidth,this.state.scaleY=this.state.displayHeight/this.state.originalHeight,this.state.focusActive&&this._updateFocusMarkerPosition(),this.state.cropActive&&this._updateCropOverlayPosition()}_toOriginalCoords(t,e){return{x:t/this.state.scaleX,y:e/this.state.scaleY}}_toScaledCoords(t,e){return{x:t*this.state.scaleX,y:e*this.state.scaleY}}_createFocusMarker(){if(this.state.focusMarker)return;const t=document.createElement("div");t.style.position="absolute",t.style.width=this.options.focusPoint.style.width,t.style.height=this.options.focusPoint.style.height,t.style.border=this.options.focusPoint.style.border,t.style.boxShadow=this.options.focusPoint.style.boxShadow,t.style.backgroundColor=this.options.focusPoint.style.backgroundColor,t.style.cursor="move",t.style.display="none",t.style.zIndex="999",t.style.clipPath="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%)",this.imageElement.parentNode.appendChild(t),this.state.focusMarker=t,t.addEventListener("mousedown",this._handleFocusMarkerMouseDown.bind(this))}_handleFocusMarkerMouseDown(t){this.interaction.focusDragging=!0,this.state.focusMarker.style.cursor="grabbing";const e=this.state.focusMarker.getBoundingClientRect();this.interaction.focusDragOffsetX=t.clientX-(e.left+e.width/2),this.interaction.focusDragOffsetY=t.clientY-(e.top+e.height/2),t.preventDefault()}_createCropOverlay(){if(this.state.cropOverlay)return;const t=document.createElement("div");t.style.position="absolute",t.style.border=this.options.cropZone.style.border,t.style.backgroundColor=this.options.cropZone.style.backgroundColor,t.style.boxSizing="border-box",t.style.cursor="move",t.style.display="none",t.style.zIndex="998";const e=["tl","tm","tr","ml","mr","bl","bm","br"];for(const i of e){const e=document.createElement("div");switch(e.style.position="absolute",e.style.width=this.options.cropZone.handleStyle.width,e.style.height=this.options.cropZone.handleStyle.height,e.style.backgroundColor=this.options.cropZone.handleStyle.backgroundColor,e.style.border=this.options.cropZone.handleStyle.border,e.style.boxShadow=this.options.cropZone.handleStyle.boxShadow,e.style.boxSizing="border-box",e.dataset.handle=i,i){case"tl":e.style.top="-7px",e.style.left="-7px",e.style.cursor="nwse-resize";break;case"tm":e.style.top="-7px",e.style.left="50%",e.style.marginLeft="-7px",e.style.cursor="ns-resize";break;case"tr":e.style.top="-7px",e.style.right="-7px",e.style.cursor="nesw-resize";break;case"ml":e.style.top="50%",e.style.left="-7px",e.style.marginTop="-7px",e.style.cursor="ew-resize";break;case"mr":e.style.top="50%",e.style.right="-7px",e.style.marginTop="-7px",e.style.cursor="ew-resize";break;case"bl":e.style.bottom="-7px",e.style.left="-7px",e.style.cursor="nesw-resize";break;case"bm":e.style.bottom="-7px",e.style.left="50%",e.style.marginLeft="-7px",e.style.cursor="ns-resize";break;case"br":e.style.bottom="-7px",e.style.right="-7px",e.style.cursor="nwse-resize"}e.addEventListener("mousedown",(t=>this._handleCropHandleMouseDown(t,i))),t.appendChild(e)}t.addEventListener("mousedown",this._handleCropOverlayMouseDown.bind(this)),this.imageElement.parentNode.appendChild(t),this.state.cropOverlay=t}_handleCropHandleMouseDown(t,e){this.interaction.cropResizing=!0,this.interaction.activeHandle=e,this.interaction.startX=Number.parseInt(this.state.cropOverlay.style.left,10)||0,this.interaction.startY=Number.parseInt(this.state.cropOverlay.style.top,10)||0,this.interaction.startWidth=this.state.cropOverlay.offsetWidth,this.interaction.startHeight=this.state.cropOverlay.offsetHeight,this.interaction.startMouseX=t.clientX,this.interaction.startMouseY=t.clientY,t.preventDefault(),t.stopPropagation()}_handleCropOverlayMouseDown(t){t.target===this.state.cropOverlay&&(this.interaction.cropDragging=!0,this.state.cropOverlay.style.cursor="grabbing",this.interaction.startX=Number.parseInt(this.state.cropOverlay.style.left,10)||0,this.interaction.startY=Number.parseInt(this.state.cropOverlay.style.top,10)||0,this.interaction.startMouseX=t.clientX,this.interaction.startMouseY=t.clientY,t.preventDefault())}_setupEventListeners(){window.addEventListener("resize",this._updateScaling.bind(this)),this.imageElement.complete||this.imageElement.addEventListener("load",this._updateScaling.bind(this)),document.addEventListener("mouseup",this._handleMouseUp.bind(this)),document.addEventListener("mousemove",this._handleMouseMove.bind(this))}_handleMouseUp(){this.interaction.focusDragging&&(this.interaction.focusDragging=!1,this.state.focusMarker&&(this.state.focusMarker.style.cursor="move")),this.interaction.cropDragging&&(this.interaction.cropDragging=!1,this.state.cropOverlay&&(this.state.cropOverlay.style.cursor="move")),this.interaction.cropResizing=!1,this.interaction.activeHandle=null,document.body.style.cursor="default"}_handleMouseMove(t){this.interaction.focusDragging&&this.state.focusMarker&&this._handleFocusMarkerDrag(t),this.interaction.cropDragging&&this._handleCropOverlayDrag(t),this.interaction.cropResizing&&this._handleCropOverlayResize(t)}_handleFocusMarkerDrag(t){const e=this.imageElement.getBoundingClientRect(),i=t.clientX-e.left-this.interaction.focusDragOffsetX,s=t.clientY-e.top-this.interaction.focusDragOffsetY,o=this._toOriginalCoords(i,s);this.setFocusPoint(o.x,o.y)}_handleCropOverlayDrag(t){const e=t.clientX-this.interaction.startMouseX,i=t.clientY-this.interaction.startMouseY,s=this.interaction.startX+e,o=this.interaction.startY+i,a=this._toOriginalCoords(s,o),{width:r,height:n}=this.state.cropZone;this.setCropZone(a.x,a.y,r,n)}_handleCropOverlayResize(t){if(!this.interaction.activeHandle)return;const e=t.clientX-this.interaction.startMouseX,i=t.clientY-this.interaction.startMouseY;let s=this.interaction.startX,o=this.interaction.startY,a=this.interaction.startWidth,r=this.interaction.startHeight;this.interaction.activeHandle.includes("t")&&(o=this.interaction.startY+i,r=this.interaction.startHeight-i),this.interaction.activeHandle.includes("b")&&(r=this.interaction.startHeight+i),this.interaction.activeHandle.includes("l")&&(s=this.interaction.startX+e,a=this.interaction.startWidth-e),this.interaction.activeHandle.includes("r")&&(a=this.interaction.startWidth+e),a<10&&(this.interaction.activeHandle.includes("l")&&(s=this.interaction.startX+this.interaction.startWidth-10),a=10),r<10&&(this.interaction.activeHandle.includes("t")&&(o=this.interaction.startY+this.interaction.startHeight-10),r=10);const n=s/this.state.scaleX,h=o/this.state.scaleY,l=a/this.state.scaleX,c=r/this.state.scaleY;this.setCropZone(n,h,l,c)}_updateFocusMarkerPosition(){if(!this.state.focusMarker)return;const{x:t,y:e}=this.state.focusPoint,i=Math.max(0,Math.min(t,this.state.originalWidth)),s=Math.max(0,Math.min(e,this.state.originalHeight));t===i&&e===s||(this.state.focusPoint={x:i,y:s});const o=this._toScaledCoords(i,s);if(this.options.debug){const t=this.imageElement.parentNode,e=window.getComputedStyle(t),i=Number.parseFloat(e.paddingLeft),s=Number.parseFloat(e.paddingTop);console.log("[FocusMarker] scaled:",o,"paddingLeft:",i,"paddingTop:",s,"containerRect:",t.getBoundingClientRect())}let a=0,r=0;{const t=this.imageElement.parentNode,e=window.getComputedStyle(t);a=Number.parseFloat(e.paddingLeft),r=Number.parseFloat(e.paddingTop)}this.state.focusMarker.style.left=o.x+a-this.state.focusMarker.offsetWidth/2+"px",this.state.focusMarker.style.top=o.y+r-this.state.focusMarker.offsetHeight/2+"px",this.options.debug&&console.log("[FocusMarker] style.left:",this.state.focusMarker.style.left,"style.top:",this.state.focusMarker.style.top)}_updateCropOverlayPosition(){if(!this.state.cropOverlay)return;const{x:t,y:e,width:i,height:s}=this.state.cropZone,o=Math.max(0,Math.min(t,this.state.originalWidth-i)),a=Math.max(0,Math.min(e,this.state.originalHeight-s)),r=Math.max(10,Math.min(i,this.state.originalWidth-o)),n=Math.max(10,Math.min(s,this.state.originalHeight-a));t===o&&e===a&&i===r&&s===n||(this.state.cropZone={x:o,y:a,width:r,height:n});const h=this._toScaledCoords(o,a),l=r*this.state.scaleX,c=n*this.state.scaleY;if(this.options.debug){const t=this.imageElement.parentNode,e=window.getComputedStyle(t),i=Number.parseFloat(e.paddingLeft),s=Number.parseFloat(e.paddingTop);console.log("[CropOverlay] scaled:",h,"paddingLeft:",i,"paddingTop:",s,"containerRect:",t.getBoundingClientRect())}let d=0,p=0;{const t=this.imageElement.parentNode,e=window.getComputedStyle(t);d=Number.parseFloat(e.paddingLeft),p=Number.parseFloat(e.paddingTop)}this.state.cropOverlay.style.left=`${h.x+d}px`,this.state.cropOverlay.style.top=`${h.y+p}px`,this.state.cropOverlay.style.width=`${l}px`,this.state.cropOverlay.style.height=`${c}px`,this.options.debug&&console.log("[CropOverlay] style.left:",this.state.cropOverlay.style.left,"style.top:",this.state.cropOverlay.style.top)}toggleFocusPoint(t){return this.options.focusPoint.enabled?(void 0===t&&this.state.focusActive,t&&!this.state.focusActive?(this.state.focusMarker||this._createFocusMarker(),0===this.state.focusPoint.x&&0===this.state.focusPoint.y&&(this.state.focusPoint={x:this.state.originalWidth/2,y:this.state.originalHeight/2}),this._updateFocusMarkerPosition(),this.state.focusMarker.style.display="block",this.state.focusActive=!0):!t&&this.state.focusActive&&(this.state.focusMarker&&(this.state.focusMarker.style.display="none"),this.state.focusActive=!1),this._notifyChange(),this):this}toggleCropZone(t){if(!this.options.cropZone.enabled)return this;if(void 0===t&&this.state.cropActive,t&&!this.state.cropActive){if(this.state.cropOverlay||this._createCropOverlay(),0===this.state.cropZone.width||0===this.state.cropZone.height){const t=this.state.originalWidth/2,e=this.state.originalHeight/2,i=(this.state.originalWidth-t)/2,s=(this.state.originalHeight-e)/2;this.state.cropZone={x:i,y:s,width:t,height:e}}this._updateCropOverlayPosition(),this.state.cropOverlay.style.display="block",this.state.cropActive=!0}else!t&&this.state.cropActive&&(this.state.cropOverlay&&(this.state.cropOverlay.style.display="none"),this.state.cropActive=!1);return this._notifyChange(),this}setFocusPoint(t,e){const i=Math.max(0,Math.min(t,this.state.originalWidth)),s=Math.max(0,Math.min(e,this.state.originalHeight));return this.state.focusPoint={x:i,y:s},this.state.focusActive&&this.state.focusMarker&&this._updateFocusMarkerPosition(),this._notifyChange(),this}setCropZone(t,e,i,s){const o=Math.max(0,Math.min(t,this.state.originalWidth-i)),a=Math.max(0,Math.min(e,this.state.originalHeight-s)),r=Math.max(10,Math.min(i,this.state.originalWidth-o)),n=Math.max(10,Math.min(s,this.state.originalHeight-a));return this.state.cropZone={x:o,y:a,width:r,height:n},this.state.cropActive&&this.state.cropOverlay&&this._updateCropOverlayPosition(),this._notifyChange(),this}getFocusPoint(){return{...this.state.focusPoint}}getCropZone(){return{...this.state.cropZone}}getImageDimensions(){return{width:this.state.originalWidth,height:this.state.originalHeight}}_notifyChange(){"function"==typeof this.options.onChange&&this.options.onChange({focusPoint:this.getFocusPoint(),cropZone:this.getCropZone(),focusActive:this.state.focusActive,cropActive:this.state.cropActive})}destroy(){this.state.focusMarker?.parentNode&&this.state.focusMarker.parentNode.removeChild(this.state.focusMarker),this.state.cropOverlay?.parentNode&&this.state.cropOverlay.parentNode.removeChild(this.state.cropOverlay),window.removeEventListener("resize",this._updateScaling.bind(this)),document.removeEventListener("mouseup",this._handleMouseUp.bind(this)),document.removeEventListener("mousemove",this._handleMouseMove.bind(this)),this.state=null,this.interaction=null,this.options=null,this.imageElement=null}}t.VisualImageTool=e,t.default=e,Object.defineProperty(t,"__esModule",{value:!0})}));
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).VisualImageTool={})}(this,(function(t){"use strict";t.VisualImageTool=class{constructor(t){if(!t||!t.imageElement)throw new Error("Image element is required");if(this.imageElement="string"==typeof t.imageElement?document.querySelector(t.imageElement):t.imageElement,!this.imageElement||"IMG"!==this.imageElement.tagName)throw new Error("Invalid image element");this.options={focusPoint:{enabled:!0,style:{width:"30px",height:"30px",border:"3px solid white",boxShadow:"0 0 0 2px black, 0 0 5px rgba(0,0,0,0.5)",backgroundColor:"rgba(255, 0, 0, 0.5)"},...t.focusPoint},cropZone:{enabled:!0,style:{border:"1px dashed #fff",backgroundColor:"rgba(0, 0, 0, 0.4)"},handleStyle:{width:"14px",height:"14px",backgroundColor:"white",border:"2px solid black",boxShadow:"0 0 3px rgba(0,0,0,0.5)"},...t.cropZone},onChange:t.onChange||(()=>{}),debug:t.debug||!1},this.state={focusMarker:null,cropOverlay:null,focusActive:!1,cropActive:!1,focusPoint:{x:0,y:0},cropZone:{x:0,y:0,width:0,height:0},originalWidth:1,originalHeight:1,displayWidth:1,displayHeight:1,scaleX:1,scaleY:1},this._boundUpdateScaling=this._updateScaling.bind(this),this._boundHandleMouseUp=this._handleMouseUp.bind(this),this._boundHandleMouseMove=this._handleMouseMove.bind(this),this._boundFocusMarkerMouseDown=this._handleFocusMarkerMouseDown.bind(this),this._boundCropOverlayMouseDown=this._handleCropOverlayMouseDown.bind(this),this._boundCropHandleMouseDown=this._handleCropHandleMouseDown.bind(this),this.cropHandles=[],this.interaction={focusDragging:!1,focusDragOffsetX:0,focusDragOffsetY:0,cropDragging:!1,cropResizing:!1,activeHandle:null,startX:0,startY:0,startWidth:0,startHeight:0,startMouseX:0,startMouseY:0},this.spinnerElement=null,this.initialLoadComplete=!1,this._init()}_init(){this._prepareContainer(),this._updateScaling(),this.options.focusPoint.enabled&&this._createFocusMarker(),this.options.cropZone.enabled&&this._createCropOverlay(),this._setupEventListeners()}_prepareContainer(){if(this.imageElement.parentNode&&(this.imageElement.parentNode.style.position="relative",this.spinnerElement=document.createElement("div"),this.spinnerElement.style.position="absolute",this.spinnerElement.style.top="50%",this.spinnerElement.style.left="50%",this.spinnerElement.style.transform="translate(-50%, -50%)",this.spinnerElement.style.width="40px",this.spinnerElement.style.height="40px",this.spinnerElement.style.border="4px solid #f3f3f3",this.spinnerElement.style.borderTop="4px solid #3498db",this.spinnerElement.style.borderRadius="50%",this.spinnerElement.style.boxSizing="border-box",this.spinnerElement.style.zIndex="1000",this.spinnerElement.style.display="block",this.spinnerElement.style.animation="spin 1s linear infinite",this.imageElement.parentNode.appendChild(this.spinnerElement),!document.getElementById("visual-image-tool-spinner-styles"))){const t=document.createElement("style");t.id="visual-image-tool-spinner-styles",t.innerHTML="\n@keyframes spin {\n 0% { transform: translate(-50%, -50%) rotate(0deg); }\n 100% { transform: translate(-50%, -50%) rotate(360deg); }\n}\n ",document.head.appendChild(t)}}_updateScaling(){this.state.originalWidth=this.imageElement.naturalWidth||1,this.state.originalHeight=this.imageElement.naturalHeight||1,!this.initialLoadComplete&&this.spinnerElement&&this.state.originalWidth>1&&this.state.originalHeight>1&&(this.spinnerElement.style.display="none",this.initialLoadComplete=!0),this.state.displayWidth=this.imageElement.offsetWidth,this.state.displayHeight=this.imageElement.offsetHeight,this.state.scaleX=this.state.displayWidth/this.state.originalWidth,this.state.scaleY=this.state.displayHeight/this.state.originalHeight,!this.initialLoadComplete&&this.spinnerElement&&(this.spinnerElement.style.top=this.state.displayHeight/2+"px",this.spinnerElement.style.left=this.state.displayWidth/2+"px"),this.state.focusActive&&this._updateFocusMarkerPosition(),this.state.cropActive&&this._updateCropOverlayPosition()}_toOriginalCoords(t,e){return{x:t/this.state.scaleX,y:e/this.state.scaleY}}_toScaledCoords(t,e){return{x:t*this.state.scaleX,y:e*this.state.scaleY}}_createFocusMarker(){if(this.state.focusMarker)return;const t=document.createElement("div");t.style.position="absolute",t.style.width=this.options.focusPoint.style.width,t.style.height=this.options.focusPoint.style.height,t.style.border=this.options.focusPoint.style.border,t.style.boxShadow=this.options.focusPoint.style.boxShadow,t.style.backgroundColor=this.options.focusPoint.style.backgroundColor,t.style.cursor="move",t.style.display="none",t.style.zIndex="999",t.style.clipPath="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%)",this.imageElement.parentNode.appendChild(t),this.state.focusMarker=t,t.addEventListener("mousedown",this._boundFocusMarkerMouseDown)}_handleFocusMarkerMouseDown(t){this.interaction.focusDragging=!0,this.state.focusMarker.style.cursor="grabbing";const e=this.state.focusMarker.getBoundingClientRect();this.interaction.focusDragOffsetX=t.clientX-(e.left+e.width/2),this.interaction.focusDragOffsetY=t.clientY-(e.top+e.height/2),t.preventDefault()}_createCropOverlay(){if(this.state.cropOverlay)return;const t=document.createElement("div");t.style.position="absolute",t.style.border=this.options.cropZone.style.border,t.style.backgroundColor=this.options.cropZone.style.backgroundColor,t.style.boxSizing="border-box",t.style.cursor="move",t.style.display="none",t.style.zIndex="998";const e=["tl","tm","tr","ml","mr","bl","bm","br"];for(const s of e){const e=document.createElement("div");switch(e.style.position="absolute",e.style.width=this.options.cropZone.handleStyle.width,e.style.height=this.options.cropZone.handleStyle.height,e.style.backgroundColor=this.options.cropZone.handleStyle.backgroundColor,e.style.border=this.options.cropZone.handleStyle.border,e.style.boxShadow=this.options.cropZone.handleStyle.boxShadow,e.style.boxSizing="border-box",e.dataset.handle=s,s){case"tl":e.style.top="-7px",e.style.left="-7px",e.style.cursor="nwse-resize";break;case"tm":e.style.top="-7px",e.style.left="50%",e.style.marginLeft="-7px",e.style.cursor="ns-resize";break;case"tr":e.style.top="-7px",e.style.right="-7px",e.style.cursor="nesw-resize";break;case"ml":e.style.top="50%",e.style.left="-7px",e.style.marginTop="-7px",e.style.cursor="ew-resize";break;case"mr":e.style.top="50%",e.style.right="-7px",e.style.marginTop="-7px",e.style.cursor="ew-resize";break;case"bl":e.style.bottom="-7px",e.style.left="-7px",e.style.cursor="nesw-resize";break;case"bm":e.style.bottom="-7px",e.style.left="50%",e.style.marginLeft="-7px",e.style.cursor="ns-resize";break;case"br":e.style.bottom="-7px",e.style.right="-7px",e.style.cursor="nwse-resize"}e.addEventListener("mousedown",this._boundCropHandleMouseDown),t.appendChild(e),this.cropHandles.push(e)}t.addEventListener("mousedown",this._boundCropOverlayMouseDown),this.imageElement.parentNode.appendChild(t),this.state.cropOverlay=t}_handleCropHandleMouseDown(t){const e=t.currentTarget.dataset.handle;this.interaction.cropResizing=!0,this.interaction.activeHandle=e,this.interaction.startX=Number.parseInt(this.state.cropOverlay.style.left,10)||0,this.interaction.startY=Number.parseInt(this.state.cropOverlay.style.top,10)||0,this.interaction.startWidth=this.state.cropOverlay.offsetWidth,this.interaction.startHeight=this.state.cropOverlay.offsetHeight,this.interaction.startMouseX=t.clientX,this.interaction.startMouseY=t.clientY,t.preventDefault(),t.stopPropagation()}_handleCropOverlayMouseDown(t){t.target===this.state.cropOverlay&&(this.interaction.cropDragging=!0,this.state.cropOverlay.style.cursor="grabbing",this.interaction.startX=Number.parseInt(this.state.cropOverlay.style.left,10)||0,this.interaction.startY=Number.parseInt(this.state.cropOverlay.style.top,10)||0,this.interaction.startMouseX=t.clientX,this.interaction.startMouseY=t.clientY,t.preventDefault())}_setupEventListeners(){window.addEventListener("resize",this._boundUpdateScaling),this.imageElement.complete||this.imageElement.addEventListener("load",this._boundUpdateScaling),document.addEventListener("mouseup",this._boundHandleMouseUp),document.addEventListener("mousemove",this._boundHandleMouseMove)}_handleMouseUp(){this.interaction.focusDragging&&(this.interaction.focusDragging=!1,this.state.focusMarker&&(this.state.focusMarker.style.cursor="move")),this.interaction.cropDragging&&(this.interaction.cropDragging=!1,this.state.cropOverlay&&(this.state.cropOverlay.style.cursor="move")),this.interaction.cropResizing=!1,this.interaction.activeHandle=null,document.body.style.cursor="default"}_handleMouseMove(t){this.interaction.focusDragging&&this.state.focusMarker&&this._handleFocusMarkerDrag(t),this.interaction.cropDragging&&this._handleCropOverlayDrag(t),this.interaction.cropResizing&&this._handleCropOverlayResize(t)}_handleFocusMarkerDrag(t){const e=this.imageElement.getBoundingClientRect(),s=t.clientX-e.left-this.interaction.focusDragOffsetX,i=t.clientY-e.top-this.interaction.focusDragOffsetY,o=this._toOriginalCoords(s,i);this.setFocusPoint(o.x,o.y)}_handleCropOverlayDrag(t){const e=t.clientX-this.interaction.startMouseX,s=t.clientY-this.interaction.startMouseY,i=this.interaction.startX+e,o=this.interaction.startY+s,n=this._toOriginalCoords(i,o),{width:a,height:r}=this.state.cropZone;this.setCropZone(n.x,n.y,a,r)}_handleCropOverlayResize(t){if(!this.interaction.activeHandle)return;const e=t.clientX-this.interaction.startMouseX,s=t.clientY-this.interaction.startMouseY;let i=this.interaction.startX,o=this.interaction.startY,n=this.interaction.startWidth,a=this.interaction.startHeight;this.interaction.activeHandle.includes("t")&&(o=this.interaction.startY+s,a=this.interaction.startHeight-s),this.interaction.activeHandle.includes("b")&&(a=this.interaction.startHeight+s),this.interaction.activeHandle.includes("l")&&(i=this.interaction.startX+e,n=this.interaction.startWidth-e),this.interaction.activeHandle.includes("r")&&(n=this.interaction.startWidth+e),n<10&&(this.interaction.activeHandle.includes("l")&&(i=this.interaction.startX+this.interaction.startWidth-10),n=10),a<10&&(this.interaction.activeHandle.includes("t")&&(o=this.interaction.startY+this.interaction.startHeight-10),a=10);const r=i/this.state.scaleX,h=o/this.state.scaleY,l=n/this.state.scaleX,c=a/this.state.scaleY;this.setCropZone(r,h,l,c)}_updateFocusMarkerPosition(){if(!this.state.focusMarker)return;const{x:t,y:e}=this.state.focusPoint,s=Math.max(0,Math.min(t,this.state.originalWidth)),i=Math.max(0,Math.min(e,this.state.originalHeight));t===s&&e===i||(this.state.focusPoint={x:s,y:i});const o=this._toScaledCoords(s,i);if(this.options.debug){const t=this.imageElement.parentNode,e=window.getComputedStyle(t),s=Number.parseFloat(e.paddingLeft),i=Number.parseFloat(e.paddingTop);console.log("[FocusMarker] scaled:",o,"paddingLeft:",s,"paddingTop:",i,"containerRect:",t.getBoundingClientRect())}let n=0,a=0;{const t=this.imageElement.parentNode,e=window.getComputedStyle(t);n=Number.parseFloat(e.paddingLeft),a=Number.parseFloat(e.paddingTop)}this.state.focusMarker.style.left=o.x+n-this.state.focusMarker.offsetWidth/2+"px",this.state.focusMarker.style.top=o.y+a-this.state.focusMarker.offsetHeight/2+"px",this.options.debug&&console.log("[FocusMarker] style.left:",this.state.focusMarker.style.left,"style.top:",this.state.focusMarker.style.top)}_updateCropOverlayPosition(){if(!this.state.cropOverlay)return;const{x:t,y:e,width:s,height:i}=this.state.cropZone,o=Math.max(0,Math.min(t,this.state.originalWidth-s)),n=Math.max(0,Math.min(e,this.state.originalHeight-i)),a=Math.max(10,Math.min(s,this.state.originalWidth-o)),r=Math.max(10,Math.min(i,this.state.originalHeight-n));t===o&&e===n&&s===a&&i===r||(this.state.cropZone={x:o,y:n,width:a,height:r});const h=this._toScaledCoords(o,n),l=a*this.state.scaleX,c=r*this.state.scaleY;if(this.options.debug){const t=this.imageElement.parentNode,e=window.getComputedStyle(t),s=Number.parseFloat(e.paddingLeft),i=Number.parseFloat(e.paddingTop);console.log("[CropOverlay] scaled:",h,"paddingLeft:",s,"paddingTop:",i,"containerRect:",t.getBoundingClientRect())}let d=0,p=0;{const t=this.imageElement.parentNode,e=window.getComputedStyle(t);d=Number.parseFloat(e.paddingLeft),p=Number.parseFloat(e.paddingTop)}this.state.cropOverlay.style.left=`${h.x+d}px`,this.state.cropOverlay.style.top=`${h.y+p}px`,this.state.cropOverlay.style.width=`${l}px`,this.state.cropOverlay.style.height=`${c}px`,this.options.debug&&console.log("[CropOverlay] style.left:",this.state.cropOverlay.style.left,"style.top:",this.state.cropOverlay.style.top)}toggleFocusPoint(t){if(!this.options.focusPoint.enabled)return this;const e=void 0===t?!this.state.focusActive:t;return e&&!this.state.focusActive?(this.state.focusMarker||this._createFocusMarker(),0===this.state.focusPoint.x&&0===this.state.focusPoint.y&&(this.state.focusPoint={x:this.state.originalWidth/2,y:this.state.originalHeight/2}),this._updateFocusMarkerPosition(),this.state.focusMarker.style.display="block",this.state.focusActive=!0):!e&&this.state.focusActive&&(this.state.focusMarker&&(this.state.focusMarker.style.display="none"),this.state.focusActive=!1),this._notifyChange(),this}toggleCropZone(t){if(!this.options.cropZone.enabled)return this;const e=void 0===t?!this.state.cropActive:t;if(e&&!this.state.cropActive){if(this.state.cropOverlay||this._createCropOverlay(),0===this.state.cropZone.width||0===this.state.cropZone.height){const t=this.state.originalWidth/2,e=this.state.originalHeight/2,s=(this.state.originalWidth-t)/2,i=(this.state.originalHeight-e)/2;this.state.cropZone={x:s,y:i,width:t,height:e}}this._updateCropOverlayPosition(),this.state.cropOverlay.style.display="block",this.state.cropActive=!0}else!e&&this.state.cropActive&&(this.state.cropOverlay&&(this.state.cropOverlay.style.display="none"),this.state.cropActive=!1);return this._notifyChange(),this}setFocusPoint(t,e){const s=Math.max(0,Math.min(t,this.state.originalWidth)),i=Math.max(0,Math.min(e,this.state.originalHeight));return this.state.focusPoint={x:s,y:i},this.state.focusActive&&this.state.focusMarker&&this._updateFocusMarkerPosition(),this._notifyChange(),this}setCropZone(t,e,s,i){const o=Math.max(0,Math.min(t,this.state.originalWidth-s)),n=Math.max(0,Math.min(e,this.state.originalHeight-i)),a=Math.max(10,Math.min(s,this.state.originalWidth-o)),r=Math.max(10,Math.min(i,this.state.originalHeight-n));return this.state.cropZone={x:o,y:n,width:a,height:r},this.state.cropActive&&this.state.cropOverlay&&this._updateCropOverlayPosition(),this._notifyChange(),this}getFocusPoint(){return{...this.state.focusPoint}}getCropZone(){return{...this.state.cropZone}}getImageDimensions(){return{width:this.state.originalWidth,height:this.state.originalHeight}}_notifyChange(){"function"==typeof this.options.onChange&&this.options.onChange({focusPoint:this.getFocusPoint(),cropZone:this.getCropZone(),focusActive:this.state.focusActive,cropActive:this.state.cropActive})}destroy(){if(this.state){this.state.focusMarker&&this.state.focusMarker.removeEventListener("mousedown",this._boundFocusMarkerMouseDown),this.state.cropOverlay&&this.state.cropOverlay.removeEventListener("mousedown",this._boundCropOverlayMouseDown);for(const t of this.cropHandles)t.removeEventListener("mousedown",this._boundCropHandleMouseDown);this.cropHandles=[],this.state.focusMarker?.parentNode&&this.state.focusMarker.parentNode.removeChild(this.state.focusMarker),this.state.cropOverlay?.parentNode&&this.state.cropOverlay.parentNode.removeChild(this.state.cropOverlay),this.spinnerElement?.parentNode&&this.spinnerElement.parentNode.removeChild(this.spinnerElement),this.spinnerElement=null,window.removeEventListener("resize",this._boundUpdateScaling),document.removeEventListener("mouseup",this._boundHandleMouseUp),document.removeEventListener("mousemove",this._boundHandleMouseMove),this.imageElement&&this.imageElement.removeEventListener("load",this._boundUpdateScaling),this._boundUpdateScaling=null,this._boundHandleMouseUp=null,this._boundHandleMouseMove=null,this._boundFocusMarkerMouseDown=null,this._boundCropOverlayMouseDown=null,this._boundCropHandleMouseDown=null,this.state=null,this.interaction=null,this.options=null,this.imageElement=null}}}}));
2
2
  //# sourceMappingURL=visual-image-tool.umd.js.map