export default JSort; /** * Small yet powerful drag and drop sortable library with touch support, smooth animations, for a great UX. * @class JSort * @author Roko C. Buljan * @license MIT * @see {@link https://github.com/rokobuljan/jsort} */ declare class JSort { /** @type {string} */ static version: string; /** * @constructor * @param {HTMLElement} el * @param {Object} [options] * @param {string} [options.group=""] Link-group parents i.e: "group-a" * @param {boolean} [options.swap=false] Swap items mode (Swap elements on drop) * @param {number} [options.duration=420] Ms items animation duration * @param {string} [options.easing="cubic-bezier(0.6, 0, 0.6, 1)"] Items animation easing * @param {number} [options.scale=1.1] Ghost element scale * @param {number} [options.opacity=0.8] Ghost element opacity * @param {number} [options.grabTimeout=140] Ms before grab is considered instead of scroll on touch devices (has no effect for mouse Event) * @param {boolean} [options.parentDrop=true] Can drop item onto parent * @param {number} [options.moveThreshold=0] Px before it's considered a pointer drag (Allows to click inner links, buttons, inputs, etc) * @param {number} [options.scrollThreshold=8] Px before it's considered a scroll * @param {number} [options.edgeThreshold=50] Pixels from edge to start parent auto-scrolling * @param {number} [options.scrollSpeed=10] Scroll pixels per frame while ghost is near parent edge * @param {number} [options.zIndex=2147483647] Maximum 32-bit signed integer * @param {string} [options.selectorParent=".jsort"] Selector for parent elements * @param {string} [options.selectorItems="*"] Selector for parent's immediate sortable children * @param {string} [options.selectorItemsIgnore=".jsort-ignore"] Selector for ignored immediate children * @param {string} [options.selectorHandler=".jsort.handler"] Selector for handler elements * @param {string} [options.selectorIgnoreTarget=""] Selector for ignoring specific item's descendant elements (closest to pointer target) * @param {string} [options.selectorIgnoreFields=""] Selector for ignoring specific item's descendant action fields elements like buttons, inputs, textarea, etc. * @param {string} [options.classGhost="is-jsort-ghost"] Class name for ghost element * @param {string} [options.classActive="is-jsort-active"] Class name for item on mousedown, pointerdown * @param {string} [options.classTouch="is-jsort-touch"] Class name for item on touchstart event only * @param {string} [options.classGrab="is-jsort-grab"] Class name for grabbed item * @param {string} [options.classTarget="is-jsort-target"] Class name for hovered element (either item or Sort parent) * @param {string} [options.classAnimated="is-jsort-animated"] Class name for all animated elements (on drop) * @param {string} [options.classAnimatedDrop="is-jsort-animated-drop"] Class name for the animated grabbed element (on drop) * @param {string} [options.classInvalid="is-jsort-invalid"] Class name for invalid item * @param {function} [options.onBeforeGrab=(data) => {}] Callback function called before grab (return false to cancel grab) * @param {function} [options.onGrab=(data) => {}] Callback function called after grab * @param {function} [options.onMove=(data) => {}] Callback function called on move * @param {function} [options.onBeforeDrop=(data) => {}] Callback function called before drop (return false to cancel drop) * @param {function} [options.onDrop=(data) => {}] Callback function called after drop * @param {function} [options.onAnimationEnd=() => {}] Callback function called when animation ends */ constructor(el: HTMLElement, options?: { group?: string; swap?: boolean; duration?: number; easing?: string; scale?: number; opacity?: number; grabTimeout?: number; parentDrop?: boolean; moveThreshold?: number; scrollThreshold?: number; edgeThreshold?: number; scrollSpeed?: number; zIndex?: number; selectorParent?: string; selectorItems?: string; selectorItemsIgnore?: string; selectorHandler?: string; selectorIgnoreTarget?: string; selectorIgnoreFields?: string; classGhost?: string; classActive?: string; classTouch?: string; classGrab?: string; classTarget?: string; classAnimated?: string; classAnimatedDrop?: string; classInvalid?: string; onBeforeGrab?: Function; onGrab?: Function; onMove?: Function; onBeforeDrop?: Function; onDrop?: Function; onAnimationEnd?: Function; }); /** @type {string} selectorParent + selectorItems*/ selectorItemsFull: string; /** @type {HTMLElement | null} */ elGhost: HTMLElement | null; /** @type {HTMLElement | null} */ elGrab: HTMLElement | null; /** @type {HTMLElement | null} */ elTarget: HTMLElement | null; /** @type {HTMLElement | null} */ elDrop: HTMLElement | null; /** @type {HTMLElement | null} */ elDropParent: HTMLElement | null; /** @type {number} */ indexGrab: number; /** @type {number} */ indexDrop: number; /** @type {HTMLElement[]} */ affectedElements: HTMLElement[]; /** @type {HTMLElement | null} */ scrollParent: HTMLElement | null; /** @type {string | null} */ scrollDirection: string | null; /** @type {null | { start: Function, stop: Function, tick: Function }} */ scrollAnim: null | { start: Function; stop: Function; tick: Function; }; /** @type {number} */ edgePressure: number; /** @type {number | undefined} */ moveTimeout: number | undefined; /** @type {boolean} */ isScrollPrevented: boolean; /** @type {boolean} */ hasPointerMoved: boolean; /** @type {boolean} */ hasTouchMoved: boolean; /** @type {boolean} - If we should remove jsort class from parent on destroy */ destroyParentClass: boolean; /** @type {null | { clientX: number, clientY: number }} */ pointerGrab: null | { clientX: number; clientY: number; }; /** @type {null | { clientX: number, clientY: number }} */ touchStart: null | { clientX: number; clientY: number; }; elGrabParent: HTMLElement; group: string; swap: boolean; duration: number; easing: string; scale: number; opacity: number; grabTimeout: number; parentDrop: boolean; moveThreshold: number; scrollThreshold: number; edgeThreshold: number; scrollSpeed: number; zIndex: number; selectorParent: string; selectorItems: string; selectorItemsIgnore: string; selectorHandler: string; selectorIgnoreTarget: string; selectorIgnoreFields: string; classGhost: string; classActive: string; classTouch: string; classGrab: string; classTarget: string; classAnimated: string; classAnimatedDrop: string; classInvalid: string; onBeforeGrab: () => void; onGrab: () => void; onMove: () => void; onBeforeDrop: () => void; onDrop: () => void; onAnimationEnd: () => void; /** * Get Array of all child elements (ignores .is-jsort-ghost element, if present) * @param {HTMLElement} elParent * @returns {HTMLElement[]} */ getChildren(elParent: HTMLElement): HTMLElement[]; /** * Parse `data-jsort` attribute * @param {HTMLElement} el * @returns {Object} */ parseDataAttribute(el: HTMLElement): any; /** * Check if touch or pointer move distance is significant * @param {Object} startXY {clientX, clientY} start * @param {Object} currentXY {clientX, clientY} current * @param {number} distance Distance in px * @returns {boolean} */ isSignificantMove(startXY: any, currentXY: any, distance: number): boolean; /** * Append ghost element to grab's parent * @returns {void} */ insertGhost(): void; /** * Remove ghost element * @returns {void} */ removeGhost(): void; /** * Animate item to new position * @param {Object} data * @param {Element} data.el - the Element to animate * @param {number} data.x - the new X position * @param {number} data.y - the new Y position * @returns {Animation|undefined} */ animateItem({ el, x, y }: { el: Element; x: number; y: number; }): Animation | undefined; /** * Find closest element (similar to Element.closest() but without selector string) * If not found, returns null, meaning el was not a descendant of elTarget, or elTarget itself * @param {Element|null} el * @param {Element|null} elTarget * @returns {Element|null} */ closestElement(el: Element | null, elTarget: Element | null): Element | null; /** * Check if drop is valid by the given coordinates * @param {Object} data * @param {number} [data.clientX] * @param {number} [data.clientY] * @param {HTMLElement} [data.el] * @returns {boolean} true if can be dropped at coordinates */ checkValidity({ clientX, clientY, el }: { clientX?: number; clientY?: number; el?: HTMLElement; }): boolean; /** * Create reusable animation engine * @param {Function} cb callback function * @param {number} fps desired FPS target (60 frames per second by default) * @returns {Object} { start, stop, tick } methods */ engine(cb: Function, fps?: number): any; /** * Find closest scrollable element * @param {Element|null|undefined} el Start element * @returns {Element} Scrollable element */ findScrollParent(el: Element | null | undefined): Element; /** * Scroll parent element given a this.scrollDirection * @returns {void} */ scrollStep(): void; /** * Start edge scroll engine * @param {string} direction */ startEdgeScroll(direction: string): void; /** * Stop edge scroll engine */ stopEdgeScroll(): void; /** * Handle parent scroll depending on the position od the dragged item * in regards to the closest scrollable parent's edges * @param {PointerEvent} ev */ handleScrollParent(ev: PointerEvent): void; /** * Insert elItem into this JSort parent * @param {HTMLElement} elGrab * @param {HTMLElement} elTarget * @returns {boolean} True if insertion was successful */ insert(elGrab: HTMLElement, elTarget: HTMLElement): boolean; /** * Grab an item * @param {PointerEvent} ev */ grab: (ev: PointerEvent) => void; /** * Move an item * @param {PointerEvent} ev */ move: (ev: PointerEvent) => void; /** * Called when an item is dropped on pointerUp * @param {PointerEvent} ev */ drop: (ev: PointerEvent) => void; _currentEvent: PointerEvent; /** * Handle touch start event - used for scroll-intent * @param {TouchEvent} ev */ handleTouchStart: (ev: TouchEvent) => void; /** * Handle touch move event - used for scroll-intent * @param {TouchEvent} ev */ handleTouchMove: (ev: TouchEvent) => void; /** * Just like Array.sort() but animated * @param {(a: HTMLElement, b: HTMLElement) => number} fn * @returns {HTMLElement[]} Sorted items */ sort(fn: (a: HTMLElement, b: HTMLElement) => number): HTMLElement[]; /** * Reset, cleanup internal-use properties * @returns {void} */ reset(): void; /** * Initialize: pass user options or data attr to constructor, and attach events * @param {Object} options */ init(options: any): void; /** * Destroy: remove event listeners */ destroy(): void; }