Skip to content

Commit 0383d8b

Browse files
committed
feat: Add pinch events
1 parent 547eeac commit 0383d8b

File tree

26 files changed

+514
-124
lines changed

26 files changed

+514
-124
lines changed

README.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
</tr>
4545
<tr>
4646
<td align="center"><strong>Warpable</strong></td>
47-
<td align="center"><strong>Pinchable(Soon)</strong></td>
47+
<td align="center"><strong>Pinchable</strong></td>
4848
<td align="center"><strong></strong></td>
4949
<td align="center"><strong></strong></td>
5050
</tr>
@@ -85,7 +85,8 @@ import Moveable from "moveable";
8585

8686
const moveable = new Moveable(document.body, {
8787
target: document.querySelector(".target"),
88-
container: null,
88+
// If the container is null, the position is fixed. (default: parentElement(document.body))
89+
container: document.body,
8990
draggable: true,
9091
resizable: true,
9192
scalable: true,
@@ -177,6 +178,20 @@ moveable.on("warpStart", ({ target, clientX, clientY }) => {
177178
}).on("warpEnd", ({ target, isDrag, clientX, clientY }) => {
178179
console.log("onWarpEnd", target, isDrag);
179180
});
181+
182+
/* pinchable */
183+
// Enabling pincable lets you use events that
184+
// can be used in draggable, resizable, scalable, and rotateable.
185+
moveable.on("pinchStart", ({ target, clientX, clientY }) => {
186+
// pinchStart event occur before dragStart, rotateStart, scaleStart, resizeStart
187+
console.log("onPinchStart");
188+
}).on("pinch", ({ target, clientX, clientY, datas }) => {
189+
// pinch event occur before drag, rotate, scale, resize
190+
console.log("onPinch");
191+
}).on("pinchEnd", ({ isDrag, target, clientX, clientY, datas }) => {
192+
// pinchEnd event occur before dragEnd, rotateEnd, scaleEnd, resizeEnd
193+
console.log("onPinchEnd");
194+
});
180195
```
181196

182197

demo/index.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,21 @@ <h2 class="container">Features</h2>
139139
<pre class="panel" data-panel="preact" data-group="warpable"><code class="javascript"></code></pre>
140140
</div>
141141
</div>
142+
<div class="container">
143+
<div class="left">
144+
<div class="moveable pinchable"><span>Pinchable</span></div>
145+
</div>
146+
<div class="right">
147+
<p class="description"><strong>Pinchable</strong> indicates whether the target can be pinched with draggable, resizable, scalable, rotatable.<br/>(Check on the mobile) </p>
148+
<button class="tab selected" data-tab="vanilla" data-group="pinchable">Vanilla</button>
149+
<button class="tab" data-tab="react" data-group="pinchable">React</button>
150+
<button class="tab" data-tab="preact" data-group="pinchable">Preact</button>
151+
<pre class="panel selected" data-panel="vanilla"
152+
data-group="pinchable"><code class="javascript"></code></pre>
153+
<pre class="panel" data-panel="react" data-group="pinchable"><code class="javascript"></code></pre>
154+
<pre class="panel" data-panel="preact" data-group="pinchable"><code class="javascript"></code></pre>
155+
</div>
156+
</div>
142157
<div class="container">
143158
<div class="left">
144159
<div class="moveable origin"><span>30%, 50%</span></div>

demo/src/consts.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,48 @@ return (
191191
);
192192
`,
193193
},
194+
pinchable: {
195+
vanilla: `
196+
import Moveable from "moveable";
197+
const scale = [1, 1];
198+
let rotate = 0;
199+
200+
const pinchable = new Moveable(document.body, {
201+
target: document.querySelector(".pinchable"),
202+
pinchable: ["rotatable", "scalable"],
203+
}).on("rotate", ({ target, beforeDelta }) => {
204+
rotate += beforeDelta;
205+
target.style.transform = "scale(" + scale.join(", ") + ") rotate(" + rotate + "deg)";
206+
}).on("scale", ({ target, delta }) => {
207+
scale[0] += delta[0];
208+
scale[1] += delta[1];
209+
target.style.transform = "scale(" + scale.join(", ") + ") rotate(" + rotate + "deg)";
210+
});`,
211+
react: `
212+
import Moveable from "react-moveable";
213+
this.scale = [1, 1];
214+
this.rotate = 0;
215+
216+
return (
217+
<Moveable
218+
target={document.querySelector(".pinchable")}
219+
pinchable={["rotatable", "scalable"]},
220+
onRotate={({ target, beforeDelta }) => {
221+
this.rotate += beforeDelta;
222+
target.style.transform
223+
= "scale(" + this.scale.join(", ") + ") "
224+
+ "rotate(" + this.rotate + "deg)";
225+
}}
226+
onScale={({ target, beforeDelta }) => {
227+
this.scale[0] += delta[0];
228+
this.scale[1] += delta[1];
229+
target.style.transform
230+
= "scale(" + this.scale.join(", ") + ") "
231+
+ "rotate(" + this.rotate + "deg)";
232+
}}
233+
/>
234+
);`,
235+
},
194236
origin: {
195237
vanilla: `
196238
import Moveable from "moveable";

demo/src/index.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ a {
169169
font-weight: 600;
170170
}
171171

172-
.draggable, .resizable, .scalable, .rotatable, .origin {
172+
.draggable, .resizable, .scalable, .rotatable, .origin, .warpable, .pinchable {
173173
position: absolute;
174174
left: 0;
175175
}

demo/src/index.ts

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,46 +30,63 @@ const frame = new Frame({
3030
function setTransform(target: HTMLElement | SVGElement) {
3131
target.style.cssText = frame.toCSS();
3232
}
33-
function setLabel(clientX: number, clientY: number, text) {
33+
function setLabel(clientX: number, clientY: number, text: string) {
3434
// tslint:disable-next-line: max-line-length
35-
labelElement.style.cssText = `display: block; transform: translate(${clientX}px, ${clientY - 10}px) translate(-100%, -100%);`;
35+
36+
labelElement.style.cssText = `
37+
display: block; transform: translate(${clientX}px, ${clientY - 10}px) translate(-100%, -100%);`;
38+
3639
labelElement.innerHTML = text;
3740
}
41+
42+
3843
const moveable = new Moveable(moveableElement.parentElement, {
3944
target: moveableElement,
40-
container: moveableElement.parentElement,
4145
origin: false,
4246
draggable: true,
4347
rotatable: true,
4448
scalable: true,
49+
pinchable: true,
4550
keepRatio: false,
4651
throttleDrag: 1,
4752
throttleScale: 0.01,
4853
throttleRotate: 0.2,
4954
throttleResize: 1,
50-
}).on("drag", ({ target, left, top, clientX, clientY }) => {
55+
}).on("pinch", ({ clientX, clientY }) => {
56+
setTimeout(() => {
57+
setLabel(clientX, clientY, `X: ${frame.get("left")}
58+
<br/>Y: ${frame.get("top")}
59+
<br/>W: ${frame.get("width")}
60+
<br/>H: ${frame.get("height")}
61+
<br/>S: ${frame.get("transform", "scaleX").toFixed(2)}, ${frame.get("transform", "scaleY").toFixed(2)}
62+
<br/>R: ${parseFloat(frame.get("transform", "rotate")).toFixed(1)}deg
63+
`);
64+
});
65+
}).on("drag", ({ target, left, top, clientX, clientY, isPinch }) => {
5166
frame.set("left", `${left}px`);
5267
frame.set("top", `${top}px`);
5368
setTransform(target);
54-
setLabel(clientX, clientY, `X: ${left}px<br/>Y: ${top}px`);
55-
}).on("scale", ({ target, dist, clientX, clientY }) => {
69+
!isPinch && setLabel(clientX, clientY, `X: ${left}px<br/>Y: ${top}px`);
70+
71+
}).on("scale", ({ target, dist, clientX, clientY, isPinch }) => {
5672
const scaleX = frame.get("transform", "scaleX") * dist[0];
5773
const scaleY = frame.get("transform", "scaleY") * dist[1];
5874
frame.set("transform", "scaleX", scaleX);
5975
frame.set("transform", "scaleY", scaleY);
6076
setTransform(target);
61-
setLabel(clientX, clientY, `S: ${scaleX.toFixed(2)}, ${scaleY.toFixed(2)}`);
62-
}).on("rotate", ({ target, beforeDelta, clientX, clientY }) => {
77+
!isPinch && setLabel(clientX, clientY, `S: ${scaleX.toFixed(2)}, ${scaleY.toFixed(2)}`);
78+
79+
}).on("rotate", ({ target, beforeDelta, clientX, clientY, isPinch }) => {
6380
const deg = parseFloat(frame.get("transform", "rotate")) + beforeDelta;
6481

6582
frame.set("transform", "rotate", `${deg}deg`);
6683
setTransform(target);
67-
setLabel(clientX, clientY, `R: ${deg.toFixed(1)}`);
68-
}).on("resize", ({ target, width, height, clientX, clientY }) => {
84+
!isPinch && setLabel(clientX, clientY, `R: ${deg.toFixed(1)}`);
85+
}).on("resize", ({ target, width, height, clientX, clientY, isPinch }) => {
6986
frame.set("width", `${width}px`);
7087
frame.set("height", `${height}px`);
7188
setTransform(target);
72-
setLabel(clientX, clientY, `W: ${width}px<br/>H: ${height}px`);
89+
!isPinch && setLabel(clientX, clientY, `W: ${width}px<br/>H: ${height}px`);
7390
}).on("warp", ({ target, multiply, delta, clientX, clientY }) => {
7491
frame.set("transform", "matrix3d", multiply(frame.get("transform", "matrix3d"), delta));
7592
setTransform(target);
@@ -89,7 +106,6 @@ const moveable = new Moveable(moveableElement.parentElement, {
89106
const draggableElement: HTMLElement = document.querySelector(".draggable");
90107
const draggable = new Moveable(draggableElement.parentElement, {
91108
target: draggableElement,
92-
container: draggableElement.parentElement,
93109
origin: false,
94110
draggable: true,
95111
}).on("drag", ({ target, transform }) => {
@@ -99,7 +115,6 @@ const draggable = new Moveable(draggableElement.parentElement, {
99115
const resizableElement: HTMLElement = document.querySelector(".resizable");
100116
const resizable = new Moveable(resizableElement.parentElement, {
101117
target: resizableElement,
102-
container: resizableElement.parentElement,
103118
origin: false,
104119
resizable: true,
105120
}).on("resize", ({ target, width, height }) => {
@@ -110,7 +125,6 @@ const resizable = new Moveable(resizableElement.parentElement, {
110125
const scalableElement: HTMLElement = document.querySelector(".scalable");
111126
const scalable = new Moveable(scalableElement.parentElement, {
112127
target: scalableElement,
113-
container: scalableElement.parentElement,
114128
origin: false,
115129
scalable: true,
116130
}).on("scale", ({ target, transform }) => {
@@ -120,7 +134,6 @@ const scalable = new Moveable(scalableElement.parentElement, {
120134
const rotatableElement: HTMLElement = document.querySelector(".rotatable");
121135
const rotatable = new Moveable(rotatableElement.parentElement, {
122136
target: rotatableElement,
123-
container: rotatableElement.parentElement,
124137
origin: false,
125138
rotatable: true,
126139
}).on("rotate", ({ target, transform }) => {
@@ -129,7 +142,6 @@ const rotatable = new Moveable(rotatableElement.parentElement, {
129142
const warpableElement: HTMLElement = document.querySelector(".warpable");
130143
const warpable = new Moveable(warpableElement.parentElement, {
131144
target: warpableElement,
132-
container: warpableElement.parentElement,
133145
warpable: true,
134146
origin: false,
135147
}).on("warp", ({ target, transform }) => {
@@ -139,7 +151,6 @@ const warpable = new Moveable(warpableElement.parentElement, {
139151
const originElement: HTMLElement = document.querySelector(".origin");
140152
const origin = new Moveable(originElement.parentElement, {
141153
target: originElement,
142-
container: originElement.parentElement,
143154
origin: true,
144155
draggable: true,
145156
rotatable: true,
@@ -150,13 +161,32 @@ const origin = new Moveable(originElement.parentElement, {
150161
target.style.transform = transform;
151162
});
152163

164+
const pinchableElement: HTMLElement = document.querySelector(".pinchable");
165+
const scale = [1, 1];
166+
let rotate = 0;
167+
const pinchable = new Moveable(pinchableElement.parentElement, {
168+
target: pinchableElement,
169+
pinchable: ["rotatable", "scalable"],
170+
origin: false,
171+
}).on("rotate", ({ beforeDelta }) => {
172+
rotate += beforeDelta;
173+
174+
pinchableElement.style.transform = `scale(${scale.join(", ")}) rotate(${rotate}deg)`;
175+
}).on("scale", ({ delta }) => {
176+
scale[0] += delta[0];
177+
scale[1] += delta[1];
178+
179+
pinchableElement.style.transform = `scale(${scale.join(", ")}) rotate(${rotate}deg)`;
180+
});
181+
153182
window.addEventListener("resize", () => {
154183
moveable.updateRect();
155184
draggable.updateRect();
156185
resizable.updateRect();
157186
scalable.updateRect();
158187
rotatable.updateRect();
159188
warpable.updateRect();
189+
pinchable.updateRect();
160190
});
161191

162192
document.addEventListener("DOMContentLoaded", () => {

package-lock.json

Lines changed: 28 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,12 @@
4848
},
4949
"homepage": "https://github.com/daybrush/moveable#readme",
5050
"dependencies": {
51-
"@daybrush/drag": "^0.6.0",
51+
"@daybrush/drag": "^0.8.0",
5252
"@daybrush/utils": "^0.10.0",
53+
"@egjs/agent": "^2.1.5",
5354
"@egjs/component": "^2.1.2",
5455
"framework-utils": "^0.1.0",
55-
"preact-moveable": "^0.6.3"
56+
"preact-moveable": "^0.8.1"
5657
},
5758
"devDependencies": {
5859
"@daybrush/builder": "^0.1.1",

0 commit comments

Comments
 (0)