@vielzeug/dnd 26.10.15 → 26.10.17
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/LICENSE +21 -0
- package/dist/_dev.cjs.map +1 -1
- package/dist/_dev.js +5 -1
- package/dist/_dev.js.map +1 -1
- package/dist/_shared.cjs.map +1 -1
- package/dist/_shared.js +22 -1
- package/dist/_shared.js.map +1 -1
- package/dist/_touch.cjs.map +1 -1
- package/dist/_touch.js +150 -1
- package/dist/_touch.js.map +1 -1
- package/dist/dnd.cjs +1 -1
- package/dist/dnd.cjs.map +1 -1
- package/dist/dnd.iife.js +1 -1
- package/dist/dnd.iife.js.map +1 -1
- package/dist/dnd.js +697 -1
- package/dist/dnd.js.map +1 -1
- package/dist/drop-zone.cjs.map +1 -1
- package/dist/drop-zone.js +115 -1
- package/dist/drop-zone.js.map +1 -1
- package/dist/drop.js +3 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +13 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.js +4 -1
- package/dist/sortable.cjs +1 -1
- package/dist/sortable.cjs.map +1 -1
- package/dist/sortable.js +414 -1
- package/dist/sortable.js.map +1 -1
- package/package.json +7 -6
package/dist/sortable.js
CHANGED
|
@@ -1,2 +1,415 @@
|
|
|
1
|
-
import"./_dev.js";import{createDisposable as e,resolveDisabled as t}from"./_shared.js";import{DndError as n,DndScopeError as r}from"./errors.js";import{createScopeTouchController as i}from"./_touch.js";import{matchKey as a}from"@vielzeug/keymap";var o=Symbol(`SortableScope`),s=`data-dnd-handle`,c=`data-dnd-item`,l=new WeakMap,u={container:!0,edgeThreshold:32,speed:18,viewport:!1};function getSortableScopeState(e){let t=l.get(e);if(!t)throw new r;if(e.disposed)throw new r(`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 u;if(!Number.isFinite(e.edgeThreshold??32)||(e.edgeThreshold??32)<0||!Number.isFinite(e.speed??18)||(e.speed??18)<=0)throw new n(`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(e,t,n,r){let i=e.indexOf(t);if(i<0)return null;let o=r===`vertical`?`ArrowDown`:`ArrowRight`,s=r===`vertical`?`ArrowUp`:`ArrowLeft`,c=a(n,o),l=a(n,s),u;if(c)u=Math.min(e.length-1,i+1);else if(l)u=Math.max(0,i-1);else if(a(n,`Home`))u=0;else if(a(n,`End`))u=e.length-1;else return null;return u===i?null:u}function createSortableScope(t={}){let n={active:null,commitMove(e){notify(`onMove`,t.onMove,Object.freeze({...e,sourceBeforeIds:immutableIds(e.sourceBeforeIds),sourceIds:immutableIds(e.sourceIds),targetBeforeIds:immutableIds(e.targetBeforeIds),targetIds:immutableIds(e.targetIds)}))},disposables:new Set,handles:new Set,touch:null},r=e(()=>{n.touch?.dispose();for(let e of[...n.disposables])e();n.disposables.clear(),n.handles.clear()}),a={get disposalSignal(){return r.disposalSignal},dispose:r.dispose,get disposed(){return r.disposed},get isDragging(){return n.active!==null},[o]:!0,[Symbol.dispose]:r[Symbol.dispose]};return l.set(a,n),t.touch&&(n.touch=i(t.touch===!0?{}:t.touch,e=>{if(n.active)return null;for(let t of n.handles){let n=t.resolveTouchTarget(e);if(n)return n}return null})),a}function createSortable(r){let{autoScroll:i=!0,axis:a=`vertical`,element:o,getKey:l,handle:u,keyboard:d=!0,placeholderClass:f=`dnd-placeholder`,scope:p=createSortableScope()}=r;if(a!==`vertical`&&a!==`horizontal`)throw new n(`axis must be "vertical" or "horizontal"`);let m=u?.trim()||null;if((u===void 0||m)&&m)try{o.querySelector(m)}catch(e){throw new n(`Invalid handle selector: "${u}"`,{cause:e})}let h=resolveAutoScrollOptions(i),g=getSortableScopeState(p);if([...g.handles].some(e=>e.element===o))throw new n(`A sortable is already registered for this element in the selected scope.`);let getItems=()=>(r.items?r.items():Array.from(o.children)).filter(e=>e.parentElement===o&&e.hasAttribute(c)),getOrderedIds=()=>getItems().map(e=>l(e)),_=new Map,v=o.getAttribute(`role`),rememberElement=e=>{let t=_.get(e);if(t)return t;let n={dataDndHandle:e.getAttribute(s),dataDndItem:e.getAttribute(c),draggable:e.getAttribute(`draggable`),role:e.getAttribute(`role`),tabIndex:e.getAttribute(`tabindex`),touchAction:e.style.touchAction};return _.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),u===void 0?(e.setAttribute(`draggable`,`true`),g.touch&&(e.style.touchAction=`none`)):m&&e.querySelectorAll(m).forEach(e=>{rememberElement(e),e.setAttribute(s,``),e.setAttribute(`draggable`,`true`),g.touch&&(e.style.touchAction=`none`)})})},markItems=()=>{let e=new Set,t=r.items?r.items():Array.from(o.children),n=t.filter(e=>e instanceof HTMLElement&&e.parentElement===o),i=[];n.length,t.length;for(let t of n)try{let n=l(t);if(n){if(e.has(n)){`${n}`;continue}e.add(n),i.push(t)}}catch(e){`${String(e)}`}cleanupItems();for(let e of i)rememberElement(e),e.setAttribute(c,``);syncItems(i)},cleanupItems=()=>{for(let[e,t]of _)restoreAttribute(e,s,t.dataDndHandle),restoreAttribute(e,c,t.dataDndItem),restoreAttribute(e,`draggable`,t.draggable),restoreAttribute(e,`role`,t.role),restoreAttribute(e,`tabindex`,t.tabIndex),e.style.touchAction=t.touchAction;_.clear()},createPlaceholder=e=>{let t=document.createElement(`div`);return t.className=f,t.setAttribute(`aria-hidden`,`true`),a===`horizontal`?t.style.width=`${e.offsetWidth}px`:t.style.height=`${e.offsetHeight}px`,t},y={commitReorder:e=>notify(`onReorder`,r.onReorder,Object.freeze({after:immutableIds(e.after),before:immutableIds(e.before),item:e.item})),element:o,getOrderedIds,getOrderedItems:getItems,isDisabled:()=>t(r.disabled),notifyBeforeReorder:(e,t)=>notify(`onBeforeReorder`,r.onBeforeReorder,e,t),notifyDragEnd:(e,t)=>notify(`onDragEnd`,r.onDragEnd,e,t),notifyDragStart:(e,t)=>notify(`onDragStart`,r.onDragStart,e,t),notifyInteraction:e=>notify(`onInteraction`,r.onInteraction,Object.freeze(e)),resolveTouchTarget:e=>{if(t(r.disabled)||!o.contains(e))return null;let n=e.closest(`[${c}]`);if(!n||!getItems().includes(n))return null;if(u===void 0)return n;if(!m)return null;let i=e.closest(m);return i&&n.contains(i)?i:null}},handleDragStart=e=>{if(g.active||y.isDisabled())return;let t=e.target,n=t.closest(`[${c}]`);if(!n||!getItems().includes(n))return;if(u!==void 0){let e=m?t.closest(m):null;if(!e||!n.contains(e))return}let i=n.parentElement;if(!i)return;let a=createPlaceholder(n),o=n.nextSibling,s=l(n),d=new Map;d.set(y,y.getOrderedIds()),n.setAttribute(`data-dragging`,``),i.insertBefore(a,o);let f={draggedEl:n,draggedId:s,hideFrame:null,initialOrders:d,originalDisplay:n.style.display,originalNextSibling:o,originalParent:i,placeholder:a,source:y,target:y};if((!isTouchDragEvent(e)||e.__dndTouchPreview)&&scheduleHide(f),g.active=f,e.dataTransfer)try{if(e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,s),r.dragImage){let t=typeof r.dragImage==`function`?r.dragImage(s,n,e):r.dragImage,[i,a]=r.dragImageOffset??[0,0];t&&e.dataTransfer.setDragImage(t,i,a)}}catch(e){`${e instanceof Error?e.message:String(e)}`}y.notifyDragStart(f.draggedId,e),y.notifyInteraction({index:y.getOrderedIds().indexOf(s),itemId:s,total:y.getOrderedIds().length,type:`pickup`})},handleDragOver=e=>{let t=g.active;if(!t||t.source.isDisabled()||y.isDisabled())return;e.preventDefault(),maybeAutoScroll(e,o,a,h),snapshotOrder(t,y);let{draggedEl:n,placeholder:r}=t,i=e.target.closest(`[${c}]`);if(i&&!getItems().includes(i))return;if(!i){r.parentElement!==o&&o.appendChild(r),t.target=y;return}if(i===n||i===r)return;let s=i.getBoundingClientRect(),l=a===`vertical`?e.clientY>=s.top+s.height/2:e.clientX>=s.left+s.width/2;o.insertBefore(r,l?i.nextSibling:i),t.target=y},handleDrop=e=>{let t=g.active;t&&(t.source.isDisabled()||y.isDisabled()||(e.preventDefault(),t.target=y))},handleDragEnd=e=>{g.active?.source===y&&finishSession(g,e,!1)},handleKeydown=e=>{if(!d||y.isDisabled())return;let t=e.target,n=t?.closest(`[${c}]`);if(!t||!n||!getItems().includes(n))return;let r=t.closest(`input, textarea, select, button, a[href], [contenteditable]:not([contenteditable="false"]), [role="button"], [role="link"]`),i=m?t.closest(m):null;if(r&&(!i||!n.contains(i)))return;let s=getItems(),u=s.indexOf(n),f=keyboardTargetIndex(s,n,e,a);if(f===null)return;let p=s[f];if(!p)return;let h=s.map(l),g=[...s];g.splice(u,1),g.splice(f,0,n);let _=g.map(l),v=l(n);e.preventDefault(),y.notifyBeforeReorder(immutableIds(h),immutableIds(_)),o.insertBefore(n,f>u?p.nextSibling:p),n.focus(),y.commitReorder({after:_,before:h,item:v}),y.notifyInteraction({index:f,itemId:v,previousIndex:u,total:_.length,type:`move`})};markItems();let b,x=e(()=>{g.disposables.delete(x.dispose),g.active&&(g.active.source===y||g.active.target===y)&&!g.touch?.cancel()&&finishSession(g,new Event(`dragend`),!0),b?.(),g.handles.delete(y),restoreAttribute(o,`role`,v),cleanupItems()});return g.handles.add(y),b=g.touch?.register(o),v===null&&o.setAttribute(`role`,`list`),o.addEventListener(`dragstart`,handleDragStart,{signal:x.disposalSignal}),o.addEventListener(`dragover`,handleDragOver,{signal:x.disposalSignal}),o.addEventListener(`drop`,handleDrop,{signal:x.disposalSignal}),o.addEventListener(`dragend`,handleDragEnd,{signal:x.disposalSignal}),o.addEventListener(`keydown`,handleKeydown,{signal:x.disposalSignal}),g.disposables.add(x.dispose),{get disposalSignal(){return x.disposalSignal},dispose:x.dispose,get disposed(){return x.disposed},get isDragging(){return g.active?.source===y},[Symbol.dispose]:x[Symbol.dispose],refresh:()=>{markItems()}}}function applyReorder(e,t,r){let i=new Map;for(let t of e){let e=r(t);if(i.has(e))throw new n(`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}export{n as DndError,r as DndScopeError,applyReorder,createSortable,createSortableScope};
|
|
1
|
+
import "./_dev.js";
|
|
2
|
+
import { createDisposable as e, resolveDisabled as t } from "./_shared.js";
|
|
3
|
+
import { DndError as n, DndScopeError as r } from "./errors.js";
|
|
4
|
+
import { createScopeTouchController as i } from "./_touch.js";
|
|
5
|
+
import { matchKey as a } from "@vielzeug/keymap";
|
|
6
|
+
//#region src/sortable.ts
|
|
7
|
+
var o = Symbol("SortableScope"), s = "data-dnd-handle", c = "data-dnd-item", l = /* @__PURE__ */ new WeakMap(), u = {
|
|
8
|
+
container: !0,
|
|
9
|
+
edgeThreshold: 32,
|
|
10
|
+
speed: 18,
|
|
11
|
+
viewport: !1
|
|
12
|
+
};
|
|
13
|
+
function getSortableScopeState(e) {
|
|
14
|
+
let t = l.get(e);
|
|
15
|
+
if (!t) throw new r();
|
|
16
|
+
if (e.disposed) throw new r("Cannot register a sortable with a disposed scope.");
|
|
17
|
+
return t;
|
|
18
|
+
}
|
|
19
|
+
function resolveAutoScrollOptions(e) {
|
|
20
|
+
if (e === !1) return null;
|
|
21
|
+
if (e === !0 || e === void 0) return u;
|
|
22
|
+
if (!Number.isFinite(e.edgeThreshold ?? 32) || (e.edgeThreshold ?? 32) < 0 || !Number.isFinite(e.speed ?? 18) || (e.speed ?? 18) <= 0) throw new n("Auto-scroll edgeThreshold must be non-negative and speed must be positive");
|
|
23
|
+
return {
|
|
24
|
+
container: e.container ?? !0,
|
|
25
|
+
edgeThreshold: e.edgeThreshold ?? 32,
|
|
26
|
+
speed: e.speed ?? 18,
|
|
27
|
+
viewport: e.viewport ?? !1
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function hasOrderChanged(e, t) {
|
|
31
|
+
return t.length !== e.length || t.some((t, n) => t !== e[n]);
|
|
32
|
+
}
|
|
33
|
+
function isTouchDragEvent(e) {
|
|
34
|
+
return e.__dndTouch === !0;
|
|
35
|
+
}
|
|
36
|
+
function immutableIds(e) {
|
|
37
|
+
return Object.freeze([...e]);
|
|
38
|
+
}
|
|
39
|
+
function notify(e, t, ...n) {
|
|
40
|
+
if (t) try {
|
|
41
|
+
t(...n);
|
|
42
|
+
} catch {
|
|
43
|
+
`${e}`;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function scheduleHide(e) {
|
|
47
|
+
typeof requestAnimationFrame == "function" && (e.hideFrame = requestAnimationFrame(() => {
|
|
48
|
+
e.hideFrame = null, e.draggedEl.style.display = "none";
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
function cancelHide(e) {
|
|
52
|
+
e.hideFrame !== null && (cancelAnimationFrame(e.hideFrame), e.hideFrame = null);
|
|
53
|
+
}
|
|
54
|
+
function restoreSessionElement(e) {
|
|
55
|
+
cancelHide(e), e.draggedEl.style.display = e.originalDisplay, e.draggedEl.removeAttribute("data-dragging");
|
|
56
|
+
}
|
|
57
|
+
function snapshotOrder(e, t) {
|
|
58
|
+
e.initialOrders.has(t) || e.initialOrders.set(t, t.getOrderedIds());
|
|
59
|
+
}
|
|
60
|
+
function projectedChanges(e) {
|
|
61
|
+
let t = e.target;
|
|
62
|
+
return [...e.initialOrders].flatMap(([n, r]) => {
|
|
63
|
+
let i = r.filter((t) => t !== e.draggedId);
|
|
64
|
+
if (n === t && e.placeholder.parentElement === n.element) {
|
|
65
|
+
let t = [...n.element.children], r = t.indexOf(e.placeholder), a = n.getOrderedItems().filter((n) => n !== e.draggedEl && t.indexOf(n) < r).length;
|
|
66
|
+
i.splice(a, 0, e.draggedId);
|
|
67
|
+
}
|
|
68
|
+
return hasOrderChanged(r, i) ? [{
|
|
69
|
+
after: i,
|
|
70
|
+
before: r,
|
|
71
|
+
handle: n
|
|
72
|
+
}] : [];
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function cancelSession(e, t) {
|
|
76
|
+
let n = e.active;
|
|
77
|
+
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({
|
|
78
|
+
index: n.source.getOrderedIds().indexOf(n.draggedId),
|
|
79
|
+
itemId: n.draggedId,
|
|
80
|
+
total: n.source.getOrderedIds().length,
|
|
81
|
+
type: "cancel"
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
function commitSession(e, t) {
|
|
85
|
+
let n = e.active;
|
|
86
|
+
if (!n) return;
|
|
87
|
+
let r = n.target, i = n.placeholder.parentElement, a = projectedChanges(n);
|
|
88
|
+
for (let { after: e, before: t, handle: n } of a) n.notifyBeforeReorder(immutableIds(t), immutableIds(e));
|
|
89
|
+
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);
|
|
90
|
+
let o = [];
|
|
91
|
+
for (let [t, r] of n.initialOrders) {
|
|
92
|
+
if (!e.handles.has(t)) continue;
|
|
93
|
+
let n = t.getOrderedIds();
|
|
94
|
+
hasOrderChanged(r, n) && o.push({
|
|
95
|
+
after: n,
|
|
96
|
+
before: r,
|
|
97
|
+
handle: t
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (r && r !== n.source) {
|
|
101
|
+
let t = o.find((e) => e.handle === n.source), i = o.find((e) => e.handle === r);
|
|
102
|
+
if (t && i) {
|
|
103
|
+
e.commitMove({
|
|
104
|
+
itemId: n.draggedId,
|
|
105
|
+
source: n.source.element,
|
|
106
|
+
sourceBeforeIds: t.before,
|
|
107
|
+
sourceIds: t.after,
|
|
108
|
+
target: r.element,
|
|
109
|
+
targetBeforeIds: i.before,
|
|
110
|
+
targetIds: i.after
|
|
111
|
+
});
|
|
112
|
+
let a = i.after.indexOf(n.draggedId), o = i.after.length;
|
|
113
|
+
n.source.notifyInteraction({
|
|
114
|
+
index: a,
|
|
115
|
+
itemId: n.draggedId,
|
|
116
|
+
total: o,
|
|
117
|
+
type: "drop"
|
|
118
|
+
}), r.notifyInteraction({
|
|
119
|
+
index: a,
|
|
120
|
+
itemId: n.draggedId,
|
|
121
|
+
total: o,
|
|
122
|
+
type: "drop"
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (let { after: e, before: t, handle: r } of o) r.commitReorder({
|
|
128
|
+
after: e,
|
|
129
|
+
before: t,
|
|
130
|
+
item: n.draggedId
|
|
131
|
+
});
|
|
132
|
+
let s = o.find((e) => e.handle === n.source), c = s ? s.after : n.source.getOrderedIds(), l = c.indexOf(n.draggedId);
|
|
133
|
+
n.source.notifyInteraction({
|
|
134
|
+
index: l,
|
|
135
|
+
itemId: n.draggedId,
|
|
136
|
+
total: c.length,
|
|
137
|
+
type: "drop"
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function finishSession(e, t, n) {
|
|
141
|
+
if (!e.active) return;
|
|
142
|
+
let { active: r } = e;
|
|
143
|
+
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);
|
|
144
|
+
}
|
|
145
|
+
function maybeAutoScroll(e, t, n, r) {
|
|
146
|
+
if (!r) return;
|
|
147
|
+
let { container: i, edgeThreshold: a, speed: o, viewport: s } = r, c = t.getBoundingClientRect();
|
|
148
|
+
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({
|
|
149
|
+
left: 0,
|
|
150
|
+
top: -o
|
|
151
|
+
}) : s && e.clientY > window.innerHeight - a && window.scrollBy({
|
|
152
|
+
left: 0,
|
|
153
|
+
top: o
|
|
154
|
+
})) : (i && e.clientX < c.left + a ? t.scrollLeft -= o : i && e.clientX > c.right - a && (t.scrollLeft += o), s && e.clientX < a ? window.scrollBy({
|
|
155
|
+
left: -o,
|
|
156
|
+
top: 0
|
|
157
|
+
}) : s && e.clientX > window.innerWidth - a && window.scrollBy({
|
|
158
|
+
left: o,
|
|
159
|
+
top: 0
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
function keyboardTargetIndex(e, t, n, r) {
|
|
163
|
+
let i = e.indexOf(t);
|
|
164
|
+
if (i < 0) return null;
|
|
165
|
+
let o = r === "vertical" ? "ArrowDown" : "ArrowRight", s = r === "vertical" ? "ArrowUp" : "ArrowLeft", c = a(n, o), l = a(n, s), u;
|
|
166
|
+
if (c) u = Math.min(e.length - 1, i + 1);
|
|
167
|
+
else if (l) u = Math.max(0, i - 1);
|
|
168
|
+
else if (a(n, "Home")) u = 0;
|
|
169
|
+
else if (a(n, "End")) u = e.length - 1;
|
|
170
|
+
else return null;
|
|
171
|
+
return u === i ? null : u;
|
|
172
|
+
}
|
|
173
|
+
function createSortableScope(t = {}) {
|
|
174
|
+
let n = {
|
|
175
|
+
active: null,
|
|
176
|
+
commitMove(e) {
|
|
177
|
+
notify("onMove", t.onMove, Object.freeze({
|
|
178
|
+
...e,
|
|
179
|
+
sourceBeforeIds: immutableIds(e.sourceBeforeIds),
|
|
180
|
+
sourceIds: immutableIds(e.sourceIds),
|
|
181
|
+
targetBeforeIds: immutableIds(e.targetBeforeIds),
|
|
182
|
+
targetIds: immutableIds(e.targetIds)
|
|
183
|
+
}));
|
|
184
|
+
},
|
|
185
|
+
disposables: /* @__PURE__ */ new Set(),
|
|
186
|
+
handles: /* @__PURE__ */ new Set(),
|
|
187
|
+
touch: null
|
|
188
|
+
}, r = e(() => {
|
|
189
|
+
n.touch?.dispose();
|
|
190
|
+
for (let e of [...n.disposables]) e();
|
|
191
|
+
n.disposables.clear(), n.handles.clear();
|
|
192
|
+
}), a = {
|
|
193
|
+
get disposalSignal() {
|
|
194
|
+
return r.disposalSignal;
|
|
195
|
+
},
|
|
196
|
+
dispose: r.dispose,
|
|
197
|
+
get disposed() {
|
|
198
|
+
return r.disposed;
|
|
199
|
+
},
|
|
200
|
+
get isDragging() {
|
|
201
|
+
return n.active !== null;
|
|
202
|
+
},
|
|
203
|
+
[o]: !0,
|
|
204
|
+
[Symbol.dispose]: r[Symbol.dispose]
|
|
205
|
+
};
|
|
206
|
+
return l.set(a, n), t.touch && (n.touch = i(t.touch === !0 ? {} : t.touch, (e) => {
|
|
207
|
+
if (n.active) return null;
|
|
208
|
+
for (let t of n.handles) {
|
|
209
|
+
let n = t.resolveTouchTarget(e);
|
|
210
|
+
if (n) return n;
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
213
|
+
})), a;
|
|
214
|
+
}
|
|
215
|
+
function createSortable(r) {
|
|
216
|
+
let { autoScroll: i = !0, axis: a = "vertical", element: o, getKey: l, handle: u, keyboard: d = !0, placeholderClass: f = "dnd-placeholder", scope: p = createSortableScope() } = r;
|
|
217
|
+
if (a !== "vertical" && a !== "horizontal") throw new n("axis must be \"vertical\" or \"horizontal\"");
|
|
218
|
+
let m = u?.trim() || null;
|
|
219
|
+
if ((u === void 0 || m) && m) try {
|
|
220
|
+
o.querySelector(m);
|
|
221
|
+
} catch (e) {
|
|
222
|
+
throw new n(`Invalid handle selector: "${u}"`, { cause: e });
|
|
223
|
+
}
|
|
224
|
+
let h = resolveAutoScrollOptions(i), g = getSortableScopeState(p);
|
|
225
|
+
if ([...g.handles].some((e) => e.element === o)) throw new n("A sortable is already registered for this element in the selected scope.");
|
|
226
|
+
let getItems = () => (r.items ? r.items() : Array.from(o.children)).filter((e) => e.parentElement === o && e.hasAttribute(c)), getOrderedIds = () => getItems().map((e) => l(e)), _ = /* @__PURE__ */ new Map(), v = o.getAttribute("role"), rememberElement = (e) => {
|
|
227
|
+
let t = _.get(e);
|
|
228
|
+
if (t) return t;
|
|
229
|
+
let n = {
|
|
230
|
+
dataDndHandle: e.getAttribute(s),
|
|
231
|
+
dataDndItem: e.getAttribute(c),
|
|
232
|
+
draggable: e.getAttribute("draggable"),
|
|
233
|
+
role: e.getAttribute("role"),
|
|
234
|
+
tabIndex: e.getAttribute("tabindex"),
|
|
235
|
+
touchAction: e.style.touchAction
|
|
236
|
+
};
|
|
237
|
+
return _.set(e, n), n;
|
|
238
|
+
}, restoreAttribute = (e, t, n) => {
|
|
239
|
+
n === null ? e.removeAttribute(t) : e.setAttribute(t, n);
|
|
240
|
+
}, syncItems = (e = getItems()) => {
|
|
241
|
+
e.forEach((e) => {
|
|
242
|
+
let t = rememberElement(e);
|
|
243
|
+
t.role === null && e.setAttribute("role", "listitem"), t.tabIndex === null && (e.tabIndex = 0), u === void 0 ? (e.setAttribute("draggable", "true"), g.touch && (e.style.touchAction = "none")) : m && e.querySelectorAll(m).forEach((e) => {
|
|
244
|
+
rememberElement(e), e.setAttribute(s, ""), e.setAttribute("draggable", "true"), g.touch && (e.style.touchAction = "none");
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
}, markItems = () => {
|
|
248
|
+
let e = /* @__PURE__ */ new Set(), t = r.items ? r.items() : Array.from(o.children), n = t.filter((e) => e instanceof HTMLElement && e.parentElement === o), i = [];
|
|
249
|
+
n.length, t.length;
|
|
250
|
+
for (let t of n) try {
|
|
251
|
+
let n = l(t);
|
|
252
|
+
if (n) {
|
|
253
|
+
if (e.has(n)) {
|
|
254
|
+
`${n}`;
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
e.add(n), i.push(t);
|
|
258
|
+
}
|
|
259
|
+
} catch (e) {
|
|
260
|
+
`${String(e)}`;
|
|
261
|
+
}
|
|
262
|
+
cleanupItems();
|
|
263
|
+
for (let e of i) rememberElement(e), e.setAttribute(c, "");
|
|
264
|
+
syncItems(i);
|
|
265
|
+
}, cleanupItems = () => {
|
|
266
|
+
for (let [e, t] of _) restoreAttribute(e, s, t.dataDndHandle), restoreAttribute(e, c, t.dataDndItem), restoreAttribute(e, "draggable", t.draggable), restoreAttribute(e, "role", t.role), restoreAttribute(e, "tabindex", t.tabIndex), e.style.touchAction = t.touchAction;
|
|
267
|
+
_.clear();
|
|
268
|
+
}, createPlaceholder = (e) => {
|
|
269
|
+
let t = document.createElement("div");
|
|
270
|
+
return t.className = f, t.setAttribute("aria-hidden", "true"), a === "horizontal" ? t.style.width = `${e.offsetWidth}px` : t.style.height = `${e.offsetHeight}px`, t;
|
|
271
|
+
}, y = {
|
|
272
|
+
commitReorder: (e) => notify("onReorder", r.onReorder, Object.freeze({
|
|
273
|
+
after: immutableIds(e.after),
|
|
274
|
+
before: immutableIds(e.before),
|
|
275
|
+
item: e.item
|
|
276
|
+
})),
|
|
277
|
+
element: o,
|
|
278
|
+
getOrderedIds,
|
|
279
|
+
getOrderedItems: getItems,
|
|
280
|
+
isDisabled: () => t(r.disabled),
|
|
281
|
+
notifyBeforeReorder: (e, t) => notify("onBeforeReorder", r.onBeforeReorder, e, t),
|
|
282
|
+
notifyDragEnd: (e, t) => notify("onDragEnd", r.onDragEnd, e, t),
|
|
283
|
+
notifyDragStart: (e, t) => notify("onDragStart", r.onDragStart, e, t),
|
|
284
|
+
notifyInteraction: (e) => notify("onInteraction", r.onInteraction, Object.freeze(e)),
|
|
285
|
+
resolveTouchTarget: (e) => {
|
|
286
|
+
if (t(r.disabled) || !o.contains(e)) return null;
|
|
287
|
+
let n = e.closest(`[${c}]`);
|
|
288
|
+
if (!n || !getItems().includes(n)) return null;
|
|
289
|
+
if (u === void 0) return n;
|
|
290
|
+
if (!m) return null;
|
|
291
|
+
let i = e.closest(m);
|
|
292
|
+
return i && n.contains(i) ? i : null;
|
|
293
|
+
}
|
|
294
|
+
}, handleDragStart = (e) => {
|
|
295
|
+
if (g.active || y.isDisabled()) return;
|
|
296
|
+
let t = e.target, n = t.closest(`[${c}]`);
|
|
297
|
+
if (!n || !getItems().includes(n)) return;
|
|
298
|
+
if (u !== void 0) {
|
|
299
|
+
let e = m ? t.closest(m) : null;
|
|
300
|
+
if (!e || !n.contains(e)) return;
|
|
301
|
+
}
|
|
302
|
+
let i = n.parentElement;
|
|
303
|
+
if (!i) return;
|
|
304
|
+
let a = createPlaceholder(n), o = n.nextSibling, s = l(n), d = /* @__PURE__ */ new Map();
|
|
305
|
+
d.set(y, y.getOrderedIds()), n.setAttribute("data-dragging", ""), i.insertBefore(a, o);
|
|
306
|
+
let f = {
|
|
307
|
+
draggedEl: n,
|
|
308
|
+
draggedId: s,
|
|
309
|
+
hideFrame: null,
|
|
310
|
+
initialOrders: d,
|
|
311
|
+
originalDisplay: n.style.display,
|
|
312
|
+
originalNextSibling: o,
|
|
313
|
+
originalParent: i,
|
|
314
|
+
placeholder: a,
|
|
315
|
+
source: y,
|
|
316
|
+
target: y
|
|
317
|
+
};
|
|
318
|
+
if ((!isTouchDragEvent(e) || e.__dndTouchPreview) && scheduleHide(f), g.active = f, e.dataTransfer) try {
|
|
319
|
+
if (e.dataTransfer.effectAllowed = "move", e.dataTransfer.setData("text/plain", s), r.dragImage) {
|
|
320
|
+
let t = typeof r.dragImage == "function" ? r.dragImage(s, n, e) : r.dragImage, [i, a] = r.dragImageOffset ?? [0, 0];
|
|
321
|
+
t && e.dataTransfer.setDragImage(t, i, a);
|
|
322
|
+
}
|
|
323
|
+
} catch (e) {
|
|
324
|
+
`${e instanceof Error ? e.message : String(e)}`;
|
|
325
|
+
}
|
|
326
|
+
y.notifyDragStart(f.draggedId, e), y.notifyInteraction({
|
|
327
|
+
index: y.getOrderedIds().indexOf(s),
|
|
328
|
+
itemId: s,
|
|
329
|
+
total: y.getOrderedIds().length,
|
|
330
|
+
type: "pickup"
|
|
331
|
+
});
|
|
332
|
+
}, handleDragOver = (e) => {
|
|
333
|
+
let t = g.active;
|
|
334
|
+
if (!t || t.source.isDisabled() || y.isDisabled()) return;
|
|
335
|
+
e.preventDefault(), maybeAutoScroll(e, o, a, h), snapshotOrder(t, y);
|
|
336
|
+
let { draggedEl: n, placeholder: r } = t, i = e.target.closest(`[${c}]`);
|
|
337
|
+
if (i && !getItems().includes(i)) return;
|
|
338
|
+
if (!i) {
|
|
339
|
+
r.parentElement !== o && o.appendChild(r), t.target = y;
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (i === n || i === r) return;
|
|
343
|
+
let s = i.getBoundingClientRect(), l = a === "vertical" ? e.clientY >= s.top + s.height / 2 : e.clientX >= s.left + s.width / 2;
|
|
344
|
+
o.insertBefore(r, l ? i.nextSibling : i), t.target = y;
|
|
345
|
+
}, handleDrop = (e) => {
|
|
346
|
+
let t = g.active;
|
|
347
|
+
t && (t.source.isDisabled() || y.isDisabled() || (e.preventDefault(), t.target = y));
|
|
348
|
+
}, handleDragEnd = (e) => {
|
|
349
|
+
g.active?.source === y && finishSession(g, e, !1);
|
|
350
|
+
}, handleKeydown = (e) => {
|
|
351
|
+
if (!d || y.isDisabled()) return;
|
|
352
|
+
let t = e.target, n = t?.closest(`[${c}]`);
|
|
353
|
+
if (!t || !n || !getItems().includes(n)) return;
|
|
354
|
+
let r = t.closest("input, textarea, select, button, a[href], [contenteditable]:not([contenteditable=\"false\"]), [role=\"button\"], [role=\"link\"]"), i = m ? t.closest(m) : null;
|
|
355
|
+
if (r && (!i || !n.contains(i))) return;
|
|
356
|
+
let s = getItems(), u = s.indexOf(n), f = keyboardTargetIndex(s, n, e, a);
|
|
357
|
+
if (f === null) return;
|
|
358
|
+
let p = s[f];
|
|
359
|
+
if (!p) return;
|
|
360
|
+
let h = s.map(l), g = [...s];
|
|
361
|
+
g.splice(u, 1), g.splice(f, 0, n);
|
|
362
|
+
let _ = g.map(l), v = l(n);
|
|
363
|
+
e.preventDefault(), y.notifyBeforeReorder(immutableIds(h), immutableIds(_)), o.insertBefore(n, f > u ? p.nextSibling : p), n.focus(), y.commitReorder({
|
|
364
|
+
after: _,
|
|
365
|
+
before: h,
|
|
366
|
+
item: v
|
|
367
|
+
}), y.notifyInteraction({
|
|
368
|
+
index: f,
|
|
369
|
+
itemId: v,
|
|
370
|
+
previousIndex: u,
|
|
371
|
+
total: _.length,
|
|
372
|
+
type: "move"
|
|
373
|
+
});
|
|
374
|
+
};
|
|
375
|
+
markItems();
|
|
376
|
+
let b, x = e(() => {
|
|
377
|
+
g.disposables.delete(x.dispose), g.active && (g.active.source === y || g.active.target === y) && !g.touch?.cancel() && finishSession(g, new Event("dragend"), !0), b?.(), g.handles.delete(y), restoreAttribute(o, "role", v), cleanupItems();
|
|
378
|
+
});
|
|
379
|
+
return g.handles.add(y), b = g.touch?.register(o), v === null && o.setAttribute("role", "list"), o.addEventListener("dragstart", handleDragStart, { signal: x.disposalSignal }), o.addEventListener("dragover", handleDragOver, { signal: x.disposalSignal }), o.addEventListener("drop", handleDrop, { signal: x.disposalSignal }), o.addEventListener("dragend", handleDragEnd, { signal: x.disposalSignal }), o.addEventListener("keydown", handleKeydown, { signal: x.disposalSignal }), g.disposables.add(x.dispose), {
|
|
380
|
+
get disposalSignal() {
|
|
381
|
+
return x.disposalSignal;
|
|
382
|
+
},
|
|
383
|
+
dispose: x.dispose,
|
|
384
|
+
get disposed() {
|
|
385
|
+
return x.disposed;
|
|
386
|
+
},
|
|
387
|
+
get isDragging() {
|
|
388
|
+
return g.active?.source === y;
|
|
389
|
+
},
|
|
390
|
+
[Symbol.dispose]: x[Symbol.dispose],
|
|
391
|
+
refresh: () => {
|
|
392
|
+
markItems();
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
function applyReorder(e, t, r) {
|
|
397
|
+
let i = /* @__PURE__ */ new Map();
|
|
398
|
+
for (let t of e) {
|
|
399
|
+
let e = r(t);
|
|
400
|
+
if (i.has(e)) throw new n(`Duplicate item key: "${e}"`);
|
|
401
|
+
i.set(e, t);
|
|
402
|
+
}
|
|
403
|
+
let a = [];
|
|
404
|
+
for (let e of t) {
|
|
405
|
+
if (!i.has(e)) continue;
|
|
406
|
+
let t = i.get(e);
|
|
407
|
+
a.push(t), i.delete(e);
|
|
408
|
+
}
|
|
409
|
+
for (let e of i.values()) a.push(e);
|
|
410
|
+
return a;
|
|
411
|
+
}
|
|
412
|
+
//#endregion
|
|
413
|
+
export { n as DndError, r as DndScopeError, applyReorder, createSortable, createSortableScope };
|
|
414
|
+
|
|
2
415
|
//# sourceMappingURL=sortable.js.map
|