Files
lit-examples/assets/draggable-dom-DGr2odh4.js
2026-07-05 02:38:01 +00:00

84 lines
3.8 KiB
JavaScript

import{a as l,b as c,i as h}from"./lit-element-BUNo9pnf.js";import{t as f}from"./custom-element-BhZVzxrc.js";import{e as d}from"./query-BApjzB0v.js";var y=Object.defineProperty,g=Object.getOwnPropertyDescriptor,p=(t,e,o,r)=>{for(var s=r>1?void 0:r?g(e,o):e,i=t.length-1,n;i>=0;i--)(n=t[i])&&(s=(r?n(e,o,s):n(s))||s);return r&&s&&y(e,o,s),s};let a=class extends l{constructor(){super(...arguments),this.dragType="none",this.offset={x:0,y:0},this.pointerMap=new Map}render(){return c`
<main
@pointerdown=${t=>this.handleDown(t,"canvas")}
@pointermove=${t=>this.handleMove(t,"canvas",e=>this.moveCanvas(e))}
@pointerup=${t=>this.handleUp(t)}
@pointercancel=${t=>this.handleUp(t)}
>
<canvas></canvas>
<div id="children">
<slot
class="child"
@pointerdown=${t=>this.handleDown(t,"element")}
@pointermove=${t=>this.handleMove(t,"element",e=>{const o=t.target,r=o.assignedSlot?o:o.closest("[slot]")||o;this.moveElement(r,e)})}
></slot>
</div>
</main>
`}handleDown(t,e){this.dragType==="none"&&(t.preventDefault(),this.dragType=e,t.target.setPointerCapture(t.pointerId),this.pointerMap.set(t.pointerId,{id:t.pointerId,startPos:{x:t.clientX,y:t.clientY},currentPos:{x:t.clientX,y:t.clientY}}))}handleMove(t,e,o){if(this.dragType===e){t.preventDefault();const r=this.pointerMap.get(t.pointerId),s={...r.currentPos};r.currentPos={x:t.clientX,y:t.clientY};const i={x:r.currentPos.x-s.x,y:r.currentPos.y-s.y};o(i)}}handleUp(t){this.dragType="none",t.target.releasePointerCapture(t.pointerId)}moveCanvas(t){this.offset.x+=t.x,this.offset.y+=t.y,this.style.setProperty("--offset-x",`${this.offset.x}px`),this.style.setProperty("--offset-y",`${this.offset.y}px`),this.container.style.setProperty("--pan-x",`${this.offset.x}px`),this.container.style.setProperty("--pan-y",`${this.offset.y}px`)}moveElement(t,e){const o=i=>{const n=t.style.getPropertyValue(i);return n.length>0?parseFloat(n.replace("px","")):0},r=o("--dx")+e.x,s=o("--dy")+e.y;t.style.setProperty("--dx",`${r}px`),t.style.setProperty("--dy",`${s}px`)}};a.styles=h`
:host {
display: block;
width: 100%;
height: 100%;
position: relative;
overflow: hidden;
--offset-x: 0;
--offset-y: 0;
--grid-background-color: white;
--grid-color: rgba(0, 0, 0, 0.1);
--grid-size: 40px;
--grid-dot-size: 2px;
}
main {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
overflow: hidden;
touch-action: none;
}
canvas {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: var(--grid-size) var(--grid-size);
background-image: radial-gradient(
circle,
var(--grid-color) var(--grid-dot-size),
var(--grid-background-color) var(--grid-dot-size)
);
background-position: var(--offset-x) var(--offset-y);
z-index: 0;
pointer-events: none;
}
#children {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
transform: translate(var(--pan-x, 0), var(--pan-y, 0));
pointer-events: none;
}
.child {
display: block;
pointer-events: auto;
}
::slotted(*) {
position: absolute !important;
top: 0;
left: 0;
transform: translate(var(--dx, 0), var(--dy, 0));
pointer-events: auto;
touch-action: none;
}
@media (prefers-color-scheme: dark) {
:host {
--grid-background-color: #0d1117;
--grid-color: rgba(255, 255, 255, 0.1);
}
}
`;p([d("main")],a.prototype,"root",2);p([d("#children")],a.prototype,"container",2);p([d("canvas")],a.prototype,"canvas",2);a=p([f("draggable-dom")],a);export{a as DraggableDOM};