@vielzeug/dnd 1.2.2 → 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 CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  **Package:** `@vielzeug/dnd`  ·  **Category:** UI Interaction
11
11
 
12
- **Key exports:** `createDropZone`, `createSortable`, `createSortableScope`, `createTouchDragShim`, `applyReorder`, `matchesAccept`
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
- // Sortable list — with FLIP hook and revert support
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
- keyboard: true,
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/_dev.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=!globalThis.__DND_PROD__;function t(t){e&&console.warn(`[@vielzeug/dnd] ${t}`)}exports.warn=t;
1
+ function e(e){}exports.warn=e;
2
2
  //# sourceMappingURL=_dev.cjs.map
package/dist/_dev.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __DND_PROD__?: boolean }).__DND_PROD__;\n\n/** @internal @security Messages may include developer-supplied config values. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/dnd] ${msg}`);\n}\n\n/** @internal — Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAAA,IAAM,EAAQ,CAAE,WAA0C,aAG1D,SAAgB,EAAK,EAAmB,CAClC,GAAO,QAAQ,KAAK,mBAAmB,GAAK,CAClD"}
1
+ {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __DND_PROD__?: boolean }).__DND_PROD__;\n\n/** @internal @security Messages may include developer-supplied config values. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/dnd] ${msg}`);\n}\n\n/** @internal — Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
package/dist/_dev.js CHANGED
@@ -1,9 +1,6 @@
1
1
  //#region src/_dev.ts
2
- var e = !globalThis.__DND_PROD__;
3
- function t(t) {
4
- e && console.warn(`[@vielzeug/dnd] ${t}`);
5
- }
2
+ function e(e) {}
6
3
  //#endregion
7
- export { t as warn };
4
+ export { e as warn };
8
5
 
9
6
  //# sourceMappingURL=_dev.js.map
package/dist/_dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __DND_PROD__?: boolean }).__DND_PROD__;\n\n/** @internal @security Messages may include developer-supplied config values. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/dnd] ${msg}`);\n}\n\n/** @internal — Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":";AAAA,IAAM,IAAQ,CAAE,WAA0C;AAG1D,SAAgB,EAAK,GAAmB;CACtC,AAAI,KAAO,QAAQ,KAAK,mBAAmB,GAAK;AAClD"}
1
+ {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __DND_PROD__?: boolean }).__DND_PROD__;\n\n/** @internal @security Messages may include developer-supplied config values. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/dnd] ${msg}`);\n}\n\n/** @internal — Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":";AAGA,SAAgB,EAAK,GAAmB,CAExC"}
@@ -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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"}
@@ -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}):!0}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})):!0}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=!globalThis.__DND_PROD__;function l(e){c&&console.warn(`[@vielzeug/dnd] ${e}`)}var u=Symbol(`SortableScope`),d=`data-dnd-handle`,f=`data-dnd-item`,p=new WeakMap,m={container:!0,edgeThreshold:32,speed:18,viewport:!1};function h(e){let t=p.get(e);if(!t)throw new s;return t}function g(e){return e===!1?null:e===!0||e===void 0?m:{container:e.container??!0,edgeThreshold:e.edgeThreshold??32,speed:e.speed??18,viewport:e.viewport??!1}}function _(e,t){return t.length!==e.length||t.some((t,n)=>t!==e[n])}function v(e){e.querySelectorAll(`[${d}]`).forEach(e=>{e.removeAttribute(d),e.removeAttribute(`draggable`),e.style.touchAction=``})}function y(e){typeof requestAnimationFrame==`function`&&(e.hideFrame=requestAnimationFrame(()=>{e.hideFrame=null,e.draggedEl.style.display=`none`}))}function b(e){e.hideFrame!==null&&(cancelAnimationFrame(e.hideFrame),e.hideFrame=null)}function x(e){b(e),e.draggedEl.style.display=e.originalDisplay,e.draggedEl.removeAttribute(`data-dragging`)}function S(e,t){e.initialOrders.has(t)||e.initialOrders.set(t,t.getOrderedIds())}function C(e,t){let n=e.active;n&&(x(n),n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t))}function w(e,t){let n=e.active;if(!n)return;let r=n.target,i=n.placeholder.parentElement;x(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();_(r,n)&&(t.notifyBeforeReorder(r,n),t.commitReorder(n))}}function T(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()?C(e,t):w(e,t)}function E(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 D(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 O(){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},[u]:!0,[Symbol.dispose]:n[Symbol.dispose]};return p.set(r,t),r}function k(n){let{autoScroll:r=!0,axis:i=`vertical`,element:a,getKey:o,handle:s,keyboard:c=!0,placeholderClass:u=`dnd-placeholder`,scope:p=O()}=n,m=g(r),_=h(p);s!==void 0&&s.trim()===``&&l(`handle option is an empty string — no handle elements will be found. Provide a valid CSS selector or omit the option.`);let b=()=>Array.from(a.children).filter(e=>e.hasAttribute(f)),x=()=>b().map(e=>o(e)),C=()=>{v(a),b().forEach(e=>{e.setAttribute(`role`,`listitem`),e.tabIndex=0,s?(e.removeAttribute(`draggable`),e.style.touchAction=``,e.querySelectorAll(s).forEach(e=>{e.setAttribute(d,``),e.setAttribute(`draggable`,`true`),e.style.touchAction=`none`})):(e.setAttribute(`draggable`,`true`),e.style.touchAction=`none`)})},w=()=>{let e=new Set;Array.from(a.children).forEach(t=>{let n=t;try{let t=o(n);t&&(e.has(t)?l(`getKey returned the duplicate key "${t}" for two sibling items — onReorder's ids and applyReorder may become inconsistent. Ensure getKey returns a unique value per item.`):e.add(t),n.setAttribute(f,``))}catch(e){l(`getKey threw for a child element — the item will not be sortable. Check your getKey implementation. ${String(e)}`)}}),C()},k=()=>{v(a),a.querySelectorAll(`[${f}]`).forEach(e=>{e.removeAttribute(f),e.removeAttribute(`draggable`),e.removeAttribute(`role`),e.removeAttribute(`tabindex`),e.style.touchAction=``})},A=e=>{let t=document.createElement(`div`);return t.className=u,t.setAttribute(`aria-hidden`,`true`),i===`horizontal`?t.style.width=`${e.offsetWidth}px`:t.style.height=`${e.offsetHeight}px`,t},j=null,M={commitReorder:e=>{if(!n.onReorder)return;let t={ids:e,setRevert(e){j=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)};_.handles.add(M);let N=e=>{if(_.active||M.isDisabled())return;let t=e.target,r=t.closest(`[${f}]`);if(!r||s&&!t.closest(s))return;let i=r.parentElement;if(!i)return;let a=A(r),c=r.nextSibling,l=o(r),u=new Map;u.set(M,M.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:M,target:M};if(y(d),_.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)}M.notifyDragStart(d.draggedId,e)},P=e=>{let t=_.active;if(!t||t.source.isDisabled()||M.isDisabled())return;e.preventDefault(),E(e,a,i,m),S(t,M);let{draggedEl:n,placeholder:r}=t,o=e.target.closest(`[${f}]`);if(!o){r.parentElement!==a&&a.appendChild(r),t.target=M;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=M},F=e=>{let t=_.active;t&&(t.source.isDisabled()||M.isDisabled()||(e.preventDefault(),t.target=M))},I=e=>{_.active?.source===M&&T(_,e,!1)},L=e=>{if(!c||M.isDisabled())return;let t=e.target?.tagName;if(t===`INPUT`||t===`TEXTAREA`||t===`SELECT`)return;let n=e.target.closest(`[${f}]`);if(!n||!a.contains(n))return;let r=x(),o=D(n,a,b,x,e.key,i);o!==null&&(e.preventDefault(),M.notifyBeforeReorder(r,o),M.commitReorder(o))};w();let R=e(()=>{_.disposables.delete(R.dispose),_.active&&(_.active.source===M||_.active.target===M)&&T(_,new Event(`dragend`),!0),_.handles.delete(M),a.removeAttribute(`role`),k()});return a.setAttribute(`role`,`list`),a.addEventListener(`dragstart`,N,{signal:R.disposalSignal}),a.addEventListener(`dragover`,P,{signal:R.disposalSignal}),a.addEventListener(`drop`,F,{signal:R.disposalSignal}),a.addEventListener(`dragend`,I,{signal:R.disposalSignal}),a.addEventListener(`keydown`,L,{signal:R.disposalSignal}),_.disposables.add(R.dispose),{get disposalSignal(){return R.disposalSignal},dispose:R.dispose,get disposed(){return R.disposed},get isDragging(){return _.active?.source===M},revert:()=>{j?.(),j=null},[Symbol.dispose]:R[Symbol.dispose],sync:()=>{w()}}}function A(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 j=2147483647;function M(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(j)}),document.body.appendChild(n),n}function N(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function P(n={}){let r=N(),i=null,a=null,o=null,s=null,c=null,u=null;function d(){c?.remove(),c=null,u=null}function f(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 p=e(()=>{i=null,a=null,o=null,s=null,d()});function m(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:p.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=M(o),u={clientX:t.clientX,clientY:t.clientY}}catch(e){l(`drag preview failed to render, continuing without one: ${String(e)}`),d()}m(o,`dragstart`,t.clientX,t.clientY)}if(c&&u){let e=t.clientX-u.clientX,n=t.clientY-u.clientY;c.style.transform=`translate3d(${e}px, ${n}px, 0)`}let r=f(t.clientX,t.clientY);r&&r!==s&&(s&&m(s,`dragleave`,t.clientX,t.clientY),s=r),r&&m(r,`dragover`,t.clientX,t.clientY),i=null,a=null,e.preventDefault()},{passive:!1,signal:p.disposalSignal}),document.addEventListener(`touchend`,e=>{if(!o){i=null,a=null;return}let t=e.changedTouches[0];if(!t)return;let n=f(t.clientX,t.clientY);n&&m(n,`drop`,t.clientX,t.clientY),m(o,`dragend`,t.clientX,t.clientY),i=null,a=null,o=null,s=null,d()},{passive:!0,signal:p.disposalSignal}),document.addEventListener(`touchcancel`,e=>{if(!o){i=null,a=null;return}let t=e.changedTouches[0];t&&(m(o,`dragend`,t.clientX,t.clientY),i=null,a=null,o=null,s=null,d())},{passive:!0,signal:p.disposalSignal}),p}exports.DndError=o,exports.DndScopeError=s,exports.applyReorder=A,exports.createDropZone=a,exports.createSortable=k,exports.createSortableScope=O,exports.createTouchDragShim=P,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