@vielzeug/dnd 3.0.0 → 26.10.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/dist/_dev.cjs CHANGED
@@ -1,2 +1,2 @@
1
- function e(e){}exports.warn=e;
1
+ function warn(e){}exports.warn=warn;
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":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
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,KAAK,EAAmB,CAExC"}
package/dist/_dev.js CHANGED
@@ -1,6 +1,2 @@
1
- //#region src/_dev.ts
2
- function e(e) {}
3
- //#endregion
4
- export { e as warn };
5
-
1
+ function warn(e){}export{warn};
6
2
  //# 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":";AAGA,SAAgB,EAAK,GAAmB,CAExC"}
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,KAAK,EAAmB,CAExC"}
package/dist/_shared.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 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}exports.createDisposable=e,exports.resolveDisabled=t;
1
+ function createDisposable(e){let t=!1,n=new AbortController,dispose=()=>{t||(t=!0,n.abort(),e?.())};return{get disposalSignal(){return n.signal},dispose,get disposed(){return t},[Symbol.dispose]:dispose}}function resolveDisabled(e){return e===!0}exports.createDisposable=createDisposable,exports.resolveDisabled=resolveDisabled;
2
2
  //# sourceMappingURL=_shared.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_shared.cjs","names":[],"sources":["../src/_shared.ts"],"sourcesContent":["import type { Disposable } from './types.js';\n\n// ─── Disposable ──────────────────────────────────────────────────────────────\n\n/**\n * Create a `Disposable` backed by an `AbortController`.\n * `dispose()` is idempotent — the signal aborts and `cleanup` runs at most once.\n * Pass the returned `disposalSignal` to `addEventListener` calls so removal happens\n * automatically on dispose, instead of pairing manual `removeEventListener` calls.\n */\nexport function createDisposable(cleanup?: () => void): Disposable {\n let disposed = false;\n const abortController = new AbortController();\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n abortController.abort();\n cleanup?.();\n };\n\n return {\n get disposalSignal() {\n return abortController.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n [Symbol.dispose]: dispose,\n };\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nexport function resolveDisabled(disabled: boolean | undefined): boolean {\n return disabled === true;\n}\n"],"mappings":"AAUA,SAAgB,EAAiB,EAAkC,CACjE,IAAI,EAAW,GACT,EAAkB,IAAI,gBAEtB,MAAsB,CACtB,IAEJ,EAAW,GACX,EAAgB,MAAM,EACtB,IAAU,EACZ,EAEA,MAAO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAgB,MACzB,EACA,UACA,IAAI,UAAW,CACb,OAAO,CACT,GACC,OAAO,SAAU,CACpB,CACF,CAIA,SAAgB,EAAgB,EAAwC,CACtE,OAAO,IAAa,EACtB"}
1
+ {"version":3,"file":"_shared.cjs","names":[],"sources":["../src/_shared.ts"],"sourcesContent":["import type { Disposable } from './types.js';\n\n// ─── Disposable ──────────────────────────────────────────────────────────────\n\n/**\n * Create a `Disposable` backed by an `AbortController`.\n * `dispose()` is idempotent — the signal aborts and `cleanup` runs at most once.\n * Pass the returned `disposalSignal` to `addEventListener` calls so removal happens\n * automatically on dispose, instead of pairing manual `removeEventListener` calls.\n */\nexport function createDisposable(cleanup?: () => void): Disposable {\n let disposed = false;\n const abortController = new AbortController();\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n abortController.abort();\n cleanup?.();\n };\n\n return {\n get disposalSignal() {\n return abortController.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n [Symbol.dispose]: dispose,\n };\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nexport function resolveDisabled(disabled: boolean | undefined): boolean {\n return disabled === true;\n}\n"],"mappings":"AAUA,SAAgB,iBAAiB,EAAkC,CACjE,IAAI,EAAW,GACT,EAAkB,IAAI,gBAEtB,YAAsB,CACtB,IAEJ,EAAW,GACX,EAAgB,MAAM,EACtB,IAAU,EACZ,EAEA,MAAO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAgB,MACzB,EACA,QACA,IAAI,UAAW,CACb,OAAO,CACT,GACC,OAAO,SAAU,OACpB,CACF,CAIA,SAAgB,gBAAgB,EAAwC,CACtE,OAAO,IAAa,EACtB"}
package/dist/_shared.js CHANGED
@@ -1,23 +1,2 @@
1
- //#region src/_shared.ts
2
- function e(e) {
3
- let t = !1, n = new AbortController(), r = () => {
4
- t || (t = !0, n.abort(), e?.());
5
- };
6
- return {
7
- get disposalSignal() {
8
- return n.signal;
9
- },
10
- dispose: r,
11
- get disposed() {
12
- return t;
13
- },
14
- [Symbol.dispose]: r
15
- };
16
- }
17
- function t(e) {
18
- return e === !0;
19
- }
20
- //#endregion
21
- export { e as createDisposable, t as resolveDisabled };
22
-
1
+ function createDisposable(e){let t=!1,n=new AbortController,dispose=()=>{t||(t=!0,n.abort(),e?.())};return{get disposalSignal(){return n.signal},dispose,get disposed(){return t},[Symbol.dispose]:dispose}}function resolveDisabled(e){return e===!0}export{createDisposable,resolveDisabled};
23
2
  //# sourceMappingURL=_shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_shared.js","names":[],"sources":["../src/_shared.ts"],"sourcesContent":["import type { Disposable } from './types.js';\n\n// ─── Disposable ──────────────────────────────────────────────────────────────\n\n/**\n * Create a `Disposable` backed by an `AbortController`.\n * `dispose()` is idempotent — the signal aborts and `cleanup` runs at most once.\n * Pass the returned `disposalSignal` to `addEventListener` calls so removal happens\n * automatically on dispose, instead of pairing manual `removeEventListener` calls.\n */\nexport function createDisposable(cleanup?: () => void): Disposable {\n let disposed = false;\n const abortController = new AbortController();\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n abortController.abort();\n cleanup?.();\n };\n\n return {\n get disposalSignal() {\n return abortController.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n [Symbol.dispose]: dispose,\n };\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nexport function resolveDisabled(disabled: boolean | undefined): boolean {\n return disabled === true;\n}\n"],"mappings":";AAUA,SAAgB,EAAiB,GAAkC;CACjE,IAAI,IAAW,IACT,IAAkB,IAAI,gBAAgB,GAEtC,UAAsB;EACtB,MAEJ,IAAW,IACX,EAAgB,MAAM,GACtB,IAAU;CACZ;CAEA,OAAO;EACL,IAAI,iBAAiB;GACnB,OAAO,EAAgB;EACzB;EACA;EACA,IAAI,WAAW;GACb,OAAO;EACT;GACC,OAAO,UAAU;CACpB;AACF;AAIA,SAAgB,EAAgB,GAAwC;CACtE,OAAO,MAAa;AACtB"}
