At the current stage this project is not a lot more than a proof-of-concept. In it's current shape there might be some unhandled edge cases. Typescript support is virtually non-existent. I am planning to add more actions in the near future, which might result in a change of API.
Opinionated domnode transform actions for svelte.
Currently supports dragging (modifying translate3d) and resizing (modifying width & height). Uses pointerdown events.
Reposition an object by dragging it from its content or an optional handle. Uses translate3d()
to position the object.
Resize an object by dragging it from one of its sides or an optional handle. Modifies the width
and height
property of the object.
Enable all actions.
Using all transformations
<script>
import transform from 'svelte-transform';
</script>
<div use:transform>Transform me like one of your French girls.</div>
;
Using single transformations
<script>
import { draggable, resizable } from 'svelte-transform';
</script>
<div use:draggable>Drag me, don't resize me.</div>
<div use:resizable>Resize me, don't drag me.</div>
<div>Leave me alone</div>
Every action emits three events: start
delta
and end
.
<script>
import transform from 'svelte-transform';
</script>
<div
use:transform
on:drag:start={(e) => console.log('started dragging')}
on:drag:delta={(e) => console.log('still dragging')}
on:drag:end={(e) => console.log('ended dragging')}
on:resize:start={(e) => console.log('started resizing')}
on:resize:delta={(e) => console.log('still resizing')}
on:resize:end={(e) => console.log('ended resizing')}
>
It's such an eventful day today, won't you agree?
</div>;
Each event containts a detail
object of the following form:
detail {
pos: {
x: [current x position in px],
y: [current y position in px],
},
size: {
width: [current width in px],
height: [current height in px],
}
}
You can pass in a config object containing a pos: { x, y }
and a size: { width, height }
object.
<script>
import transform from 'svelte-transform';
let x, y, width, height
let updateValues = (e) => {
x = e.detail.pos.x;
y = e.detail.pos.y
width = e.detail.size.width
height = e.detail.size.height
}
</script>
<div
use:transform={{ pos: { x, y }, size: { width, height }}}
on:resize:delta={updateValues}
on:drag:delta={updateValues}
>
Transform me with your knobs and sliders.
</div>
<input type="range" min=0 max=100 bind:value={x} />
<input type="range" min=0 max=100 bind:value={y} />
<input type="range" min=0 max=100 bind:value={width} />
<input type="range" min=0 max=100 bind:value={height} />