@elixpo/lixsketch 5.5.6 → 5.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react/{SketchEngine-DWDJP2BB.js → SketchEngine-V45O52WG.js} +2 -2
- package/dist/react/{ZoomPan-U3TXC5AJ.js → ZoomPan-NYPDJBD5.js} +77 -1
- package/dist/react/ZoomPan-NYPDJBD5.js.map +7 -0
- package/dist/react/index.js +20 -1
- package/dist/react/index.js.map +2 -2
- package/package.json +1 -1
- package/src/EngineShortcuts.js +7 -0
- package/src/core/ZoomPan.js +102 -0
- package/src/react/components/Footer.jsx +13 -0
- package/dist/react/ZoomPan-U3TXC5AJ.js.map +0 -7
- /package/dist/react/{SketchEngine-DWDJP2BB.js.map → SketchEngine-V45O52WG.js.map} +0 -0
package/package.json
CHANGED
package/src/EngineShortcuts.js
CHANGED
|
@@ -175,6 +175,13 @@ export function installEngineShortcuts(engine, options = {}) {
|
|
|
175
175
|
return; // Other Ctrl combos are app-level; let the consumer handle them.
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
+
// Shift+1 = Fit to content
|
|
179
|
+
if (e.shiftKey && (key === '1' || key === '!')) {
|
|
180
|
+
e.preventDefault();
|
|
181
|
+
if (typeof window.zoomFit === 'function') window.zoomFit();
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
178
185
|
// Delete / Backspace — remove selected shapes.
|
|
179
186
|
if (e.key === 'Delete' || e.key === 'Backspace') {
|
|
180
187
|
e.preventDefault();
|
package/src/core/ZoomPan.js
CHANGED
|
@@ -99,6 +99,108 @@ window.zoomReset = function() {
|
|
|
99
99
|
}
|
|
100
100
|
};
|
|
101
101
|
|
|
102
|
+
function getShapeBoundsForFit(shape) {
|
|
103
|
+
if (!shape) return null;
|
|
104
|
+
|
|
105
|
+
const selection = window.multiSelection;
|
|
106
|
+
if (selection && typeof selection.getShapeBounds === "function") {
|
|
107
|
+
try {
|
|
108
|
+
const bounds = selection.getShapeBounds(shape);
|
|
109
|
+
if (bounds && [bounds.x, bounds.y, bounds.width, bounds.height].every(Number.isFinite)) {
|
|
110
|
+
return bounds;
|
|
111
|
+
}
|
|
112
|
+
} catch {}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Fall back to the common shape interface when selection is unavailable.
|
|
116
|
+
// Accessing x/y instead of boundingBox preserves freehand move offsets.
|
|
117
|
+
const bounds = {
|
|
118
|
+
x: Number(shape.x),
|
|
119
|
+
y: Number(shape.y),
|
|
120
|
+
width: Number(shape.width),
|
|
121
|
+
height: Number(shape.height),
|
|
122
|
+
};
|
|
123
|
+
return Object.values(bounds).every(Number.isFinite) ? bounds : null;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
window.zoomFit = function() {
|
|
127
|
+
if (!window.shapes || window.shapes.length === 0) {
|
|
128
|
+
if (window.zoomReset) window.zoomReset();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
let minX = Infinity;
|
|
133
|
+
let minY = Infinity;
|
|
134
|
+
let maxX = -Infinity;
|
|
135
|
+
let maxY = -Infinity;
|
|
136
|
+
|
|
137
|
+
window.shapes.forEach(shape => {
|
|
138
|
+
const bounds = getShapeBoundsForFit(shape);
|
|
139
|
+
if (!bounds) return;
|
|
140
|
+
|
|
141
|
+
// Normalize coordinates just in case width/height is negative
|
|
142
|
+
const x1 = Math.min(bounds.x, bounds.x + bounds.width);
|
|
143
|
+
const x2 = Math.max(bounds.x, bounds.x + bounds.width);
|
|
144
|
+
const y1 = Math.min(bounds.y, bounds.y + bounds.height);
|
|
145
|
+
const y2 = Math.max(bounds.y, bounds.y + bounds.height);
|
|
146
|
+
|
|
147
|
+
minX = Math.min(minX, x1);
|
|
148
|
+
minY = Math.min(minY, y1);
|
|
149
|
+
maxX = Math.max(maxX, x2);
|
|
150
|
+
maxY = Math.max(maxY, y2);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
if (minX === Infinity) {
|
|
154
|
+
if (window.zoomReset) window.zoomReset();
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const rect = freehandCanvas.getBoundingClientRect();
|
|
159
|
+
const screenW = rect.width || window.innerWidth;
|
|
160
|
+
const screenH = rect.height || window.innerHeight;
|
|
161
|
+
|
|
162
|
+
const contentW = maxX - minX;
|
|
163
|
+
const contentH = maxY - minY;
|
|
164
|
+
|
|
165
|
+
// Add 10% padding
|
|
166
|
+
const paddingX = Math.max(50, contentW * 0.1);
|
|
167
|
+
const paddingY = Math.max(50, contentH * 0.1);
|
|
168
|
+
|
|
169
|
+
const paddedW = contentW + paddingX * 2;
|
|
170
|
+
const paddedH = contentH + paddingY * 2;
|
|
171
|
+
|
|
172
|
+
// Calculate required zoom to fit the padded content in the screen
|
|
173
|
+
const zoomX = screenW / paddedW;
|
|
174
|
+
const zoomY = screenH / paddedH;
|
|
175
|
+
|
|
176
|
+
let newZoom = Math.min(zoomX, zoomY);
|
|
177
|
+
newZoom = Math.max(minScale, Math.min(newZoom, maxScale));
|
|
178
|
+
|
|
179
|
+
// Center coordinate of the content
|
|
180
|
+
const cx = minX + contentW / 2;
|
|
181
|
+
const cy = minY + contentH / 2;
|
|
182
|
+
|
|
183
|
+
// Set the new viewBox and zoom
|
|
184
|
+
currentZoom = newZoom;
|
|
185
|
+
const vbW = screenW / currentZoom;
|
|
186
|
+
const vbH = screenH / currentZoom;
|
|
187
|
+
|
|
188
|
+
currentViewBox.x = cx - vbW / 2;
|
|
189
|
+
currentViewBox.y = cy - vbH / 2;
|
|
190
|
+
currentViewBox.width = vbW;
|
|
191
|
+
currentViewBox.height = vbH;
|
|
192
|
+
|
|
193
|
+
freehandCanvas.setAttribute(
|
|
194
|
+
"viewBox",
|
|
195
|
+
`${currentViewBox.x} ${currentViewBox.y} ${vbW} ${vbH}`
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
updateZoomDisplay();
|
|
199
|
+
if (window.__sketchStoreApi && window.__sketchStoreApi.setZoom) {
|
|
200
|
+
window.__sketchStoreApi.setZoom(currentZoom);
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
|
|
102
204
|
freehandCanvas.addEventListener("wheel", function(e) {
|
|
103
205
|
if (!e.ctrlKey) return;
|
|
104
206
|
e.preventDefault();
|
|
@@ -23,6 +23,10 @@ export default function Footer() {
|
|
|
23
23
|
if (window.zoomReset) window.zoomReset()
|
|
24
24
|
}, [])
|
|
25
25
|
|
|
26
|
+
const handleZoomFit = useCallback(() => {
|
|
27
|
+
if (window.zoomFit) window.zoomFit()
|
|
28
|
+
}, [])
|
|
29
|
+
|
|
26
30
|
const handleUndo = useCallback(() => {
|
|
27
31
|
if (window.undo) window.undo()
|
|
28
32
|
}, [])
|
|
@@ -56,6 +60,15 @@ export default function Footer() {
|
|
|
56
60
|
|
|
57
61
|
{/* Zoom controls */}
|
|
58
62
|
<div className="flex items-center bg-surface rounded-lg overflow-hidden">
|
|
63
|
+
<button
|
|
64
|
+
onClick={handleZoomFit}
|
|
65
|
+
aria-label="Fit canvas to content"
|
|
66
|
+
title="Fit to Content (Shift+1)"
|
|
67
|
+
className="w-9 h-9 flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200"
|
|
68
|
+
>
|
|
69
|
+
<i className="bx bx-target-lock text-lg" />
|
|
70
|
+
</button>
|
|
71
|
+
<div className="w-px h-5 bg-border-light" />
|
|
59
72
|
<button
|
|
60
73
|
onClick={handleZoomOut}
|
|
61
74
|
title="Zoom Out (Ctrl+-)"
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/core/ZoomPan.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable */\n// Zoom and Pan controls - combined from zoomFunction.js + panCanvas.js\n// Depends on globals: svg, freehandCanvas, currentZoom, currentViewBox, isPanningToolActive, isPanning\n// Depends on globals: minScale, maxScale, zoomInBtn, zoomOutBtn, zoomPercentSpan, panStart, startCanvasX, startCanvasY\n\n// === Zoom Functions ===\nlet currentY = 0;\nconst scrollRate = 50;\n\nfunction updateZoomDisplay() {\n zoomPercentSpan.innerText = Math.round(currentZoom * 100) + \"%\";\n}\n\nfunction updateViewBox(anchorX = null, anchorY = null) {\n const width = window.innerWidth;\n const height = window.innerHeight;\n const scaledWidth = width / currentZoom;\n const scaledHeight = height / currentZoom;\n\n let centerX, centerY;\n\n if (anchorX === null || anchorY === null) {\n centerX = currentViewBox.x + (currentViewBox.width / 2);\n centerY = currentViewBox.y + (currentViewBox.height / 2);\n } else {\n\n centerX = anchorX;\n centerY = anchorY;\n }\n\n const viewBoxX = centerX - (scaledWidth / 2);\n const viewBoxY = centerY - (scaledHeight / 2);\n\n freehandCanvas.setAttribute(\n \"viewBox\",\n `${viewBoxX} ${viewBoxY} ${scaledWidth} ${scaledHeight}`\n );\n\n currentViewBox.x = viewBoxX;\n currentViewBox.y = viewBoxY;\n currentViewBox.width = scaledWidth;\n currentViewBox.height = scaledHeight;\n}\n\nzoomInBtn.addEventListener(\"click\", function() {\n currentZoom *= 1.1;\n if (currentZoom > maxScale) currentZoom = maxScale;\n updateViewBox();\n updateZoomDisplay();\n});\n\nzoomOutBtn.addEventListener(\"click\", function() {\n currentZoom /= 1.1;\n if (currentZoom < minScale) currentZoom = minScale;\n updateViewBox();\n updateZoomDisplay();\n});\n\n// Exposed for React Footer buttons \u2014 zoom from center of canvas\nwindow.zoomFromCenter = function(direction) {\n if (direction > 0) {\n currentZoom *= 1.1;\n if (currentZoom > maxScale) currentZoom = maxScale;\n } else {\n currentZoom /= 1.1;\n if (currentZoom < minScale) currentZoom = minScale;\n }\n updateViewBox(); // null anchors = zoom from center\n updateZoomDisplay();\n // Sync React zoom state\n if (window.__sketchStoreApi && window.__sketchStoreApi.setZoom) {\n window.__sketchStoreApi.setZoom(currentZoom);\n }\n};\n\nwindow.zoomReset = function() {\n // Issue #24 bug #5: reset zoom in place around the current viewport\n // centre \u2014 do NOT recenter to (0, 0). Recentering used to make whatever\n // the user had on screen vanish until they panned back to it.\n const cx = currentViewBox.x + currentViewBox.width / 2;\n const cy = currentViewBox.y + currentViewBox.height / 2;\n\n currentZoom = 1;\n const rect = freehandCanvas.getBoundingClientRect();\n const vbW = rect.width || window.innerWidth;\n const vbH = rect.height || window.innerHeight;\n\n currentViewBox.x = cx - vbW / 2;\n currentViewBox.y = cy - vbH / 2;\n currentViewBox.width = vbW;\n currentViewBox.height = vbH;\n freehandCanvas.setAttribute(\n \"viewBox\",\n `${currentViewBox.x} ${currentViewBox.y} ${vbW} ${vbH}`\n );\n updateZoomDisplay();\n if (window.__sketchStoreApi && window.__sketchStoreApi.setZoom) {\n window.__sketchStoreApi.setZoom(1);\n }\n};\n\nfreehandCanvas.addEventListener(\"wheel\", function(e) {\n if (!e.ctrlKey) return;\n e.preventDefault();\n\n // Determine the zoom delta\n const delta = e.deltaY > 0 ? -0.1 : 0.1;\n let newZoom = currentZoom + delta;\n if (newZoom < minScale) newZoom = minScale;\n if (newZoom > maxScale) newZoom = maxScale;\n\n // Get canvas bounding rect \u2014 this MUST be the SVG element's actual\n // size, not the window's. In split mode the canvas pane is narrower\n // than the viewport; using window.innerWidth here would produce a\n // viewBox aspect that doesn't match the element, and (with\n // preserveAspectRatio=\"none\" on the host) the content gets stretched\n // / squeezed on every zoom step.\n const rect = freehandCanvas.getBoundingClientRect();\n\n // Calculate mouse position relative to the canvas in pixels\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Determine what fraction of the canvas the mouse is at\n const mouseFracX = mouseX / rect.width;\n const mouseFracY = mouseY / rect.height;\n\n // Compute the current viewBox coordinate under the mouse.\n // currentViewBox.width and .height represent the current viewBox dimensions.\n const anchorViewBoxX = currentViewBox.x + mouseFracX * currentViewBox.width;\n const anchorViewBoxY = currentViewBox.y + mouseFracY * currentViewBox.height;\n\n // New viewBox dimensions sized to the *element*, scaled by the new\n // zoom. This keeps the viewBox aspect ratio matching the element so\n // shapes stay undistorted.\n const newViewBoxWidth = rect.width / newZoom;\n const newViewBoxHeight = rect.height / newZoom;\n \n // Compute the new viewBox's x and y so that the anchor remains at the same screen fraction.\n // That means:\n // newViewBox.x + mouseFracX * newViewBoxWidth === anchorViewBoxX\n // Solve for newViewBox.x:\n const newViewBoxX = anchorViewBoxX - mouseFracX * newViewBoxWidth;\n const newViewBoxY = anchorViewBoxY - mouseFracY * newViewBoxHeight;\n \n // Update the viewBox attribute with the new values.\n freehandCanvas.setAttribute(\n \"viewBox\",\n `${newViewBoxX} ${newViewBoxY} ${newViewBoxWidth} ${newViewBoxHeight}`\n );\n \n // Update our state\n currentZoom = newZoom;\n currentViewBox = {\n x: newViewBoxX,\n y: newViewBoxY,\n width: newViewBoxWidth,\n height: newViewBoxHeight\n };\n\n updateZoomDisplay();\n // Sync React zoom state\n if (window.__sketchStoreApi && window.__sketchStoreApi.setZoom) {\n window.__sketchStoreApi.setZoom(currentZoom);\n }\n});\n\n// Function to resize the canvas to fill the screen (initial setup)\nfunction resizeCanvas() {\n const width = window.innerWidth;\n const height = window.innerHeight;\n\n freehandCanvas.style.width = `${width}px`;\n freehandCanvas.style.height = `${height}px`;\n\n // Set initial viewBox based on initial zoom\n updateViewBox(); // Initial center anchor\n}\n\n\n\nlet isMiddleMousePanning = false;\n\nfreehandCanvas.addEventListener(\"mousedown\", function (e) {\n // Middle mouse button panning\n if (e.button === 1) {\n e.preventDefault();\n isMiddleMousePanning = true;\n isPanning = true;\n startCanvasX = e.clientX;\n startCanvasY = e.clientY;\n panStart = { x: e.clientX, y: e.clientY };\n freehandCanvas.style.cursor = 'grabbing';\n return;\n }\n if (isPanningToolActive) {\n isPanning = true;\n startCanvasX = e.clientX;\n startCanvasY = e.clientY;\n panStart = { x: e.clientX, y: e.clientY };\n freehandCanvas.style.cursor = 'grabbing';\n }\n});\n\nfreehandCanvas.addEventListener(\"mousemove\", (e) => {\n if (!isPanning) return;\n\n const dx = e.clientX - panStart.x;\n const dy = e.clientY - panStart.y;\n const dxViewBox = dx / currentZoom;\n const dyViewBox = dy / currentZoom;\n\n currentViewBox.x -= dxViewBox;\n currentViewBox.y -= dyViewBox;\n\n freehandCanvas.setAttribute(\n \"viewBox\",\n `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`\n );\n\n panStart = { x: e.clientX, y: e.clientY };\n});\n\nfreehandCanvas.addEventListener(\"mouseup\", (e) => {\n if (isMiddleMousePanning) {\n isMiddleMousePanning = false;\n isPanning = false;\n freehandCanvas.style.cursor = '';\n return;\n }\n if(isPanningToolActive)\n {\n isPanning = false;\n freehandCanvas.style.cursor = 'grab';\n }\n});\n\nfreehandCanvas.addEventListener(\"mouseleave\", () => {\n if (isMiddleMousePanning) {\n isMiddleMousePanning = false;\n isPanning = false;\n freehandCanvas.style.cursor = '';\n return;\n }\n if(isPanningToolActive)\n {\n isPanning = false;\n freehandCanvas.style.cursor = 'grab';\n }\n});\n\n// Prevent default middle-click auto-scroll behavior\nfreehandCanvas.addEventListener(\"auxclick\", (e) => {\n if (e.button === 1) e.preventDefault();\n});\n\n\nsvg.addEventListener(\"wheel\", (e) => {\n e.preventDefault();\n if (e.ctrlKey) return; // Ignore zoom gestures\n\n if (e.shiftKey) {\n // Pan sideways when Shift is held\n currentViewBox.x += e.deltaY > 0 ? scrollRate : -scrollRate;\n } else {\n // Pan vertically\n currentViewBox.y += e.deltaY > 0 ? scrollRate : -scrollRate;\n }\n\n svg.setAttribute(\n \"viewBox\",\n `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`\n );\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
File without changes
|