1
+ {"version":3,"file":"_shared.js","names":[],"sources":["../src/_shared.ts"],"sourcesContent":["import type { Disposable } from './types.js';\n\n// ─── Disposable ──────────────────────────────────────────────────────────────\n\n/**\n * Create a `Disposable` backed by an `AbortController`.\n * `dispose()` is idempotent — the signal aborts and `cleanup` runs at most once.\n * Pass the returned `disposalSignal` to `addEventListener` calls so removal happens\n * automatically on dispose, instead of pairing manual `removeEventListener` calls.\n */\nexport function createDisposable(cleanup?: () => void): Disposable {\n let disposed = false;\n const abortController = new AbortController();\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n abortController.abort();\n cleanup?.();\n };\n\n return {\n get disposalSignal() {\n return abortController.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n [Symbol.dispose]: dispose,\n };\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nexport function resolveDisabled(disabled: boolean | undefined): boolean {\n return disabled === true;\n}\n"],"mappings":"AAUA,SAAgB,iBAAiB,EAAkC,CACjE,IAAI,EAAW,GACT,EAAkB,IAAI,gBAEtB,YAAsB,CACtB,IAEJ,EAAW,GACX,EAAgB,MAAM,EACtB,IAAU,EACZ,EAEA,MAAO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAgB,MACzB,EACA,QACA,IAAI,UAAW,CACb,OAAO,CACT,GACC,OAAO,SAAU,OACpB,CACF,CAIA,SAAgB,gBAAgB,EAAwC,CACtE,OAAO,IAAa,EACtB"}
package/dist/_touch.cjs CHANGED
@@ -1,2 +1,2 @@
1
- require("./_dev.cjs");const e=require("./_shared.cjs"),t=require("./errors.cjs");let n=require("@vielzeug/gesture");var r=2147483647;function i(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function a(e){let t=e.getBoundingClientRect(),n=e.ownerDocument.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(r)}),n}function o(o,s){let{activationDistance:c=6,preview:l}=o;if(!Number.isFinite(c)||c<0)throw new t.DndError(`touch.activationDistance must be a non-negative finite number`);let u=i(),d=new Map,f=null,p=null,m=()=>{p?.preview?.remove(),f=null,p=null},h=e.createDisposable(()=>{m(),d.clear()}),g=e=>{let t=e.composedPath().find(e=>e.nodeType===1)??e.target;return t&&t.nodeType===1?t:null},_=(e,t)=>{let n=e.source.style.display,r=e.preview?.style.display??``;e.source.style.display=`none`,e.preview&&(e.preview.style.display=`none`);try{return e.source.ownerDocument.elementFromPoint(t.x,t.y)}finally{e.source.style.display=n,e.preview&&(e.preview.style.display=r)}},v=(e,t,n,r=!1)=>{let i=new((e.ownerDocument.defaultView?.Event)??Event)(t,{bubbles:!0,cancelable:!0});return Object.defineProperties(i,{__dndTouch:{configurable:!0,value:!0},__dndTouchPreview:{configurable:!0,value:r},clientX:{configurable:!0,value:n.x},clientY:{configurable:!0,value:n.y},dataTransfer:{configurable:!0,value:u}}),e.dispatchEvent(i),i.defaultPrevented},y=e=>{if(l===!1)return null;let t;try{let n=l?.(e);t=l?n?.cloneNode(!0)??null:a(e)}catch(e){`${String(e)}`,t=null}return t?(t.setAttribute(`aria-hidden`,`true`),t.setAttribute(`data-dnd-touch-preview`,``),t.setAttribute(`inert`,``),t.removeAttribute(`id`),t.querySelectorAll(`[id]`).forEach(e=>{e.removeAttribute(`id`)}),t.style.pointerEvents=`none`,t.style.position=`fixed`,t.style.zIndex=String(r),e.ownerDocument.body.appendChild(t),t):null},b=e=>{let t=f;if(f=null,!t)return;let n=y(t);p={current:e.current,lastTarget:t,preview:n,previewOrigin:n?e.current:null,source:t},v(t,`dragstart`,e.current,n!==null)},x=e=>{if(!p)return;if(p.current=e.current,p.preview&&p.previewOrigin){let t=e.current.x-p.previewOrigin.x,n=e.current.y-p.previewOrigin.y;p.preview.style.transform=`translate3d(${t}px, ${n}px, 0)`}let t=_(p,e.current);t&&t!==p.lastTarget&&(p.lastTarget&&v(p.lastTarget,`dragleave`,e.current),p.lastTarget=t),t&&v(t,`dragover`,e.current),e.event.preventDefault()},S=e=>{if(f=null,!p)return;let t=p;try{let n=!1;if(e.reason===`release`){let r=_(t,e.current);r&&(n=v(r,`drop`,e.current))}u.dropEffect=n?`move`:`none`,v(t.source,`dragend`,e.current,t.preview!==null)}finally{u.dropEffect=`move`,m()}};return Object.assign(h,{cancel(){for(let e of d.values())if(e.cancel())return!0;return!1},register(e){let t=(0,n.createDragGesture)(e,{activationDistance:c,onEnd:S,onMove:x,onStart:b,pointerCapture:!1,shouldStart:e=>{if(e.pointerType!==`touch`||p)return!1;let t=g(e);return f=t?s(t):null,f!==null},signal:h.disposalSignal});return d.set(e,t),()=>{t.dispose(),d.delete(e),f&&e.contains(f)&&(f=null),p&&e.contains(p.source)&&m()}}})}exports.createScopeTouchController=o;
1
+ require("./_dev.cjs");const e=require("./_shared.cjs"),t=require("./errors.cjs");let n=require("@vielzeug/gesture");var r=2147483647;function makeDataTransfer(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function createDefaultPreview(e){let t=e.getBoundingClientRect(),n=e.ownerDocument.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(r)}),n}function createScopeTouchController(i,a){let{activationDistance:o=6,preview:s}=i;if(!Number.isFinite(o)||o<0)throw new t.DndError(`touch.activationDistance must be a non-negative finite number`);let c=makeDataTransfer(),l=new Map,u=null,d=null,resetSession=()=>{d?.preview?.remove(),u=null,d=null},f=e.createDisposable(()=>{resetSession(),l.clear()}),eventTarget=e=>{let t=e.composedPath().find(e=>e.nodeType===1)??e.target;return t&&t.nodeType===1?t:null},elementBelow=(e,t)=>{let n=e.source.style.display,r=e.preview?.style.display??``;e.source.style.display=`none`,e.preview&&(e.preview.style.display=`none`);try{return e.source.ownerDocument.elementFromPoint(t.x,t.y)}finally{e.source.style.display=n,e.preview&&(e.preview.style.display=r)}},dispatch=(e,t,n,r=!1)=>{let i=new((e.ownerDocument.defaultView?.Event)??Event)(t,{bubbles:!0,cancelable:!0});return Object.defineProperties(i,{__dndTouch:{configurable:!0,value:!0},__dndTouchPreview:{configurable:!0,value:r},clientX:{configurable:!0,value:n.x},clientY:{configurable:!0,value:n.y},dataTransfer:{configurable:!0,value:c}}),e.dispatchEvent(i),i.defaultPrevented},renderPreview=e=>{if(s===!1)return null;let t;try{let n=s?.(e);t=s?n?.cloneNode(!0)??null:createDefaultPreview(e)}catch(e){`${String(e)}`,t=null}return t?(t.setAttribute(`aria-hidden`,`true`),t.setAttribute(`data-dnd-touch-preview`,``),t.setAttribute(`inert`,``),t.removeAttribute(`id`),t.querySelectorAll(`[id]`).forEach(e=>{e.removeAttribute(`id`)}),t.style.pointerEvents=`none`,t.style.position=`fixed`,t.style.zIndex=String(r),e.ownerDocument.body.appendChild(t),t):null},start=e=>{let t=u;if(u=null,!t)return;let n=renderPreview(t);d={current:e.current,lastTarget:t,preview:n,previewOrigin:n?e.current:null,source:t},dispatch(t,`dragstart`,e.current,n!==null)},move=e=>{if(!d)return;if(d.current=e.current,d.preview&&d.previewOrigin){let t=e.current.x-d.previewOrigin.x,n=e.current.y-d.previewOrigin.y;d.preview.style.transform=`translate3d(${t}px, ${n}px, 0)`}let t=elementBelow(d,e.current);t&&t!==d.lastTarget&&(d.lastTarget&&dispatch(d.lastTarget,`dragleave`,e.current),d.lastTarget=t),t&&dispatch(t,`dragover`,e.current),e.event.preventDefault()},end=e=>{if(u=null,!d)return;let t=d;try{let n=!1;if(e.reason===`release`){let r=elementBelow(t,e.current);r&&(n=dispatch(r,`drop`,e.current))}c.dropEffect=n?`move`:`none`,dispatch(t.source,`dragend`,e.current,t.preview!==null)}finally{c.dropEffect=`move`,resetSession()}};return Object.assign(f,{cancel(){for(let e of l.values())if(e.cancel())return!0;return!1},register(e){let t=(0,n.createDragGesture)(e,{activationDistance:o,onEnd:end,onMove:move,onStart:start,pointerCapture:!1,shouldStart:e=>{if(e.pointerType!==`touch`||d)return!1;let t=eventTarget(e);return u=t?a(t):null,u!==null},signal:f.disposalSignal});return l.set(e,t),()=>{t.dispose(),l.delete(e),u&&e.contains(u)&&(u=null),d&&e.contains(d.source)&&resetSession()}}})}exports.createScopeTouchController=createScopeTouchController;
2
2
  //# sourceMappingURL=_touch.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_touch.cjs","names":[],"sources":["../src/_touch.ts"],"sourcesContent":["import { createDragGesture, type DragGesture, type DragGestureDetail } from '@vielzeug/gesture';\n\nimport { warn } from './_dev.js';\nimport { createDisposable } from './_shared.js';\nimport { DndError } from './errors.js';\nimport type { Disposable } from './types.js';\n\nexport type TouchInputOptions = Readonly<{\n /** Finger movement in pixels required before sorting starts. @default 6 */\n activationDistance?: number;\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 interface ScopeTouchController extends Disposable {\n cancel(): boolean;\n register(element: HTMLElement): () => void;\n}\n\nconst PREVIEW_Z_INDEX = 2147483647;\n\ntype TouchDragSession = {\n current: DragGestureDetail['current'];\n lastTarget: Element | null;\n preview: HTMLElement | null;\n previewOrigin: DragGestureDetail['current'] | null;\n source: HTMLElement;\n};\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 = source.ownerDocument.createElement('div');\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 return preview;\n}\n\nexport function createScopeTouchController(\n options: TouchInputOptions,\n resolveDragTarget: (target: Element) => HTMLElement | null,\n): ScopeTouchController {\n const { activationDistance = 6, preview: previewOption } = options;\n if (!Number.isFinite(activationDistance) || activationDistance < 0) {\n throw new DndError('touch.activationDistance must be a non-negative finite number');\n }\n\n const dataTransfer = makeDataTransfer();\n const gestures = new Map<HTMLElement, DragGesture>();\n let pendingSource: HTMLElement | null = null;\n let session: TouchDragSession | null = null;\n\n const resetSession = (): void => {\n session?.preview?.remove();\n pendingSource = null;\n session = null;\n };\n const disposable = createDisposable(() => {\n resetSession();\n gestures.clear();\n });\n\n const eventTarget = (event: PointerEvent): Element | null => {\n const target = event.composedPath().find((node) => (node as Node).nodeType === 1) ?? event.target;\n return target && (target as Node).nodeType === 1 ? (target as Element) : null;\n };\n\n const elementBelow = (active: TouchDragSession, point: DragGestureDetail['current']): Element | null => {\n const previousSourceDisplay = active.source.style.display;\n const previousPreviewDisplay = active.preview?.style.display ?? '';\n active.source.style.display = 'none';\n if (active.preview) active.preview.style.display = 'none';\n try {\n return active.source.ownerDocument.elementFromPoint(point.x, point.y);\n } finally {\n active.source.style.display = previousSourceDisplay;\n if (active.preview) active.preview.style.display = previousPreviewDisplay;\n }\n };\n\n const dispatch = (\n element: Element,\n type: string,\n point: DragGestureDetail['current'],\n hasPreview = false,\n ): boolean => {\n const EventType = element.ownerDocument.defaultView?.Event ?? Event;\n const event = new EventType(type, { bubbles: true, cancelable: true });\n Object.defineProperties(event, {\n __dndTouch: { configurable: true, value: true },\n __dndTouchPreview: { configurable: true, value: hasPreview },\n clientX: { configurable: true, value: point.x },\n clientY: { configurable: true, value: point.y },\n dataTransfer: { configurable: true, value: dataTransfer },\n });\n element.dispatchEvent(event);\n return event.defaultPrevented;\n };\n\n const renderPreview = (source: HTMLElement): HTMLElement | null => {\n if (previewOption === false) return null;\n let previewElement: HTMLElement | null;\n try {\n const preview = previewOption?.(source);\n previewElement = previewOption\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 previewElement = null;\n }\n if (!previewElement) return null;\n\n previewElement.setAttribute('aria-hidden', 'true');\n previewElement.setAttribute('data-dnd-touch-preview', '');\n previewElement.setAttribute('inert', '');\n previewElement.removeAttribute('id');\n previewElement.querySelectorAll('[id]').forEach((element) => {\n element.removeAttribute('id');\n });\n previewElement.style.pointerEvents = 'none';\n previewElement.style.position = 'fixed';\n previewElement.style.zIndex = String(PREVIEW_Z_INDEX);\n source.ownerDocument.body.appendChild(previewElement);\n return previewElement;\n };\n\n const start = (detail: DragGestureDetail): void => {\n const source = pendingSource;\n pendingSource = null;\n if (!source) return;\n\n const preview = renderPreview(source);\n const active: TouchDragSession = {\n current: detail.current,\n lastTarget: source,\n preview,\n previewOrigin: preview ? detail.current : null,\n source,\n };\n session = active;\n dispatch(source, 'dragstart', detail.current, preview !== null);\n };\n\n const move = (detail: DragGestureDetail): void => {\n if (!session) return;\n session.current = detail.current;\n if (session.preview && session.previewOrigin) {\n const x = detail.current.x - session.previewOrigin.x;\n const y = detail.current.y - session.previewOrigin.y;\n session.preview.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n }\n\n const below = elementBelow(session, detail.current);\n if (below && below !== session.lastTarget) {\n if (session.lastTarget) dispatch(session.lastTarget, 'dragleave', detail.current);\n session.lastTarget = below;\n }\n if (below) dispatch(below, 'dragover', detail.current);\n detail.event.preventDefault();\n };\n\n const end = (detail: DragGestureDetail & Readonly<{ reason: 'cancel' | 'release' }>): void => {\n pendingSource = null;\n if (!session) return;\n const active = session;\n try {\n let dropAccepted = false;\n if (detail.reason === 'release') {\n const below = elementBelow(active, detail.current);\n if (below) dropAccepted = dispatch(below, 'drop', detail.current);\n }\n dataTransfer.dropEffect = dropAccepted ? 'move' : 'none';\n dispatch(active.source, 'dragend', detail.current, active.preview !== null);\n } finally {\n dataTransfer.dropEffect = 'move';\n resetSession();\n }\n };\n\n return Object.assign(disposable, {\n cancel(): boolean {\n for (const gesture of gestures.values()) {\n if (gesture.cancel()) return true;\n }\n return false;\n },\n register(element: HTMLElement): () => void {\n const gesture = createDragGesture(element, {\n activationDistance,\n onEnd: end,\n onMove: move,\n onStart: start,\n pointerCapture: false,\n shouldStart: (event) => {\n if (event.pointerType !== 'touch' || session) return false;\n const target = eventTarget(event);\n pendingSource = target ? resolveDragTarget(target) : null;\n return pendingSource !== null;\n },\n signal: disposable.disposalSignal,\n });\n gestures.set(element, gesture);\n\n return () => {\n gesture.dispose();\n gestures.delete(element);\n if (pendingSource && element.contains(pendingSource)) pendingSource = null;\n if (session && element.contains(session.source)) resetSession();\n };\n },\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_touch.cjs","names":[],"sources":["../src/_touch.ts"],"sourcesContent":["import { createDragGesture, type DragGesture, type DragGestureDetail } from '@vielzeug/gesture';\n\nimport { warn } from './_dev.js';\nimport { createDisposable } from './_shared.js';\nimport { DndError } from './errors.js';\nimport type { Disposable } from './types.js';\n\nexport type TouchInputOptions = Readonly<{\n /** Finger movement in pixels required before sorting starts. @default 6 */\n activationDistance?: number;\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 interface ScopeTouchController extends Disposable {\n cancel(): boolean;\n register(element: HTMLElement): () => void;\n}\n\nconst PREVIEW_Z_INDEX = 2147483647;\n\ntype TouchDragSession = {\n current: DragGestureDetail['current'];\n lastTarget: Element | null;\n preview: HTMLElement | null;\n previewOrigin: DragGestureDetail['current'] | null;\n source: HTMLElement;\n};\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 = source.ownerDocument.createElement('div');\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 return preview;\n}\n\nexport function createScopeTouchController(\n options: TouchInputOptions,\n resolveDragTarget: (target: Element) => HTMLElement | null,\n): ScopeTouchController {\n const { activationDistance = 6, preview: previewOption } = options;\n if (!Number.isFinite(activationDistance) || activationDistance < 0) {\n throw new DndError('touch.activationDistance must be a non-negative finite number');\n }\n\n const dataTransfer = makeDataTransfer();\n const gestures = new Map<HTMLElement, DragGesture>();\n let pendingSource: HTMLElement | null = null;\n let session: TouchDragSession | null = null;\n\n const resetSession = (): void => {\n session?.preview?.remove();\n pendingSource = null;\n session = null;\n };\n const disposable = createDisposable(() => {\n resetSession();\n gestures.clear();\n });\n\n const eventTarget = (event: PointerEvent): Element | null => {\n const target = event.composedPath().find((node) => (node as Node).nodeType === 1) ?? event.target;\n return target && (target as Node).nodeType === 1 ? (target as Element) : null;\n };\n\n const elementBelow = (active: TouchDragSession, point: DragGestureDetail['current']): Element | null => {\n const previousSourceDisplay = active.source.style.display;\n const previousPreviewDisplay = active.preview?.style.display ?? '';\n active.source.style.display = 'none';\n if (active.preview) active.preview.style.display = 'none';\n try {\n return active.source.ownerDocument.elementFromPoint(point.x, point.y);\n } finally {\n active.source.style.display = previousSourceDisplay;\n if (active.preview) active.preview.style.display = previousPreviewDisplay;\n }\n };\n\n const dispatch = (\n element: Element,\n type: string,\n point: DragGestureDetail['current'],\n hasPreview = false,\n ): boolean => {\n const EventType = element.ownerDocument.defaultView?.Event ?? Event;\n const event = new EventType(type, { bubbles: true, cancelable: true });\n Object.defineProperties(event, {\n __dndTouch: { configurable: true, value: true },\n __dndTouchPreview: { configurable: true, value: hasPreview },\n clientX: { configurable: true, value: point.x },\n clientY: { configurable: true, value: point.y },\n dataTransfer: { configurable: true, value: dataTransfer },\n });\n element.dispatchEvent(event);\n return event.defaultPrevented;\n };\n\n const renderPreview = (source: HTMLElement): HTMLElement | null => {\n if (previewOption === false) return null;\n let previewElement: HTMLElement | null;\n try {\n const preview = previewOption?.(source);\n previewElement = previewOption\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 previewElement = null;\n }\n if (!previewElement) return null;\n\n previewElement.setAttribute('aria-hidden', 'true');\n previewElement.setAttribute('data-dnd-touch-preview', '');\n previewElement.setAttribute('inert', '');\n previewElement.removeAttribute('id');\n previewElement.querySelectorAll('[id]').forEach((element) => {\n element.removeAttribute('id');\n });\n previewElement.style.pointerEvents = 'none';\n previewElement.style.position = 'fixed';\n previewElement.style.zIndex = String(PREVIEW_Z_INDEX);\n source.ownerDocument.body.appendChild(previewElement);\n return previewElement;\n };\n\n const start = (detail: DragGestureDetail): void => {\n const source = pendingSource;\n pendingSource = null;\n if (!source) return;\n\n const preview = renderPreview(source);\n const active: TouchDragSession = {\n current: detail.current,\n lastTarget: source,\n preview,\n previewOrigin: preview ? detail.current : null,\n source,\n };\n session = active;\n dispatch(source, 'dragstart', detail.current, preview !== null);\n };\n\n const move = (detail: DragGestureDetail): void => {\n if (!session) return;\n session.current = detail.current;\n if (session.preview && session.previewOrigin) {\n const x = detail.current.x - session.previewOrigin.x;\n const y = detail.current.y - session.previewOrigin.y;\n session.preview.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n }\n\n const below = elementBelow(session, detail.current);\n if (below && below !== session.lastTarget) {\n if (session.lastTarget) dispatch(session.lastTarget, 'dragleave', detail.current);\n session.lastTarget = below;\n }\n if (below) dispatch(below, 'dragover', detail.current);\n detail.event.preventDefault();\n };\n\n const end = (detail: DragGestureDetail & Readonly<{ reason: 'cancel' | 'release' }>): void => {\n pendingSource = null;\n if (!session) return;\n const active = session;\n try {\n let dropAccepted = false;\n if (detail.reason === 'release') {\n const below = elementBelow(active, detail.current);\n if (below) dropAccepted = dispatch(below, 'drop', detail.current);\n }\n dataTransfer.dropEffect = dropAccepted ? 'move' : 'none';\n dispatch(active.source, 'dragend', detail.current, active.preview !== null);\n } finally {\n dataTransfer.dropEffect = 'move';\n resetSession();\n }\n };\n\n return Object.assign(disposable, {\n cancel(): boolean {\n for (const gesture of gestures.values()) {\n if (gesture.cancel()) return true;\n }\n return false;\n },\n register(element: HTMLElement): () => void {\n const gesture = createDragGesture(element, {\n activationDistance,\n onEnd: end,\n onMove: move,\n onStart: start,\n pointerCapture: false,\n shouldStart: (event) => {\n if (event.pointerType !== 'touch' || session) return false;\n const target = eventTarget(event);\n pendingSource = target ? resolveDragTarget(target) : null;\n return pendingSource !== null;\n },\n signal: disposable.disposalSignal,\n });\n gestures.set(element, gesture);\n\n return () => {\n gesture.dispose();\n gestures.delete(element);\n if (pendingSource && element.contains(pendingSource)) pendingSource = null;\n if (session && element.contains(session.source)) resetSession();\n };\n },\n });\n}\n"],"mappings":"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"}
