// Initialize the zoom level and step let isDragging = false; // Track whether the user is dragging let startX, startY; // Starting position for dragging let currentX, currentY; let zoomLevel = 1; const zoomStep = 0.1; const minZoomLevel = 0.1; const maxZoomLevel = 3; // Function to update the zoom and apply it to the SVG element function updateZoom() { const svgElement = document.querySelector("#scrollableOutput svg"); if (svgElement) { svgElement.style.transform = `scale(${zoomLevel})`; // Center the SVG element within the parent div const scrollableDiv = document.getElementById("scrollableOutput"); if (scrollableDiv) { // Adjust the scroll position to center the SVG element scrollableDiv.scrollLeft = (svgElement.clientWidth - scrollableDiv.clientWidth) / 2; scrollableDiv.scrollTop = (svgElement.clientHeight - scrollableDiv.clientHeight) / 2; } } } // Event listener for the zoom in button document.getElementById("zoomInBtn").addEventListener("click", function () { zoomLevel += zoomStep; if (zoomLevel > maxZoomLevel) { zoomLevel = maxZoomLevel; } updateZoom(); }); // Event listener for the zoom out button document.getElementById("zoomOutBtn").addEventListener("click", function () { zoomLevel -= zoomStep; if (zoomLevel < minZoomLevel) { zoomLevel = minZoomLevel; } updateZoom(); }); function startDragging(event) { isDragging = true; // Start dragging startX = event.clientX; startY = event.clientY; } // Event listener for mousemove on the document (applies when dragging) function dragSVG(event) { if (isDragging) { // Calculate the movement const deltaX = (event.clientX - startX) * 2; const deltaY = (event.clientY - startY) * 2; // Retrieve the SVG element from the #scrollableOutput div const svgElement = document.querySelector("#scrollableOutput svg"); if (svgElement) { // Get the current translation values from the transform attribute const transform = svgElement.style.transform || "translate(0, 0)"; const translateMatch = transform.match( /translate\((-?\d+)px, (-?\d+)px\)/ ); let translateX = translateMatch ? parseInt(translateMatch[1]) : 0; let translateY = translateMatch ? parseInt(translateMatch[2]) : 0; translateX += deltaX; translateY += deltaY; // Update the SVG transform with the new translation svgElement.style.transform = `${transform.replace( /translate\(-?\d+px, -?\d+px\)/, "" )} translate(${translateX}px, ${translateY}px)`; // Update the starting positions for the next drag startX = event.clientX; startY = event.clientY; } } } // Function to center the SVG element within the #scrollableOutput div function centerSVG() { const scrollableDiv = document.getElementById("scrollableOutput"); const svgElement = document.querySelector("#scrollableOutput svg"); if (svgElement) { // Calculate the horizontal and vertical offset to center the SVG const divWidth = scrollableDiv.clientWidth; const divHeight = scrollableDiv.clientHeight; const svgWidth = svgElement.getBBox().width; const svgHeight = svgElement.getBBox().height; // Calculate the scroll positions to center the SVG const scrollX = (svgWidth - divWidth) / 2; const scrollY = (svgHeight - divHeight) / 2; // Set the scroll positions of the div to center the SVG scrollableDiv.scrollLeft = scrollX; scrollableDiv.scrollTop = scrollY; } } document.getElementById("centerSvgButton").addEventListener("click", centerSVG); // Event listener for mouseup on the document (ends dragging) function stopDragging() { isDragging = false; } // Event listeners to handle dragging document.addEventListener("mousedown", (event) => { // Only start dragging if the mousedown event occurs on the SVG element const svgElement = document.querySelector("#scrollableOutput svg"); if (svgElement && svgElement.contains(event.target)) { startDragging(event); } }); document.addEventListener("mousemove", dragSVG); document.addEventListener("mouseup", stopDragging);