@vielzeug/dnd 2.0.0 → 2.1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"_shared.cjs","names":[],"sources":["../src/_shared.ts"],"sourcesContent":["import { type Disposable } from './types';\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';\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"}
package/dist/_shared.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type Disposable } from './types';
1
+ import type { Disposable } from './types';
2
2
  /**
3
3
  * Create a `Disposable` backed by an `AbortController`.
4
4
  * `dispose()` is idempotent — the signal aborts and `cleanup` runs at most once.
@@ -1 +1 @@
1
- {"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../src/_shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAI1C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,UAAU,CAsBjE;AAID,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAEtE"}
1
+ {"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../src/_shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI1C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,UAAU,CAsBjE;AAID,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAEtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"_shared.js","names":[],"sources":["../src/_shared.ts"],"sourcesContent":["import { type Disposable } from './types';\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';\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"}
package/dist/_touch.cjs CHANGED
@@ -1,2 +1,2 @@
1
- const e=require("./_shared.cjs");require("./_dev.cjs");var t=2147483647;function n(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function r(e){let n=e.getBoundingClientRect(),r=document.createElement(`div`);return r.setAttribute(`aria-hidden`,`true`),r.setAttribute(`data-dnd-touch-preview`,``),r.setAttribute(`inert`,``),Object.assign(r.style,{background:`transparent`,border:`2px solid currentColor`,boxSizing:`border-box`,height:`${n.height}px`,left:`${n.left}px`,opacity:`0.7`,pointerEvents:`none`,position:`fixed`,top:`${n.top}px`,transition:`none`,width:`${n.width}px`,zIndex:String(t)}),r}function i(i,a){let o=n(),s=null,c=null,l=null,u=null,d=null,f=null;function p(){d?.remove(),d=null,f=null}function m(e,t){let n=l?.style.display??``,r=d?.style.display??``;l&&(l.style.display=`none`),d&&(d.style.display=`none`);let i=document.elementFromPoint(e,t);return l&&(l.style.display=n),d&&(d.style.display=r),i}let h=e.createDisposable(()=>{s=null,c=null,l=null,u=null,p()});function g(e,t,n,r,i=!1){let a=new Event(t,{bubbles:!0,cancelable:!0});Object.defineProperty(a,"__dndTouch",{configurable:!0,value:!0}),Object.defineProperty(a,"__dndTouchPreview",{configurable:!0,value:i}),Object.defineProperty(a,"clientX",{configurable:!0,value:n}),Object.defineProperty(a,"clientY",{configurable:!0,value:r}),Object.defineProperty(a,"dataTransfer",{configurable:!0,value:o}),e.dispatchEvent(a)}function _(e,n){if(i.preview===!1)return!1;try{let t=i.preview?.(e);d=i.preview?t?.cloneNode(!0)??null:r(e)}catch(e){`${String(e)}`,d=null}return d?(d.setAttribute(`aria-hidden`,`true`),d.setAttribute(`data-dnd-touch-preview`,``),d.setAttribute(`inert`,``),d.removeAttribute(`id`),d.querySelectorAll(`[id]`).forEach(e=>e.removeAttribute(`id`)),d.style.pointerEvents=`none`,d.style.position=`fixed`,d.style.zIndex=String(t),document.body.appendChild(d),f=n,!0):!1}document.addEventListener(`touchstart`,e=>{let t=e.touches[0];if(!t)return;let n=document.elementFromPoint(t.clientX,t.clientY),r=n?a(n):null;r&&(s=r,c={clientX:t.clientX,clientY:t.clientY})},{passive:!1,signal:h.disposalSignal}),document.addEventListener(`touchmove`,e=>{let t=e.touches[0];if(!t)return;if(!l){if(!s||!c||Math.hypot(t.clientX-c.clientX,t.clientY-c.clientY)<6)return;l=s,u=s;let e=_(l,t);g(l,`dragstart`,t.clientX,t.clientY,e)}if(d&&f){let e=t.clientX-f.clientX,n=t.clientY-f.clientY;d.style.transform=`translate3d(${e}px, ${n}px, 0)`}let n=m(t.clientX,t.clientY);n&&n!==u&&(u&&g(u,`dragleave`,t.clientX,t.clientY),u=n),n&&g(n,`dragover`,t.clientX,t.clientY),s=null,c=null,e.preventDefault()},{passive:!1,signal:h.disposalSignal});function v(e,t){if(!l){s=null,c=null;return}let n=e.changedTouches[0];if(n){if(!t){let e=m(n.clientX,n.clientY);e&&g(e,`drop`,n.clientX,n.clientY)}g(l,`dragend`,n.clientX,n.clientY,d!==null),s=null,c=null,l=null,u=null,p()}}return document.addEventListener(`touchend`,e=>v(e,!1),{passive:!0,signal:h.disposalSignal}),document.addEventListener(`touchcancel`,e=>v(e,!0),{passive:!0,signal:h.disposalSignal}),h}exports.createScopeTouchController=i;
1
+ const e=require("./_shared.cjs");require("./_dev.cjs");var t=2147483647;function n(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function r(e){let n=e.getBoundingClientRect(),r=document.createElement(`div`);return r.setAttribute(`aria-hidden`,`true`),r.setAttribute(`data-dnd-touch-preview`,``),r.setAttribute(`inert`,``),Object.assign(r.style,{background:`transparent`,border:`2px solid currentColor`,boxSizing:`border-box`,height:`${n.height}px`,left:`${n.left}px`,opacity:`0.7`,pointerEvents:`none`,position:`fixed`,top:`${n.top}px`,transition:`none`,width:`${n.width}px`,zIndex:String(t)}),r}function i(i,a){let o=n(),s={state:`idle`};function c(e,t){return Array.from(e).find(e=>e.identifier===t)}function l(){s.state===`dragging`&&s.preview?.remove(),s={state:`idle`}}function u(e,t,n){let r=e.source.style.display,i=e.preview?.style.display??``;e.source.style.display=`none`,e.preview&&(e.preview.style.display=`none`);try{return document.elementFromPoint(t,n)}finally{e.source.style.display=r,e.preview&&(e.preview.style.display=i)}}let d=e.createDisposable(l);function f(e,t,n,r,i=!1){let a=new Event(t,{bubbles:!0,cancelable:!0});return Object.defineProperty(a,"__dndTouch",{configurable:!0,value:!0}),Object.defineProperty(a,"__dndTouchPreview",{configurable:!0,value:i}),Object.defineProperty(a,"clientX",{configurable:!0,value:n}),Object.defineProperty(a,"clientY",{configurable:!0,value:r}),Object.defineProperty(a,"dataTransfer",{configurable:!0,value:o}),e.dispatchEvent(a),a.defaultPrevented}function p(e){if(i.preview===!1)return null;let n;try{let t=i.preview?.(e);n=i.preview?t?.cloneNode(!0)??null:r(e)}catch(e){`${String(e)}`,n=null}return n?(n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`data-dnd-touch-preview`,``),n.setAttribute(`inert`,``),n.removeAttribute(`id`),n.querySelectorAll(`[id]`).forEach(e=>{e.removeAttribute(`id`)}),n.style.pointerEvents=`none`,n.style.position=`fixed`,n.style.zIndex=String(t),document.body.appendChild(n),n):null}document.addEventListener(`touchstart`,e=>{if(s.state!==`idle`)return;let t=e.changedTouches[0];if(!t)return;let n=document.elementFromPoint(t.clientX,t.clientY),r=n?a(n):null;r&&(s={identifier:t.identifier,source:r,start:{clientX:t.clientX,clientY:t.clientY},state:`pending`})},{passive:!1,signal:d.disposalSignal}),document.addEventListener(`touchmove`,e=>{if(s.state===`idle`)return;let t=c(e.changedTouches,s.identifier);if(!t)return;if(s.state===`pending`){if(Math.hypot(t.clientX-s.start.clientX,t.clientY-s.start.clientY)<6)return;let e={clientX:t.clientX,clientY:t.clientY},n=p(s.source),r={current:e,identifier:s.identifier,lastTarget:s.source,preview:n,previewOrigin:n?e:null,source:s.source,state:`dragging`};if(s=r,f(r.source,`dragstart`,t.clientX,t.clientY,n!==null),s!==r)return}if(s.current={clientX:t.clientX,clientY:t.clientY},s.preview&&s.previewOrigin){let e=t.clientX-s.previewOrigin.clientX,n=t.clientY-s.previewOrigin.clientY;s.preview.style.transform=`translate3d(${e}px, ${n}px, 0)`}let n=u(s,t.clientX,t.clientY);n&&n!==s.lastTarget&&(s.lastTarget&&f(s.lastTarget,`dragleave`,t.clientX,t.clientY),s.lastTarget=n),n&&f(n,`dragover`,t.clientX,t.clientY),e.preventDefault()},{passive:!1,signal:d.disposalSignal});function m(e,t){if(s.state===`idle`)return;let n=c(e.changedTouches,s.identifier);if(!n){let n=c(e.touches,s.identifier);if(!t||n)return}if(s.state===`pending`){l();return}let r=s,i=n??r.current;try{let e=!1;if(!t){let t=u(r,i.clientX,i.clientY);t&&(e=f(t,`drop`,i.clientX,i.clientY))}o.dropEffect=e?`move`:`none`,f(r.source,`dragend`,i.clientX,i.clientY,r.preview!==null)}finally{o.dropEffect=`move`,l()}}return document.addEventListener(`touchend`,e=>m(e,!1),{passive:!0,signal:d.disposalSignal}),document.addEventListener(`touchcancel`,e=>m(e,!0),{passive:!0,signal:d.disposalSignal}),d}exports.createScopeTouchController=i;
2
2
  //# sourceMappingURL=_touch.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_touch.cjs","names":[],"sources":["../src/_touch.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createDisposable } from './_shared';\nimport { type Disposable } from './types';\n\nexport interface TouchInputOptions {\n /**\n * Renders visual feedback for a touch drag. Return `null` to keep the source item visible\n * instead of rendering a preview. Dnd clones the returned element, preserving caller-owned DOM.\n * The default is an inert outline sized to the source item.\n */\n preview?: false | ((item: HTMLElement) => HTMLElement | null);\n}\n\nexport type ScopeTouchController = Disposable;\n\nconst PREVIEW_Z_INDEX = 2147483647;\n\nfunction makeDataTransfer(): DataTransfer {\n return {\n dropEffect: 'move',\n effectAllowed: 'move',\n getData: () => '',\n setData() {},\n setDragImage() {},\n } as unknown as DataTransfer;\n}\n\nfunction createDefaultPreview(source: HTMLElement): HTMLElement {\n const rect = source.getBoundingClientRect();\n const preview = document.createElement('div');\n\n preview.setAttribute('aria-hidden', 'true');\n preview.setAttribute('data-dnd-touch-preview', '');\n preview.setAttribute('inert', '');\n Object.assign(preview.style, {\n background: 'transparent',\n border: '2px solid currentColor',\n boxSizing: 'border-box',\n height: `${rect.height}px`,\n left: `${rect.left}px`,\n opacity: '0.7',\n pointerEvents: 'none',\n position: 'fixed',\n top: `${rect.top}px`,\n transition: 'none',\n width: `${rect.width}px`,\n zIndex: String(PREVIEW_Z_INDEX),\n });\n\n return preview;\n}\n\nexport function createScopeTouchController(\n options: TouchInputOptions,\n resolveDragTarget: (target: Element) => HTMLElement | null,\n): ScopeTouchController {\n const dt = makeDataTransfer();\n const dragStartDistancePx = 6;\n let pendingDraggable: HTMLElement | null = null;\n let pendingStartPoint: { clientX: number; clientY: number } | null = null;\n let dragging: HTMLElement | null = null;\n let lastTarget: Element | null = null;\n let previewEl: HTMLElement | null = null;\n let previewOrigin: { clientX: number; clientY: number } | null = null;\n\n function removePreview(): void {\n previewEl?.remove();\n previewEl = null;\n previewOrigin = null;\n }\n\n function elementBelow(clientX: number, clientY: number): Element | null {\n const previousDraggingDisplay = dragging?.style.display ?? '';\n const previousPreviewDisplay = previewEl?.style.display ?? '';\n\n if (dragging) dragging.style.display = 'none';\n\n if (previewEl) previewEl.style.display = 'none';\n\n const below = document.elementFromPoint(clientX, clientY);\n\n if (dragging) dragging.style.display = previousDraggingDisplay;\n\n if (previewEl) previewEl.style.display = previousPreviewDisplay;\n\n return below;\n }\n\n const disposable = createDisposable(() => {\n pendingDraggable = null;\n pendingStartPoint = null;\n dragging = null;\n lastTarget = null;\n removePreview();\n });\n\n function dispatch(element: Element, type: string, clientX: number, clientY: number, hasPreview = false): void {\n const event = new Event(type, { bubbles: true, cancelable: true });\n\n Object.defineProperty(event, '__dndTouch', { configurable: true, value: true });\n Object.defineProperty(event, '__dndTouchPreview', { configurable: true, value: hasPreview });\n Object.defineProperty(event, 'clientX', { configurable: true, value: clientX });\n Object.defineProperty(event, 'clientY', { configurable: true, value: clientY });\n Object.defineProperty(event, 'dataTransfer', { configurable: true, value: dt });\n element.dispatchEvent(event);\n }\n\n function renderPreview(source: HTMLElement, point: { clientX: number; clientY: number }): boolean {\n if (options.preview === false) return false;\n\n try {\n const preview = options.preview?.(source);\n\n previewEl = options.preview\n ? ((preview?.cloneNode(true) as HTMLElement | undefined) ?? null)\n : createDefaultPreview(source);\n } catch (error) {\n warn(`touch drag preview failed to render, continuing without one: ${String(error)}`);\n previewEl = null;\n }\n\n if (!previewEl) return false;\n\n previewEl.setAttribute('aria-hidden', 'true');\n previewEl.setAttribute('data-dnd-touch-preview', '');\n previewEl.setAttribute('inert', '');\n previewEl.removeAttribute('id');\n previewEl.querySelectorAll('[id]').forEach((element) => element.removeAttribute('id'));\n previewEl.style.pointerEvents = 'none';\n previewEl.style.position = 'fixed';\n previewEl.style.zIndex = String(PREVIEW_Z_INDEX);\n document.body.appendChild(previewEl);\n previewOrigin = point;\n\n return true;\n }\n\n document.addEventListener(\n 'touchstart',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n\n if (!touch) return;\n\n const target = document.elementFromPoint(touch.clientX, touch.clientY);\n const draggable = target ? resolveDragTarget(target) : null;\n\n if (!draggable) return;\n\n pendingDraggable = draggable;\n pendingStartPoint = { clientX: touch.clientX, clientY: touch.clientY };\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n document.addEventListener(\n 'touchmove',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n\n if (!touch) return;\n\n if (!dragging) {\n if (!pendingDraggable || !pendingStartPoint) return;\n\n const distance = Math.hypot(\n touch.clientX - pendingStartPoint.clientX,\n touch.clientY - pendingStartPoint.clientY,\n );\n\n if (distance < dragStartDistancePx) return;\n\n dragging = pendingDraggable;\n lastTarget = pendingDraggable;\n\n const hasPreview = renderPreview(dragging, touch);\n\n dispatch(dragging, 'dragstart', touch.clientX, touch.clientY, hasPreview);\n }\n\n if (previewEl && previewOrigin) {\n const dx = touch.clientX - previewOrigin.clientX;\n const dy = touch.clientY - previewOrigin.clientY;\n\n previewEl.style.transform = `translate3d(${dx}px, ${dy}px, 0)`;\n }\n\n const below = elementBelow(touch.clientX, touch.clientY);\n\n if (below && below !== lastTarget) {\n if (lastTarget) dispatch(lastTarget, 'dragleave', touch.clientX, touch.clientY);\n\n lastTarget = below;\n }\n\n if (below) dispatch(below, 'dragover', touch.clientX, touch.clientY);\n\n pendingDraggable = null;\n pendingStartPoint = null;\n event.preventDefault();\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n function finish(event: TouchEvent, cancelled: boolean): void {\n if (!dragging) {\n pendingDraggable = null;\n pendingStartPoint = null;\n\n return;\n }\n\n const touch = event.changedTouches[0];\n\n if (!touch) return;\n\n if (!cancelled) {\n const below = elementBelow(touch.clientX, touch.clientY);\n\n if (below) dispatch(below, 'drop', touch.clientX, touch.clientY);\n }\n\n dispatch(dragging, 'dragend', touch.clientX, touch.clientY, previewEl !== null);\n pendingDraggable = null;\n pendingStartPoint = null;\n dragging = null;\n lastTarget = null;\n removePreview();\n }\n\n document.addEventListener('touchend', (event: TouchEvent) => finish(event, false), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n document.addEventListener('touchcancel', (event: TouchEvent) => finish(event, true), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n\n return disposable;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_touch.cjs","names":[],"sources":["../src/_touch.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createDisposable } from './_shared';\nimport type { Disposable } from './types';\n\nexport interface TouchInputOptions {\n /**\n * Renders visual feedback for a touch drag. Return `null` to keep the source item visible\n * instead of rendering a preview. Dnd clones the returned element, preserving caller-owned DOM.\n * The default is an inert outline sized to the source item.\n */\n preview?: false | ((item: HTMLElement) => HTMLElement | null);\n}\n\nexport type ScopeTouchController = Disposable;\n\nconst PREVIEW_Z_INDEX = 2147483647;\n\ntype TouchPoint = {\n clientX: number;\n clientY: number;\n};\n\ntype PendingTouchSession = {\n identifier: number;\n source: HTMLElement;\n start: TouchPoint;\n state: 'pending';\n};\n\ntype DraggingTouchSession = {\n current: TouchPoint;\n identifier: number;\n lastTarget: Element | null;\n preview: HTMLElement | null;\n previewOrigin: TouchPoint | null;\n source: HTMLElement;\n state: 'dragging';\n};\n\ntype TouchSession = { state: 'idle' } | DraggingTouchSession | PendingTouchSession;\n\nfunction makeDataTransfer(): DataTransfer {\n return {\n dropEffect: 'move',\n effectAllowed: 'move',\n getData: () => '',\n setData() {},\n setDragImage() {},\n } as unknown as DataTransfer;\n}\n\nfunction createDefaultPreview(source: HTMLElement): HTMLElement {\n const rect = source.getBoundingClientRect();\n const preview = document.createElement('div');\n\n preview.setAttribute('aria-hidden', 'true');\n preview.setAttribute('data-dnd-touch-preview', '');\n preview.setAttribute('inert', '');\n Object.assign(preview.style, {\n background: 'transparent',\n border: '2px solid currentColor',\n boxSizing: 'border-box',\n height: `${rect.height}px`,\n left: `${rect.left}px`,\n opacity: '0.7',\n pointerEvents: 'none',\n position: 'fixed',\n top: `${rect.top}px`,\n transition: 'none',\n width: `${rect.width}px`,\n zIndex: String(PREVIEW_Z_INDEX),\n });\n\n return preview;\n}\n\nexport function createScopeTouchController(\n options: TouchInputOptions,\n resolveDragTarget: (target: Element) => HTMLElement | null,\n): ScopeTouchController {\n const dt = makeDataTransfer();\n const dragStartDistancePx = 6;\n let session: TouchSession = { state: 'idle' };\n\n function findTouch(touches: TouchList, identifier: number): Touch | undefined {\n return Array.from(touches).find((touch) => touch.identifier === identifier);\n }\n\n function resetSession(): void {\n if (session.state === 'dragging') session.preview?.remove();\n\n session = { state: 'idle' };\n }\n\n function elementBelow(active: DraggingTouchSession, clientX: number, clientY: number): Element | null {\n const previousSourceDisplay = active.source.style.display;\n const previousPreviewDisplay = active.preview?.style.display ?? '';\n\n active.source.style.display = 'none';\n if (active.preview) active.preview.style.display = 'none';\n\n try {\n return document.elementFromPoint(clientX, clientY);\n } finally {\n active.source.style.display = previousSourceDisplay;\n\n if (active.preview) active.preview.style.display = previousPreviewDisplay;\n }\n }\n\n const disposable = createDisposable(resetSession);\n\n function dispatch(element: Element, type: string, clientX: number, clientY: number, hasPreview = false): boolean {\n const event = new Event(type, { bubbles: true, cancelable: true });\n\n Object.defineProperty(event, '__dndTouch', { configurable: true, value: true });\n Object.defineProperty(event, '__dndTouchPreview', { configurable: true, value: hasPreview });\n Object.defineProperty(event, 'clientX', { configurable: true, value: clientX });\n Object.defineProperty(event, 'clientY', { configurable: true, value: clientY });\n Object.defineProperty(event, 'dataTransfer', { configurable: true, value: dt });\n element.dispatchEvent(event);\n\n return event.defaultPrevented;\n }\n\n function renderPreview(source: HTMLElement): HTMLElement | null {\n if (options.preview === false) return null;\n\n let previewEl: HTMLElement | null;\n\n try {\n const preview = options.preview?.(source);\n\n previewEl = options.preview\n ? ((preview?.cloneNode(true) as HTMLElement | undefined) ?? null)\n : createDefaultPreview(source);\n } catch (error) {\n warn(`touch drag preview failed to render, continuing without one: ${String(error)}`);\n previewEl = null;\n }\n\n if (!previewEl) return null;\n\n previewEl.setAttribute('aria-hidden', 'true');\n previewEl.setAttribute('data-dnd-touch-preview', '');\n previewEl.setAttribute('inert', '');\n previewEl.removeAttribute('id');\n previewEl.querySelectorAll('[id]').forEach((element) => {\n element.removeAttribute('id');\n });\n previewEl.style.pointerEvents = 'none';\n previewEl.style.position = 'fixed';\n previewEl.style.zIndex = String(PREVIEW_Z_INDEX);\n document.body.appendChild(previewEl);\n\n return previewEl;\n }\n\n document.addEventListener(\n 'touchstart',\n (event: TouchEvent) => {\n if (session.state !== 'idle') return;\n\n const touch = event.changedTouches[0];\n\n if (!touch) return;\n\n const target = document.elementFromPoint(touch.clientX, touch.clientY);\n const draggable = target ? resolveDragTarget(target) : null;\n\n if (!draggable) return;\n\n session = {\n identifier: touch.identifier,\n source: draggable,\n start: { clientX: touch.clientX, clientY: touch.clientY },\n state: 'pending',\n };\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n document.addEventListener(\n 'touchmove',\n (event: TouchEvent) => {\n if (session.state === 'idle') return;\n\n const touch = findTouch(event.changedTouches, session.identifier);\n\n if (!touch) return;\n\n if (session.state === 'pending') {\n const distance = Math.hypot(touch.clientX - session.start.clientX, touch.clientY - session.start.clientY);\n\n if (distance < dragStartDistancePx) return;\n\n const point = { clientX: touch.clientX, clientY: touch.clientY };\n const preview = renderPreview(session.source);\n const active: DraggingTouchSession = {\n current: point,\n identifier: session.identifier,\n lastTarget: session.source,\n preview,\n previewOrigin: preview ? point : null,\n source: session.source,\n state: 'dragging',\n };\n\n session = active;\n dispatch(active.source, 'dragstart', touch.clientX, touch.clientY, preview !== null);\n\n if (session !== active) return;\n }\n\n session.current = { clientX: touch.clientX, clientY: touch.clientY };\n\n if (session.preview && session.previewOrigin) {\n const dx = touch.clientX - session.previewOrigin.clientX;\n const dy = touch.clientY - session.previewOrigin.clientY;\n\n session.preview.style.transform = `translate3d(${dx}px, ${dy}px, 0)`;\n }\n\n const below = elementBelow(session, touch.clientX, touch.clientY);\n\n if (below && below !== session.lastTarget) {\n if (session.lastTarget) dispatch(session.lastTarget, 'dragleave', touch.clientX, touch.clientY);\n\n session.lastTarget = below;\n }\n\n if (below) dispatch(below, 'dragover', touch.clientX, touch.clientY);\n\n event.preventDefault();\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n function finish(event: TouchEvent, cancelled: boolean): void {\n if (session.state === 'idle') return;\n\n const touch = findTouch(event.changedTouches, session.identifier);\n\n if (!touch) {\n const stillActive = findTouch(event.touches, session.identifier);\n\n if (!cancelled || stillActive) return;\n }\n\n if (session.state === 'pending') {\n resetSession();\n\n return;\n }\n\n const active = session;\n const point = touch ?? active.current;\n\n try {\n let dropAccepted = false;\n\n if (!cancelled) {\n const below = elementBelow(active, point.clientX, point.clientY);\n\n if (below) dropAccepted = dispatch(below, 'drop', point.clientX, point.clientY);\n }\n\n dt.dropEffect = dropAccepted ? 'move' : 'none';\n dispatch(active.source, 'dragend', point.clientX, point.clientY, active.preview !== null);\n } finally {\n dt.dropEffect = 'move';\n resetSession();\n }\n }\n\n document.addEventListener('touchend', (event: TouchEvent) => finish(event, false), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n document.addEventListener('touchcancel', (event: TouchEvent) => finish(event, true), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n\n return disposable;\n}\n"],"mappings":"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"}
package/dist/_touch.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type Disposable } from './types';
1
+ import type { Disposable } from './types';
2
2
  export interface TouchInputOptions {
3
3
  /**
4
4
  * Renders visual feedback for a touch drag. Return `null` to keep the source item visible
@@ -1 +1 @@
1
- {"version":3,"file":"_touch.d.ts","sourceRoot":"","sources":["../src/_touch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,WAAW,GAAG,IAAI,CAAC,CAAC;CAC/D;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC;AAuC9C,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,iBAAiB,EAC1B,iBAAiB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,IAAI,GACzD,oBAAoB,CAyLtB"}
1
+ {"version":3,"file":"_touch.d.ts","sourceRoot":"","sources":["../src/_touch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,WAAW,GAAG,IAAI,CAAC,CAAC;CAC/D;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC;AA+D9C,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,iBAAiB,EAC1B,iBAAiB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,IAAI,GACzD,oBAAoB,CA8MtB"}
package/dist/_touch.js CHANGED
@@ -29,25 +29,29 @@ function r(e) {
29
29
  }), r;
30
30
  }
31
31
  function i(i, a) {
32
- let o = n(), s = null, c = null, l = null, u = null, d = null, f = null;
33
- function p() {
34
- d?.remove(), d = null, f = null;
32
+ let o = n(), s = { state: "idle" };
33
+ function c(e, t) {
34
+ return Array.from(e).find((e) => e.identifier === t);
35
35
  }
36
- function m(e, t) {
37
- let n = l?.style.display ?? "", r = d?.style.display ?? "";
38
- l && (l.style.display = "none"), d && (d.style.display = "none");
39
- let i = document.elementFromPoint(e, t);
40
- return l && (l.style.display = n), d && (d.style.display = r), i;
36
+ function l() {
37
+ s.state === "dragging" && s.preview?.remove(), s = { state: "idle" };
41
38
  }
42
- let h = e(() => {
43
- s = null, c = null, l = null, u = null, p();
44
- });
45
- function g(e, t, n, r, i = !1) {
39
+ function u(e, t, n) {
40
+ let r = e.source.style.display, i = e.preview?.style.display ?? "";
41
+ e.source.style.display = "none", e.preview && (e.preview.style.display = "none");
42
+ try {
43
+ return document.elementFromPoint(t, n);
44
+ } finally {
45
+ e.source.style.display = r, e.preview && (e.preview.style.display = i);
46
+ }
47
+ }
48
+ let d = e(l);
49
+ function f(e, t, n, r, i = !1) {
46
50
  let a = new Event(t, {
47
51
  bubbles: !0,
48
52
  cancelable: !0
49
53
  });
50
- Object.defineProperty(a, "__dndTouch", {
54
+ return Object.defineProperty(a, "__dndTouch", {
51
55
  configurable: !0,
52
56
  value: !0
53
57
  }), Object.defineProperty(a, "__dndTouchPreview", {
@@ -62,69 +66,101 @@ function i(i, a) {
62
66
  }), Object.defineProperty(a, "dataTransfer", {
63
67
  configurable: !0,
64
68
  value: o
65
- }), e.dispatchEvent(a);
69
+ }), e.dispatchEvent(a), a.defaultPrevented;
66
70
  }
67
- function _(e, n) {
68
- if (i.preview === !1) return !1;
71
+ function p(e) {
72
+ if (i.preview === !1) return null;
73
+ let n;
69
74
  try {
70
75
  let t = i.preview?.(e);
71
- d = i.preview ? t?.cloneNode(!0) ?? null : r(e);
76
+ n = i.preview ? t?.cloneNode(!0) ?? null : r(e);
72
77
  } catch (e) {
73
- `${String(e)}`, d = null;
78
+ `${String(e)}`, n = null;
74
79
  }
75
- return d ? (d.setAttribute("aria-hidden", "true"), d.setAttribute("data-dnd-touch-preview", ""), d.setAttribute("inert", ""), d.removeAttribute("id"), d.querySelectorAll("[id]").forEach((e) => e.removeAttribute("id")), d.style.pointerEvents = "none", d.style.position = "fixed", d.style.zIndex = String(t), document.body.appendChild(d), f = n, !0) : !1;
80
+ return n ? (n.setAttribute("aria-hidden", "true"), n.setAttribute("data-dnd-touch-preview", ""), n.setAttribute("inert", ""), n.removeAttribute("id"), n.querySelectorAll("[id]").forEach((e) => {
81
+ e.removeAttribute("id");
82
+ }), n.style.pointerEvents = "none", n.style.position = "fixed", n.style.zIndex = String(t), document.body.appendChild(n), n) : null;
76
83
  }
77
84
  document.addEventListener("touchstart", (e) => {
78
- let t = e.touches[0];
85
+ if (s.state !== "idle") return;
86
+ let t = e.changedTouches[0];
79
87
  if (!t) return;
80
88
  let n = document.elementFromPoint(t.clientX, t.clientY), r = n ? a(n) : null;
81
- r && (s = r, c = {
82
- clientX: t.clientX,
83
- clientY: t.clientY
89
+ r && (s = {
90
+ identifier: t.identifier,
91
+ source: r,
92
+ start: {
93
+ clientX: t.clientX,
94
+ clientY: t.clientY
95
+ },
96
+ state: "pending"
84
97
  });
85
98
  }, {
86
99
  passive: !1,
87
- signal: h.disposalSignal
100
+ signal: d.disposalSignal
88
101
  }), document.addEventListener("touchmove", (e) => {
89
- let t = e.touches[0];
102
+ if (s.state === "idle") return;
103
+ let t = c(e.changedTouches, s.identifier);
90
104
  if (!t) return;
91
- if (!l) {
92
- if (!s || !c || Math.hypot(t.clientX - c.clientX, t.clientY - c.clientY) < 6) return;
93
- l = s, u = s;
94
- let e = _(l, t);
95
- g(l, "dragstart", t.clientX, t.clientY, e);
105
+ if (s.state === "pending") {
106
+ if (Math.hypot(t.clientX - s.start.clientX, t.clientY - s.start.clientY) < 6) return;
107
+ let e = {
108
+ clientX: t.clientX,
109
+ clientY: t.clientY
110
+ }, n = p(s.source), r = {
111
+ current: e,
112
+ identifier: s.identifier,
113
+ lastTarget: s.source,
114
+ preview: n,
115
+ previewOrigin: n ? e : null,
116
+ source: s.source,
117
+ state: "dragging"
118
+ };
119
+ if (s = r, f(r.source, "dragstart", t.clientX, t.clientY, n !== null), s !== r) return;
96
120
  }
97
- if (d && f) {
98
- let e = t.clientX - f.clientX, n = t.clientY - f.clientY;
99
- d.style.transform = `translate3d(${e}px, ${n}px, 0)`;
121
+ if (s.current = {
122
+ clientX: t.clientX,
123
+ clientY: t.clientY
124
+ }, s.preview && s.previewOrigin) {
125
+ let e = t.clientX - s.previewOrigin.clientX, n = t.clientY - s.previewOrigin.clientY;
126
+ s.preview.style.transform = `translate3d(${e}px, ${n}px, 0)`;
100
127
  }
101
- let n = m(t.clientX, t.clientY);
102
- n && n !== u && (u && g(u, "dragleave", t.clientX, t.clientY), u = n), n && g(n, "dragover", t.clientX, t.clientY), s = null, c = null, e.preventDefault();
128
+ let n = u(s, t.clientX, t.clientY);
129
+ n && n !== s.lastTarget && (s.lastTarget && f(s.lastTarget, "dragleave", t.clientX, t.clientY), s.lastTarget = n), n && f(n, "dragover", t.clientX, t.clientY), e.preventDefault();
103
130
  }, {
104
131
  passive: !1,
105
- signal: h.disposalSignal
132
+ signal: d.disposalSignal
106
133
  });
107
- function v(e, t) {
108
- if (!l) {
109
- s = null, c = null;
134
+ function m(e, t) {
135
+ if (s.state === "idle") return;
136
+ let n = c(e.changedTouches, s.identifier);
137
+ if (!n) {
138
+ let n = c(e.touches, s.identifier);
139
+ if (!t || n) return;
140
+ }
141
+ if (s.state === "pending") {
142
+ l();
110
143
  return;
111
144
  }
112
- let n = e.changedTouches[0];
113
- if (n) {
145
+ let r = s, i = n ?? r.current;
146
+ try {
147
+ let e = !1;
114
148
  if (!t) {
115
- let e = m(n.clientX, n.clientY);
116
- e && g(e, "drop", n.clientX, n.clientY);
149
+ let t = u(r, i.clientX, i.clientY);
150
+ t && (e = f(t, "drop", i.clientX, i.clientY));
117
151
  }
118
- g(l, "dragend", n.clientX, n.clientY, d !== null), s = null, c = null, l = null, u = null, p();
152
+ o.dropEffect = e ? "move" : "none", f(r.source, "dragend", i.clientX, i.clientY, r.preview !== null);
153
+ } finally {
154
+ o.dropEffect = "move", l();
119
155
  }
120
156
  }
121
- return document.addEventListener("touchend", (e) => v(e, !1), {
157
+ return document.addEventListener("touchend", (e) => m(e, !1), {
122
158
  passive: !0,
123
- signal: h.disposalSignal
124
- }), document.addEventListener("touchcancel", (e) => v(e, !0), {
159
+ signal: d.disposalSignal
160
+ }), document.addEventListener("touchcancel", (e) => m(e, !0), {
125
161
  passive: !0,
126
- signal: h.disposalSignal
127
- }), h;
162
+ signal: d.disposalSignal
163
+ }), d;
128
164
  }
129
165
  //#endregion
130
166
  export { i as createScopeTouchController };
@@ -1 +1 @@
1
- {"version":3,"file":"_touch.js","names":[],"sources":["../src/_touch.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createDisposable } from './_shared';\nimport { type Disposable } from './types';\n\nexport interface TouchInputOptions {\n /**\n * Renders visual feedback for a touch drag. Return `null` to keep the source item visible\n * instead of rendering a preview. Dnd clones the returned element, preserving caller-owned DOM.\n * The default is an inert outline sized to the source item.\n */\n preview?: false | ((item: HTMLElement) => HTMLElement | null);\n}\n\nexport type ScopeTouchController = Disposable;\n\nconst PREVIEW_Z_INDEX = 2147483647;\n\nfunction makeDataTransfer(): DataTransfer {\n return {\n dropEffect: 'move',\n effectAllowed: 'move',\n getData: () => '',\n setData() {},\n setDragImage() {},\n } as unknown as DataTransfer;\n}\n\nfunction createDefaultPreview(source: HTMLElement): HTMLElement {\n const rect = source.getBoundingClientRect();\n const preview = document.createElement('div');\n\n preview.setAttribute('aria-hidden', 'true');\n preview.setAttribute('data-dnd-touch-preview', '');\n preview.setAttribute('inert', '');\n Object.assign(preview.style, {\n background: 'transparent',\n border: '2px solid currentColor',\n boxSizing: 'border-box',\n height: `${rect.height}px`,\n left: `${rect.left}px`,\n opacity: '0.7',\n pointerEvents: 'none',\n position: 'fixed',\n top: `${rect.top}px`,\n transition: 'none',\n width: `${rect.width}px`,\n zIndex: String(PREVIEW_Z_INDEX),\n });\n\n return preview;\n}\n\nexport function createScopeTouchController(\n options: TouchInputOptions,\n resolveDragTarget: (target: Element) => HTMLElement | null,\n): ScopeTouchController {\n const dt = makeDataTransfer();\n const dragStartDistancePx = 6;\n let pendingDraggable: HTMLElement | null = null;\n let pendingStartPoint: { clientX: number; clientY: number } | null = null;\n let dragging: HTMLElement | null = null;\n let lastTarget: Element | null = null;\n let previewEl: HTMLElement | null = null;\n let previewOrigin: { clientX: number; clientY: number } | null = null;\n\n function removePreview(): void {\n previewEl?.remove();\n previewEl = null;\n previewOrigin = null;\n }\n\n function elementBelow(clientX: number, clientY: number): Element | null {\n const previousDraggingDisplay = dragging?.style.display ?? '';\n const previousPreviewDisplay = previewEl?.style.display ?? '';\n\n if (dragging) dragging.style.display = 'none';\n\n if (previewEl) previewEl.style.display = 'none';\n\n const below = document.elementFromPoint(clientX, clientY);\n\n if (dragging) dragging.style.display = previousDraggingDisplay;\n\n if (previewEl) previewEl.style.display = previousPreviewDisplay;\n\n return below;\n }\n\n const disposable = createDisposable(() => {\n pendingDraggable = null;\n pendingStartPoint = null;\n dragging = null;\n lastTarget = null;\n removePreview();\n });\n\n function dispatch(element: Element, type: string, clientX: number, clientY: number, hasPreview = false): void {\n const event = new Event(type, { bubbles: true, cancelable: true });\n\n Object.defineProperty(event, '__dndTouch', { configurable: true, value: true });\n Object.defineProperty(event, '__dndTouchPreview', { configurable: true, value: hasPreview });\n Object.defineProperty(event, 'clientX', { configurable: true, value: clientX });\n Object.defineProperty(event, 'clientY', { configurable: true, value: clientY });\n Object.defineProperty(event, 'dataTransfer', { configurable: true, value: dt });\n element.dispatchEvent(event);\n }\n\n function renderPreview(source: HTMLElement, point: { clientX: number; clientY: number }): boolean {\n if (options.preview === false) return false;\n\n try {\n const preview = options.preview?.(source);\n\n previewEl = options.preview\n ? ((preview?.cloneNode(true) as HTMLElement | undefined) ?? null)\n : createDefaultPreview(source);\n } catch (error) {\n warn(`touch drag preview failed to render, continuing without one: ${String(error)}`);\n previewEl = null;\n }\n\n if (!previewEl) return false;\n\n previewEl.setAttribute('aria-hidden', 'true');\n previewEl.setAttribute('data-dnd-touch-preview', '');\n previewEl.setAttribute('inert', '');\n previewEl.removeAttribute('id');\n previewEl.querySelectorAll('[id]').forEach((element) => element.removeAttribute('id'));\n previewEl.style.pointerEvents = 'none';\n previewEl.style.position = 'fixed';\n previewEl.style.zIndex = String(PREVIEW_Z_INDEX);\n document.body.appendChild(previewEl);\n previewOrigin = point;\n\n return true;\n }\n\n document.addEventListener(\n 'touchstart',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n\n if (!touch) return;\n\n const target = document.elementFromPoint(touch.clientX, touch.clientY);\n const draggable = target ? resolveDragTarget(target) : null;\n\n if (!draggable) return;\n\n pendingDraggable = draggable;\n pendingStartPoint = { clientX: touch.clientX, clientY: touch.clientY };\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n document.addEventListener(\n 'touchmove',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n\n if (!touch) return;\n\n if (!dragging) {\n if (!pendingDraggable || !pendingStartPoint) return;\n\n const distance = Math.hypot(\n touch.clientX - pendingStartPoint.clientX,\n touch.clientY - pendingStartPoint.clientY,\n );\n\n if (distance < dragStartDistancePx) return;\n\n dragging = pendingDraggable;\n lastTarget = pendingDraggable;\n\n const hasPreview = renderPreview(dragging, touch);\n\n dispatch(dragging, 'dragstart', touch.clientX, touch.clientY, hasPreview);\n }\n\n if (previewEl && previewOrigin) {\n const dx = touch.clientX - previewOrigin.clientX;\n const dy = touch.clientY - previewOrigin.clientY;\n\n previewEl.style.transform = `translate3d(${dx}px, ${dy}px, 0)`;\n }\n\n const below = elementBelow(touch.clientX, touch.clientY);\n\n if (below && below !== lastTarget) {\n if (lastTarget) dispatch(lastTarget, 'dragleave', touch.clientX, touch.clientY);\n\n lastTarget = below;\n }\n\n if (below) dispatch(below, 'dragover', touch.clientX, touch.clientY);\n\n pendingDraggable = null;\n pendingStartPoint = null;\n event.preventDefault();\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n function finish(event: TouchEvent, cancelled: boolean): void {\n if (!dragging) {\n pendingDraggable = null;\n pendingStartPoint = null;\n\n return;\n }\n\n const touch = event.changedTouches[0];\n\n if (!touch) return;\n\n if (!cancelled) {\n const below = elementBelow(touch.clientX, touch.clientY);\n\n if (below) dispatch(below, 'drop', touch.clientX, touch.clientY);\n }\n\n dispatch(dragging, 'dragend', touch.clientX, touch.clientY, previewEl !== null);\n pendingDraggable = null;\n pendingStartPoint = null;\n dragging = null;\n lastTarget = null;\n removePreview();\n }\n\n document.addEventListener('touchend', (event: TouchEvent) => finish(event, false), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n document.addEventListener('touchcancel', (event: TouchEvent) => finish(event, true), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n\n return disposable;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_touch.js","names":[],"sources":["../src/_touch.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { createDisposable } from './_shared';\nimport type { Disposable } from './types';\n\nexport interface TouchInputOptions {\n /**\n * Renders visual feedback for a touch drag. Return `null` to keep the source item visible\n * instead of rendering a preview. Dnd clones the returned element, preserving caller-owned DOM.\n * The default is an inert outline sized to the source item.\n */\n preview?: false | ((item: HTMLElement) => HTMLElement | null);\n}\n\nexport type ScopeTouchController = Disposable;\n\nconst PREVIEW_Z_INDEX = 2147483647;\n\ntype TouchPoint = {\n clientX: number;\n clientY: number;\n};\n\ntype PendingTouchSession = {\n identifier: number;\n source: HTMLElement;\n start: TouchPoint;\n state: 'pending';\n};\n\ntype DraggingTouchSession = {\n current: TouchPoint;\n identifier: number;\n lastTarget: Element | null;\n preview: HTMLElement | null;\n previewOrigin: TouchPoint | null;\n source: HTMLElement;\n state: 'dragging';\n};\n\ntype TouchSession = { state: 'idle' } | DraggingTouchSession | PendingTouchSession;\n\nfunction makeDataTransfer(): DataTransfer {\n return {\n dropEffect: 'move',\n effectAllowed: 'move',\n getData: () => '',\n setData() {},\n setDragImage() {},\n } as unknown as DataTransfer;\n}\n\nfunction createDefaultPreview(source: HTMLElement): HTMLElement {\n const rect = source.getBoundingClientRect();\n const preview = document.createElement('div');\n\n preview.setAttribute('aria-hidden', 'true');\n preview.setAttribute('data-dnd-touch-preview', '');\n preview.setAttribute('inert', '');\n Object.assign(preview.style, {\n background: 'transparent',\n border: '2px solid currentColor',\n boxSizing: 'border-box',\n height: `${rect.height}px`,\n left: `${rect.left}px`,\n opacity: '0.7',\n pointerEvents: 'none',\n position: 'fixed',\n top: `${rect.top}px`,\n transition: 'none',\n width: `${rect.width}px`,\n zIndex: String(PREVIEW_Z_INDEX),\n });\n\n return preview;\n}\n\nexport function createScopeTouchController(\n options: TouchInputOptions,\n resolveDragTarget: (target: Element) => HTMLElement | null,\n): ScopeTouchController {\n const dt = makeDataTransfer();\n const dragStartDistancePx = 6;\n let session: TouchSession = { state: 'idle' };\n\n function findTouch(touches: TouchList, identifier: number): Touch | undefined {\n return Array.from(touches).find((touch) => touch.identifier === identifier);\n }\n\n function resetSession(): void {\n if (session.state === 'dragging') session.preview?.remove();\n\n session = { state: 'idle' };\n }\n\n function elementBelow(active: DraggingTouchSession, clientX: number, clientY: number): Element | null {\n const previousSourceDisplay = active.source.style.display;\n const previousPreviewDisplay = active.preview?.style.display ?? '';\n\n active.source.style.display = 'none';\n if (active.preview) active.preview.style.display = 'none';\n\n try {\n return document.elementFromPoint(clientX, clientY);\n } finally {\n active.source.style.display = previousSourceDisplay;\n\n if (active.preview) active.preview.style.display = previousPreviewDisplay;\n }\n }\n\n const disposable = createDisposable(resetSession);\n\n function dispatch(element: Element, type: string, clientX: number, clientY: number, hasPreview = false): boolean {\n const event = new Event(type, { bubbles: true, cancelable: true });\n\n Object.defineProperty(event, '__dndTouch', { configurable: true, value: true });\n Object.defineProperty(event, '__dndTouchPreview', { configurable: true, value: hasPreview });\n Object.defineProperty(event, 'clientX', { configurable: true, value: clientX });\n Object.defineProperty(event, 'clientY', { configurable: true, value: clientY });\n Object.defineProperty(event, 'dataTransfer', { configurable: true, value: dt });\n element.dispatchEvent(event);\n\n return event.defaultPrevented;\n }\n\n function renderPreview(source: HTMLElement): HTMLElement | null {\n if (options.preview === false) return null;\n\n let previewEl: HTMLElement | null;\n\n try {\n const preview = options.preview?.(source);\n\n previewEl = options.preview\n ? ((preview?.cloneNode(true) as HTMLElement | undefined) ?? null)\n : createDefaultPreview(source);\n } catch (error) {\n warn(`touch drag preview failed to render, continuing without one: ${String(error)}`);\n previewEl = null;\n }\n\n if (!previewEl) return null;\n\n previewEl.setAttribute('aria-hidden', 'true');\n previewEl.setAttribute('data-dnd-touch-preview', '');\n previewEl.setAttribute('inert', '');\n previewEl.removeAttribute('id');\n previewEl.querySelectorAll('[id]').forEach((element) => {\n element.removeAttribute('id');\n });\n previewEl.style.pointerEvents = 'none';\n previewEl.style.position = 'fixed';\n previewEl.style.zIndex = String(PREVIEW_Z_INDEX);\n document.body.appendChild(previewEl);\n\n return previewEl;\n }\n\n document.addEventListener(\n 'touchstart',\n (event: TouchEvent) => {\n if (session.state !== 'idle') return;\n\n const touch = event.changedTouches[0];\n\n if (!touch) return;\n\n const target = document.elementFromPoint(touch.clientX, touch.clientY);\n const draggable = target ? resolveDragTarget(target) : null;\n\n if (!draggable) return;\n\n session = {\n identifier: touch.identifier,\n source: draggable,\n start: { clientX: touch.clientX, clientY: touch.clientY },\n state: 'pending',\n };\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n document.addEventListener(\n 'touchmove',\n (event: TouchEvent) => {\n if (session.state === 'idle') return;\n\n const touch = findTouch(event.changedTouches, session.identifier);\n\n if (!touch) return;\n\n if (session.state === 'pending') {\n const distance = Math.hypot(touch.clientX - session.start.clientX, touch.clientY - session.start.clientY);\n\n if (distance < dragStartDistancePx) return;\n\n const point = { clientX: touch.clientX, clientY: touch.clientY };\n const preview = renderPreview(session.source);\n const active: DraggingTouchSession = {\n current: point,\n identifier: session.identifier,\n lastTarget: session.source,\n preview,\n previewOrigin: preview ? point : null,\n source: session.source,\n state: 'dragging',\n };\n\n session = active;\n dispatch(active.source, 'dragstart', touch.clientX, touch.clientY, preview !== null);\n\n if (session !== active) return;\n }\n\n session.current = { clientX: touch.clientX, clientY: touch.clientY };\n\n if (session.preview && session.previewOrigin) {\n const dx = touch.clientX - session.previewOrigin.clientX;\n const dy = touch.clientY - session.previewOrigin.clientY;\n\n session.preview.style.transform = `translate3d(${dx}px, ${dy}px, 0)`;\n }\n\n const below = elementBelow(session, touch.clientX, touch.clientY);\n\n if (below && below !== session.lastTarget) {\n if (session.lastTarget) dispatch(session.lastTarget, 'dragleave', touch.clientX, touch.clientY);\n\n session.lastTarget = below;\n }\n\n if (below) dispatch(below, 'dragover', touch.clientX, touch.clientY);\n\n event.preventDefault();\n },\n { passive: false, signal: disposable.disposalSignal },\n );\n\n function finish(event: TouchEvent, cancelled: boolean): void {\n if (session.state === 'idle') return;\n\n const touch = findTouch(event.changedTouches, session.identifier);\n\n if (!touch) {\n const stillActive = findTouch(event.touches, session.identifier);\n\n if (!cancelled || stillActive) return;\n }\n\n if (session.state === 'pending') {\n resetSession();\n\n return;\n }\n\n const active = session;\n const point = touch ?? active.current;\n\n try {\n let dropAccepted = false;\n\n if (!cancelled) {\n const below = elementBelow(active, point.clientX, point.clientY);\n\n if (below) dropAccepted = dispatch(below, 'drop', point.clientX, point.clientY);\n }\n\n dt.dropEffect = dropAccepted ? 'move' : 'none';\n dispatch(active.source, 'dragend', point.clientX, point.clientY, active.preview !== null);\n } finally {\n dt.dropEffect = 'move';\n resetSession();\n }\n }\n\n document.addEventListener('touchend', (event: TouchEvent) => finish(event, false), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n document.addEventListener('touchcancel', (event: TouchEvent) => finish(event, true), {\n passive: true,\n signal: disposable.disposalSignal,\n });\n\n return disposable;\n}\n"],"mappings":"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"}
package/dist/dnd.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e){let t=!1,n=new AbortController,r=()=>{t||(t=!0,n.abort(),e?.())};return{get disposalSignal(){return n.signal},dispose:r,get disposed(){return t},[Symbol.dispose]:r}}function t(e){return e===!0}function n(e,t){return!t.length||t.some(t=>{let n=t.trim();return n.startsWith(`.`)?e.name.toLowerCase().endsWith(n.toLowerCase()):n.endsWith(`/*`)?e.type.startsWith(n.slice(0,-1)):e.type===n})}function r(e,t){return!t.length||Array.from(e).some(e=>e.kind===`file`&&t.some(t=>{let n=t.trim();return n.endsWith(`/*`)?e.type.startsWith(n.slice(0,-1)):n.startsWith(`.`)?!0:e.type===n}))}function i(e,t,r){let i=[],a=[];for(let r of e)(n(r,t)?i:a).push(r);return r!==void 0&&i.length>r&&a.push(...i.splice(r)),{accepted:i,rejected:a}}function a(n){let{accept:a=[],dropEffect:o=`copy`,element:s,maxFiles:c,onDrop:l,onDropRejected:u,onHoverChange:d,onValidatingChange:f}=n,p=0,m=!1,h=!1,g=new Set,_=e=>{h!==e&&(h=e,f?.(e))},v=e=>{let t=p>0&&m;p=Math.max(0,e),p===0&&(m=!1);let n=p>0&&m;n!==t&&d?.(n)},y=()=>{v(0)},b=e(()=>{for(let e of g)e.abort();g.clear(),y()}),x=(e,t)=>{e.length>0&&l?.(e),t.length>0&&u?.(t)},S=(e,t)=>{e.length>0&&(n.onPaste?n.onPaste(e):l?.(e)),t.length>0&&u?.(t)},C=(e,t)=>{let{accepted:r,rejected:o}=i(e,a,c),s=n.onValidate,l=s&&r.length>0?new AbortController:null;l&&(g.add(l),_(!0));let u=()=>{l&&(g.delete(l),b.disposed||_(g.size>0))},d;try{d=l&&s?s(r,{signal:l.signal}):!0}catch(e){d=Promise.reject(e)}Promise.resolve(d).then(e=>{u(),!b.disposed&&(e?t(r,o):t([],[...o,...r]))}).catch(()=>{u(),!b.disposed&&t([],[...o,...r])})};return s.addEventListener(`dragenter`,e=>{if(!t(n.disabled)){if(e.preventDefault(),p===0){let t=e.dataTransfer?.items;m=!a.length||!t?.length||r(t,a)}!m&&e.dataTransfer&&(e.dataTransfer.dropEffect=`none`),v(p+1)}},{signal:b.disposalSignal}),s.addEventListener(`dragover`,e=>{t(n.disabled)||(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=m?o:`none`))},{signal:b.disposalSignal}),s.addEventListener(`dragleave`,e=>{v(p-1)},{signal:b.disposalSignal}),s.addEventListener(`drop`,e=>{if(y(),t(n.disabled))return;e.preventDefault();let r=e.dataTransfer?.files;r&&C(Array.from(r),x)},{signal:b.disposalSignal}),n.paste&&window.addEventListener(`paste`,e=>{if(t(n.disabled))return;let r=e.clipboardData?.files;r?.length&&(e.preventDefault(),C(Array.from(r),S))},{signal:b.disposalSignal}),window.addEventListener(`dragend`,y,{signal:b.disposalSignal}),window.addEventListener(`drop`,y,{signal:b.disposalSignal}),{get disposalSignal(){return b.disposalSignal},dispose:b.dispose,get disposed(){return b.disposed},get hovered(){return p>0&&m},[Symbol.dispose]:b[Symbol.dispose],get validating(){return h}}}var o=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},s=class extends o{constructor(){super(`Invalid scope — use createSortableScope() to create scopes.`)}},c=2147483647;function l(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function u(e){let t=e.getBoundingClientRect(),n=document.createElement(`div`);return n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`data-dnd-touch-preview`,``),n.setAttribute(`inert`,``),Object.assign(n.style,{background:`transparent`,border:`2px solid currentColor`,boxSizing:`border-box`,height:`${t.height}px`,left:`${t.left}px`,opacity:`0.7`,pointerEvents:`none`,position:`fixed`,top:`${t.top}px`,transition:`none`,width:`${t.width}px`,zIndex:String(c)}),n}function d(t,n){let r=l(),i=null,a=null,o=null,s=null,d=null,f=null;function p(){d?.remove(),d=null,f=null}function m(e,t){let n=o?.style.display??``,r=d?.style.display??``;o&&(o.style.display=`none`),d&&(d.style.display=`none`);let i=document.elementFromPoint(e,t);return o&&(o.style.display=n),d&&(d.style.display=r),i}let h=e(()=>{i=null,a=null,o=null,s=null,p()});function g(e,t,n,i,a=!1){let o=new Event(t,{bubbles:!0,cancelable:!0});Object.defineProperty(o,"__dndTouch",{configurable:!0,value:!0}),Object.defineProperty(o,"__dndTouchPreview",{configurable:!0,value:a}),Object.defineProperty(o,"clientX",{configurable:!0,value:n}),Object.defineProperty(o,"clientY",{configurable:!0,value:i}),Object.defineProperty(o,"dataTransfer",{configurable:!0,value:r}),e.dispatchEvent(o)}function _(e,n){if(t.preview===!1)return!1;try{let n=t.preview?.(e);d=t.preview?n?.cloneNode(!0)??null:u(e)}catch(e){`${String(e)}`,d=null}return d?(d.setAttribute(`aria-hidden`,`true`),d.setAttribute(`data-dnd-touch-preview`,``),d.setAttribute(`inert`,``),d.removeAttribute(`id`),d.querySelectorAll(`[id]`).forEach(e=>e.removeAttribute(`id`)),d.style.pointerEvents=`none`,d.style.position=`fixed`,d.style.zIndex=String(c),document.body.appendChild(d),f=n,!0):!1}document.addEventListener(`touchstart`,e=>{let t=e.touches[0];if(!t)return;let r=document.elementFromPoint(t.clientX,t.clientY),o=r?n(r):null;o&&(i=o,a={clientX:t.clientX,clientY:t.clientY})},{passive:!1,signal:h.disposalSignal}),document.addEventListener(`touchmove`,e=>{let t=e.touches[0];if(!t)return;if(!o){if(!i||!a||Math.hypot(t.clientX-a.clientX,t.clientY-a.clientY)<6)return;o=i,s=i;let e=_(o,t);g(o,`dragstart`,t.clientX,t.clientY,e)}if(d&&f){let e=t.clientX-f.clientX,n=t.clientY-f.clientY;d.style.transform=`translate3d(${e}px, ${n}px, 0)`}let n=m(t.clientX,t.clientY);n&&n!==s&&(s&&g(s,`dragleave`,t.clientX,t.clientY),s=n),n&&g(n,`dragover`,t.clientX,t.clientY),i=null,a=null,e.preventDefault()},{passive:!1,signal:h.disposalSignal});function v(e,t){if(!o){i=null,a=null;return}let n=e.changedTouches[0];if(n){if(!t){let e=m(n.clientX,n.clientY);e&&g(e,`drop`,n.clientX,n.clientY)}g(o,`dragend`,n.clientX,n.clientY,d!==null),i=null,a=null,o=null,s=null,p()}}return document.addEventListener(`touchend`,e=>v(e,!1),{passive:!0,signal:h.disposalSignal}),document.addEventListener(`touchcancel`,e=>v(e,!0),{passive:!0,signal:h.disposalSignal}),h}var f=Symbol(`SortableScope`),p=`data-dnd-handle`,m=`data-dnd-item`,h=new WeakMap,g={container:!0,edgeThreshold:32,speed:18,viewport:!1};function _(e){let t=h.get(e);if(!t)throw new s;return t}function v(e){return e===!1?null:e===!0||e===void 0?g:{container:e.container??!0,edgeThreshold:e.edgeThreshold??32,speed:e.speed??18,viewport:e.viewport??!1}}function y(e,t){return t.length!==e.length||t.some((t,n)=>t!==e[n])}function b(e){return e.__dndTouch===!0}function x(e){typeof requestAnimationFrame==`function`&&(e.hideFrame=requestAnimationFrame(()=>{e.hideFrame=null,e.draggedEl.style.display=`none`}))}function S(e){e.hideFrame!==null&&(cancelAnimationFrame(e.hideFrame),e.hideFrame=null)}function C(e){S(e),e.draggedEl.style.display=e.originalDisplay,e.draggedEl.removeAttribute(`data-dragging`)}function w(e,t){e.initialOrders.has(t)||e.initialOrders.set(t,t.getOrderedIds())}function T(e,t){let n=e.active;n&&(C(n),n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t))}function E(e,t){let n=e.active;if(!n)return;let r=n.target,i=n.placeholder.parentElement;C(n),r&&e.handles.has(r)&&i?i.insertBefore(n.draggedEl,n.placeholder):n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t);let a=[];for(let[t,r]of n.initialOrders){if(!e.handles.has(t))continue;let n=t.getOrderedIds();y(r,n)&&a.push({after:n,before:r,handle:t})}for(let{after:e,before:t,handle:n}of a)n.notifyBeforeReorder(t,e);if(r&&r!==n.source){let t=a.find(e=>e.handle===n.source),i=a.find(e=>e.handle===r);t&&i&&e.commitMove({itemId:n.draggedId,source:n.source.element,sourceIds:t.after,target:r.element,targetIds:i.after});return}for(let{after:e,handle:t}of a)t.commitReorder(e)}function D(e,t,n){if(!e.active)return;let{active:r}=e;n||!t.dataTransfer||t.dataTransfer.dropEffect===`none`||!r.target||!e.handles.has(r.target)||r.source.isDisabled()||r.target.isDisabled()?T(e,t):E(e,t)}function O(e,t,n,r){if(!r)return;let{container:i,edgeThreshold:a,speed:o,viewport:s}=r,c=t.getBoundingClientRect();if(n===`vertical`){i&&e.clientY<c.top+a?t.scrollTop-=o:i&&e.clientY>c.bottom-a&&(t.scrollTop+=o),s&&e.clientY<a?window.scrollBy({left:0,top:-o}):s&&e.clientY>window.innerHeight-a&&window.scrollBy({left:0,top:o});return}i&&e.clientX<c.left+a?t.scrollLeft-=o:i&&e.clientX>c.right-a&&(t.scrollLeft+=o),s&&e.clientX<a?window.scrollBy({left:-o,top:0}):s&&e.clientX>window.innerWidth-a&&window.scrollBy({left:o,top:0})}function k(e,t,n,r,i,a){let o=n(),s=o.indexOf(e);if(s<0)return null;let c=a===`vertical`?i===`ArrowDown`:i===`ArrowRight`,l=a===`vertical`?i===`ArrowUp`:i===`ArrowLeft`,u;if(c)u=Math.min(o.length-1,s+1);else if(l)u=Math.max(0,s-1);else if(i===`Home`)u=0;else if(i===`End`)u=o.length-1;else return null;if(u===s)return null;let d=o[u];return d?(t.insertBefore(e,u>s?d.nextSibling:d),e.focus(),r()):null}function A(t={}){let n={active:null,commitMove(e){t.onMove?.({...e,setRevert(e){n.lastRevert=e}})},disposables:new Set,handles:new Set,lastRevert:null,touch:null},r=e(()=>{n.touch?.dispose();for(let e of n.disposables)e()}),i={get disposalSignal(){return r.disposalSignal},dispose:r.dispose,get disposed(){return r.disposed},get isDragging(){return n.active!==null},revert(){n.lastRevert?.(),n.lastRevert=null},[f]:!0,[Symbol.dispose]:r[Symbol.dispose]};return h.set(i,n),t.touch&&(n.touch=d(t.touch===!0?{}:t.touch,e=>{for(let t of n.handles){let n=t.resolveTouchTarget(e);if(n)return n}return null})),i}function j(n){let{autoScroll:r=!0,axis:i=`vertical`,element:a,getKey:o,handle:s,keyboard:c=!0,placeholderClass:l=`dnd-placeholder`,scope:u=A()}=n,d=v(r),f=_(u);s!==void 0&&s.trim();let h=()=>Array.from(a.children).filter(e=>e.hasAttribute(m)),g=()=>h().map(e=>o(e)),y=new Map,S=a.getAttribute(`role`),C=e=>{let t=y.get(e);if(t)return t;let n={dataDndHandle:e.getAttribute(p),dataDndItem:e.getAttribute(m),draggable:e.getAttribute(`draggable`),role:e.getAttribute(`role`),tabIndex:e.getAttribute(`tabindex`),touchAction:e.style.touchAction};return y.set(e,n),n},T=(e,t,n)=>{n===null?e.removeAttribute(t):e.setAttribute(t,n)},E=()=>{h().forEach(e=>{let t=C(e);t.role===null&&e.setAttribute(`role`,`listitem`),t.tabIndex===null&&(e.tabIndex=0),s?e.querySelectorAll(s).forEach(e=>{C(e),e.setAttribute(p,``),e.setAttribute(`draggable`,`true`),e.style.touchAction=`none`}):(e.setAttribute(`draggable`,`true`),e.style.touchAction=`none`)})},j=()=>{let e=new Set;Array.from(a.children).forEach(t=>{let n=t;try{let t=o(n);t&&(C(n),e.has(t)?`${t}`:e.add(t),n.setAttribute(m,``))}catch(e){`${String(e)}`}}),E()},M=()=>{for(let[e,t]of y)T(e,p,t.dataDndHandle),T(e,m,t.dataDndItem),T(e,`draggable`,t.draggable),T(e,`role`,t.role),T(e,`tabindex`,t.tabIndex),e.style.touchAction=t.touchAction;y.clear()},N=e=>{let t=document.createElement(`div`);return t.className=l,t.setAttribute(`aria-hidden`,`true`),i===`horizontal`?t.style.width=`${e.offsetWidth}px`:t.style.height=`${e.offsetHeight}px`,t},P=null,F={commitReorder:e=>{if(!n.onReorder)return;let t={ids:e,setRevert(e){P=e}};n.onReorder(t)},element:a,getOrderedIds:g,isDisabled:()=>t(n.disabled),notifyBeforeReorder:(e,t)=>n.onBeforeReorder?.(e,t),notifyDragEnd:(e,t)=>n.onDragEnd?.(e,t),notifyDragStart:(e,t)=>n.onDragStart?.(e,t),resolveTouchTarget:e=>{if(t(n.disabled)||!a.contains(e))return null;let r=e.closest(`[${m}]`);if(!r||!a.contains(r))return null;if(!s)return r;let i=e.closest(s);return i&&r.contains(i)?i:null}};f.handles.add(F);let I=e=>{if(f.active||F.isDisabled())return;let t=e.target,r=t.closest(`[${m}]`);if(!r||s&&!t.closest(s))return;let i=r.parentElement;if(!i)return;let a=N(r),c=r.nextSibling,l=o(r),u=new Map;u.set(F,F.getOrderedIds()),r.setAttribute(`data-dragging`,``),i.insertBefore(a,c);let d={draggedEl:r,draggedId:l,hideFrame:null,initialOrders:u,originalDisplay:r.style.display,originalNextSibling:c,originalParent:i,placeholder:a,source:F,target:F};if((!b(e)||e.__dndTouchPreview)&&x(d),f.active=d,e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,l),n.dragImage)){let t=typeof n.dragImage==`function`?n.dragImage(l,r,e):n.dragImage,[i,a]=n.dragImageOffset??[0,0];t&&e.dataTransfer.setDragImage(t,i,a)}F.notifyDragStart(d.draggedId,e)},L=e=>{let t=f.active;if(!t||t.source.isDisabled()||F.isDisabled())return;e.preventDefault(),O(e,a,i,d),w(t,F);let{draggedEl:n,placeholder:r}=t,o=e.target.closest(`[${m}]`);if(!o){r.parentElement!==a&&a.appendChild(r),t.target=F;return}if(o===n||o===r)return;let s=o.getBoundingClientRect(),c=i===`vertical`?e.clientY>=s.top+s.height/2:e.clientX>=s.left+s.width/2;a.insertBefore(r,c?o.nextSibling:o),t.target=F},R=e=>{let t=f.active;t&&(t.source.isDisabled()||F.isDisabled()||(e.preventDefault(),t.target=F))},z=e=>{f.active?.source===F&&D(f,e,!1)},B=e=>{if(!c||F.isDisabled())return;let t=e.target?.tagName;if(t===`INPUT`||t===`TEXTAREA`||t===`SELECT`)return;let n=e.target.closest(`[${m}]`);if(!n||!a.contains(n))return;let r=g(),o=k(n,a,h,g,e.key,i);o!==null&&(e.preventDefault(),F.notifyBeforeReorder(r,o),F.commitReorder(o))};j();let V=e(()=>{f.disposables.delete(V.dispose),f.active&&(f.active.source===F||f.active.target===F)&&D(f,new Event(`dragend`),!0),f.handles.delete(F),T(a,`role`,S),M()});return S===null&&a.setAttribute(`role`,`list`),a.addEventListener(`dragstart`,I,{signal:V.disposalSignal}),a.addEventListener(`dragover`,L,{signal:V.disposalSignal}),a.addEventListener(`drop`,R,{signal:V.disposalSignal}),a.addEventListener(`dragend`,z,{signal:V.disposalSignal}),a.addEventListener(`keydown`,B,{signal:V.disposalSignal}),f.disposables.add(V.dispose),{get disposalSignal(){return V.disposalSignal},dispose:V.dispose,get disposed(){return V.disposed},get isDragging(){return f.active?.source===F},revert:()=>{P?.(),P=null},[Symbol.dispose]:V[Symbol.dispose],sync:()=>{j()}}}function M(e,t,n){let r=new Map(e.map(e=>[n(e),e])),i=[];for(let e of t){if(!r.has(e))continue;let t=r.get(e);i.push(t),r.delete(e)}for(let e of r.values())i.push(e);return i}exports.DndError=o,exports.DndScopeError=s,exports.applyReorder=M,exports.createDropZone=a,exports.createSortable=j,exports.createSortableScope=A,exports.matchesAccept=n;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e){let t=!1,n=new AbortController,r=()=>{t||(t=!0,n.abort(),e?.())};return{get disposalSignal(){return n.signal},dispose:r,get disposed(){return t},[Symbol.dispose]:r}}function t(e){return e===!0}function n(e,t){return!t.length||t.some(t=>{let n=t.trim();return n.startsWith(`.`)?e.name.toLowerCase().endsWith(n.toLowerCase()):n.endsWith(`/*`)?e.type.startsWith(n.slice(0,-1)):e.type===n})}function r(e,t){return!t.length||Array.from(e).some(e=>e.kind===`file`&&t.some(t=>{let n=t.trim();return n.endsWith(`/*`)?e.type.startsWith(n.slice(0,-1)):n.startsWith(`.`)?!0:e.type===n}))}function i(e,t,r){let i=[],a=[];for(let r of e)(n(r,t)?i:a).push(r);return r!==void 0&&i.length>r&&a.push(...i.splice(r)),{accepted:i,rejected:a}}function a(n){let{accept:a=[],dropEffect:o=`copy`,element:s,maxFiles:c,onDrop:l,onDropRejected:u,onHoverChange:d,onValidatingChange:f}=n,p=0,m=!1,h=!1,g=new Set,_=e=>{h!==e&&(h=e,f?.(e))},v=e=>{let t=p>0&&m;p=Math.max(0,e),p===0&&(m=!1);let n=p>0&&m;n!==t&&d?.(n)},y=()=>{v(0)},b=e(()=>{for(let e of g)e.abort();g.clear(),y()}),x=(e,t)=>{e.length>0&&l?.(e),t.length>0&&u?.(t)},S=(e,t)=>{e.length>0&&(n.onPaste?n.onPaste(e):l?.(e)),t.length>0&&u?.(t)},C=(e,t)=>{let{accepted:r,rejected:o}=i(e,a,c),s=n.onValidate,l=s&&r.length>0?new AbortController:null;l&&(g.add(l),_(!0));let u=()=>{l&&(g.delete(l),b.disposed||_(g.size>0))},d;try{d=l&&s?s(r,{signal:l.signal}):!0}catch(e){d=Promise.reject(e)}Promise.resolve(d).then(e=>{u(),!b.disposed&&(e?t(r,o):t([],[...o,...r]))}).catch(()=>{u(),!b.disposed&&t([],[...o,...r])})};return s.addEventListener(`dragenter`,e=>{if(!t(n.disabled)){if(e.preventDefault(),p===0){let t=e.dataTransfer?.items;m=!a.length||!t?.length||r(t,a)}!m&&e.dataTransfer&&(e.dataTransfer.dropEffect=`none`),v(p+1)}},{signal:b.disposalSignal}),s.addEventListener(`dragover`,e=>{t(n.disabled)||(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=m?o:`none`))},{signal:b.disposalSignal}),s.addEventListener(`dragleave`,e=>{v(p-1)},{signal:b.disposalSignal}),s.addEventListener(`drop`,e=>{if(y(),t(n.disabled))return;e.preventDefault();let r=e.dataTransfer?.files;r&&C(Array.from(r),x)},{signal:b.disposalSignal}),n.paste&&window.addEventListener(`paste`,e=>{if(t(n.disabled))return;let r=e.clipboardData?.files;r?.length&&(e.preventDefault(),C(Array.from(r),S))},{signal:b.disposalSignal}),window.addEventListener(`dragend`,y,{signal:b.disposalSignal}),window.addEventListener(`drop`,y,{signal:b.disposalSignal}),{get disposalSignal(){return b.disposalSignal},dispose:b.dispose,get disposed(){return b.disposed},get hovered(){return p>0&&m},[Symbol.dispose]:b[Symbol.dispose],get validating(){return h}}}var o=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},s=class extends o{constructor(){super(`Invalid scope — use createSortableScope() to create scopes.`)}},c=2147483647;function l(){return{dropEffect:`move`,effectAllowed:`move`,getData:()=>``,setData(){},setDragImage(){}}}function u(e){let t=e.getBoundingClientRect(),n=document.createElement(`div`);return n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`data-dnd-touch-preview`,``),n.setAttribute(`inert`,``),Object.assign(n.style,{background:`transparent`,border:`2px solid currentColor`,boxSizing:`border-box`,height:`${t.height}px`,left:`${t.left}px`,opacity:`0.7`,pointerEvents:`none`,position:`fixed`,top:`${t.top}px`,transition:`none`,width:`${t.width}px`,zIndex:String(c)}),n}function d(t,n){let r=l(),i={state:`idle`};function a(e,t){return Array.from(e).find(e=>e.identifier===t)}function o(){i.state===`dragging`&&i.preview?.remove(),i={state:`idle`}}function s(e,t,n){let r=e.source.style.display,i=e.preview?.style.display??``;e.source.style.display=`none`,e.preview&&(e.preview.style.display=`none`);try{return document.elementFromPoint(t,n)}finally{e.source.style.display=r,e.preview&&(e.preview.style.display=i)}}let d=e(o);function f(e,t,n,i,a=!1){let o=new Event(t,{bubbles:!0,cancelable:!0});return Object.defineProperty(o,"__dndTouch",{configurable:!0,value:!0}),Object.defineProperty(o,"__dndTouchPreview",{configurable:!0,value:a}),Object.defineProperty(o,"clientX",{configurable:!0,value:n}),Object.defineProperty(o,"clientY",{configurable:!0,value:i}),Object.defineProperty(o,"dataTransfer",{configurable:!0,value:r}),e.dispatchEvent(o),o.defaultPrevented}function p(e){if(t.preview===!1)return null;let n;try{let r=t.preview?.(e);n=t.preview?r?.cloneNode(!0)??null:u(e)}catch(e){`${String(e)}`,n=null}return n?(n.setAttribute(`aria-hidden`,`true`),n.setAttribute(`data-dnd-touch-preview`,``),n.setAttribute(`inert`,``),n.removeAttribute(`id`),n.querySelectorAll(`[id]`).forEach(e=>{e.removeAttribute(`id`)}),n.style.pointerEvents=`none`,n.style.position=`fixed`,n.style.zIndex=String(c),document.body.appendChild(n),n):null}document.addEventListener(`touchstart`,e=>{if(i.state!==`idle`)return;let t=e.changedTouches[0];if(!t)return;let r=document.elementFromPoint(t.clientX,t.clientY),a=r?n(r):null;a&&(i={identifier:t.identifier,source:a,start:{clientX:t.clientX,clientY:t.clientY},state:`pending`})},{passive:!1,signal:d.disposalSignal}),document.addEventListener(`touchmove`,e=>{if(i.state===`idle`)return;let t=a(e.changedTouches,i.identifier);if(!t)return;if(i.state===`pending`){if(Math.hypot(t.clientX-i.start.clientX,t.clientY-i.start.clientY)<6)return;let e={clientX:t.clientX,clientY:t.clientY},n=p(i.source),r={current:e,identifier:i.identifier,lastTarget:i.source,preview:n,previewOrigin:n?e:null,source:i.source,state:`dragging`};if(i=r,f(r.source,`dragstart`,t.clientX,t.clientY,n!==null),i!==r)return}if(i.current={clientX:t.clientX,clientY:t.clientY},i.preview&&i.previewOrigin){let e=t.clientX-i.previewOrigin.clientX,n=t.clientY-i.previewOrigin.clientY;i.preview.style.transform=`translate3d(${e}px, ${n}px, 0)`}let n=s(i,t.clientX,t.clientY);n&&n!==i.lastTarget&&(i.lastTarget&&f(i.lastTarget,`dragleave`,t.clientX,t.clientY),i.lastTarget=n),n&&f(n,`dragover`,t.clientX,t.clientY),e.preventDefault()},{passive:!1,signal:d.disposalSignal});function m(e,t){if(i.state===`idle`)return;let n=a(e.changedTouches,i.identifier);if(!n){let n=a(e.touches,i.identifier);if(!t||n)return}if(i.state===`pending`){o();return}let c=i,l=n??c.current;try{let e=!1;if(!t){let t=s(c,l.clientX,l.clientY);t&&(e=f(t,`drop`,l.clientX,l.clientY))}r.dropEffect=e?`move`:`none`,f(c.source,`dragend`,l.clientX,l.clientY,c.preview!==null)}finally{r.dropEffect=`move`,o()}}return document.addEventListener(`touchend`,e=>m(e,!1),{passive:!0,signal:d.disposalSignal}),document.addEventListener(`touchcancel`,e=>m(e,!0),{passive:!0,signal:d.disposalSignal}),d}var f=Symbol(`SortableScope`),p=`data-dnd-handle`,m=`data-dnd-item`,h=new WeakMap,g={container:!0,edgeThreshold:32,speed:18,viewport:!1};function _(e){let t=h.get(e);if(!t)throw new s;return t}function v(e){return e===!1?null:e===!0||e===void 0?g:{container:e.container??!0,edgeThreshold:e.edgeThreshold??32,speed:e.speed??18,viewport:e.viewport??!1}}function y(e,t){return t.length!==e.length||t.some((t,n)=>t!==e[n])}function b(e){return e.__dndTouch===!0}function x(e){typeof requestAnimationFrame==`function`&&(e.hideFrame=requestAnimationFrame(()=>{e.hideFrame=null,e.draggedEl.style.display=`none`}))}function S(e){e.hideFrame!==null&&(cancelAnimationFrame(e.hideFrame),e.hideFrame=null)}function C(e){S(e),e.draggedEl.style.display=e.originalDisplay,e.draggedEl.removeAttribute(`data-dragging`)}function w(e,t){e.initialOrders.has(t)||e.initialOrders.set(t,t.getOrderedIds())}function T(e,t){let n=e.active;n&&(C(n),n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t))}function E(e,t){let n=e.active;if(!n)return;let r=n.target,i=n.placeholder.parentElement;C(n),r&&e.handles.has(r)&&i?i.insertBefore(n.draggedEl,n.placeholder):n.originalParent.insertBefore(n.draggedEl,n.originalNextSibling),n.placeholder.remove(),e.active=null,n.source.notifyDragEnd(n.draggedId,t);let a=[];for(let[t,r]of n.initialOrders){if(!e.handles.has(t))continue;let n=t.getOrderedIds();y(r,n)&&a.push({after:n,before:r,handle:t})}for(let{after:e,before:t,handle:n}of a)n.notifyBeforeReorder(t,e);if(r&&r!==n.source){let t=a.find(e=>e.handle===n.source),i=a.find(e=>e.handle===r);t&&i&&e.commitMove({itemId:n.draggedId,source:n.source.element,sourceIds:t.after,target:r.element,targetIds:i.after});return}for(let{after:e,handle:t}of a)t.commitReorder(e)}function D(e,t,n){if(!e.active)return;let{active:r}=e;n||!t.dataTransfer||t.dataTransfer.dropEffect===`none`||!r.target||!e.handles.has(r.target)||r.source.isDisabled()||r.target.isDisabled()?T(e,t):E(e,t)}function O(e,t,n,r){if(!r)return;let{container:i,edgeThreshold:a,speed:o,viewport:s}=r,c=t.getBoundingClientRect();if(n===`vertical`){i&&e.clientY<c.top+a?t.scrollTop-=o:i&&e.clientY>c.bottom-a&&(t.scrollTop+=o),s&&e.clientY<a?window.scrollBy({left:0,top:-o}):s&&e.clientY>window.innerHeight-a&&window.scrollBy({left:0,top:o});return}i&&e.clientX<c.left+a?t.scrollLeft-=o:i&&e.clientX>c.right-a&&(t.scrollLeft+=o),s&&e.clientX<a?window.scrollBy({left:-o,top:0}):s&&e.clientX>window.innerWidth-a&&window.scrollBy({left:o,top:0})}function k(e,t,n,r,i,a){let o=n(),s=o.indexOf(e);if(s<0)return null;let c=a===`vertical`?i===`ArrowDown`:i===`ArrowRight`,l=a===`vertical`?i===`ArrowUp`:i===`ArrowLeft`,u;if(c)u=Math.min(o.length-1,s+1);else if(l)u=Math.max(0,s-1);else if(i===`Home`)u=0;else if(i===`End`)u=o.length-1;else return null;if(u===s)return null;let d=o[u];return d?(t.insertBefore(e,u>s?d.nextSibling:d),e.focus(),r()):null}function A(t={}){let n={active:null,commitMove(e){t.onMove?.({...e,setRevert(e){n.lastRevert=e}})},disposables:new Set,handles:new Set,lastRevert:null,touch:null},r=e(()=>{n.touch?.dispose();for(let e of n.disposables)e()}),i={get disposalSignal(){return r.disposalSignal},dispose:r.dispose,get disposed(){return r.disposed},get isDragging(){return n.active!==null},revert(){n.lastRevert?.(),n.lastRevert=null},[f]:!0,[Symbol.dispose]:r[Symbol.dispose]};return h.set(i,n),t.touch&&(n.touch=d(t.touch===!0?{}:t.touch,e=>{for(let t of n.handles){let n=t.resolveTouchTarget(e);if(n)return n}return null})),i}function j(n){let{autoScroll:r=!0,axis:i=`vertical`,element:a,getKey:o,handle:s,keyboard:c=!0,placeholderClass:l=`dnd-placeholder`,scope:u=A()}=n,d=v(r),f=_(u);s!==void 0&&s.trim();let h=()=>Array.from(a.children).filter(e=>e.hasAttribute(m)),g=()=>h().map(e=>o(e)),y=new Map,S=a.getAttribute(`role`),C=e=>{let t=y.get(e);if(t)return t;let n={dataDndHandle:e.getAttribute(p),dataDndItem:e.getAttribute(m),draggable:e.getAttribute(`draggable`),role:e.getAttribute(`role`),tabIndex:e.getAttribute(`tabindex`),touchAction:e.style.touchAction};return y.set(e,n),n},T=(e,t,n)=>{n===null?e.removeAttribute(t):e.setAttribute(t,n)},E=()=>{h().forEach(e=>{let t=C(e);t.role===null&&e.setAttribute(`role`,`listitem`),t.tabIndex===null&&(e.tabIndex=0),s?e.querySelectorAll(s).forEach(e=>{C(e),e.setAttribute(p,``),e.setAttribute(`draggable`,`true`),e.style.touchAction=`none`}):(e.setAttribute(`draggable`,`true`),e.style.touchAction=`none`)})},j=()=>{let e=new Set;Array.from(a.children).forEach(t=>{let n=t;try{let t=o(n);t&&(C(n),e.has(t)?`${t}`:e.add(t),n.setAttribute(m,``))}catch(e){`${String(e)}`}}),E()},M=()=>{for(let[e,t]of y)T(e,p,t.dataDndHandle),T(e,m,t.dataDndItem),T(e,`draggable`,t.draggable),T(e,`role`,t.role),T(e,`tabindex`,t.tabIndex),e.style.touchAction=t.touchAction;y.clear()},N=e=>{let t=document.createElement(`div`);return t.className=l,t.setAttribute(`aria-hidden`,`true`),i===`horizontal`?t.style.width=`${e.offsetWidth}px`:t.style.height=`${e.offsetHeight}px`,t},P=null,F={commitReorder:e=>{if(!n.onReorder)return;let t={ids:e,setRevert(e){P=e}};n.onReorder(t)},element:a,getOrderedIds:g,isDisabled:()=>t(n.disabled),notifyBeforeReorder:(e,t)=>n.onBeforeReorder?.(e,t),notifyDragEnd:(e,t)=>n.onDragEnd?.(e,t),notifyDragStart:(e,t)=>n.onDragStart?.(e,t),resolveTouchTarget:e=>{if(t(n.disabled)||!a.contains(e))return null;let r=e.closest(`[${m}]`);if(!r||!a.contains(r))return null;if(!s)return r;let i=e.closest(s);return i&&r.contains(i)?i:null}};f.handles.add(F);let I=e=>{if(f.active||F.isDisabled())return;let t=e.target,r=t.closest(`[${m}]`);if(!r||s&&!t.closest(s))return;let i=r.parentElement;if(!i)return;let a=N(r),c=r.nextSibling,l=o(r),u=new Map;u.set(F,F.getOrderedIds()),r.setAttribute(`data-dragging`,``),i.insertBefore(a,c);let d={draggedEl:r,draggedId:l,hideFrame:null,initialOrders:u,originalDisplay:r.style.display,originalNextSibling:c,originalParent:i,placeholder:a,source:F,target:F};if((!b(e)||e.__dndTouchPreview)&&x(d),f.active=d,e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,l),n.dragImage)){let t=typeof n.dragImage==`function`?n.dragImage(l,r,e):n.dragImage,[i,a]=n.dragImageOffset??[0,0];t&&e.dataTransfer.setDragImage(t,i,a)}F.notifyDragStart(d.draggedId,e)},L=e=>{let t=f.active;if(!t||t.source.isDisabled()||F.isDisabled())return;e.preventDefault(),O(e,a,i,d),w(t,F);let{draggedEl:n,placeholder:r}=t,o=e.target.closest(`[${m}]`);if(!o){r.parentElement!==a&&a.appendChild(r),t.target=F;return}if(o===n||o===r)return;let s=o.getBoundingClientRect(),c=i===`vertical`?e.clientY>=s.top+s.height/2:e.clientX>=s.left+s.width/2;a.insertBefore(r,c?o.nextSibling:o),t.target=F},R=e=>{let t=f.active;t&&(t.source.isDisabled()||F.isDisabled()||(e.preventDefault(),t.target=F))},z=e=>{f.active?.source===F&&D(f,e,!1)},B=e=>{if(!c||F.isDisabled())return;let t=e.target?.tagName;if(t===`INPUT`||t===`TEXTAREA`||t===`SELECT`)return;let n=e.target.closest(`[${m}]`);if(!n||!a.contains(n))return;let r=g(),o=k(n,a,h,g,e.key,i);o!==null&&(e.preventDefault(),F.notifyBeforeReorder(r,o),F.commitReorder(o))};j();let V=e(()=>{f.disposables.delete(V.dispose),f.active&&(f.active.source===F||f.active.target===F)&&D(f,new Event(`dragend`),!0),f.handles.delete(F),T(a,`role`,S),M()});return S===null&&a.setAttribute(`role`,`list`),a.addEventListener(`dragstart`,I,{signal:V.disposalSignal}),a.addEventListener(`dragover`,L,{signal:V.disposalSignal}),a.addEventListener(`drop`,R,{signal:V.disposalSignal}),a.addEventListener(`dragend`,z,{signal:V.disposalSignal}),a.addEventListener(`keydown`,B,{signal:V.disposalSignal}),f.disposables.add(V.dispose),{get disposalSignal(){return V.disposalSignal},dispose:V.dispose,get disposed(){return V.disposed},get isDragging(){return f.active?.source===F},revert:()=>{P?.(),P=null},[Symbol.dispose]:V[Symbol.dispose],sync:()=>{j()}}}function M(e,t,n){let r=new Map(e.map(e=>[n(e),e])),i=[];for(let e of t){if(!r.has(e))continue;let t=r.get(e);i.push(t),r.delete(e)}for(let e of r.values())i.push(e);return i}exports.DndError=o,exports.DndScopeError=s,exports.applyReorder=M,exports.createDropZone=a,exports.createSortable=j,exports.createSortableScope=A,exports.matchesAccept=n;
2
2
  //# sourceMappingURL=dnd.cjs.map