package/dist/_touch.js CHANGED
@@ -1,151 +1,2 @@
1
- import "./_dev.js";
2
- import { createDisposable as e } from "./_shared.js";
3
- import { DndError as t } from "./errors.js";
4
- import { createDragGesture as n } from "@vielzeug/gesture";
5
- //#region src/_touch.ts
6
- var r = 2147483647;
7
- function i() {
8
- return {
9
- dropEffect: "move",
10
- effectAllowed: "move",
11
- getData: () => "",
12
- setData() {},
13
- setDragImage() {}
14
- };
15
- }
16
- function a(e) {
17
- let t = e.getBoundingClientRect(), n = e.ownerDocument.createElement("div");
18
- return n.setAttribute("aria-hidden", "true"), n.setAttribute("data-dnd-touch-preview", ""), n.setAttribute("inert", ""), Object.assign(n.style, {
19
- background: "transparent",
20
- border: "2px solid currentColor",
21
- boxSizing: "border-box",
22
- height: `${t.height}px`,
23
- left: `${t.left}px`,
24
- opacity: "0.7",
25
- pointerEvents: "none",
26
- position: "fixed",
27
- top: `${t.top}px`,
28
- transition: "none",
29
- width: `${t.width}px`,
30
- zIndex: String(r)
31
- }), n;
32
- }
33
- function o(o, s) {
34
- let { activationDistance: c = 6, preview: l } = o;
35
- if (!Number.isFinite(c) || c < 0) throw new t("touch.activationDistance must be a non-negative finite number");
36
- let u = i(), d = /* @__PURE__ */ new Map(), f = null, p = null, m = () => {
37
- p?.preview?.remove(), f = null, p = null;
38
- }, h = e(() => {
39
- m(), d.clear();
40
- }), g = (e) => {
41
- let t = e.composedPath().find((e) => e.nodeType === 1) ?? e.target;
42
- return t && t.nodeType === 1 ? t : null;
43
- }, _ = (e, t) => {
44
- let n = e.source.style.display, r = e.preview?.style.display ?? "";
45
- e.source.style.display = "none", e.preview && (e.preview.style.display = "none");
46
- try {
47
- return e.source.ownerDocument.elementFromPoint(t.x, t.y);
48
- } finally {
49
- e.source.style.display = n, e.preview && (e.preview.style.display = r);
50
- }
51
- }, v = (e, t, n, r = !1) => {
52
- let i = new ((e.ownerDocument.defaultView?.Event) ?? Event)(t, {
53
- bubbles: !0,
54
- cancelable: !0
55
- });
56
- return Object.defineProperties(i, {
57
- __dndTouch: {
58
- configurable: !0,
59
- value: !0
60
- },
61
- __dndTouchPreview: {
62
- configurable: !0,
63
- value: r
64
- },
65
- clientX: {
66
- configurable: !0,
67
- value: n.x
68
- },
69
- clientY: {
70
- configurable: !0,
71
- value: n.y
72
- },
73
- dataTransfer: {
74
- configurable: !0,
75
- value: u
76
- }
77
- }), e.dispatchEvent(i), i.defaultPrevented;
78
- }, y = (e) => {
79
- if (l === !1) return null;
80
- let t;
81
- try {
82
- let n = l?.(e);
83
- t = l ? n?.cloneNode(!0) ?? null : a(e);
84
- } catch (e) {
85
- `${String(e)}`, t = null;
86
- }
87
- return t ? (t.setAttribute("aria-hidden", "true"), t.setAttribute("data-dnd-touch-preview", ""), t.setAttribute("inert", ""), t.removeAttribute("id"), t.querySelectorAll("[id]").forEach((e) => {
88
- e.removeAttribute("id");
89
- }), t.style.pointerEvents = "none", t.style.position = "fixed", t.style.zIndex = String(r), e.ownerDocument.body.appendChild(t), t) : null;
90
- }, b = (e) => {
91
- let t = f;
92
- if (f = null, !t) return;
93
- let n = y(t);
94
- p = {
95
- current: e.current,
96
- lastTarget: t,
97
- preview: n,
98
- previewOrigin: n ? e.current : null,
99
- source: t
100
- }, v(t, "dragstart", e.current, n !== null);
101
- }, x = (e) => {
102
- if (!p) return;
103
- if (p.current = e.current, p.preview && p.previewOrigin) {
104
- let t = e.current.x - p.previewOrigin.x, n = e.current.y - p.previewOrigin.y;
105
- p.preview.style.transform = `translate3d(${t}px, ${n}px, 0)`;
106
- }
107
- let t = _(p, e.current);
108
- t && t !== p.lastTarget && (p.lastTarget && v(p.lastTarget, "dragleave", e.current), p.lastTarget = t), t && v(t, "dragover", e.current), e.event.preventDefault();
109
- }, S = (e) => {
110
- if (f = null, !p) return;
111
- let t = p;
112
- try {
113
- let n = !1;
114
- if (e.reason === "release") {
115
- let r = _(t, e.current);
116
- r && (n = v(r, "drop", e.current));
117
- }
118
- u.dropEffect = n ? "move" : "none", v(t.source, "dragend", e.current, t.preview !== null);
119
- } finally {
120
- u.dropEffect = "move", m();
121
- }
122
- };
123
- return Object.assign(h, {
124
- cancel() {
125
- for (let e of d.values()) if (e.cancel()) return !0;
126
- return !1;
127
- },
128
- register(e) {
129
- let t = n(e, {
130
- activationDistance: c,
131
- onEnd: S,
132
- onMove: x,
133
- onStart: b,
134
- pointerCapture: !1,
135
- shouldStart: (e) => {
136
- if (e.pointerType !== "touch" || p) return !1;
137
- let t = g(e);
138
- return f = t ? s(t) : null, f !== null;
139
- },
140
- signal: h.disposalSignal
141
- });
142
- return d.set(e, t), () => {
143
- t.dispose(), d.delete(e), f && e.contains(f) && (f = null), p && e.contains(p.source) && m();
144
- };
145
- }
146
- });
147
- }
148
- //#endregion
149
- export { o as createScopeTouchController };
150
-
1
+ import"./_dev.js";import{createDisposable as e}from"./_shared.js";import{DndError as t}from"./errors.js";import{createDragGesture as n}from"@vielzeug/gesture";var r=2147483647;function makeDataTransfer(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function createDefaultPreview(e){let t=e.getBoundingClientRect(),n=e.ownerDocument.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(r)}),n}function createScopeTouchController(i,a){let{activationDistance:o=6,preview:s}=i;if(!Number.isFinite(o)||o<0)throw new t(`touch.activationDistance must be a non-negative finite number`);let c=makeDataTransfer(),l=new Map,u=null,d=null,resetSession=()=>{d?.preview?.remove(),u=null,d=null},f=e(()=>{resetSession(),l.clear()}),eventTarget=e=>{let t=e.composedPath().find(e=>e.nodeType===1)??e.target;return t&&t.nodeType===1?t:null},elementBelow=(e,t)=>{let n=e.source.style.display,r=e.preview?.style.display??``;e.source.style.display=`none`,e.preview&&(e.preview.style.display=`none`);try{return e.source.ownerDocument.elementFromPoint(t.x,t.y)}finally{e.source.style.display=n,e.preview&&(e.preview.style.display=r)}},dispatch=(e,t,n,r=!1)=>{let i=new((e.ownerDocument.defaultView?.Event)??Event)(t,{bubbles:!0,cancelable:!0});return Object.defineProperties(i,{__dndTouch:{configurable:!0,value:!0},__dndTouchPreview:{configurable:!0,value:r},clientX:{configurable:!0,value:n.x},clientY:{configurable:!0,value:n.y},dataTransfer:{configurable:!0,value:c}}),e.dispatchEvent(i),i.defaultPrevented},renderPreview=e=>{if(s===!1)return null;let t;try{let n=s?.(e);t=s?n?.cloneNode(!0)??null:createDefaultPreview(e)}catch(e){`${String(e)}`,t=null}return t?(t.setAttribute(`aria-hidden`,`true`),t.setAttribute(`data-dnd-touch-preview`,``),t.setAttribute(`inert`,``),t.removeAttribute(`id`),t.querySelectorAll(`[id]`).forEach(e=>{e.removeAttribute(`id`)}),t.style.pointerEvents=`none`,t.style.position=`fixed`,t.style.zIndex=String(r),e.ownerDocument.body.appendChild(t),t):null},start=e=>{let t=u;if(u=null,!t)return;let n=renderPreview(t);d={current:e.current,lastTarget:t,preview:n,previewOrigin:n?e.current:null,source:t},dispatch(t,`dragstart`,e.current,n!==null)},move=e=>{if(!d)return;if(d.current=e.current,d.preview&&d.previewOrigin){let t=e.current.x-d.previewOrigin.x,n=e.current.y-d.previewOrigin.y;d.preview.style.transform=`translate3d(${t}px, ${n}px, 0)`}let t=elementBelow(d,e.current);t&&t!==d.lastTarget&&(d.lastTarget&&dispatch(d.lastTarget,`dragleave`,e.current),d.lastTarget=t),t&&dispatch(t,`dragover`,e.current),e.event.preventDefault()},end=e=>{if(u=null,!d)return;let t=d;try{let n=!1;if(e.reason===`release`){let r=elementBelow(t,e.current);r&&(n=dispatch(r,`drop`,e.current))}c.dropEffect=n?`move`:`none`,dispatch(t.source,`dragend`,e.current,t.preview!==null)}finally{c.dropEffect=`move`,resetSession()}};return Object.assign(f,{cancel(){for(let e of l.values())if(e.cancel())return!0;return!1},register(e){let t=n(e,{activationDistance:o,onEnd:end,onMove:move,onStart:start,pointerCapture:!1,shouldStart:e=>{if(e.pointerType!==`touch`||d)return!1;let t=eventTarget(e);return u=t?a(t):null,u!==null},signal:f.disposalSignal});return l.set(e,t),()=>{t.dispose(),l.delete(e),u&&e.contains(u)&&(u=null),d&&e.contains(d.source)&&resetSession()}}})}export{createScopeTouchController};
151
2
  //# sourceMappingURL=_touch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_touch.js","names":[],"sources":["../src/_touch.ts"],"sourcesContent":["import { createDragGesture, type DragGesture, type DragGestureDetail } from '@vielzeug/gesture';\n\nimport { warn } from './_dev.js';\nimport { createDisposable } from './_shared.js';\nimport { DndError } from './errors.js';\nimport type { Disposable } from './types.js';\n\nexport type TouchInputOptions = Readonly<{\n /** Finger movement in pixels required before sorting starts. @default 6 */\n activationDistance?: number;\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 interface ScopeTouchController extends Disposable {\n cancel(): boolean;\n register(element: HTMLElement): () => void;\n}\n\nconst PREVIEW_Z_INDEX = 2147483647;\n\ntype TouchDragSession = {\n current: DragGestureDetail['current'];\n lastTarget: Element | null;\n preview: HTMLElement | null;\n previewOrigin: DragGestureDetail['current'] | null;\n source: HTMLElement;\n};\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 = source.ownerDocument.createElement('div');\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 return preview;\n}\n\nexport function createScopeTouchController(\n options: TouchInputOptions,\n resolveDragTarget: (target: Element) => HTMLElement | null,\n): ScopeTouchController {\n const { activationDistance = 6, preview: previewOption } = options;\n if (!Number.isFinite(activationDistance) || activationDistance < 0) {\n throw new DndError('touch.activationDistance must be a non-negative finite number');\n }\n\n const dataTransfer = makeDataTransfer();\n const gestures = new Map<HTMLElement, DragGesture>();\n let pendingSource: HTMLElement | null = null;\n let session: TouchDragSession | null = null;\n\n const resetSession = (): void => {\n session?.preview?.remove();\n pendingSource = null;\n session = null;\n };\n const disposable = createDisposable(() => {\n resetSession();\n gestures.clear();\n });\n\n const eventTarget = (event: PointerEvent): Element | null => {\n const target = event.composedPath().find((node) => (node as Node).nodeType === 1) ?? event.target;\n return target && (target as Node).nodeType === 1 ? (target as Element) : null;\n };\n\n const elementBelow = (active: TouchDragSession, point: DragGestureDetail['current']): Element | null => {\n const previousSourceDisplay = active.source.style.display;\n const previousPreviewDisplay = active.preview?.style.display ?? '';\n active.source.style.display = 'none';\n if (active.preview) active.preview.style.display = 'none';\n try {\n return active.source.ownerDocument.elementFromPoint(point.x, point.y);\n } finally {\n active.source.style.display = previousSourceDisplay;\n if (active.preview) active.preview.style.display = previousPreviewDisplay;\n }\n };\n\n const dispatch = (\n element: Element,\n type: string,\n point: DragGestureDetail['current'],\n hasPreview = false,\n ): boolean => {\n const EventType = element.ownerDocument.defaultView?.Event ?? Event;\n const event = new EventType(type, { bubbles: true, cancelable: true });\n Object.defineProperties(event, {\n __dndTouch: { configurable: true, value: true },\n __dndTouchPreview: { configurable: true, value: hasPreview },\n clientX: { configurable: true, value: point.x },\n clientY: { configurable: true, value: point.y },\n dataTransfer: { configurable: true, value: dataTransfer },\n });\n element.dispatchEvent(event);\n return event.defaultPrevented;\n };\n\n const renderPreview = (source: HTMLElement): HTMLElement | null => {\n if (previewOption === false) return null;\n let previewElement: HTMLElement | null;\n try {\n const preview = previewOption?.(source);\n previewElement = previewOption\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 previewElement = null;\n }\n if (!previewElement) return null;\n\n previewElement.setAttribute('aria-hidden', 'true');\n previewElement.setAttribute('data-dnd-touch-preview', '');\n previewElement.setAttribute('inert', '');\n previewElement.removeAttribute('id');\n previewElement.querySelectorAll('[id]').forEach((element) => {\n element.removeAttribute('id');\n });\n previewElement.style.pointerEvents = 'none';\n previewElement.style.position = 'fixed';\n previewElement.style.zIndex = String(PREVIEW_Z_INDEX);\n source.ownerDocument.body.appendChild(previewElement);\n return previewElement;\n };\n\n const start = (detail: DragGestureDetail): void => {\n const source = pendingSource;\n pendingSource = null;\n if (!source) return;\n\n const preview = renderPreview(source);\n const active: TouchDragSession = {\n current: detail.current,\n lastTarget: source,\n preview,\n previewOrigin: preview ? detail.current : null,\n source,\n };\n session = active;\n dispatch(source, 'dragstart', detail.current, preview !== null);\n };\n\n const move = (detail: DragGestureDetail): void => {\n if (!session) return;\n session.current = detail.current;\n if (session.preview && session.previewOrigin) {\n const x = detail.current.x - session.previewOrigin.x;\n const y = detail.current.y - session.previewOrigin.y;\n session.preview.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n }\n\n const below = elementBelow(session, detail.current);\n if (below && below !== session.lastTarget) {\n if (session.lastTarget) dispatch(session.lastTarget, 'dragleave', detail.current);\n session.lastTarget = below;\n }\n if (below) dispatch(below, 'dragover', detail.current);\n detail.event.preventDefault();\n };\n\n const end = (detail: DragGestureDetail & Readonly<{ reason: 'cancel' | 'release' }>): void => {\n pendingSource = null;\n if (!session) return;\n const active = session;\n try {\n let dropAccepted = false;\n if (detail.reason === 'release') {\n const below = elementBelow(active, detail.current);\n if (below) dropAccepted = dispatch(below, 'drop', detail.current);\n }\n dataTransfer.dropEffect = dropAccepted ? 'move' : 'none';\n dispatch(active.source, 'dragend', detail.current, active.preview !== null);\n } finally {\n dataTransfer.dropEffect = 'move';\n resetSession();\n }\n };\n\n return Object.assign(disposable, {\n cancel(): boolean {\n for (const gesture of gestures.values()) {\n if (gesture.cancel()) return true;\n }\n return false;\n },\n register(element: HTMLElement): () => void {\n const gesture = createDragGesture(element, {\n activationDistance,\n onEnd: end,\n onMove: move,\n onStart: start,\n pointerCapture: false,\n shouldStart: (event) => {\n if (event.pointerType !== 'touch' || session) return false;\n const target = eventTarget(event);\n pendingSource = target ? resolveDragTarget(target) : null;\n return pendingSource !== null;\n },\n signal: disposable.disposalSignal,\n });\n gestures.set(element, gesture);\n\n return () => {\n gesture.dispose();\n gestures.delete(element);\n if (pendingSource && element.contains(pendingSource)) pendingSource = null;\n if (session && element.contains(session.source)) resetSession();\n };\n },\n });\n}\n"],"mappings":";;;;;AAuBA,IAAM,IAAkB;AAUxB,SAAS,IAAiC;CACxC,OAAO;EACL,YAAY;EACZ,eAAe;EACf,eAAe;EACf,UAAU,CAAC;EACX,eAAe,CAAC;CAClB;AACF;AAEA,SAAS,EAAqB,GAAkC;CAC9D,IAAM,IAAO,EAAO,sBAAsB,GACpC,IAAU,EAAO,cAAc,cAAc,KAAK;CAkBxD,OAjBA,EAAQ,aAAa,eAAe,MAAM,GAC1C,EAAQ,aAAa,0BAA0B,EAAE,GACjD,EAAQ,aAAa,SAAS,EAAE,GAChC,OAAO,OAAO,EAAQ,OAAO;EAC3B,YAAY;EACZ,QAAQ;EACR,WAAW;EACX,QAAQ,GAAG,EAAK,OAAO;EACvB,MAAM,GAAG,EAAK,KAAK;EACnB,SAAS;EACT,eAAe;EACf,UAAU;EACV,KAAK,GAAG,EAAK,IAAI;EACjB,YAAY;EACZ,OAAO,GAAG,EAAK,MAAM;EACrB,QAAQ,OAAO,CAAe;CAChC,CAAC,GACM;AACT;AAEA,SAAgB,EACd,GACA,GACsB;CACtB,IAAM,EAAE,wBAAqB,GAAG,SAAS,MAAkB;CAC3D,IAAI,CAAC,OAAO,SAAS,CAAkB,KAAK,IAAqB,GAC/D,MAAM,IAAI,EAAS,+DAA+D;CAGpF,IAAM,IAAe,EAAiB,GAChC,oBAAW,IAAI,IAA8B,GAC/C,IAAoC,MACpC,IAAmC,MAEjC,UAA2B;EAG/B,AAFA,GAAS,SAAS,OAAO,GACzB,IAAgB,MAChB,IAAU;CACZ,GACM,IAAa,QAAuB;EAExC,AADA,EAAa,GACb,EAAS,MAAM;CACjB,CAAC,GAEK,KAAe,MAAwC;EAC3D,IAAM,IAAS,EAAM,aAAa,CAAC,CAAC,MAAM,MAAU,EAAc,aAAa,CAAC,KAAK,EAAM;EAC3F,OAAO,KAAW,EAAgB,aAAa,IAAK,IAAqB;CAC3E,GAEM,KAAgB,GAA0B,MAAwD;EACtG,IAAM,IAAwB,EAAO,OAAO,MAAM,SAC5C,IAAyB,EAAO,SAAS,MAAM,WAAW;EAEhE,AADA,EAAO,OAAO,MAAM,UAAU,QAC1B,EAAO,YAAS,EAAO,QAAQ,MAAM,UAAU;EACnD,IAAI;GACF,OAAO,EAAO,OAAO,cAAc,iBAAiB,EAAM,GAAG,EAAM,CAAC;EACtE,UAAU;GAER,AADA,EAAO,OAAO,MAAM,UAAU,GAC1B,EAAO,YAAS,EAAO,QAAQ,MAAM,UAAU;EACrD;CACF,GAEM,KACJ,GACA,GACA,GACA,IAAa,OACD;EAEZ,IAAM,IAAQ,MADI,EAAQ,cAAc,aAAa,UAAS,OAClC,GAAM;GAAE,SAAS;GAAM,YAAY;EAAK,CAAC;EASrE,OARA,OAAO,iBAAiB,GAAO;GAC7B,YAAY;IAAE,cAAc;IAAM,OAAO;GAAK;GAC9C,mBAAmB;IAAE,cAAc;IAAM,OAAO;GAAW;GAC3D,SAAS;IAAE,cAAc;IAAM,OAAO,EAAM;GAAE;GAC9C,SAAS;IAAE,cAAc;IAAM,OAAO,EAAM;GAAE;GAC9C,cAAc;IAAE,cAAc;IAAM,OAAO;GAAa;EAC1D,CAAC,GACD,EAAQ,cAAc,CAAK,GACpB,EAAM;CACf,GAEM,KAAiB,MAA4C;EACjE,IAAI,MAAkB,IAAO,OAAO;EACpC,IAAI;EACJ,IAAI;GACF,IAAM,IAAU,IAAgB,CAAM;GACtC,IAAiB,IACX,GAAS,UAAU,EAAI,KAAiC,OAC1D,EAAqB,CAAM;EACjC,SAAS,GAAO;GAEd,AADK,GAAgE,OAAO,CAAK,EAA5E,GACL,IAAiB;EACnB;EAcA,OAbK,KAEL,EAAe,aAAa,eAAe,MAAM,GACjD,EAAe,aAAa,0BAA0B,EAAE,GACxD,EAAe,aAAa,SAAS,EAAE,GACvC,EAAe,gBAAgB,IAAI,GACnC,EAAe,iBAAiB,MAAM,CAAC,CAAC,SAAS,MAAY;GAC3D,EAAQ,gBAAgB,IAAI;EAC9B,CAAC,GACD,EAAe,MAAM,gBAAgB,QACrC,EAAe,MAAM,WAAW,SAChC,EAAe,MAAM,SAAS,OAAO,CAAe,GACpD,EAAO,cAAc,KAAK,YAAY,CAAc,GAC7C,KAbqB;CAc9B,GAEM,KAAS,MAAoC;EACjD,IAAM,IAAS;EAEf,IADA,IAAgB,MACZ,CAAC,GAAQ;EAEb,IAAM,IAAU,EAAc,CAAM;EASpC,AADA,IAAU;GANR,SAAS,EAAO;GAChB,YAAY;GACZ;GACA,eAAe,IAAU,EAAO,UAAU;GAC1C;EAEQ,GACV,EAAS,GAAQ,aAAa,EAAO,SAAS,MAAY,IAAI;CAChE,GAEM,KAAQ,MAAoC;EAChD,IAAI,CAAC,GAAS;EAEd,IADA,EAAQ,UAAU,EAAO,SACrB,EAAQ,WAAW,EAAQ,eAAe;GAC5C,IAAM,IAAI,EAAO,QAAQ,IAAI,EAAQ,cAAc,GAC7C,IAAI,EAAO,QAAQ,IAAI,EAAQ,cAAc;GACnD,EAAQ,QAAQ,MAAM,YAAY,eAAe,EAAE,MAAM,EAAE;EAC7D;EAEA,IAAM,IAAQ,EAAa,GAAS,EAAO,OAAO;EAMlD,AALI,KAAS,MAAU,EAAQ,eACzB,EAAQ,cAAY,EAAS,EAAQ,YAAY,aAAa,EAAO,OAAO,GAChF,EAAQ,aAAa,IAEnB,KAAO,EAAS,GAAO,YAAY,EAAO,OAAO,GACrD,EAAO,MAAM,eAAe;CAC9B,GAEM,KAAO,MAAiF;EAE5F,IADA,IAAgB,MACZ,CAAC,GAAS;EACd,IAAM,IAAS;EACf,IAAI;GACF,IAAI,IAAe;GACnB,IAAI,EAAO,WAAW,WAAW;IAC/B,IAAM,IAAQ,EAAa,GAAQ,EAAO,OAAO;IACjD,AAAI,MAAO,IAAe,EAAS,GAAO,QAAQ,EAAO,OAAO;GAClE;GAEA,AADA,EAAa,aAAa,IAAe,SAAS,QAClD,EAAS,EAAO,QAAQ,WAAW,EAAO,SAAS,EAAO,YAAY,IAAI;EAC5E,UAAU;GAER,AADA,EAAa,aAAa,QAC1B,EAAa;EACf;CACF;CAEA,OAAO,OAAO,OAAO,GAAY;EAC/B,SAAkB;GAChB,KAAK,IAAM,KAAW,EAAS,OAAO,GACpC,IAAI,EAAQ,OAAO,GAAG,OAAO;GAE/B,OAAO;EACT;EACA,SAAS,GAAkC;GACzC,IAAM,IAAU,EAAkB,GAAS;IACzC;IACA,OAAO;IACP,QAAQ;IACR,SAAS;IACT,gBAAgB;IAChB,cAAc,MAAU;KACtB,IAAI,EAAM,gBAAgB,WAAW,GAAS,OAAO;KACrD,IAAM,IAAS,EAAY,CAAK;KAEhC,OADA,IAAgB,IAAS,EAAkB,CAAM,IAAI,MAC9C,MAAkB;IAC3B;IACA,QAAQ,EAAW;GACrB,CAAC;GAGD,OAFA,EAAS,IAAI,GAAS,CAAO,SAEhB;IAIX,AAHA,EAAQ,QAAQ,GAChB,EAAS,OAAO,CAAO,GACnB,KAAiB,EAAQ,SAAS,CAAa,MAAG,IAAgB,OAClE,KAAW,EAAQ,SAAS,EAAQ,MAAM,KAAG,EAAa;GAChE;EACF;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"_touch.js","names":[],"sources":["../src/_touch.ts"],"sourcesContent":["import { createDragGesture, type DragGesture, type DragGestureDetail } from '@vielzeug/gesture';\n\nimport { warn } from './_dev.js';\nimport { createDisposable } from './_shared.js';\nimport { DndError } from './errors.js';\nimport type { Disposable } from './types.js';\n\nexport type TouchInputOptions = Readonly<{\n /** Finger movement in pixels required before sorting starts. @default 6 */\n activationDistance?: number;\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 interface ScopeTouchController extends Disposable {\n cancel(): boolean;\n register(element: HTMLElement): () => void;\n}\n\nconst PREVIEW_Z_INDEX = 2147483647;\n\ntype TouchDragSession = {\n current: DragGestureDetail['current'];\n lastTarget: Element | null;\n preview: HTMLElement | null;\n previewOrigin: DragGestureDetail['current'] | null;\n source: HTMLElement;\n};\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 = source.ownerDocument.createElement('div');\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 return preview;\n}\n\nexport function createScopeTouchController(\n options: TouchInputOptions,\n resolveDragTarget: (target: Element) => HTMLElement | null,\n): ScopeTouchController {\n const { activationDistance = 6, preview: previewOption } = options;\n if (!Number.isFinite(activationDistance) || activationDistance < 0) {\n throw new DndError('touch.activationDistance must be a non-negative finite number');\n }\n\n const dataTransfer = makeDataTransfer();\n const gestures = new Map<HTMLElement, DragGesture>();\n let pendingSource: HTMLElement | null = null;\n let session: TouchDragSession | null = null;\n\n const resetSession = (): void => {\n session?.preview?.remove();\n pendingSource = null;\n session = null;\n };\n const disposable = createDisposable(() => {\n resetSession();\n gestures.clear();\n });\n\n const eventTarget = (event: PointerEvent): Element | null => {\n const target = event.composedPath().find((node) => (node as Node).nodeType === 1) ?? event.target;\n return target && (target as Node).nodeType === 1 ? (target as Element) : null;\n };\n\n const elementBelow = (active: TouchDragSession, point: DragGestureDetail['current']): Element | null => {\n const previousSourceDisplay = active.source.style.display;\n const previousPreviewDisplay = active.preview?.style.display ?? '';\n active.source.style.display = 'none';\n if (active.preview) active.preview.style.display = 'none';\n try {\n return active.source.ownerDocument.elementFromPoint(point.x, point.y);\n } finally {\n active.source.style.display = previousSourceDisplay;\n if (active.preview) active.preview.style.display = previousPreviewDisplay;\n }\n };\n\n const dispatch = (\n element: Element,\n type: string,\n point: DragGestureDetail['current'],\n hasPreview = false,\n ): boolean => {\n const EventType = element.ownerDocument.defaultView?.Event ?? Event;\n const event = new EventType(type, { bubbles: true, cancelable: true });\n Object.defineProperties(event, {\n __dndTouch: { configurable: true, value: true },\n __dndTouchPreview: { configurable: true, value: hasPreview },\n clientX: { configurable: true, value: point.x },\n clientY: { configurable: true, value: point.y },\n dataTransfer: { configurable: true, value: dataTransfer },\n });\n element.dispatchEvent(event);\n return event.defaultPrevented;\n };\n\n const renderPreview = (source: HTMLElement): HTMLElement | null => {\n if (previewOption === false) return null;\n let previewElement: HTMLElement | null;\n try {\n const preview = previewOption?.(source);\n previewElement = previewOption\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 previewElement = null;\n }\n if (!previewElement) return null;\n\n previewElement.setAttribute('aria-hidden', 'true');\n previewElement.setAttribute('data-dnd-touch-preview', '');\n previewElement.setAttribute('inert', '');\n previewElement.removeAttribute('id');\n previewElement.querySelectorAll('[id]').forEach((element) => {\n element.removeAttribute('id');\n });\n previewElement.style.pointerEvents = 'none';\n previewElement.style.position = 'fixed';\n previewElement.style.zIndex = String(PREVIEW_Z_INDEX);\n source.ownerDocument.body.appendChild(previewElement);\n return previewElement;\n };\n\n const start = (detail: DragGestureDetail): void => {\n const source = pendingSource;\n pendingSource = null;\n if (!source) return;\n\n const preview = renderPreview(source);\n const active: TouchDragSession = {\n current: detail.current,\n lastTarget: source,\n preview,\n previewOrigin: preview ? detail.current : null,\n source,\n };\n session = active;\n dispatch(source, 'dragstart', detail.current, preview !== null);\n };\n\n const move = (detail: DragGestureDetail): void => {\n if (!session) return;\n session.current = detail.current;\n if (session.preview && session.previewOrigin) {\n const x = detail.current.x - session.previewOrigin.x;\n const y = detail.current.y - session.previewOrigin.y;\n session.preview.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n }\n\n const below = elementBelow(session, detail.current);\n if (below && below !== session.lastTarget) {\n if (session.lastTarget) dispatch(session.lastTarget, 'dragleave', detail.current);\n session.lastTarget = below;\n }\n if (below) dispatch(below, 'dragover', detail.current);\n detail.event.preventDefault();\n };\n\n const end = (detail: DragGestureDetail & Readonly<{ reason: 'cancel' | 'release' }>): void => {\n pendingSource = null;\n if (!session) return;\n const active = session;\n try {\n let dropAccepted = false;\n if (detail.reason === 'release') {\n const below = elementBelow(active, detail.current);\n if (below) dropAccepted = dispatch(below, 'drop', detail.current);\n }\n dataTransfer.dropEffect = dropAccepted ? 'move' : 'none';\n dispatch(active.source, 'dragend', detail.current, active.preview !== null);\n } finally {\n dataTransfer.dropEffect = 'move';\n resetSession();\n }\n };\n\n return Object.assign(disposable, {\n cancel(): boolean {\n for (const gesture of gestures.values()) {\n if (gesture.cancel()) return true;\n }\n return false;\n },\n register(element: HTMLElement): () => void {\n const gesture = createDragGesture(element, {\n activationDistance,\n onEnd: end,\n onMove: move,\n onStart: start,\n pointerCapture: false,\n shouldStart: (event) => {\n if (event.pointerType !== 'touch' || session) return false;\n const target = eventTarget(event);\n pendingSource = target ? resolveDragTarget(target) : null;\n return pendingSource !== null;\n },\n signal: disposable.disposalSignal,\n });\n gestures.set(element, gesture);\n\n return () => {\n gesture.dispose();\n gestures.delete(element);\n if (pendingSource && element.contains(pendingSource)) pendingSource = null;\n if (session && element.contains(session.source)) resetSession();\n };\n },\n });\n}\n"],"mappings":"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"}
