@vielzeug/dnd 1.2.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -9
- package/dist/_touch.cjs +2 -0
- package/dist/_touch.cjs.map +1 -0
- package/dist/_touch.d.ts +12 -0
- package/dist/_touch.d.ts.map +1 -0
- package/dist/_touch.js +132 -0
- package/dist/_touch.js.map +1 -0
- package/dist/dnd.cjs +1 -1
- package/dist/dnd.cjs.map +1 -1
- package/dist/dnd.iife.js +1 -1
- package/dist/dnd.iife.js.map +1 -1
- package/dist/dnd.js +1 -1
- package/dist/dnd.js.map +1 -1
- package/dist/drop-zone.cjs +1 -1
- package/dist/drop-zone.cjs.map +1 -1
- package/dist/drop-zone.d.ts +7 -3
- package/dist/drop-zone.d.ts.map +1 -1
- package/dist/drop-zone.js +38 -26
- package/dist/drop-zone.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/sortable.cjs +1 -1
- package/dist/sortable.cjs.map +1 -1
- package/dist/sortable.d.ts +35 -1
- package/dist/sortable.d.ts.map +1 -1
- package/dist/sortable.js +165 -105
- package/dist/sortable.js.map +1 -1
- package/package.json +1 -1
- package/dist/touch.cjs +0 -2
- package/dist/touch.cjs.map +0 -1
- package/dist/touch.d.ts +0 -49
- package/dist/touch.d.ts.map +0 -1
- package/dist/touch.js +0 -124
- package/dist/touch.js.map +0 -1
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
**Package:** `@vielzeug/dnd` · **Category:** UI Interaction
|
|
11
11
|
|
|
12
|
-
**Key exports:** `createDropZone`, `createSortable`, `createSortableScope`, `
|
|
12
|
+
**Key exports:** `createDropZone`, `createSortable`, `createSortableScope`, `applyReorder`, `matchesAccept`
|
|
13
13
|
|
|
14
14
|
**When to use:** File drop zones with MIME filtering and async validation, or sortable lists with keyboard, FLIP animation, and optimistic-update support — zero dependencies.
|
|
15
15
|
|
|
@@ -30,14 +30,14 @@ yarn add @vielzeug/dnd
|
|
|
30
30
|
## Quick Start
|
|
31
31
|
|
|
32
32
|
```ts
|
|
33
|
-
import { createDropZone, createSortable } from '@vielzeug/dnd';
|
|
33
|
+
import { createDropZone, createSortable, createSortableScope } from '@vielzeug/dnd';
|
|
34
34
|
|
|
35
35
|
// Drop zone — with async validation and clipboard paste support
|
|
36
36
|
using zone = createDropZone({
|
|
37
37
|
element: document.getElementById('dropzone')!,
|
|
38
38
|
accept: ['image/*', '.pdf'],
|
|
39
39
|
paste: true,
|
|
40
|
-
onValidate: async (files) => checkServerQuota(files),
|
|
40
|
+
onValidate: async (files, { signal }) => checkServerQuota(files, { signal }),
|
|
41
41
|
onDrop: (files) => uploadFiles(files),
|
|
42
42
|
onDropRejected: (files) => {
|
|
43
43
|
showError(`${files.length} file(s) not accepted`);
|
|
@@ -47,19 +47,21 @@ using zone = createDropZone({
|
|
|
47
47
|
},
|
|
48
48
|
});
|
|
49
49
|
|
|
50
|
-
//
|
|
50
|
+
// Connected sortable lists — one scope owns cross-list moves and touch input
|
|
51
|
+
using scope = createSortableScope({
|
|
52
|
+
onMove: ({ itemId, sourceIds, targetIds }) => saveMove(itemId, sourceIds, targetIds),
|
|
53
|
+
touch: true,
|
|
54
|
+
});
|
|
51
55
|
using sortable = createSortable({
|
|
52
56
|
element: document.getElementById('list')!,
|
|
53
|
-
|
|
54
|
-
autoScroll: { edgeThreshold: 40, speed: 24 },
|
|
57
|
+
getKey: (el) => el.dataset.sortId!,
|
|
55
58
|
onBeforeReorder: (from, to) => {
|
|
56
59
|
// snapshot element positions here for FLIP animations
|
|
57
60
|
},
|
|
58
|
-
onReorder: (ids) => {
|
|
59
|
-
const prev = currentOrder;
|
|
61
|
+
onReorder: ({ ids }) => {
|
|
60
62
|
setOrder(ids);
|
|
61
|
-
return () => setOrder(prev); // enable sortable.revert() on server error
|
|
62
63
|
},
|
|
64
|
+
scope,
|
|
63
65
|
});
|
|
64
66
|
```
|
|
65
67
|
|
|
@@ -69,6 +71,7 @@ using sortable = createSortable({
|
|
|
69
71
|
- [Usage Guide](https://vielzeug.dev/dnd/usage)
|
|
70
72
|
- [API Reference](https://vielzeug.dev/dnd/api)
|
|
71
73
|
- [Examples](https://vielzeug.dev/dnd/examples)
|
|
74
|
+
- [Migration Guide](https://vielzeug.dev/dnd/migration)
|
|
72
75
|
|
|
73
76
|
## License
|
|
74
77
|
|
package/dist/_touch.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./_shared.cjs");require("./_dev.cjs");var t=2147483647;function n(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function r(e){let n=e.getBoundingClientRect(),r=document.createElement(`div`);return r.setAttribute(`aria-hidden`,`true`),r.setAttribute(`data-dnd-touch-preview`,``),r.setAttribute(`inert`,``),Object.assign(r.style,{background:`transparent`,border:`2px solid currentColor`,boxSizing:`border-box`,height:`${n.height}px`,left:`${n.left}px`,opacity:`0.7`,pointerEvents:`none`,position:`fixed`,top:`${n.top}px`,transition:`none`,width:`${n.width}px`,zIndex:String(t)}),r}function i(i,a){let o=n(),s=null,c=null,l=null,u=null,d=null,f=null;function p(){d?.remove(),d=null,f=null}function m(e,t){let n=l?.style.display??``,r=d?.style.display??``;l&&(l.style.display=`none`),d&&(d.style.display=`none`);let i=document.elementFromPoint(e,t);return l&&(l.style.display=n),d&&(d.style.display=r),i}let h=e.createDisposable(()=>{s=null,c=null,l=null,u=null,p()});function g(e,t,n,r,i=!1){let a=new Event(t,{bubbles:!0,cancelable:!0});Object.defineProperty(a,"__dndTouch",{configurable:!0,value:!0}),Object.defineProperty(a,"__dndTouchPreview",{configurable:!0,value:i}),Object.defineProperty(a,"clientX",{configurable:!0,value:n}),Object.defineProperty(a,"clientY",{configurable:!0,value:r}),Object.defineProperty(a,"dataTransfer",{configurable:!0,value:o}),e.dispatchEvent(a)}function _(e,n){if(i.preview===!1)return!1;try{let t=i.preview?.(e);d=i.preview?t?.cloneNode(!0)??null:r(e)}catch(e){`${String(e)}`,d=null}return d?(d.setAttribute(`aria-hidden`,`true`),d.setAttribute(`data-dnd-touch-preview`,``),d.setAttribute(`inert`,``),d.removeAttribute(`id`),d.querySelectorAll(`[id]`).forEach(e=>e.removeAttribute(`id`)),d.style.pointerEvents=`none`,d.style.position=`fixed`,d.style.zIndex=String(t),document.body.appendChild(d),f=n,!0):!1}document.addEventListener(`touchstart`,e=>{let t=e.touches[0];if(!t)return;let n=document.elementFromPoint(t.clientX,t.clientY),r=n?a(n):null;r&&(s=r,c={clientX:t.clientX,clientY:t.clientY})},{passive:!1,signal:h.disposalSignal}),document.addEventListener(`touchmove`,e=>{let t=e.touches[0];if(!t)return;if(!l){if(!s||!c||Math.hypot(t.clientX-c.clientX,t.clientY-c.clientY)<6)return;l=s,u=s;let e=_(l,t);g(l,`dragstart`,t.clientX,t.clientY,e)}if(d&&f){let e=t.clientX-f.clientX,n=t.clientY-f.clientY;d.style.transform=`translate3d(${e}px, ${n}px, 0)`}let n=m(t.clientX,t.clientY);n&&n!==u&&(u&&g(u,`dragleave`,t.clientX,t.clientY),u=n),n&&g(n,`dragover`,t.clientX,t.clientY),s=null,c=null,e.preventDefault()},{passive:!1,signal:h.disposalSignal});function v(e,t){if(!l){s=null,c=null;return}let n=e.changedTouches[0];if(n){if(!t){let e=m(n.clientX,n.clientY);e&&g(e,`drop`,n.clientX,n.clientY)}g(l,`dragend`,n.clientX,n.clientY,d!==null),s=null,c=null,l=null,u=null,p()}}return document.addEventListener(`touchend`,e=>v(e,!1),{passive:!0,signal:h.disposalSignal}),document.addEventListener(`touchcancel`,e=>v(e,!0),{passive:!0,signal:h.disposalSignal}),h}exports.createScopeTouchController=i;
|
|
2
|
+
//# sourceMappingURL=_touch.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_touch.cjs","names":[],"sources":["../src/_touch.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createDisposable } from './_shared';\nimport { type Disposable } from './types';\n\nexport interface TouchInputOptions {\n /**\n * Renders visual feedback for a touch drag. Return `null` to keep the source item visible\n * instead of rendering a preview. Dnd clones the returned element, preserving caller-owned DOM.\n * The default is an inert outline sized to the source item.\n */\n preview?: false | ((item: HTMLElement) => HTMLElement | null);\n}\n\nexport type ScopeTouchController = Disposable;\n\nconst PREVIEW_Z_INDEX = 2147483647;\n\nfunction makeDataTransfer(): DataTransfer {\n return {\n dropEffect: 'move',\n effectAllowed: 'move',\n getData: () => '',\n setData() {},\n setDragImage() {},\n } as unknown as DataTransfer;\n}\n\nfunction createDefaultPreview(source: HTMLElement): HTMLElement {\n const rect = source.getBoundingClientRect();\n const preview = document.createElement('div');\n\n preview.setAttribute('aria-hidden', 'true');\n preview.setAttribute('data-dnd-touch-preview', '');\n preview.setAttribute('inert', '');\n Object.assign(preview.style, {\n background: 'transparent',\n border: '2px solid currentColor',\n boxSizing: 'border-box',\n height: `${rect.height}px`,\n left: `${rect.left}px`,\n opacity: '0.7',\n pointerEvents: 'none',\n position: 'fixed',\n top: `${rect.top}px`,\n transition: 'none',\n width: `${rect.width}px`,\n zIndex: String(PREVIEW_Z_INDEX),\n });\n\n return preview;\n}\n\nexport function createScopeTouchController(\n options: TouchInputOptions,\n resolveDragTarget: (target: Element) => HTMLElement | null,\n): ScopeTouchController {\n const dt = makeDataTransfer();\n const dragStartDistancePx = 6;\n let pendingDraggable: HTMLElement | null = null;\n let pendingStartPoint: { clientX: number; clientY: number } | null = null;\n let dragging: HTMLElement | null = null;\n let lastTarget: Element | null = null;\n let previewEl: HTMLElement | null = null;\n let previewOrigin: { clientX: number; clientY: number } | null = null;\n\n function removePreview(): void {\n previewEl?.remove();\n previewEl = null;\n previewOrigin = null;\n }\n\n function elementBelow(clientX: number, clientY: number): Element | null {\n const previousDraggingDisplay = dragging?.style.display ?? '';\n const previousPreviewDisplay = previewEl?.style.display ?? '';\n\n if (dragging) dragging.style.display = 'none';\n\n if (previewEl) previewEl.style.display = 'none';\n\n const below = document.elementFromPoint(clientX, clientY);\n\n if (dragging) dragging.style.display = previousDraggingDisplay;\n\n if (previewEl) previewEl.style.display = previousPreviewDisplay;\n\n return below;\n }\n\n const disposable = createDisposable(() => {\n pendingDraggable = null;\n pendingStartPoint = null;\n dragging = null;\n lastTarget = null;\n removePreview();\n });\n\n function dispatch(element: Element, type: string, clientX: number, clientY: number, hasPreview = false): void {\n const event = new Event(type, { bubbles: true, cancelable: true });\n\n Object.defineProperty(event, '__dndTouch', { configurable: true, value: true });\n Object.defineProperty(event, '__dndTouchPreview', { configurable: true, value: hasPreview });\n Object.defineProperty(event, 'clientX', { configurable: true, value: clientX });\n Object.defineProperty(event, 'clientY', { configurable: true, value: clientY });\n Object.defineProperty(event, 'dataTransfer', { configurable: true, value: dt });\n element.dispatchEvent(event);\n }\n\n function renderPreview(source: HTMLElement, point: { clientX: number; clientY: number }): boolean {\n if (options.preview === false) return false;\n\n try {\n const preview = options.preview?.(source);\n\n previewEl = options.preview\n ? ((preview?.cloneNode(true) as HTMLElement | undefined) ?? null)\n : createDefaultPreview(source);\n } catch (error) {\n warn(`touch drag preview failed to render, continuing without one: ${String(error)}`);\n previewEl = null;\n }\n\n if (!previewEl) return false;\n\n previewEl.setAttribute('aria-hidden', 'true');\n previewEl.setAttribute('data-dnd-touch-preview', '');\n previewEl.setAttribute('inert', '');\n previewEl.removeAttribute('id');\n previewEl.querySelectorAll('[id]').forEach((element) => element.removeAttribute('id'));\n previewEl.style.pointerEvents = 'none';\n previewEl.style.position = 'fixed';\n previewEl.style.zIndex = String(PREVIEW_Z_INDEX);\n document.body.appendChild(previewEl);\n previewOrigin = point;\n\n return true;\n }\n\n document.addEventListener(\n 'touchstart',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n\n if (!touch) return;\n\n const target = document.elementFromPoint(touch.clientX, touch.clientY);\n const draggable = target ? resolveDragTarget(target) : null;\n\n if (!draggable) return;\n\n pendingDraggable = draggable;\n pendingStartPoint = { clientX: touch.clientX, clientY: touch.clientY };\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n document.addEventListener(\n 'touchmove',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n\n if (!touch) return;\n\n if (!dragging) {\n if (!pendingDraggable || !pendingStartPoint) return;\n\n const distance = Math.hypot(\n touch.clientX - pendingStartPoint.clientX,\n touch.clientY - pendingStartPoint.clientY,\n );\n\n if (distance < dragStartDistancePx) return;\n\n dragging = pendingDraggable;\n lastTarget = pendingDraggable;\n\n const hasPreview = renderPreview(dragging, touch);\n\n dispatch(dragging, 'dragstart', touch.clientX, touch.clientY, hasPreview);\n }\n\n if (previewEl && previewOrigin) {\n const dx = touch.clientX - previewOrigin.clientX;\n const dy = touch.clientY - previewOrigin.clientY;\n\n previewEl.style.transform = `translate3d(${dx}px, ${dy}px, 0)`;\n }\n\n const below = elementBelow(touch.clientX, touch.clientY);\n\n if (below && below !== lastTarget) {\n if (lastTarget) dispatch(lastTarget, 'dragleave', touch.clientX, touch.clientY);\n\n lastTarget = below;\n }\n\n if (below) dispatch(below, 'dragover', touch.clientX, touch.clientY);\n\n pendingDraggable = null;\n pendingStartPoint = null;\n event.preventDefault();\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n function finish(event: TouchEvent, cancelled: boolean): void {\n if (!dragging) {\n pendingDraggable = null;\n pendingStartPoint = null;\n\n return;\n }\n\n const touch = event.changedTouches[0];\n\n if (!touch) return;\n\n if (!cancelled) {\n const below = elementBelow(touch.clientX, touch.clientY);\n\n if (below) dispatch(below, 'drop', touch.clientX, touch.clientY);\n }\n\n dispatch(dragging, 'dragend', touch.clientX, touch.clientY, previewEl !== null);\n pendingDraggable = null;\n pendingStartPoint = null;\n dragging = null;\n lastTarget = null;\n removePreview();\n }\n\n document.addEventListener('touchend', (event: TouchEvent) => finish(event, false), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n document.addEventListener('touchcancel', (event: TouchEvent) => finish(event, true), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n\n return disposable;\n}\n"],"mappings":"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"}
|
package/dist/_touch.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Disposable } from './types';
|
|
2
|
+
export interface TouchInputOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Renders visual feedback for a touch drag. Return `null` to keep the source item visible
|
|
5
|
+
* instead of rendering a preview. Dnd clones the returned element, preserving caller-owned DOM.
|
|
6
|
+
* The default is an inert outline sized to the source item.
|
|
7
|
+
*/
|
|
8
|
+
preview?: false | ((item: HTMLElement) => HTMLElement | null);
|
|
9
|
+
}
|
|
10
|
+
export type ScopeTouchController = Disposable;
|
|
11
|
+
export declare function createScopeTouchController(options: TouchInputOptions, resolveDragTarget: (target: Element) => HTMLElement | null): ScopeTouchController;
|
|
12
|
+
//# sourceMappingURL=_touch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_touch.d.ts","sourceRoot":"","sources":["../src/_touch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,WAAW,GAAG,IAAI,CAAC,CAAC;CAC/D;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC;AAuC9C,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,iBAAiB,EAC1B,iBAAiB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,IAAI,GACzD,oBAAoB,CAyLtB"}
|
package/dist/_touch.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { createDisposable as e } from "./_shared.js";
|
|
2
|
+
import "./_dev.js";
|
|
3
|
+
//#region src/_touch.ts
|
|
4
|
+
var t = 2147483647;
|
|
5
|
+
function n() {
|
|
6
|
+
return {
|
|
7
|
+
dropEffect: "move",
|
|
8
|
+
effectAllowed: "move",
|
|
9
|
+
getData: () => "",
|
|
10
|
+
setData() {},
|
|
11
|
+
setDragImage() {}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function r(e) {
|
|
15
|
+
let n = e.getBoundingClientRect(), r = document.createElement("div");
|
|
16
|
+
return r.setAttribute("aria-hidden", "true"), r.setAttribute("data-dnd-touch-preview", ""), r.setAttribute("inert", ""), Object.assign(r.style, {
|
|
17
|
+
background: "transparent",
|
|
18
|
+
border: "2px solid currentColor",
|
|
19
|
+
boxSizing: "border-box",
|
|
20
|
+
height: `${n.height}px`,
|
|
21
|
+
left: `${n.left}px`,
|
|
22
|
+
opacity: "0.7",
|
|
23
|
+
pointerEvents: "none",
|
|
24
|
+
position: "fixed",
|
|
25
|
+
top: `${n.top}px`,
|
|
26
|
+
transition: "none",
|
|
27
|
+
width: `${n.width}px`,
|
|
28
|
+
zIndex: String(t)
|
|
29
|
+
}), r;
|
|
30
|
+
}
|
|
31
|
+
function i(i, a) {
|
|
32
|
+
let o = n(), s = null, c = null, l = null, u = null, d = null, f = null;
|
|
33
|
+
function p() {
|
|
34
|
+
d?.remove(), d = null, f = null;
|
|
35
|
+
}
|
|
36
|
+
function m(e, t) {
|
|
37
|
+
let n = l?.style.display ?? "", r = d?.style.display ?? "";
|
|
38
|
+
l && (l.style.display = "none"), d && (d.style.display = "none");
|
|
39
|
+
let i = document.elementFromPoint(e, t);
|
|
40
|
+
return l && (l.style.display = n), d && (d.style.display = r), i;
|
|
41
|
+
}
|
|
42
|
+
let h = e(() => {
|
|
43
|
+
s = null, c = null, l = null, u = null, p();
|
|
44
|
+
});
|
|
45
|
+
function g(e, t, n, r, i = !1) {
|
|
46
|
+
let a = new Event(t, {
|
|
47
|
+
bubbles: !0,
|
|
48
|
+
cancelable: !0
|
|
49
|
+
});
|
|
50
|
+
Object.defineProperty(a, "__dndTouch", {
|
|
51
|
+
configurable: !0,
|
|
52
|
+
value: !0
|
|
53
|
+
}), Object.defineProperty(a, "__dndTouchPreview", {
|
|
54
|
+
configurable: !0,
|
|
55
|
+
value: i
|
|
56
|
+
}), Object.defineProperty(a, "clientX", {
|
|
57
|
+
configurable: !0,
|
|
58
|
+
value: n
|
|
59
|
+
}), Object.defineProperty(a, "clientY", {
|
|
60
|
+
configurable: !0,
|
|
61
|
+
value: r
|
|
62
|
+
}), Object.defineProperty(a, "dataTransfer", {
|
|
63
|
+
configurable: !0,
|
|
64
|
+
value: o
|
|
65
|
+
}), e.dispatchEvent(a);
|
|
66
|
+
}
|
|
67
|
+
function _(e, n) {
|
|
68
|
+
if (i.preview === !1) return !1;
|
|
69
|
+
try {
|
|
70
|
+
let t = i.preview?.(e);
|
|
71
|
+
d = i.preview ? t?.cloneNode(!0) ?? null : r(e);
|
|
72
|
+
} catch (e) {
|
|
73
|
+
`${String(e)}`, d = null;
|
|
74
|
+
}
|
|
75
|
+
return d ? (d.setAttribute("aria-hidden", "true"), d.setAttribute("data-dnd-touch-preview", ""), d.setAttribute("inert", ""), d.removeAttribute("id"), d.querySelectorAll("[id]").forEach((e) => e.removeAttribute("id")), d.style.pointerEvents = "none", d.style.position = "fixed", d.style.zIndex = String(t), document.body.appendChild(d), f = n, !0) : !1;
|
|
76
|
+
}
|
|
77
|
+
document.addEventListener("touchstart", (e) => {
|
|
78
|
+
let t = e.touches[0];
|
|
79
|
+
if (!t) return;
|
|
80
|
+
let n = document.elementFromPoint(t.clientX, t.clientY), r = n ? a(n) : null;
|
|
81
|
+
r && (s = r, c = {
|
|
82
|
+
clientX: t.clientX,
|
|
83
|
+
clientY: t.clientY
|
|
84
|
+
});
|
|
85
|
+
}, {
|
|
86
|
+
passive: !1,
|
|
87
|
+
signal: h.disposalSignal
|
|
88
|
+
}), document.addEventListener("touchmove", (e) => {
|
|
89
|
+
let t = e.touches[0];
|
|
90
|
+
if (!t) return;
|
|
91
|
+
if (!l) {
|
|
92
|
+
if (!s || !c || Math.hypot(t.clientX - c.clientX, t.clientY - c.clientY) < 6) return;
|
|
93
|
+
l = s, u = s;
|
|
94
|
+
let e = _(l, t);
|
|
95
|
+
g(l, "dragstart", t.clientX, t.clientY, e);
|
|
96
|
+
}
|
|
97
|
+
if (d && f) {
|
|
98
|
+
let e = t.clientX - f.clientX, n = t.clientY - f.clientY;
|
|
99
|
+
d.style.transform = `translate3d(${e}px, ${n}px, 0)`;
|
|
100
|
+
}
|
|
101
|
+
let n = m(t.clientX, t.clientY);
|
|
102
|
+
n && n !== u && (u && g(u, "dragleave", t.clientX, t.clientY), u = n), n && g(n, "dragover", t.clientX, t.clientY), s = null, c = null, e.preventDefault();
|
|
103
|
+
}, {
|
|
104
|
+
passive: !1,
|
|
105
|
+
signal: h.disposalSignal
|
|
106
|
+
});
|
|
107
|
+
function v(e, t) {
|
|
108
|
+
if (!l) {
|
|
109
|
+
s = null, c = null;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
let n = e.changedTouches[0];
|
|
113
|
+
if (n) {
|
|
114
|
+
if (!t) {
|
|
115
|
+
let e = m(n.clientX, n.clientY);
|
|
116
|
+
e && g(e, "drop", n.clientX, n.clientY);
|
|
117
|
+
}
|
|
118
|
+
g(l, "dragend", n.clientX, n.clientY, d !== null), s = null, c = null, l = null, u = null, p();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return document.addEventListener("touchend", (e) => v(e, !1), {
|
|
122
|
+
passive: !0,
|
|
123
|
+
signal: h.disposalSignal
|
|
124
|
+
}), document.addEventListener("touchcancel", (e) => v(e, !0), {
|
|
125
|
+
passive: !0,
|
|
126
|
+
signal: h.disposalSignal
|
|
127
|
+
}), h;
|
|
128
|
+
}
|
|
129
|
+
//#endregion
|
|
130
|
+
export { i as createScopeTouchController };
|
|
131
|
+
|
|
132
|
+
//# sourceMappingURL=_touch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_touch.js","names":[],"sources":["../src/_touch.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createDisposable } from './_shared';\nimport { type Disposable } from './types';\n\nexport interface TouchInputOptions {\n /**\n * Renders visual feedback for a touch drag. Return `null` to keep the source item visible\n * instead of rendering a preview. Dnd clones the returned element, preserving caller-owned DOM.\n * The default is an inert outline sized to the source item.\n */\n preview?: false | ((item: HTMLElement) => HTMLElement | null);\n}\n\nexport type ScopeTouchController = Disposable;\n\nconst PREVIEW_Z_INDEX = 2147483647;\n\nfunction makeDataTransfer(): DataTransfer {\n return {\n dropEffect: 'move',\n effectAllowed: 'move',\n getData: () => '',\n setData() {},\n setDragImage() {},\n } as unknown as DataTransfer;\n}\n\nfunction createDefaultPreview(source: HTMLElement): HTMLElement {\n const rect = source.getBoundingClientRect();\n const preview = document.createElement('div');\n\n preview.setAttribute('aria-hidden', 'true');\n preview.setAttribute('data-dnd-touch-preview', '');\n preview.setAttribute('inert', '');\n Object.assign(preview.style, {\n background: 'transparent',\n border: '2px solid currentColor',\n boxSizing: 'border-box',\n height: `${rect.height}px`,\n left: `${rect.left}px`,\n opacity: '0.7',\n pointerEvents: 'none',\n position: 'fixed',\n top: `${rect.top}px`,\n transition: 'none',\n width: `${rect.width}px`,\n zIndex: String(PREVIEW_Z_INDEX),\n });\n\n return preview;\n}\n\nexport function createScopeTouchController(\n options: TouchInputOptions,\n resolveDragTarget: (target: Element) => HTMLElement | null,\n): ScopeTouchController {\n const dt = makeDataTransfer();\n const dragStartDistancePx = 6;\n let pendingDraggable: HTMLElement | null = null;\n let pendingStartPoint: { clientX: number; clientY: number } | null = null;\n let dragging: HTMLElement | null = null;\n let lastTarget: Element | null = null;\n let previewEl: HTMLElement | null = null;\n let previewOrigin: { clientX: number; clientY: number } | null = null;\n\n function removePreview(): void {\n previewEl?.remove();\n previewEl = null;\n previewOrigin = null;\n }\n\n function elementBelow(clientX: number, clientY: number): Element | null {\n const previousDraggingDisplay = dragging?.style.display ?? '';\n const previousPreviewDisplay = previewEl?.style.display ?? '';\n\n if (dragging) dragging.style.display = 'none';\n\n if (previewEl) previewEl.style.display = 'none';\n\n const below = document.elementFromPoint(clientX, clientY);\n\n if (dragging) dragging.style.display = previousDraggingDisplay;\n\n if (previewEl) previewEl.style.display = previousPreviewDisplay;\n\n return below;\n }\n\n const disposable = createDisposable(() => {\n pendingDraggable = null;\n pendingStartPoint = null;\n dragging = null;\n lastTarget = null;\n removePreview();\n });\n\n function dispatch(element: Element, type: string, clientX: number, clientY: number, hasPreview = false): void {\n const event = new Event(type, { bubbles: true, cancelable: true });\n\n Object.defineProperty(event, '__dndTouch', { configurable: true, value: true });\n Object.defineProperty(event, '__dndTouchPreview', { configurable: true, value: hasPreview });\n Object.defineProperty(event, 'clientX', { configurable: true, value: clientX });\n Object.defineProperty(event, 'clientY', { configurable: true, value: clientY });\n Object.defineProperty(event, 'dataTransfer', { configurable: true, value: dt });\n element.dispatchEvent(event);\n }\n\n function renderPreview(source: HTMLElement, point: { clientX: number; clientY: number }): boolean {\n if (options.preview === false) return false;\n\n try {\n const preview = options.preview?.(source);\n\n previewEl = options.preview\n ? ((preview?.cloneNode(true) as HTMLElement | undefined) ?? null)\n : createDefaultPreview(source);\n } catch (error) {\n warn(`touch drag preview failed to render, continuing without one: ${String(error)}`);\n previewEl = null;\n }\n\n if (!previewEl) return false;\n\n previewEl.setAttribute('aria-hidden', 'true');\n previewEl.setAttribute('data-dnd-touch-preview', '');\n previewEl.setAttribute('inert', '');\n previewEl.removeAttribute('id');\n previewEl.querySelectorAll('[id]').forEach((element) => element.removeAttribute('id'));\n previewEl.style.pointerEvents = 'none';\n previewEl.style.position = 'fixed';\n previewEl.style.zIndex = String(PREVIEW_Z_INDEX);\n document.body.appendChild(previewEl);\n previewOrigin = point;\n\n return true;\n }\n\n document.addEventListener(\n 'touchstart',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n\n if (!touch) return;\n\n const target = document.elementFromPoint(touch.clientX, touch.clientY);\n const draggable = target ? resolveDragTarget(target) : null;\n\n if (!draggable) return;\n\n pendingDraggable = draggable;\n pendingStartPoint = { clientX: touch.clientX, clientY: touch.clientY };\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n document.addEventListener(\n 'touchmove',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n\n if (!touch) return;\n\n if (!dragging) {\n if (!pendingDraggable || !pendingStartPoint) return;\n\n const distance = Math.hypot(\n touch.clientX - pendingStartPoint.clientX,\n touch.clientY - pendingStartPoint.clientY,\n );\n\n if (distance < dragStartDistancePx) return;\n\n dragging = pendingDraggable;\n lastTarget = pendingDraggable;\n\n const hasPreview = renderPreview(dragging, touch);\n\n dispatch(dragging, 'dragstart', touch.clientX, touch.clientY, hasPreview);\n }\n\n if (previewEl && previewOrigin) {\n const dx = touch.clientX - previewOrigin.clientX;\n const dy = touch.clientY - previewOrigin.clientY;\n\n previewEl.style.transform = `translate3d(${dx}px, ${dy}px, 0)`;\n }\n\n const below = elementBelow(touch.clientX, touch.clientY);\n\n if (below && below !== lastTarget) {\n if (lastTarget) dispatch(lastTarget, 'dragleave', touch.clientX, touch.clientY);\n\n lastTarget = below;\n }\n\n if (below) dispatch(below, 'dragover', touch.clientX, touch.clientY);\n\n pendingDraggable = null;\n pendingStartPoint = null;\n event.preventDefault();\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n function finish(event: TouchEvent, cancelled: boolean): void {\n if (!dragging) {\n pendingDraggable = null;\n pendingStartPoint = null;\n\n return;\n }\n\n const touch = event.changedTouches[0];\n\n if (!touch) return;\n\n if (!cancelled) {\n const below = elementBelow(touch.clientX, touch.clientY);\n\n if (below) dispatch(below, 'drop', touch.clientX, touch.clientY);\n }\n\n dispatch(dragging, 'dragend', touch.clientX, touch.clientY, previewEl !== null);\n pendingDraggable = null;\n pendingStartPoint = null;\n dragging = null;\n lastTarget = null;\n removePreview();\n }\n\n document.addEventListener('touchend', (event: TouchEvent) => finish(event, false), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n document.addEventListener('touchcancel', (event: TouchEvent) => finish(event, true), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n\n return disposable;\n}\n"],"mappings":"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"}
|
package/dist/dnd.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e){let t=!1,n=new AbortController,r=()=>{t||(t=!0,n.abort(),e?.())};return{get disposalSignal(){return n.signal},dispose:r,get disposed(){return t},[Symbol.dispose]:r}}function t(e){return e===!0}function n(e,t){return!t.length||t.some(t=>{let n=t.trim();return n.startsWith(`.`)?e.name.toLowerCase().endsWith(n.toLowerCase()):n.endsWith(`/*`)?e.type.startsWith(n.slice(0,-1)):e.type===n})}function r(e,t){return!t.length||Array.from(e).some(e=>e.kind===`file`&&t.some(t=>{let n=t.trim();return n.endsWith(`/*`)?e.type.startsWith(n.slice(0,-1)):n.startsWith(`.`)?!0:e.type===n}))}function i(e,t,r){let i=[],a=[];for(let r of e)(n(r,t)?i:a).push(r);return r!==void 0&&i.length>r&&a.push(...i.splice(r)),{accepted:i,rejected:a}}function a(n){let{accept:a=[],dropEffect:o=`copy`,element:s,maxFiles:c,onDrop:l,onDropRejected:u,onHoverChange:d,onValidatingChange:f}=n,p=0,m=!1,h=!1,g=e=>{h=e,f?.(e)},_=e=>{let t=p>0&&m;p=Math.max(0,e),p===0&&(m=!1);let n=p>0&&m;n!==t&&d?.(n)},v=()=>{_(0)},y=e(v),b=(e,t)=>{e.length>0&&l?.(e),t.length>0&&u?.(t)},x=(e,t)=>{e.length>0&&(n.onPaste?n.onPaste(e):l?.(e)),t.length>0&&u?.(t)},S=(e,t)=>{let{accepted:r,rejected:o}=i(e,a,c);n.onValidate&&g(!0),Promise.resolve(n.onValidate&&r.length>0?n.onValidate(r):!0).then(e=>{n.onValidate&&g(!1),!y.disposed&&(e?t(r,o):t([],[...o,...r]))}).catch(()=>{n.onValidate&&g(!1),!y.disposed&&t([],[...o,...r])})};return s.addEventListener(`dragenter`,e=>{if(!t(n.disabled)){if(e.preventDefault(),p===0){let t=e.dataTransfer?.items;m=!a.length||!t?.length||r(t,a)}!m&&e.dataTransfer&&(e.dataTransfer.dropEffect=`none`),_(p+1)}},{signal:y.disposalSignal}),s.addEventListener(`dragover`,e=>{t(n.disabled)||(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=m?o:`none`))},{signal:y.disposalSignal}),s.addEventListener(`dragleave`,e=>{_(p-1)},{signal:y.disposalSignal}),s.addEventListener(`drop`,e=>{if(v(),t(n.disabled))return;e.preventDefault();let r=e.dataTransfer?.files;r&&S(Array.from(r),b)},{signal:y.disposalSignal}),n.paste&&window.addEventListener(`paste`,e=>{if(t(n.disabled))return;let r=e.clipboardData?.files;r?.length&&(e.preventDefault(),S(Array.from(r),x))},{signal:y.disposalSignal}),window.addEventListener(`dragend`,v,{signal:y.disposalSignal}),window.addEventListener(`drop`,v,{signal:y.disposalSignal}),{get disposalSignal(){return y.disposalSignal},dispose:y.dispose,get disposed(){return y.disposed},get hovered(){return p>0&&m},[Symbol.dispose]:y[Symbol.dispose],get validating(){return h}}}var o=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},s=class extends o{constructor(){super(`Invalid scope — use createSortableScope() to create scopes.`)}},c=Symbol(`SortableScope`),l=`data-dnd-handle`,u=`data-dnd-item`,d=new WeakMap,f={container:!0,edgeThreshold:32,speed:18,viewport:!1};function p(e){let t=d.get(e);if(!t)throw new s;return t}function m(e){return e===!1?null:e===!0||e===void 0?f:{container:e.container??!0,edgeThreshold:e.edgeThreshold??32,speed:e.speed??18,viewport:e.viewport??!1}}function h(e,t){return t.length!==e.length||t.some((t,n)=>t!==e[n])}function g(e){e.querySelectorAll(`[${l}]`).forEach(e=>{e.removeAttribute(l),e.removeAttribute(`draggable`),e.style.touchAction=``})}function _(e){typeof requestAnimationFrame==`function`&&(e.hideFrame=requestAnimationFrame(()=>{e.hideFrame=null,e.draggedEl.style.display=`none`}))}function v(e){e.hideFrame!==null&&(cancelAnimationFrame(e.hideFrame),e.hideFrame=null)}function y(e){v(e),e.draggedEl.style.display=e.originalDisplay,e.draggedEl.removeAttribute(`data-dragging`)}function b(e,t){e.initialOrders.has(t)||e.initialOrders.set(t,t.getOrderedIds())}function x(e,t){let n=e.active;n&&(y(n),n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t))}function S(e,t){let n=e.active;if(!n)return;let r=n.target,i=n.placeholder.parentElement;y(n),r&&e.handles.has(r)&&i?i.insertBefore(n.draggedEl,n.placeholder):n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t);for(let[t,r]of n.initialOrders){if(!e.handles.has(t))continue;let n=t.getOrderedIds();h(r,n)&&(t.notifyBeforeReorder(r,n),t.commitReorder(n))}}function C(e,t,n){if(!e.active)return;let{active:r}=e;n||!t.dataTransfer||t.dataTransfer.dropEffect===`none`||!r.target||!e.handles.has(r.target)||r.source.isDisabled()||r.target.isDisabled()?x(e,t):S(e,t)}function w(e,t,n,r){if(!r)return;let{container:i,edgeThreshold:a,speed:o,viewport:s}=r,c=t.getBoundingClientRect();if(n===`vertical`){i&&e.clientY<c.top+a?t.scrollTop-=o:i&&e.clientY>c.bottom-a&&(t.scrollTop+=o),s&&e.clientY<a?window.scrollBy({left:0,top:-o}):s&&e.clientY>window.innerHeight-a&&window.scrollBy({left:0,top:o});return}i&&e.clientX<c.left+a?t.scrollLeft-=o:i&&e.clientX>c.right-a&&(t.scrollLeft+=o),s&&e.clientX<a?window.scrollBy({left:-o,top:0}):s&&e.clientX>window.innerWidth-a&&window.scrollBy({left:o,top:0})}function T(e,t,n,r,i,a){let o=n(),s=o.indexOf(e);if(s<0)return null;let c=a===`vertical`?i===`ArrowDown`:i===`ArrowRight`,l=a===`vertical`?i===`ArrowUp`:i===`ArrowLeft`,u;if(c)u=Math.min(o.length-1,s+1);else if(l)u=Math.max(0,s-1);else if(i===`Home`)u=0;else if(i===`End`)u=o.length-1;else return null;if(u===s)return null;let d=o[u];return d?(t.insertBefore(e,u>s?d.nextSibling:d),e.focus(),r()):null}function E(){let t={active:null,disposables:new Set,handles:new Set},n=e(()=>{for(let e of t.disposables)e()}),r={get disposalSignal(){return n.disposalSignal},dispose:n.dispose,get disposed(){return n.disposed},get isDragging(){return t.active!==null},[c]:!0,[Symbol.dispose]:n[Symbol.dispose]};return d.set(r,t),r}function D(n){let{autoScroll:r=!0,axis:i=`vertical`,element:a,getKey:o,handle:s,keyboard:c=!0,placeholderClass:d=`dnd-placeholder`,scope:f=E()}=n,h=m(r),v=p(f);s!==void 0&&s.trim();let y=()=>Array.from(a.children).filter(e=>e.hasAttribute(u)),x=()=>y().map(e=>o(e)),S=()=>{g(a),y().forEach(e=>{e.setAttribute(`role`,`listitem`),e.tabIndex=0,s?(e.removeAttribute(`draggable`),e.style.touchAction=``,e.querySelectorAll(s).forEach(e=>{e.setAttribute(l,``),e.setAttribute(`draggable`,`true`),e.style.touchAction=`none`})):(e.setAttribute(`draggable`,`true`),e.style.touchAction=`none`)})},D=()=>{let e=new Set;Array.from(a.children).forEach(t=>{let n=t;try{let t=o(n);t&&(e.has(t)?`${t}`:e.add(t),n.setAttribute(u,``))}catch(e){`${String(e)}`}}),S()},O=()=>{g(a),a.querySelectorAll(`[${u}]`).forEach(e=>{e.removeAttribute(u),e.removeAttribute(`draggable`),e.removeAttribute(`role`),e.removeAttribute(`tabindex`),e.style.touchAction=``})},k=e=>{let t=document.createElement(`div`);return t.className=d,t.setAttribute(`aria-hidden`,`true`),i===`horizontal`?t.style.width=`${e.offsetWidth}px`:t.style.height=`${e.offsetHeight}px`,t},A=null,j={commitReorder:e=>{if(!n.onReorder)return;let t={ids:e,setRevert(e){A=e}};n.onReorder(t)},getOrderedIds:x,isDisabled:()=>t(n.disabled),notifyBeforeReorder:(e,t)=>n.onBeforeReorder?.(e,t),notifyDragEnd:(e,t)=>n.onDragEnd?.(e,t),notifyDragStart:(e,t)=>n.onDragStart?.(e,t)};v.handles.add(j);let M=e=>{if(v.active||j.isDisabled())return;let t=e.target,r=t.closest(`[${u}]`);if(!r||s&&!t.closest(s))return;let i=r.parentElement;if(!i)return;let a=k(r),c=r.nextSibling,l=o(r),d=new Map;d.set(j,j.getOrderedIds()),r.setAttribute(`data-dragging`,``),i.insertBefore(a,c);let f={draggedEl:r,draggedId:l,hideFrame:null,initialOrders:d,originalDisplay:r.style.display,originalNextSibling:c,originalParent:i,placeholder:a,source:j,target:j};if(_(f),v.active=f,e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,l),n.dragImage)){let t=typeof n.dragImage==`function`?n.dragImage(l,r,e):n.dragImage,[i,a]=n.dragImageOffset??[0,0];t&&e.dataTransfer.setDragImage(t,i,a)}j.notifyDragStart(f.draggedId,e)},N=e=>{let t=v.active;if(!t||t.source.isDisabled()||j.isDisabled())return;e.preventDefault(),w(e,a,i,h),b(t,j);let{draggedEl:n,placeholder:r}=t,o=e.target.closest(`[${u}]`);if(!o){r.parentElement!==a&&a.appendChild(r),t.target=j;return}if(o===n||o===r)return;let s=o.getBoundingClientRect(),c=i===`vertical`?e.clientY>=s.top+s.height/2:e.clientX>=s.left+s.width/2;a.insertBefore(r,c?o.nextSibling:o),t.target=j},P=e=>{let t=v.active;t&&(t.source.isDisabled()||j.isDisabled()||(e.preventDefault(),t.target=j))},F=e=>{v.active?.source===j&&C(v,e,!1)},I=e=>{if(!c||j.isDisabled())return;let t=e.target?.tagName;if(t===`INPUT`||t===`TEXTAREA`||t===`SELECT`)return;let n=e.target.closest(`[${u}]`);if(!n||!a.contains(n))return;let r=x(),o=T(n,a,y,x,e.key,i);o!==null&&(e.preventDefault(),j.notifyBeforeReorder(r,o),j.commitReorder(o))};D();let L=e(()=>{v.disposables.delete(L.dispose),v.active&&(v.active.source===j||v.active.target===j)&&C(v,new Event(`dragend`),!0),v.handles.delete(j),a.removeAttribute(`role`),O()});return a.setAttribute(`role`,`list`),a.addEventListener(`dragstart`,M,{signal:L.disposalSignal}),a.addEventListener(`dragover`,N,{signal:L.disposalSignal}),a.addEventListener(`drop`,P,{signal:L.disposalSignal}),a.addEventListener(`dragend`,F,{signal:L.disposalSignal}),a.addEventListener(`keydown`,I,{signal:L.disposalSignal}),v.disposables.add(L.dispose),{get disposalSignal(){return L.disposalSignal},dispose:L.dispose,get disposed(){return L.disposed},get isDragging(){return v.active?.source===j},revert:()=>{A?.(),A=null},[Symbol.dispose]:L[Symbol.dispose],sync:()=>{D()}}}function O(e,t,n){let r=new Map(e.map(e=>[n(e),e])),i=[];for(let e of t){if(!r.has(e))continue;let t=r.get(e);i.push(t),r.delete(e)}for(let e of r.values())i.push(e);return i}var k=2147483647;function A(e){let t=e.getBoundingClientRect(),n=e.cloneNode(!0);return n.removeAttribute(`id`),n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`inert`,``),n.setAttribute(`data-dnd-touch-preview`,``),Object.assign(n.style,{height:`${t.height}px`,left:`${t.left}px`,margin:`0`,opacity:`0.85`,pointerEvents:`none`,position:`fixed`,top:`${t.top}px`,transition:`none`,width:`${t.width}px`,zIndex:String(k)}),document.body.appendChild(n),n}function j(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function M(n={}){let r=j(),i=null,a=null,o=null,s=null,c=null,l=null;function u(){c?.remove(),c=null,l=null}function d(e,t){let n=o?.style.display??``,r=c?.style.display??``;o&&(o.style.display=`none`),c&&(c.style.display=`none`);let i=document.elementFromPoint(e,t);return o&&(o.style.display=n),c&&(c.style.display=r),i}let f=e(()=>{i=null,a=null,o=null,s=null,u()});function p(e,t,n,i){let a=new Event(t,{bubbles:!0,cancelable:!0});Object.defineProperty(a,"clientX",{configurable:!0,value:n}),Object.defineProperty(a,"clientY",{configurable:!0,value:i}),Object.defineProperty(a,"dataTransfer",{configurable:!0,value:r}),e.dispatchEvent(a)}return document.addEventListener(`touchstart`,e=>{if(t(n.disabled))return;let r=e.touches[0];if(!r)return;let o=document.elementFromPoint(r.clientX,r.clientY)?.closest(n.draggableSelector??`[draggable="true"]`);o&&(i=o,a={clientX:r.clientX,clientY:r.clientY})},{passive:!1,signal:f.disposalSignal}),document.addEventListener(`touchmove`,e=>{let t=e.touches[0];if(!t)return;if(!o){if(!i||!a)return;let e=t.clientX-a.clientX,r=t.clientY-a.clientY;if(Math.hypot(e,r)<6)return;if(o=i,s=i,n.showDragPreview!==!1)try{c=A(o),l={clientX:t.clientX,clientY:t.clientY}}catch(e){`${String(e)}`,u()}p(o,`dragstart`,t.clientX,t.clientY)}if(c&&l){let e=t.clientX-l.clientX,n=t.clientY-l.clientY;c.style.transform=`translate3d(${e}px, ${n}px, 0)`}let r=d(t.clientX,t.clientY);r&&r!==s&&(s&&p(s,`dragleave`,t.clientX,t.clientY),s=r),r&&p(r,`dragover`,t.clientX,t.clientY),i=null,a=null,e.preventDefault()},{passive:!1,signal:f.disposalSignal}),document.addEventListener(`touchend`,e=>{if(!o){i=null,a=null;return}let t=e.changedTouches[0];if(!t)return;let n=d(t.clientX,t.clientY);n&&p(n,`drop`,t.clientX,t.clientY),p(o,`dragend`,t.clientX,t.clientY),i=null,a=null,o=null,s=null,u()},{passive:!0,signal:f.disposalSignal}),document.addEventListener(`touchcancel`,e=>{if(!o){i=null,a=null;return}let t=e.changedTouches[0];t&&(p(o,`dragend`,t.clientX,t.clientY),i=null,a=null,o=null,s=null,u())},{passive:!0,signal:f.disposalSignal}),f}exports.DndError=o,exports.DndScopeError=s,exports.applyReorder=O,exports.createDropZone=a,exports.createSortable=D,exports.createSortableScope=E,exports.createTouchDragShim=M,exports.matchesAccept=n;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e){let t=!1,n=new AbortController,r=()=>{t||(t=!0,n.abort(),e?.())};return{get disposalSignal(){return n.signal},dispose:r,get disposed(){return t},[Symbol.dispose]:r}}function t(e){return e===!0}function n(e,t){return!t.length||t.some(t=>{let n=t.trim();return n.startsWith(`.`)?e.name.toLowerCase().endsWith(n.toLowerCase()):n.endsWith(`/*`)?e.type.startsWith(n.slice(0,-1)):e.type===n})}function r(e,t){return!t.length||Array.from(e).some(e=>e.kind===`file`&&t.some(t=>{let n=t.trim();return n.endsWith(`/*`)?e.type.startsWith(n.slice(0,-1)):n.startsWith(`.`)?!0:e.type===n}))}function i(e,t,r){let i=[],a=[];for(let r of e)(n(r,t)?i:a).push(r);return r!==void 0&&i.length>r&&a.push(...i.splice(r)),{accepted:i,rejected:a}}function a(n){let{accept:a=[],dropEffect:o=`copy`,element:s,maxFiles:c,onDrop:l,onDropRejected:u,onHoverChange:d,onValidatingChange:f}=n,p=0,m=!1,h=!1,g=new Set,_=e=>{h!==e&&(h=e,f?.(e))},v=e=>{let t=p>0&&m;p=Math.max(0,e),p===0&&(m=!1);let n=p>0&&m;n!==t&&d?.(n)},y=()=>{v(0)},b=e(()=>{for(let e of g)e.abort();g.clear(),y()}),x=(e,t)=>{e.length>0&&l?.(e),t.length>0&&u?.(t)},S=(e,t)=>{e.length>0&&(n.onPaste?n.onPaste(e):l?.(e)),t.length>0&&u?.(t)},C=(e,t)=>{let{accepted:r,rejected:o}=i(e,a,c),s=n.onValidate,l=s&&r.length>0?new AbortController:null;l&&(g.add(l),_(!0));let u=()=>{l&&(g.delete(l),b.disposed||_(g.size>0))},d;try{d=l&&s?s(r,{signal:l.signal}):!0}catch(e){d=Promise.reject(e)}Promise.resolve(d).then(e=>{u(),!b.disposed&&(e?t(r,o):t([],[...o,...r]))}).catch(()=>{u(),!b.disposed&&t([],[...o,...r])})};return s.addEventListener(`dragenter`,e=>{if(!t(n.disabled)){if(e.preventDefault(),p===0){let t=e.dataTransfer?.items;m=!a.length||!t?.length||r(t,a)}!m&&e.dataTransfer&&(e.dataTransfer.dropEffect=`none`),v(p+1)}},{signal:b.disposalSignal}),s.addEventListener(`dragover`,e=>{t(n.disabled)||(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=m?o:`none`))},{signal:b.disposalSignal}),s.addEventListener(`dragleave`,e=>{v(p-1)},{signal:b.disposalSignal}),s.addEventListener(`drop`,e=>{if(y(),t(n.disabled))return;e.preventDefault();let r=e.dataTransfer?.files;r&&C(Array.from(r),x)},{signal:b.disposalSignal}),n.paste&&window.addEventListener(`paste`,e=>{if(t(n.disabled))return;let r=e.clipboardData?.files;r?.length&&(e.preventDefault(),C(Array.from(r),S))},{signal:b.disposalSignal}),window.addEventListener(`dragend`,y,{signal:b.disposalSignal}),window.addEventListener(`drop`,y,{signal:b.disposalSignal}),{get disposalSignal(){return b.disposalSignal},dispose:b.dispose,get disposed(){return b.disposed},get hovered(){return p>0&&m},[Symbol.dispose]:b[Symbol.dispose],get validating(){return h}}}var o=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},s=class extends o{constructor(){super(`Invalid scope — use createSortableScope() to create scopes.`)}},c=2147483647;function l(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function u(e){let t=e.getBoundingClientRect(),n=document.createElement(`div`);return n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`data-dnd-touch-preview`,``),n.setAttribute(`inert`,``),Object.assign(n.style,{background:`transparent`,border:`2px solid currentColor`,boxSizing:`border-box`,height:`${t.height}px`,left:`${t.left}px`,opacity:`0.7`,pointerEvents:`none`,position:`fixed`,top:`${t.top}px`,transition:`none`,width:`${t.width}px`,zIndex:String(c)}),n}function d(t,n){let r=l(),i=null,a=null,o=null,s=null,d=null,f=null;function p(){d?.remove(),d=null,f=null}function m(e,t){let n=o?.style.display??``,r=d?.style.display??``;o&&(o.style.display=`none`),d&&(d.style.display=`none`);let i=document.elementFromPoint(e,t);return o&&(o.style.display=n),d&&(d.style.display=r),i}let h=e(()=>{i=null,a=null,o=null,s=null,p()});function g(e,t,n,i,a=!1){let o=new Event(t,{bubbles:!0,cancelable:!0});Object.defineProperty(o,"__dndTouch",{configurable:!0,value:!0}),Object.defineProperty(o,"__dndTouchPreview",{configurable:!0,value:a}),Object.defineProperty(o,"clientX",{configurable:!0,value:n}),Object.defineProperty(o,"clientY",{configurable:!0,value:i}),Object.defineProperty(o,"dataTransfer",{configurable:!0,value:r}),e.dispatchEvent(o)}function _(e,n){if(t.preview===!1)return!1;try{let n=t.preview?.(e);d=t.preview?n?.cloneNode(!0)??null:u(e)}catch(e){`${String(e)}`,d=null}return d?(d.setAttribute(`aria-hidden`,`true`),d.setAttribute(`data-dnd-touch-preview`,``),d.setAttribute(`inert`,``),d.removeAttribute(`id`),d.querySelectorAll(`[id]`).forEach(e=>e.removeAttribute(`id`)),d.style.pointerEvents=`none`,d.style.position=`fixed`,d.style.zIndex=String(c),document.body.appendChild(d),f=n,!0):!1}document.addEventListener(`touchstart`,e=>{let t=e.touches[0];if(!t)return;let r=document.elementFromPoint(t.clientX,t.clientY),o=r?n(r):null;o&&(i=o,a={clientX:t.clientX,clientY:t.clientY})},{passive:!1,signal:h.disposalSignal}),document.addEventListener(`touchmove`,e=>{let t=e.touches[0];if(!t)return;if(!o){if(!i||!a||Math.hypot(t.clientX-a.clientX,t.clientY-a.clientY)<6)return;o=i,s=i;let e=_(o,t);g(o,`dragstart`,t.clientX,t.clientY,e)}if(d&&f){let e=t.clientX-f.clientX,n=t.clientY-f.clientY;d.style.transform=`translate3d(${e}px, ${n}px, 0)`}let n=m(t.clientX,t.clientY);n&&n!==s&&(s&&g(s,`dragleave`,t.clientX,t.clientY),s=n),n&&g(n,`dragover`,t.clientX,t.clientY),i=null,a=null,e.preventDefault()},{passive:!1,signal:h.disposalSignal});function v(e,t){if(!o){i=null,a=null;return}let n=e.changedTouches[0];if(n){if(!t){let e=m(n.clientX,n.clientY);e&&g(e,`drop`,n.clientX,n.clientY)}g(o,`dragend`,n.clientX,n.clientY,d!==null),i=null,a=null,o=null,s=null,p()}}return document.addEventListener(`touchend`,e=>v(e,!1),{passive:!0,signal:h.disposalSignal}),document.addEventListener(`touchcancel`,e=>v(e,!0),{passive:!0,signal:h.disposalSignal}),h}var f=Symbol(`SortableScope`),p=`data-dnd-handle`,m=`data-dnd-item`,h=new WeakMap,g={container:!0,edgeThreshold:32,speed:18,viewport:!1};function _(e){let t=h.get(e);if(!t)throw new s;return t}function v(e){return e===!1?null:e===!0||e===void 0?g:{container:e.container??!0,edgeThreshold:e.edgeThreshold??32,speed:e.speed??18,viewport:e.viewport??!1}}function y(e,t){return t.length!==e.length||t.some((t,n)=>t!==e[n])}function b(e){return e.__dndTouch===!0}function x(e){typeof requestAnimationFrame==`function`&&(e.hideFrame=requestAnimationFrame(()=>{e.hideFrame=null,e.draggedEl.style.display=`none`}))}function S(e){e.hideFrame!==null&&(cancelAnimationFrame(e.hideFrame),e.hideFrame=null)}function C(e){S(e),e.draggedEl.style.display=e.originalDisplay,e.draggedEl.removeAttribute(`data-dragging`)}function w(e,t){e.initialOrders.has(t)||e.initialOrders.set(t,t.getOrderedIds())}function T(e,t){let n=e.active;n&&(C(n),n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t))}function E(e,t){let n=e.active;if(!n)return;let r=n.target,i=n.placeholder.parentElement;C(n),r&&e.handles.has(r)&&i?i.insertBefore(n.draggedEl,n.placeholder):n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t);let a=[];for(let[t,r]of n.initialOrders){if(!e.handles.has(t))continue;let n=t.getOrderedIds();y(r,n)&&a.push({after:n,before:r,handle:t})}for(let{after:e,before:t,handle:n}of a)n.notifyBeforeReorder(t,e);if(r&&r!==n.source){let t=a.find(e=>e.handle===n.source),i=a.find(e=>e.handle===r);t&&i&&e.commitMove({itemId:n.draggedId,source:n.source.element,sourceIds:t.after,target:r.element,targetIds:i.after});return}for(let{after:e,handle:t}of a)t.commitReorder(e)}function D(e,t,n){if(!e.active)return;let{active:r}=e;n||!t.dataTransfer||t.dataTransfer.dropEffect===`none`||!r.target||!e.handles.has(r.target)||r.source.isDisabled()||r.target.isDisabled()?T(e,t):E(e,t)}function O(e,t,n,r){if(!r)return;let{container:i,edgeThreshold:a,speed:o,viewport:s}=r,c=t.getBoundingClientRect();if(n===`vertical`){i&&e.clientY<c.top+a?t.scrollTop-=o:i&&e.clientY>c.bottom-a&&(t.scrollTop+=o),s&&e.clientY<a?window.scrollBy({left:0,top:-o}):s&&e.clientY>window.innerHeight-a&&window.scrollBy({left:0,top:o});return}i&&e.clientX<c.left+a?t.scrollLeft-=o:i&&e.clientX>c.right-a&&(t.scrollLeft+=o),s&&e.clientX<a?window.scrollBy({left:-o,top:0}):s&&e.clientX>window.innerWidth-a&&window.scrollBy({left:o,top:0})}function k(e,t,n,r,i,a){let o=n(),s=o.indexOf(e);if(s<0)return null;let c=a===`vertical`?i===`ArrowDown`:i===`ArrowRight`,l=a===`vertical`?i===`ArrowUp`:i===`ArrowLeft`,u;if(c)u=Math.min(o.length-1,s+1);else if(l)u=Math.max(0,s-1);else if(i===`Home`)u=0;else if(i===`End`)u=o.length-1;else return null;if(u===s)return null;let d=o[u];return d?(t.insertBefore(e,u>s?d.nextSibling:d),e.focus(),r()):null}function A(t={}){let n={active:null,commitMove(e){t.onMove?.({...e,setRevert(e){n.lastRevert=e}})},disposables:new Set,handles:new Set,lastRevert:null,touch:null},r=e(()=>{n.touch?.dispose();for(let e of n.disposables)e()}),i={get disposalSignal(){return r.disposalSignal},dispose:r.dispose,get disposed(){return r.disposed},get isDragging(){return n.active!==null},revert(){n.lastRevert?.(),n.lastRevert=null},[f]:!0,[Symbol.dispose]:r[Symbol.dispose]};return h.set(i,n),t.touch&&(n.touch=d(t.touch===!0?{}:t.touch,e=>{for(let t of n.handles){let n=t.resolveTouchTarget(e);if(n)return n}return null})),i}function j(n){let{autoScroll:r=!0,axis:i=`vertical`,element:a,getKey:o,handle:s,keyboard:c=!0,placeholderClass:l=`dnd-placeholder`,scope:u=A()}=n,d=v(r),f=_(u);s!==void 0&&s.trim();let h=()=>Array.from(a.children).filter(e=>e.hasAttribute(m)),g=()=>h().map(e=>o(e)),y=new Map,S=a.getAttribute(`role`),C=e=>{let t=y.get(e);if(t)return t;let n={dataDndHandle:e.getAttribute(p),dataDndItem:e.getAttribute(m),draggable:e.getAttribute(`draggable`),role:e.getAttribute(`role`),tabIndex:e.getAttribute(`tabindex`),touchAction:e.style.touchAction};return y.set(e,n),n},T=(e,t,n)=>{n===null?e.removeAttribute(t):e.setAttribute(t,n)},E=()=>{h().forEach(e=>{let t=C(e);t.role===null&&e.setAttribute(`role`,`listitem`),t.tabIndex===null&&(e.tabIndex=0),s?e.querySelectorAll(s).forEach(e=>{C(e),e.setAttribute(p,``),e.setAttribute(`draggable`,`true`),e.style.touchAction=`none`}):(e.setAttribute(`draggable`,`true`),e.style.touchAction=`none`)})},j=()=>{let e=new Set;Array.from(a.children).forEach(t=>{let n=t;try{let t=o(n);t&&(C(n),e.has(t)?`${t}`:e.add(t),n.setAttribute(m,``))}catch(e){`${String(e)}`}}),E()},M=()=>{for(let[e,t]of y)T(e,p,t.dataDndHandle),T(e,m,t.dataDndItem),T(e,`draggable`,t.draggable),T(e,`role`,t.role),T(e,`tabindex`,t.tabIndex),e.style.touchAction=t.touchAction;y.clear()},N=e=>{let t=document.createElement(`div`);return t.className=l,t.setAttribute(`aria-hidden`,`true`),i===`horizontal`?t.style.width=`${e.offsetWidth}px`:t.style.height=`${e.offsetHeight}px`,t},P=null,F={commitReorder:e=>{if(!n.onReorder)return;let t={ids:e,setRevert(e){P=e}};n.onReorder(t)},element:a,getOrderedIds:g,isDisabled:()=>t(n.disabled),notifyBeforeReorder:(e,t)=>n.onBeforeReorder?.(e,t),notifyDragEnd:(e,t)=>n.onDragEnd?.(e,t),notifyDragStart:(e,t)=>n.onDragStart?.(e,t),resolveTouchTarget:e=>{if(t(n.disabled)||!a.contains(e))return null;let r=e.closest(`[${m}]`);if(!r||!a.contains(r))return null;if(!s)return r;let i=e.closest(s);return i&&r.contains(i)?i:null}};f.handles.add(F);let I=e=>{if(f.active||F.isDisabled())return;let t=e.target,r=t.closest(`[${m}]`);if(!r||s&&!t.closest(s))return;let i=r.parentElement;if(!i)return;let a=N(r),c=r.nextSibling,l=o(r),u=new Map;u.set(F,F.getOrderedIds()),r.setAttribute(`data-dragging`,``),i.insertBefore(a,c);let d={draggedEl:r,draggedId:l,hideFrame:null,initialOrders:u,originalDisplay:r.style.display,originalNextSibling:c,originalParent:i,placeholder:a,source:F,target:F};if((!b(e)||e.__dndTouchPreview)&&x(d),f.active=d,e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,l),n.dragImage)){let t=typeof n.dragImage==`function`?n.dragImage(l,r,e):n.dragImage,[i,a]=n.dragImageOffset??[0,0];t&&e.dataTransfer.setDragImage(t,i,a)}F.notifyDragStart(d.draggedId,e)},L=e=>{let t=f.active;if(!t||t.source.isDisabled()||F.isDisabled())return;e.preventDefault(),O(e,a,i,d),w(t,F);let{draggedEl:n,placeholder:r}=t,o=e.target.closest(`[${m}]`);if(!o){r.parentElement!==a&&a.appendChild(r),t.target=F;return}if(o===n||o===r)return;let s=o.getBoundingClientRect(),c=i===`vertical`?e.clientY>=s.top+s.height/2:e.clientX>=s.left+s.width/2;a.insertBefore(r,c?o.nextSibling:o),t.target=F},R=e=>{let t=f.active;t&&(t.source.isDisabled()||F.isDisabled()||(e.preventDefault(),t.target=F))},z=e=>{f.active?.source===F&&D(f,e,!1)},B=e=>{if(!c||F.isDisabled())return;let t=e.target?.tagName;if(t===`INPUT`||t===`TEXTAREA`||t===`SELECT`)return;let n=e.target.closest(`[${m}]`);if(!n||!a.contains(n))return;let r=g(),o=k(n,a,h,g,e.key,i);o!==null&&(e.preventDefault(),F.notifyBeforeReorder(r,o),F.commitReorder(o))};j();let V=e(()=>{f.disposables.delete(V.dispose),f.active&&(f.active.source===F||f.active.target===F)&&D(f,new Event(`dragend`),!0),f.handles.delete(F),T(a,`role`,S),M()});return S===null&&a.setAttribute(`role`,`list`),a.addEventListener(`dragstart`,I,{signal:V.disposalSignal}),a.addEventListener(`dragover`,L,{signal:V.disposalSignal}),a.addEventListener(`drop`,R,{signal:V.disposalSignal}),a.addEventListener(`dragend`,z,{signal:V.disposalSignal}),a.addEventListener(`keydown`,B,{signal:V.disposalSignal}),f.disposables.add(V.dispose),{get disposalSignal(){return V.disposalSignal},dispose:V.dispose,get disposed(){return V.disposed},get isDragging(){return f.active?.source===F},revert:()=>{P?.(),P=null},[Symbol.dispose]:V[Symbol.dispose],sync:()=>{j()}}}function M(e,t,n){let r=new Map(e.map(e=>[n(e),e])),i=[];for(let e of t){if(!r.has(e))continue;let t=r.get(e);i.push(t),r.delete(e)}for(let e of r.values())i.push(e);return i}exports.DndError=o,exports.DndScopeError=s,exports.applyReorder=M,exports.createDropZone=a,exports.createSortable=j,exports.createSortableScope=A,exports.matchesAccept=n;
|
|
2
2
|
//# sourceMappingURL=dnd.cjs.map
|