Skip to content

Commit ad37964

Browse files
committed
feat: Add Groupable
1 parent a289162 commit ad37964

File tree

18 files changed

+768
-86
lines changed

18 files changed

+768
-86
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file.
33

44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
55

6+
## [0.7.0] - 2019-08-20
7+
### Added
8+
- Add [Groupable](https://github.com/daybrush/moveable/blob/master/groupable.md)
9+
- Add edge option
10+
11+
### Fixed
12+
- fix that do not call `resizeEnd` #19
13+
14+
615
## [0.6.4] - 2019-08-07
716
### Fixed
817
- fix ESM config

README.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
alt="Vue"
1313
src="https://img.shields.io/static/v1.svg?label=&message=Vue&style=flat-square&color=3fb984"></a>
1414
</p>
15-
<p align="middle">Moveable is Draggable, Resizable, Scalable, Rotatable, Warpable, Pinchable</p>
15+
<p align="middle">Moveable is Draggable, Resizable, Scalable, Rotatable, Warpable, Pinchable, Groupable</p>
1616
<p align="middle">
1717
<a href="https://daybrush.com/moveable" target="_blank"><strong>Demo</strong></a> /
1818
<a href="https://daybrush.com/moveable/release/latest/doc/" target="_blank"><strong>API</strong></a> /
@@ -47,24 +47,26 @@
4747
<tr>
4848
<td align="center"><strong>Warpable</strong></td>
4949
<td align="center"><strong>Pinchable</strong></td>
50-
<td align="center"><strong></strong></td>
50+
<td align="center"><a href="https://github.com/daybrush/moveable/blob/master/groupable.md"><strong>Groupable</strong></a></td>
5151
<td align="center"><strong></strong></td>
5252
</tr>
5353
<tr>
5454
<td align="center"><img src="https://raw.githubusercontent.com/daybrush/moveable/master/demo/images/warpable.gif"></td>
5555
<td align="center"><img src="https://raw.githubusercontent.com/daybrush/moveable/master/demo/images/pinchable.gif"></td>
56-
<td align="center"><strong></strong></td>
56+
<td align="center"><img src="https://raw.githubusercontent.com/daybrush/moveable/master/demo/images/groupable.gif"></td>
5757
<td align="center"><strong></strong></td>
5858
</tr>
5959
</table>
6060

61+
6162
## 🔥 Features
6263
* **Draggable** refers to the ability to drag and move targets.
6364
* **Resizable** indicates whether the target's width and height can be increased or decreased.
6465
* **Scalable** indicates whether the target's x and y can be scale of transform.
6566
* **Rotatable** indicates whether the target can be rotated.
6667
* **Warpable** indicates whether the target can be warped(distorted, bented).
6768
* **Pinchable** indicates whether the target can be pinched with draggable, resizable, scalable, rotatable.
69+
* **[Groupable](https://github.com/daybrush/moveable/blob/master/groupable.md)** indicates Whether the targets can be moved in group with draggable, resizable, scalable, rotatable.
6870
* Support SVG Elements (svg, path, line, ellipse, g, rect, ...etc)
6971
* Support 3d Transform
7072

@@ -101,6 +103,8 @@ const moveable = new Moveable(document.body, {
101103
pinchable: true, // ["resizable", "scalable", "rotatable"]
102104
origin: true,
103105
keepRatio: true,
106+
// Resize, Scale Events at edges.
107+
edge: false,
104108
throttleDrag: 0,
105109
throttleResize: 0,
106110
throttleScale: 0,

demo/index.html

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,24 @@ <h2 class="container">Features</h2>
174174
<pre class="panel" data-panel="angular" data-group="pinchable"><code class="javascript"></code></pre>
175175
</div>
176176
</div>
177+
<div class="container">
178+
<div class="left">
179+
<div class="moveable groupable"><span>G1</span><span>G2</span><span>G3</span></div>
180+
</div>
181+
<div class="right">
182+
<p class="description"><strong>Groupable</strong> indicates Whether the targets can be moved in group with draggable, resizable, scalable, rotatable.
183+
</p>
184+
<button class="tab selected" data-tab="vanilla" data-group="groupable">Vanilla</button>
185+
<button class="tab" data-tab="react" data-group="groupable">React</button>
186+
<button class="tab" data-tab="preact" data-group="groupable">Preact</button>
187+
<button class="tab" data-tab="angular" data-group="groupable">Angular</button>
188+
<pre class="panel selected" data-panel="vanilla"
189+
data-group="groupable"><code class="javascript"></code></pre>
190+
<pre class="panel" data-panel="react" data-group="groupable"><code class="javascript"></code></pre>
191+
<pre class="panel" data-panel="preact" data-group="groupable"><code class="javascript"></code></pre>
192+
<pre class="panel" data-panel="angular" data-group="groupable"><code class="javascript"></code></pre>
193+
</div>
194+
</div>
177195
<div class="container">
178196
<div class="left">
179197
<div class="moveable origin"><span>30%, 50%</span></div>

demo/src/consts.ts

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,4 +457,99 @@ export class AppComponent {
457457
}
458458
`,
459459
},
460+
groupable: {
461+
vanilla: `
462+
import Moveable from "moveable";
463+
const poses = [
464+
[0, 0],
465+
[0, 0],
466+
[0, 0],
467+
];
468+
const target = [].slice.call(
469+
document.querySelectorAll(".target"),
470+
);
471+
const groupable = new Moveable(document.body, {
472+
target,
473+
draggable: true,
474+
}).on("dragGroup", ({ events }) => {
475+
events.forEach(({ target, beforeDelta }, i) => {
476+
poses[i][0] += beforeDelta[0];
477+
poses[i][1] += beforeDelta[1];
478+
479+
target.style.transform
480+
= "translate("
481+
+ poses[i][0] + "px, "
482+
+ poses[i][1] + "px)";
483+
});
484+
});
485+
`,
486+
react: `
487+
import Moveable from "react-moveable";
488+
489+
this.poses = [
490+
[0, 0],
491+
[0, 0],
492+
[0, 0],
493+
];
494+
495+
const target = [].slice.call(
496+
document.querySelectorAll(".target"),
497+
);
498+
return (
499+
<Moveable
500+
target={target}
501+
draggable={true}
502+
onDragGroup={({ events }) => {
503+
events.forEach(({ target, beforeDelta }, i) => {
504+
this.poses[i][0] += beforeDelta[0];
505+
this.poses[i][1] += beforeDelta[1];
506+
507+
target.style.transform
508+
= "translate("
509+
+ this.poses[i][0] + "px, "
510+
+ this.poses[i][1] + "px)";
511+
});
512+
}}
513+
/>
514+
);
515+
`,
516+
angular: `
517+
import {
518+
NgxMoveableModule,
519+
NgxMoveableComponent,
520+
} from "ngx-moveable";
521+
522+
@Component({
523+
selector: 'AppComponent',
524+
template: ${"`"}
525+
<div #target1 class="target">target1</div>
526+
<div #target2 class="target">target2</div>
527+
<div #target3 class="target">target3</div>
528+
<ngx-moveable
529+
[target]="[target1, target2, target3]"
530+
[draggable]="true"
531+
(dragGroup)="onDragGroup($event)
532+
/>
533+
${"`"},
534+
})
535+
export class AppComponent {
536+
poses = [
537+
[0, 0],
538+
[0, 0],
539+
[0, 0],
540+
];
541+
onDragGroup({ events }) {
542+
events.forEach(({ target, beforeDelta }, i) => {
543+
this.poses[i][0] += beforeDelta[0];
544+
this.poses[i][1] += beforeDelta[1];
545+
546+
target.style.transform
547+
= "translate("
548+
+ this.poses[i][0] + "px, "
549+
+ this.poses[i][1] + "px)";
550+
});
551+
}
552+
}
553+
`,
554+
},
460555
};

demo/src/index.css

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

172-
.draggable, .resizable, .scalable, .rotatable, .origin, .warpable, .pinchable {
172+
.left>div {
173173
position: absolute;
174174
left: 0;
175175
}
176+
177+
178+
.groupable span {
179+
width: 80px;
180+
height: 60px;
181+
transform: scale(1);
182+
}
183+
.groupable span:nth-child(1) {
184+
left: 30px;
185+
}
186+
.groupable span:nth-child(2) {
187+
left: 120px;
188+
top: 160px;
189+
}
190+
.groupable span:nth-child(3) {
191+
left: 150px;
192+
top: 20px;
193+
}
176194
.origin {
177195
transform-origin: 30% 50%;
178196
}
@@ -229,6 +247,7 @@ code.hljs {
229247
}
230248

231249

250+
232251
@media screen and (max-width: 750px) {
233252
.page.feature .container {
234253
display: block;

demo/src/index.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import Moveable from "../../src/Moveable";
22
import { codes } from "./consts";
33
import { Frame } from "scenejs";
44
import "./index.css";
5-
import { hasClass } from "@daybrush/utils";
65

76
declare const hljs: any;
87

@@ -39,7 +38,6 @@ function setLabel(clientX: number, clientY: number, text: string) {
3938
labelElement.innerHTML = text;
4039
}
4140

42-
4341
const moveable = new Moveable(moveableElement.parentElement, {
4442
target: moveableElement,
4543
origin: false,
@@ -179,6 +177,26 @@ const pinchable = new Moveable(pinchableElement.parentElement, {
179177
pinchableElement.style.transform = `scale(${scale.join(", ")}) rotate(${rotate}deg)`;
180178
});
181179

180+
const groupableElement: HTMLElement = document.querySelector(".groupable");
181+
const poses = [
182+
[0, 0],
183+
[0, 0],
184+
[0, 0],
185+
];
186+
187+
const groupable = new Moveable(groupableElement.parentElement, {
188+
target: [].slice.call(groupableElement.querySelectorAll("span")),
189+
origin: false,
190+
draggable: true,
191+
}).on("dragGroup", ({ events }) => {
192+
events.forEach(({ target, beforeDelta }, i) => {
193+
poses[i][0] += beforeDelta[0];
194+
poses[i][1] += beforeDelta[1];
195+
196+
target.style.transform = `translate(${poses[i][0]}px, ${poses[i][1]}px)`;
197+
});
198+
});
199+
182200
window.addEventListener("resize", () => {
183201
moveable.updateRect();
184202
draggable.updateRect();
@@ -187,6 +205,7 @@ window.addEventListener("resize", () => {
187205
rotatable.updateRect();
188206
warpable.updateRect();
189207
pinchable.updateRect();
208+
groupable.updateRect();
190209
});
191210

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

0 commit comments

Comments
 (0)