package/dist/dnd.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@vielzeug/gesture");function t(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 n(e){return e===!0}var r=class extends Error{static errorName=`DndError`;constructor(e,t){super(e,t),this.name=new.target.errorName,Object.setPrototypeOf(this,new.target.prototype)}},i=class extends r{static errorName=`DndScopeError`;constructor(e=`Invalid scope — use createSortableScope() to create scopes.`){super(e)}};function a(e,t){return!t.length||t.some(t=>{let n=t.trim().toLowerCase(),r=e.type.toLowerCase();return n?n.startsWith(`.`)?e.name.toLowerCase().endsWith(n):n.endsWith(`/*`)?r.startsWith(n.slice(0,-1)):r===n:!1})}function o(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 s(e,t,n){let r=[],i=[];for(let n of e)(a(n,t)?r:i).push(n);return n!==void 0&&r.length>n&&i.push(...r.splice(n)),{accepted:r,rejected:i}}function c(e){return e.map(e=>{let t=e.trim().toLowerCase(),n=/^\.[a-z0-9][a-z0-9._+-]*$/.test(t),i=/^[a-z0-9!#$&^_.+-]+\/(?:\*|[a-z0-9!#$&^_.+-]+)$/.test(t);if(!n&&!i)throw new r(`Invalid accept pattern: "${e}"`);return t})}function l(e,t,...n){if(t)try{t(...n)}catch{`${e}`}}function u(e){let i=c(e.accept??[]);if(e.maxFiles!==void 0&&(!Number.isSafeInteger(e.maxFiles)||e.maxFiles<0))throw new r(`maxFiles must be a non-negative safe integer`);let{dropEffect:a=`copy`,element:u,maxFiles:d,onDrop:f,onDropRejected:p,onHoverChange:m,onValidatingChange:h}=e,g=0,_=!1,v=!1,y=new Set,b=e=>{v!==e&&(v=e,l(`onValidatingChange`,h,e))},x=e=>{let t=g>0&&_;g=Math.max(0,e),g===0&&(_=!1);let n=g>0&&_;n!==t&&l(`onHoverChange`,m,n)},S=()=>{x(0)},C=t(()=>{for(let e of y)e.abort();y.clear(),b(!1),S()}),w=(e,t)=>{e.length>0&&l(`onDrop`,f,[...e]),t.length>0&&l(`onDropRejected`,p,[...t])},T=(t,n)=>{t.length>0&&(e.onPaste?l(`onPaste`,e.onPaste,[...t]):l(`onDrop`,f,[...t])),n.length>0&&l(`onDropRejected`,p,[...n])},E=(t,n)=>{let{accepted:r,rejected:a}=s(t,i,d),o=e.onValidate,c=o&&r.length>0?new AbortController:null;c&&(y.add(c),b(!0));let l=()=>{c&&(y.delete(c),C.disposed||b(y.size>0))},u;try{u=c&&o?o([...r],{signal:c.signal}):!0}catch(e){u=Promise.reject(e)}Promise.resolve(u).then(e=>{l(),!C.disposed&&(e===!0?n(r,a):n([],[...a,...r]))},()=>{l(),!C.disposed&&n([],[...a,...r])})};return u.addEventListener(`dragenter`,t=>{if(!n(e.disabled)){if(t.preventDefault(),g===0){let e=t.dataTransfer?.items;_=!i.length||!e?.length||o(e,i)}!_&&t.dataTransfer&&(t.dataTransfer.dropEffect=`none`),x(g+1)}},{signal:C.disposalSignal}),u.addEventListener(`dragover`,t=>{n(e.disabled)||(t.preventDefault(),t.dataTransfer&&(t.dataTransfer.dropEffect=_?a:`none`))},{signal:C.disposalSignal}),u.addEventListener(`dragleave`,e=>{x(g-1)},{signal:C.disposalSignal}),u.addEventListener(`drop`,t=>{if(S(),n(e.disabled))return;t.preventDefault();let r=t.dataTransfer?.files;r&&E(Array.from(r),w)},{signal:C.disposalSignal}),e.paste&&u.addEventListener(`paste`,t=>{if(n(e.disabled))return;let r=t.clipboardData?.files;r?.length&&(t.preventDefault(),E(Array.from(r),T))},{signal:C.disposalSignal}),window.addEventListener(`dragend`,S,{signal:C.disposalSignal}),window.addEventListener(`drop`,S,{signal:C.disposalSignal}),{get disposalSignal(){return C.disposalSignal},dispose:C.dispose,get disposed(){return C.disposed},get hovered(){return g>0&&_},[Symbol.dispose]:C[Symbol.dispose],get validating(){return v}}}var d=2147483647;function f(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function p(e){let t=e.getBoundingClientRect(),n=e.ownerDocument.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(d)}),n}function m(n,i){let{activationDistance:a=6,preview:o}=n;if(!Number.isFinite(a)||a<0)throw new r(`touch.activationDistance must be a non-negative finite number`);let s=f(),c=new Map,l=null,u=null,m=()=>{u?.preview?.remove(),l=null,u=null},h=t(()=>{m(),c.clear()}),g=e=>{let t=e.composedPath().find(e=>e.nodeType===1)??e.target;return t&&t.nodeType===1?t:null},_=(e,t)=>{let n=e.source.style.display,r=e.preview?.style.display??``;e.source.style.display=`none`,e.preview&&(e.preview.style.display=`none`);try{return e.source.ownerDocument.elementFromPoint(t.x,t.y)}finally{e.source.style.display=n,e.preview&&(e.preview.style.display=r)}},v=(e,t,n,r=!1)=>{let i=new((e.ownerDocument.defaultView?.Event)??Event)(t,{bubbles:!0,cancelable:!0});return Object.defineProperties(i,{__dndTouch:{configurable:!0,value:!0},__dndTouchPreview:{configurable:!0,value:r},clientX:{configurable:!0,value:n.x},clientY:{configurable:!0,value:n.y},dataTransfer:{configurable:!0,value:s}}),e.dispatchEvent(i),i.defaultPrevented},y=e=>{if(o===!1)return null;let t;try{let n=o?.(e);t=o?n?.cloneNode(!0)??null:p(e)}catch(e){`${String(e)}`,t=null}return t?(t.setAttribute(`aria-hidden`,`true`),t.setAttribute(`data-dnd-touch-preview`,``),t.setAttribute(`inert`,``),t.removeAttribute(`id`),t.querySelectorAll(`[id]`).forEach(e=>{e.removeAttribute(`id`)}),t.style.pointerEvents=`none`,t.style.position=`fixed`,t.style.zIndex=String(d),e.ownerDocument.body.appendChild(t),t):null},b=e=>{let t=l;if(l=null,!t)return;let n=y(t);u={current:e.current,lastTarget:t,preview:n,previewOrigin:n?e.current:null,source:t},v(t,`dragstart`,e.current,n!==null)},x=e=>{if(!u)return;if(u.current=e.current,u.preview&&u.previewOrigin){let t=e.current.x-u.previewOrigin.x,n=e.current.y-u.previewOrigin.y;u.preview.style.transform=`translate3d(${t}px, ${n}px, 0)`}let t=_(u,e.current);t&&t!==u.lastTarget&&(u.lastTarget&&v(u.lastTarget,`dragleave`,e.current),u.lastTarget=t),t&&v(t,`dragover`,e.current),e.event.preventDefault()},S=e=>{if(l=null,!u)return;let t=u;try{let n=!1;if(e.reason===`release`){let r=_(t,e.current);r&&(n=v(r,`drop`,e.current))}s.dropEffect=n?`move`:`none`,v(t.source,`dragend`,e.current,t.preview!==null)}finally{s.dropEffect=`move`,m()}};return Object.assign(h,{cancel(){for(let e of c.values())if(e.cancel())return!0;return!1},register(t){let n=(0,e.createDragGesture)(t,{activationDistance:a,onEnd:S,onMove:x,onStart:b,pointerCapture:!1,shouldStart:e=>{if(e.pointerType!==`touch`||u)return!1;let t=g(e);return l=t?i(t):null,l!==null},signal:h.disposalSignal});return c.set(t,n),()=>{n.dispose(),c.delete(t),l&&t.contains(l)&&(l=null),u&&t.contains(u.source)&&m()}}})}var h=Symbol(`SortableScope`),g=`data-dnd-handle`,_=`data-dnd-item`,v=new WeakMap,y={container:!0,edgeThreshold:32,speed:18,viewport:!1};function b(e){let t=v.get(e);if(!t)throw new i;if(e.disposed)throw new i(`Cannot register a sortable with a disposed scope.`);return t}function x(e){if(e===!1)return null;if(e===!0||e===void 0)return y;if(!Number.isFinite(e.edgeThreshold??32)||(e.edgeThreshold??32)<0||!Number.isFinite(e.speed??18)||(e.speed??18)<=0)throw new r(`Auto-scroll edgeThreshold must be non-negative and speed must be positive`);return{container:e.container??!0,edgeThreshold:e.edgeThreshold??32,speed:e.speed??18,viewport:e.viewport??!1}}function S(e,t){return t.length!==e.length||t.some((t,n)=>t!==e[n])}function C(e){return e.__dndTouch===!0}function w(e){return Object.freeze([...e])}function T(e,t,...n){if(t)try{t(...n)}catch{`${e}`}}function E(e){typeof requestAnimationFrame==`function`&&(e.hideFrame=requestAnimationFrame(()=>{e.hideFrame=null,e.draggedEl.style.display=`none`}))}function D(e){e.hideFrame!==null&&(cancelAnimationFrame(e.hideFrame),e.hideFrame=null)}function O(e){D(e),e.draggedEl.style.display=e.originalDisplay,e.draggedEl.removeAttribute(`data-dragging`)}function k(e,t){e.initialOrders.has(t)||e.initialOrders.set(t,t.getOrderedIds())}function A(e){let t=e.target;return[...e.initialOrders].flatMap(([n,r])=>{let i=r.filter(t=>t!==e.draggedId);if(n===t&&e.placeholder.parentElement===n.element){let t=[...n.element.children],r=t.indexOf(e.placeholder),a=n.getOrderedItems().filter(n=>n!==e.draggedEl&&t.indexOf(n)<r).length;i.splice(a,0,e.draggedId)}return S(r,i)?[{after:i,before:r,handle:n}]:[]})}function j(e,t){let n=e.active;n&&(O(n),n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling?.parentNode===n.originalParent?n.originalNextSibling:null),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t),n.source.notifyInteraction({index:n.source.getOrderedIds().indexOf(n.draggedId),itemId:n.draggedId,total:n.source.getOrderedIds().length,type:`cancel`}))}function M(e,t){let n=e.active;if(!n)return;let r=n.target,i=n.placeholder.parentElement,a=A(n);for(let{after:e,before:t,handle:n}of a)n.notifyBeforeReorder(w(t),w(e));O(n),r&&e.handles.has(r)&&i?i.insertBefore(n.draggedEl,n.placeholder):n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling?.parentNode===n.originalParent?n.originalNextSibling:null),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t);let o=[];for(let[t,r]of n.initialOrders){if(!e.handles.has(t))continue;let n=t.getOrderedIds();S(r,n)&&o.push({after:n,before:r,handle:t})}if(r&&r!==n.source){let t=o.find(e=>e.handle===n.source),i=o.find(e=>e.handle===r);if(t&&i){e.commitMove({itemId:n.draggedId,source:n.source.element,sourceBeforeIds:t.before,sourceIds:t.after,target:r.element,targetBeforeIds:i.before,targetIds:i.after});let a=i.after.indexOf(n.draggedId),o=i.after.length;n.source.notifyInteraction({index:a,itemId:n.draggedId,total:o,type:`drop`}),r.notifyInteraction({index:a,itemId:n.draggedId,total:o,type:`drop`})}return}for(let{after:e,before:t,handle:r}of o)r.commitReorder({after:e,before:t,item:n.draggedId});let s=o.find(e=>e.handle===n.source),c=s?s.after:n.source.getOrderedIds(),l=c.indexOf(n.draggedId);n.source.notifyInteraction({index:l,itemId:n.draggedId,total:c.length,type:`drop`})}function N(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()?j(e,t):M(e,t)}function P(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 F(e,t,n,r){let i=e.indexOf(t);if(i<0)return null;let a=r===`vertical`?n===`ArrowDown`:n===`ArrowRight`,o=r===`vertical`?n===`ArrowUp`:n===`ArrowLeft`,s;if(a)s=Math.min(e.length-1,i+1);else if(o)s=Math.max(0,i-1);else if(n===`Home`)s=0;else if(n===`End`)s=e.length-1;else return null;return s===i?null:s}function I(e={}){let n={active:null,commitMove(t){T(`onMove`,e.onMove,Object.freeze({...t,sourceBeforeIds:w(t.sourceBeforeIds),sourceIds:w(t.sourceIds),targetBeforeIds:w(t.targetBeforeIds),targetIds:w(t.targetIds)}))},disposables:new Set,handles:new Set,touch:null},r=t(()=>{n.touch?.dispose();for(let e of[...n.disposables])e();n.disposables.clear(),n.handles.clear()}),i={get disposalSignal(){return r.disposalSignal},dispose:r.dispose,get disposed(){return r.disposed},get isDragging(){return n.active!==null},[h]:!0,[Symbol.dispose]:r[Symbol.dispose]};return v.set(i,n),e.touch&&(n.touch=m(e.touch===!0?{}:e.touch,e=>{if(n.active)return null;for(let t of n.handles){let n=t.resolveTouchTarget(e);if(n)return n}return null})),i}function L(e){let{autoScroll:i=!0,axis:a=`vertical`,element:o,getKey:s,handle:c,keyboard:l=!0,placeholderClass:u=`dnd-placeholder`,scope:d=I()}=e;if(a!==`vertical`&&a!==`horizontal`)throw new r(`axis must be "vertical" or "horizontal"`);let f=c?.trim()||null;if((c===void 0||f)&&f)try{o.querySelector(f)}catch(e){throw new r(`Invalid handle selector: "${c}"`,{cause:e})}let p=x(i),m=b(d);if([...m.handles].some(e=>e.element===o))throw new r(`A sortable is already registered for this element in the selected scope.`);let h=()=>(e.items?e.items():Array.from(o.children)).filter(e=>e.parentElement===o&&e.hasAttribute(_)),v=()=>h().map(e=>s(e)),y=new Map,S=o.getAttribute(`role`),D=e=>{let t=y.get(e);if(t)return t;let n={dataDndHandle:e.getAttribute(g),dataDndItem:e.getAttribute(_),draggable:e.getAttribute(`draggable`),role:e.getAttribute(`role`),tabIndex:e.getAttribute(`tabindex`),touchAction:e.style.touchAction};return y.set(e,n),n},O=(e,t,n)=>{n===null?e.removeAttribute(t):e.setAttribute(t,n)},A=(e=h())=>{e.forEach(e=>{let t=D(e);t.role===null&&e.setAttribute(`role`,`listitem`),t.tabIndex===null&&(e.tabIndex=0),c===void 0?(e.setAttribute(`draggable`,`true`),m.touch&&(e.style.touchAction=`none`)):f&&e.querySelectorAll(f).forEach(e=>{D(e),e.setAttribute(g,``),e.setAttribute(`draggable`,`true`),m.touch&&(e.style.touchAction=`none`)})})},j=()=>{let t=new Set,n=e.items?e.items():Array.from(o.children),r=n.filter(e=>e instanceof HTMLElement&&e.parentElement===o),i=[];r.length,n.length;for(let e of r)try{let n=s(e);if(n){if(t.has(n)){`${n}`;continue}t.add(n),i.push(e)}}catch(e){`${String(e)}`}M();for(let e of i)D(e),e.setAttribute(_,``);A(i)},M=()=>{for(let[e,t]of y)O(e,g,t.dataDndHandle),O(e,_,t.dataDndItem),O(e,`draggable`,t.draggable),O(e,`role`,t.role),O(e,`tabindex`,t.tabIndex),e.style.touchAction=t.touchAction;y.clear()},L=e=>{let t=document.createElement(`div`);return t.className=u,t.setAttribute(`aria-hidden`,`true`),a===`horizontal`?t.style.width=`${e.offsetWidth}px`:t.style.height=`${e.offsetHeight}px`,t},R={commitReorder:t=>T(`onReorder`,e.onReorder,Object.freeze({after:w(t.after),before:w(t.before),item:t.item})),element:o,getOrderedIds:v,getOrderedItems:h,isDisabled:()=>n(e.disabled),notifyBeforeReorder:(t,n)=>T(`onBeforeReorder`,e.onBeforeReorder,t,n),notifyDragEnd:(t,n)=>T(`onDragEnd`,e.onDragEnd,t,n),notifyDragStart:(t,n)=>T(`onDragStart`,e.onDragStart,t,n),notifyInteraction:t=>T(`onInteraction`,e.onInteraction,Object.freeze(t)),resolveTouchTarget:t=>{if(n(e.disabled)||!o.contains(t))return null;let r=t.closest(`[${_}]`);if(!r||!h().includes(r))return null;if(c===void 0)return r;if(!f)return null;let i=t.closest(f);return i&&r.contains(i)?i:null}},z=t=>{if(m.active||R.isDisabled())return;let n=t.target,r=n.closest(`[${_}]`);if(!r||!h().includes(r))return;if(c!==void 0){let e=f?n.closest(f):null;if(!e||!r.contains(e))return}let i=r.parentElement;if(!i)return;let a=L(r),o=r.nextSibling,l=s(r),u=new Map;u.set(R,R.getOrderedIds()),r.setAttribute(`data-dragging`,``),i.insertBefore(a,o);let d={draggedEl:r,draggedId:l,hideFrame:null,initialOrders:u,originalDisplay:r.style.display,originalNextSibling:o,originalParent:i,placeholder:a,source:R,target:R};if((!C(t)||t.__dndTouchPreview)&&E(d),m.active=d,t.dataTransfer)try{if(t.dataTransfer.effectAllowed=`move`,t.dataTransfer.setData(`text/plain`,l),e.dragImage){let n=typeof e.dragImage==`function`?e.dragImage(l,r,t):e.dragImage,[i,a]=e.dragImageOffset??[0,0];n&&t.dataTransfer.setDragImage(n,i,a)}}catch(e){`${e instanceof Error?e.message:String(e)}`}R.notifyDragStart(d.draggedId,t),R.notifyInteraction({index:R.getOrderedIds().indexOf(l),itemId:l,total:R.getOrderedIds().length,type:`pickup`})},B=e=>{let t=m.active;if(!t||t.source.isDisabled()||R.isDisabled())return;e.preventDefault(),P(e,o,a,p),k(t,R);let{draggedEl:n,placeholder:r}=t,i=e.target.closest(`[${_}]`);if(i&&!h().includes(i))return;if(!i){r.parentElement!==o&&o.appendChild(r),t.target=R;return}if(i===n||i===r)return;let s=i.getBoundingClientRect(),c=a===`vertical`?e.clientY>=s.top+s.height/2:e.clientX>=s.left+s.width/2;o.insertBefore(r,c?i.nextSibling:i),t.target=R},V=e=>{let t=m.active;t&&(t.source.isDisabled()||R.isDisabled()||(e.preventDefault(),t.target=R))},H=e=>{m.active?.source===R&&N(m,e,!1)},U=e=>{if(!l||R.isDisabled())return;let t=e.target,n=t?.closest(`[${_}]`);if(!t||!n||!h().includes(n))return;let r=t.closest(`input, textarea, select, button, a[href], [contenteditable]:not([contenteditable="false"]), [role="button"], [role="link"]`),i=f?t.closest(f):null;if(r&&(!i||!n.contains(i)))return;let c=h(),u=c.indexOf(n),d=F(c,n,e.key,a);if(d===null)return;let p=c[d];if(!p)return;let m=c.map(s),g=[...c];g.splice(u,1),g.splice(d,0,n);let v=g.map(s),y=s(n);e.preventDefault(),R.notifyBeforeReorder(w(m),w(v)),o.insertBefore(n,d>u?p.nextSibling:p),n.focus(),R.commitReorder({after:v,before:m,item:y}),R.notifyInteraction({index:d,itemId:y,previousIndex:u,total:v.length,type:`move`})};j();let W,G=t(()=>{m.disposables.delete(G.dispose),m.active&&(m.active.source===R||m.active.target===R)&&!m.touch?.cancel()&&N(m,new Event(`dragend`),!0),W?.(),m.handles.delete(R),O(o,`role`,S),M()});return m.handles.add(R),W=m.touch?.register(o),S===null&&o.setAttribute(`role`,`list`),o.addEventListener(`dragstart`,z,{signal:G.disposalSignal}),o.addEventListener(`dragover`,B,{signal:G.disposalSignal}),o.addEventListener(`drop`,V,{signal:G.disposalSignal}),o.addEventListener(`dragend`,H,{signal:G.disposalSignal}),o.addEventListener(`keydown`,U,{signal:G.disposalSignal}),m.disposables.add(G.dispose),{get disposalSignal(){return G.disposalSignal},dispose:G.dispose,get disposed(){return G.disposed},get isDragging(){return m.active?.source===R},[Symbol.dispose]:G[Symbol.dispose],refresh:()=>{j()}}}function R(e,t,n){let i=new Map;for(let t of e){let e=n(t);if(i.has(e))throw new r(`Duplicate item key: "${e}"`);i.set(e,t)}let a=[];for(let e of t){if(!i.has(e))continue;let t=i.get(e);a.push(t),i.delete(e)}for(let e of i.values())a.push(e);return a}exports.DndError=r,exports.DndScopeError=i,exports.applyReorder=R,exports.createDropZone=u,exports.createSortable=L,exports.createSortableScope=I,exports.matchesAccept=a;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@vielzeug/keymap"),t=require("@vielzeug/gesture");function createDisposable(e){let t=!1,n=new AbortController,dispose=()=>{t||(t=!0,n.abort(),e?.())};return{get disposalSignal(){return n.signal},dispose,get disposed(){return t},[Symbol.dispose]:dispose}}function resolveDisabled(e){return e===!0}var DndError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},DndScopeError=class extends DndError{constructor(e=`Invalid scope — use createSortableScope() to create scopes.`){super(e)}};function matchesAccept(e,t){return!t.length||t.some(t=>{let n=t.trim().toLowerCase(),r=e.type.toLowerCase();return n?n.startsWith(`.`)?e.name.toLowerCase().endsWith(n):n.endsWith(`/*`)?r.startsWith(n.slice(0,-1)):r===n:!1})}function itemsMatchAccept(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 applyFileFilters(e,t,n){let r=[],i=[];for(let n of e)(matchesAccept(n,t)?r:i).push(n);return n!==void 0&&r.length>n&&i.push(...r.splice(n)),{accepted:r,rejected:i}}function normalizeAccept(e){return e.map(e=>{let t=e.trim().toLowerCase(),n=/^\.[a-z0-9][a-z0-9._+-]*$/.test(t),r=/^[a-z0-9!#$&^_.+-]+\/(?:\*|[a-z0-9!#$&^_.+-]+)$/.test(t);if(!n&&!r)throw new DndError(`Invalid accept pattern: "${e}"`);return t})}function notify$1(e,t,...n){if(t)try{t(...n)}catch{`${e}`}}function createDropZone(e){let t=normalizeAccept(e.accept??[]);if(e.maxFiles!==void 0&&(!Number.isSafeInteger(e.maxFiles)||e.maxFiles<0))throw new DndError(`maxFiles must be a non-negative safe integer`);let{dropEffect:n=`copy`,element:r,maxFiles:i,onDrop:a,onDropRejected:o,onHoverChange:s,onValidatingChange:c}=e,l=0,u=!1,d=!1,f=new Set,setValidating=e=>{d!==e&&(d=e,notify$1(`onValidatingChange`,c,e))},updateCounter=e=>{let t=l>0&&u;l=Math.max(0,e),l===0&&(u=!1);let n=l>0&&u;n!==t&&notify$1(`onHoverChange`,s,n)},resetCounter=()=>{updateCounter(0)},p=createDisposable(()=>{for(let e of f)e.abort();f.clear(),setValidating(!1),resetCounter()}),settle=(e,t)=>{e.length>0&&notify$1(`onDrop`,a,[...e]),t.length>0&&notify$1(`onDropRejected`,o,[...t])},settleForPaste=(t,n)=>{t.length>0&&(e.onPaste?notify$1(`onPaste`,e.onPaste,[...t]):notify$1(`onDrop`,a,[...t])),n.length>0&&notify$1(`onDropRejected`,o,[...n])},dispatchWithValidation=(n,r)=>{let{accepted:a,rejected:o}=applyFileFilters(n,t,i),s=e.onValidate,c=s&&a.length>0?new AbortController:null;c&&(f.add(c),setValidating(!0));let finishValidation=()=>{c&&(f.delete(c),p.disposed||setValidating(f.size>0))},l;try{l=c&&s?s([...a],{signal:c.signal}):!0}catch(e){l=Promise.reject(e)}Promise.resolve(l).then(e=>{finishValidation(),!p.disposed&&(e===!0?r(a,o):r([],[...o,...a]))},()=>{finishValidation(),!p.disposed&&r([],[...o,...a])})},handleDragEnter=n=>{if(!resolveDisabled(e.disabled)){if(n.preventDefault(),l===0){let e=n.dataTransfer?.items;u=!t.length||!e?.length||itemsMatchAccept(e,t)}!u&&n.dataTransfer&&(n.dataTransfer.dropEffect=`none`),updateCounter(l+1)}},handleDragOver=t=>{resolveDisabled(e.disabled)||(t.preventDefault(),t.dataTransfer&&(t.dataTransfer.dropEffect=u?n:`none`))},handleDragLeave=e=>{updateCounter(l-1)},handleDrop=t=>{if(resetCounter(),resolveDisabled(e.disabled))return;t.preventDefault();let n=t.dataTransfer?.files;n&&dispatchWithValidation(Array.from(n),settle)},handlePaste=t=>{if(resolveDisabled(e.disabled))return;let n=t.clipboardData?.files;n?.length&&(t.preventDefault(),dispatchWithValidation(Array.from(n),settleForPaste))};return r.addEventListener(`dragenter`,handleDragEnter,{signal:p.disposalSignal}),r.addEventListener(`dragover`,handleDragOver,{signal:p.disposalSignal}),r.addEventListener(`dragleave`,handleDragLeave,{signal:p.disposalSignal}),r.addEventListener(`drop`,handleDrop,{signal:p.disposalSignal}),e.paste&&r.addEventListener(`paste`,handlePaste,{signal:p.disposalSignal}),window.addEventListener(`dragend`,resetCounter,{signal:p.disposalSignal}),window.addEventListener(`drop`,resetCounter,{signal:p.disposalSignal}),{get disposalSignal(){return p.disposalSignal},dispose:p.dispose,get disposed(){return p.disposed},get hovered(){return l>0&&u},[Symbol.dispose]:p[Symbol.dispose],get validating(){return d}}}var n=2147483647;function makeDataTransfer(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function createDefaultPreview(e){let t=e.getBoundingClientRect(),r=e.ownerDocument.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:`${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(n)}),r}function createScopeTouchController(e,r){let{activationDistance:i=6,preview:a}=e;if(!Number.isFinite(i)||i<0)throw new DndError(`touch.activationDistance must be a non-negative finite number`);let o=makeDataTransfer(),s=new Map,c=null,l=null,resetSession=()=>{l?.preview?.remove(),c=null,l=null},u=createDisposable(()=>{resetSession(),s.clear()}),eventTarget=e=>{let t=e.composedPath().find(e=>e.nodeType===1)??e.target;return t&&t.nodeType===1?t:null},elementBelow=(e,t)=>{let n=e.source.style.display,r=e.preview?.style.display??``;e.source.style.display=`none`,e.preview&&(e.preview.style.display=`none`);try{return e.source.ownerDocument.elementFromPoint(t.x,t.y)}finally{e.source.style.display=n,e.preview&&(e.preview.style.display=r)}},dispatch=(e,t,n,r=!1)=>{let i=new((e.ownerDocument.defaultView?.Event)??Event)(t,{bubbles:!0,cancelable:!0});return Object.defineProperties(i,{__dndTouch:{configurable:!0,value:!0},__dndTouchPreview:{configurable:!0,value:r},clientX:{configurable:!0,value:n.x},clientY:{configurable:!0,value:n.y},dataTransfer:{configurable:!0,value:o}}),e.dispatchEvent(i),i.defaultPrevented},renderPreview=e=>{if(a===!1)return null;let t;try{let n=a?.(e);t=a?n?.cloneNode(!0)??null:createDefaultPreview(e)}catch(e){`${String(e)}`,t=null}return t?(t.setAttribute(`aria-hidden`,`true`),t.setAttribute(`data-dnd-touch-preview`,``),t.setAttribute(`inert`,``),t.removeAttribute(`id`),t.querySelectorAll(`[id]`).forEach(e=>{e.removeAttribute(`id`)}),t.style.pointerEvents=`none`,t.style.position=`fixed`,t.style.zIndex=String(n),e.ownerDocument.body.appendChild(t),t):null},start=e=>{let t=c;if(c=null,!t)return;let n=renderPreview(t);l={current:e.current,lastTarget:t,preview:n,previewOrigin:n?e.current:null,source:t},dispatch(t,`dragstart`,e.current,n!==null)},move=e=>{if(!l)return;if(l.current=e.current,l.preview&&l.previewOrigin){let t=e.current.x-l.previewOrigin.x,n=e.current.y-l.previewOrigin.y;l.preview.style.transform=`translate3d(${t}px, ${n}px, 0)`}let t=elementBelow(l,e.current);t&&t!==l.lastTarget&&(l.lastTarget&&dispatch(l.lastTarget,`dragleave`,e.current),l.lastTarget=t),t&&dispatch(t,`dragover`,e.current),e.event.preventDefault()},end=e=>{if(c=null,!l)return;let t=l;try{let n=!1;if(e.reason===`release`){let r=elementBelow(t,e.current);r&&(n=dispatch(r,`drop`,e.current))}o.dropEffect=n?`move`:`none`,dispatch(t.source,`dragend`,e.current,t.preview!==null)}finally{o.dropEffect=`move`,resetSession()}};return Object.assign(u,{cancel(){for(let e of s.values())if(e.cancel())return!0;return!1},register(e){let n=(0,t.createDragGesture)(e,{activationDistance:i,onEnd:end,onMove:move,onStart:start,pointerCapture:!1,shouldStart:e=>{if(e.pointerType!==`touch`||l)return!1;let t=eventTarget(e);return c=t?r(t):null,c!==null},signal:u.disposalSignal});return s.set(e,n),()=>{n.dispose(),s.delete(e),c&&e.contains(c)&&(c=null),l&&e.contains(l.source)&&resetSession()}}})}var r=Symbol(`SortableScope`),i=`data-dnd-handle`,a=`data-dnd-item`,o=new WeakMap,s={container:!0,edgeThreshold:32,speed:18,viewport:!1};function getSortableScopeState(e){let t=o.get(e);if(!t)throw new DndScopeError;if(e.disposed)throw new DndScopeError(`Cannot register a sortable with a disposed scope.`);return t}function resolveAutoScrollOptions(e){if(e===!1)return null;if(e===!0||e===void 0)return s;if(!Number.isFinite(e.edgeThreshold??32)||(e.edgeThreshold??32)<0||!Number.isFinite(e.speed??18)||(e.speed??18)<=0)throw new DndError(`Auto-scroll edgeThreshold must be non-negative and speed must be positive`);return{container:e.container??!0,edgeThreshold:e.edgeThreshold??32,speed:e.speed??18,viewport:e.viewport??!1}}function hasOrderChanged(e,t){return t.length!==e.length||t.some((t,n)=>t!==e[n])}function isTouchDragEvent(e){return e.__dndTouch===!0}function immutableIds(e){return Object.freeze([...e])}function notify(e,t,...n){if(t)try{t(...n)}catch{`${e}`}}function scheduleHide(e){typeof requestAnimationFrame==`function`&&(e.hideFrame=requestAnimationFrame(()=>{e.hideFrame=null,e.draggedEl.style.display=`none`}))}function cancelHide(e){e.hideFrame!==null&&(cancelAnimationFrame(e.hideFrame),e.hideFrame=null)}function restoreSessionElement(e){cancelHide(e),e.draggedEl.style.display=e.originalDisplay,e.draggedEl.removeAttribute(`data-dragging`)}function snapshotOrder(e,t){e.initialOrders.has(t)||e.initialOrders.set(t,t.getOrderedIds())}function projectedChanges(e){let t=e.target;return[...e.initialOrders].flatMap(([n,r])=>{let i=r.filter(t=>t!==e.draggedId);if(n===t&&e.placeholder.parentElement===n.element){let t=[...n.element.children],r=t.indexOf(e.placeholder),a=n.getOrderedItems().filter(n=>n!==e.draggedEl&&t.indexOf(n)<r).length;i.splice(a,0,e.draggedId)}return hasOrderChanged(r,i)?[{after:i,before:r,handle:n}]:[]})}function cancelSession(e,t){let n=e.active;n&&(restoreSessionElement(n),n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling?.parentNode===n.originalParent?n.originalNextSibling:null),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t),n.source.notifyInteraction({index:n.source.getOrderedIds().indexOf(n.draggedId),itemId:n.draggedId,total:n.source.getOrderedIds().length,type:`cancel`}))}function commitSession(e,t){let n=e.active;if(!n)return;let r=n.target,i=n.placeholder.parentElement,a=projectedChanges(n);for(let{after:e,before:t,handle:n}of a)n.notifyBeforeReorder(immutableIds(t),immutableIds(e));restoreSessionElement(n),r&&e.handles.has(r)&&i?i.insertBefore(n.draggedEl,n.placeholder):n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling?.parentNode===n.originalParent?n.originalNextSibling:null),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t);let o=[];for(let[t,r]of n.initialOrders){if(!e.handles.has(t))continue;let n=t.getOrderedIds();hasOrderChanged(r,n)&&o.push({after:n,before:r,handle:t})}if(r&&r!==n.source){let t=o.find(e=>e.handle===n.source),i=o.find(e=>e.handle===r);if(t&&i){e.commitMove({itemId:n.draggedId,source:n.source.element,sourceBeforeIds:t.before,sourceIds:t.after,target:r.element,targetBeforeIds:i.before,targetIds:i.after});let a=i.after.indexOf(n.draggedId),o=i.after.length;n.source.notifyInteraction({index:a,itemId:n.draggedId,total:o,type:`drop`}),r.notifyInteraction({index:a,itemId:n.draggedId,total:o,type:`drop`})}return}for(let{after:e,before:t,handle:r}of o)r.commitReorder({after:e,before:t,item:n.draggedId});let s=o.find(e=>e.handle===n.source),c=s?s.after:n.source.getOrderedIds(),l=c.indexOf(n.draggedId);n.source.notifyInteraction({index:l,itemId:n.draggedId,total:c.length,type:`drop`})}function finishSession(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()?cancelSession(e,t):commitSession(e,t)}function maybeAutoScroll(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 keyboardTargetIndex(t,n,r,i){let a=t.indexOf(n);if(a<0)return null;let o=i===`vertical`?`ArrowDown`:`ArrowRight`,s=i===`vertical`?`ArrowUp`:`ArrowLeft`,c=(0,e.matchKey)(r,o),l=(0,e.matchKey)(r,s),u;if(c)u=Math.min(t.length-1,a+1);else if(l)u=Math.max(0,a-1);else if((0,e.matchKey)(r,`Home`))u=0;else if((0,e.matchKey)(r,`End`))u=t.length-1;else return null;return u===a?null:u}function createSortableScope(e={}){let t={active:null,commitMove(t){notify(`onMove`,e.onMove,Object.freeze({...t,sourceBeforeIds:immutableIds(t.sourceBeforeIds),sourceIds:immutableIds(t.sourceIds),targetBeforeIds:immutableIds(t.targetBeforeIds),targetIds:immutableIds(t.targetIds)}))},disposables:new Set,handles:new Set,touch:null},n=createDisposable(()=>{t.touch?.dispose();for(let e of[...t.disposables])e();t.disposables.clear(),t.handles.clear()}),i={get disposalSignal(){return n.disposalSignal},dispose:n.dispose,get disposed(){return n.disposed},get isDragging(){return t.active!==null},[r]:!0,[Symbol.dispose]:n[Symbol.dispose]};return o.set(i,t),e.touch&&(t.touch=createScopeTouchController(e.touch===!0?{}:e.touch,e=>{if(t.active)return null;for(let n of t.handles){let t=n.resolveTouchTarget(e);if(t)return t}return null})),i}function createSortable(e){let{autoScroll:t=!0,axis:n=`vertical`,element:r,getKey:o,handle:s,keyboard:c=!0,placeholderClass:l=`dnd-placeholder`,scope:u=createSortableScope()}=e;if(n!==`vertical`&&n!==`horizontal`)throw new DndError(`axis must be "vertical" or "horizontal"`);let d=s?.trim()||null;if((s===void 0||d)&&d)try{r.querySelector(d)}catch(e){throw new DndError(`Invalid handle selector: "${s}"`,{cause:e})}let f=resolveAutoScrollOptions(t),p=getSortableScopeState(u);if([...p.handles].some(e=>e.element===r))throw new DndError(`A sortable is already registered for this element in the selected scope.`);let getItems=()=>(e.items?e.items():Array.from(r.children)).filter(e=>e.parentElement===r&&e.hasAttribute(a)),getOrderedIds=()=>getItems().map(e=>o(e)),m=new Map,h=r.getAttribute(`role`),rememberElement=e=>{let t=m.get(e);if(t)return t;let n={dataDndHandle:e.getAttribute(i),dataDndItem:e.getAttribute(a),draggable:e.getAttribute(`draggable`),role:e.getAttribute(`role`),tabIndex:e.getAttribute(`tabindex`),touchAction:e.style.touchAction};return m.set(e,n),n},restoreAttribute=(e,t,n)=>{n===null?e.removeAttribute(t):e.setAttribute(t,n)},syncItems=(e=getItems())=>{e.forEach(e=>{let t=rememberElement(e);t.role===null&&e.setAttribute(`role`,`listitem`),t.tabIndex===null&&(e.tabIndex=0),s===void 0?(e.setAttribute(`draggable`,`true`),p.touch&&(e.style.touchAction=`none`)):d&&e.querySelectorAll(d).forEach(e=>{rememberElement(e),e.setAttribute(i,``),e.setAttribute(`draggable`,`true`),p.touch&&(e.style.touchAction=`none`)})})},markItems=()=>{let t=new Set,n=e.items?e.items():Array.from(r.children),i=n.filter(e=>e instanceof HTMLElement&&e.parentElement===r),s=[];i.length,n.length;for(let e of i)try{let n=o(e);if(n){if(t.has(n)){`${n}`;continue}t.add(n),s.push(e)}}catch(e){`${String(e)}`}cleanupItems();for(let e of s)rememberElement(e),e.setAttribute(a,``);syncItems(s)},cleanupItems=()=>{for(let[e,t]of m)restoreAttribute(e,i,t.dataDndHandle),restoreAttribute(e,a,t.dataDndItem),restoreAttribute(e,`draggable`,t.draggable),restoreAttribute(e,`role`,t.role),restoreAttribute(e,`tabindex`,t.tabIndex),e.style.touchAction=t.touchAction;m.clear()},createPlaceholder=e=>{let t=document.createElement(`div`);return t.className=l,t.setAttribute(`aria-hidden`,`true`),n===`horizontal`?t.style.width=`${e.offsetWidth}px`:t.style.height=`${e.offsetHeight}px`,t},g={commitReorder:t=>notify(`onReorder`,e.onReorder,Object.freeze({after:immutableIds(t.after),before:immutableIds(t.before),item:t.item})),element:r,getOrderedIds,getOrderedItems:getItems,isDisabled:()=>resolveDisabled(e.disabled),notifyBeforeReorder:(t,n)=>notify(`onBeforeReorder`,e.onBeforeReorder,t,n),notifyDragEnd:(t,n)=>notify(`onDragEnd`,e.onDragEnd,t,n),notifyDragStart:(t,n)=>notify(`onDragStart`,e.onDragStart,t,n),notifyInteraction:t=>notify(`onInteraction`,e.onInteraction,Object.freeze(t)),resolveTouchTarget:t=>{if(resolveDisabled(e.disabled)||!r.contains(t))return null;let n=t.closest(`[${a}]`);if(!n||!getItems().includes(n))return null;if(s===void 0)return n;if(!d)return null;let i=t.closest(d);return i&&n.contains(i)?i:null}},handleDragStart=t=>{if(p.active||g.isDisabled())return;let n=t.target,r=n.closest(`[${a}]`);if(!r||!getItems().includes(r))return;if(s!==void 0){let e=d?n.closest(d):null;if(!e||!r.contains(e))return}let i=r.parentElement;if(!i)return;let c=createPlaceholder(r),l=r.nextSibling,u=o(r),f=new Map;f.set(g,g.getOrderedIds()),r.setAttribute(`data-dragging`,``),i.insertBefore(c,l);let m={draggedEl:r,draggedId:u,hideFrame:null,initialOrders:f,originalDisplay:r.style.display,originalNextSibling:l,originalParent:i,placeholder:c,source:g,target:g};if((!isTouchDragEvent(t)||t.__dndTouchPreview)&&scheduleHide(m),p.active=m,t.dataTransfer)try{if(t.dataTransfer.effectAllowed=`move`,t.dataTransfer.setData(`text/plain`,u),e.dragImage){let n=typeof e.dragImage==`function`?e.dragImage(u,r,t):e.dragImage,[i,a]=e.dragImageOffset??[0,0];n&&t.dataTransfer.setDragImage(n,i,a)}}catch(e){`${e instanceof Error?e.message:String(e)}`}g.notifyDragStart(m.draggedId,t),g.notifyInteraction({index:g.getOrderedIds().indexOf(u),itemId:u,total:g.getOrderedIds().length,type:`pickup`})},handleDragOver=e=>{let t=p.active;if(!t||t.source.isDisabled()||g.isDisabled())return;e.preventDefault(),maybeAutoScroll(e,r,n,f),snapshotOrder(t,g);let{draggedEl:i,placeholder:o}=t,s=e.target.closest(`[${a}]`);if(s&&!getItems().includes(s))return;if(!s){o.parentElement!==r&&r.appendChild(o),t.target=g;return}if(s===i||s===o)return;let c=s.getBoundingClientRect(),l=n===`vertical`?e.clientY>=c.top+c.height/2:e.clientX>=c.left+c.width/2;r.insertBefore(o,l?s.nextSibling:s),t.target=g},handleDrop=e=>{let t=p.active;t&&(t.source.isDisabled()||g.isDisabled()||(e.preventDefault(),t.target=g))},handleDragEnd=e=>{p.active?.source===g&&finishSession(p,e,!1)},handleKeydown=e=>{if(!c||g.isDisabled())return;let t=e.target,i=t?.closest(`[${a}]`);if(!t||!i||!getItems().includes(i))return;let s=t.closest(`input, textarea, select, button, a[href], [contenteditable]:not([contenteditable="false"]), [role="button"], [role="link"]`),l=d?t.closest(d):null;if(s&&(!l||!i.contains(l)))return;let u=getItems(),f=u.indexOf(i),p=keyboardTargetIndex(u,i,e,n);if(p===null)return;let m=u[p];if(!m)return;let h=u.map(o),_=[...u];_.splice(f,1),_.splice(p,0,i);let v=_.map(o),y=o(i);e.preventDefault(),g.notifyBeforeReorder(immutableIds(h),immutableIds(v)),r.insertBefore(i,p>f?m.nextSibling:m),i.focus(),g.commitReorder({after:v,before:h,item:y}),g.notifyInteraction({index:p,itemId:y,previousIndex:f,total:v.length,type:`move`})};markItems();let _,v=createDisposable(()=>{p.disposables.delete(v.dispose),p.active&&(p.active.source===g||p.active.target===g)&&!p.touch?.cancel()&&finishSession(p,new Event(`dragend`),!0),_?.(),p.handles.delete(g),restoreAttribute(r,`role`,h),cleanupItems()});return p.handles.add(g),_=p.touch?.register(r),h===null&&r.setAttribute(`role`,`list`),r.addEventListener(`dragstart`,handleDragStart,{signal:v.disposalSignal}),r.addEventListener(`dragover`,handleDragOver,{signal:v.disposalSignal}),r.addEventListener(`drop`,handleDrop,{signal:v.disposalSignal}),r.addEventListener(`dragend`,handleDragEnd,{signal:v.disposalSignal}),r.addEventListener(`keydown`,handleKeydown,{signal:v.disposalSignal}),p.disposables.add(v.dispose),{get disposalSignal(){return v.disposalSignal},dispose:v.dispose,get disposed(){return v.disposed},get isDragging(){return p.active?.source===g},[Symbol.dispose]:v[Symbol.dispose],refresh:()=>{markItems()}}}function applyReorder(e,t,n){let r=new Map;for(let t of e){let e=n(t);if(r.has(e))throw new DndError(`Duplicate item key: "${e}"`);r.set(e,t)}let 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=DndError,exports.DndScopeError=DndScopeError,exports.applyReorder=applyReorder,exports.createDropZone=createDropZone,exports.createSortable=createSortable,exports.createSortableScope=createSortableScope,exports.matchesAccept=matchesAccept;
2
2
  //# sourceMappingURL=dnd.cjs.map