Create per.js
Browse files
js/per.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import 'grapesjs/dist/css/grapes.min.css'
|
| 2 |
+
|
| 3 |
+
import grapesjs, { usePlugin } from 'grapesjs'
|
| 4 |
+
import grapesjsBlocks from 'grapesjs-blocks-basic'
|
| 5 |
+
|
| 6 |
+
import type { Editor, Component } from 'grapesjs'
|
| 7 |
+
|
| 8 |
+
function runExample () {
|
| 9 |
+
const protectedCss: string = `
|
| 10 |
+
* {
|
| 11 |
+
box-sizing: border-box;
|
| 12 |
+
margin: 0;
|
| 13 |
+
padding: 0;
|
| 14 |
+
}
|
| 15 |
+
html, body, [data-gjs-type="wrapper"] {
|
| 16 |
+
width: 100%;
|
| 17 |
+
height: 100%;
|
| 18 |
+
}
|
| 19 |
+
`
|
| 20 |
+
const editor = grapesjs.init({
|
| 21 |
+
container: '#gjs', // same as id in the "index.html" file
|
| 22 |
+
height: '100vh',
|
| 23 |
+
canvas: {
|
| 24 |
+
infiniteCanvas: true
|
| 25 |
+
},
|
| 26 |
+
fromElement: true,
|
| 27 |
+
storageManager: false,
|
| 28 |
+
protectedCss,
|
| 29 |
+
plugins: [
|
| 30 |
+
usePlugin(grapesjsBlocks, {
|
| 31 |
+
flexGrid: true
|
| 32 |
+
})
|
| 33 |
+
]
|
| 34 |
+
})
|
| 35 |
+
|
| 36 |
+
let isDragging = false;
|
| 37 |
+
let offsetX = 0;
|
| 38 |
+
let offsetY = 0;
|
| 39 |
+
let selectedComponent: Component | null = null;
|
| 40 |
+
|
| 41 |
+
function startDrag(e: MouseEvent, component: Component) {
|
| 42 |
+
isDragging = true;
|
| 43 |
+
selectedComponent = component;
|
| 44 |
+
const rect = component.getEl().getBoundingClientRect();
|
| 45 |
+
offsetX = e.clientX - rect.left;
|
| 46 |
+
offsetY = e.clientY - rect.top;
|
| 47 |
+
document.addEventListener('mousemove', drag);
|
| 48 |
+
document.addEventListener('mouseup', stopDrag);
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
function drag(e: MouseEvent) {
|
| 52 |
+
if (!isDragging || !selectedComponent) return;
|
| 53 |
+
const newX = e.clientX - offsetX;
|
| 54 |
+
const newY = e.clientY - offsetY;
|
| 55 |
+
selectedComponent.set('position', { x: newX, y: newY });
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
function stopDrag() {
|
| 59 |
+
isDragging = false;
|
| 60 |
+
selectedComponent = null;
|
| 61 |
+
document.removeEventListener('mousemove', drag);
|
| 62 |
+
document.removeEventListener('mouseup', stopDrag);
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
editor.on('component:selected', (component: Component) => {
|
| 66 |
+
component.getEl().addEventListener('mousedown', (e: MouseEvent) => startDrag(e, component));
|
| 67 |
+
});
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
runExample()
|