20 lines
11 KiB
JavaScript
20 lines
11 KiB
JavaScript
|
"use strict";/**
|
|||
|
* @name hotline.mjs
|
|||
|
*
|
|||
|
* @description
|
|||
|
* Module for creating "hot lines"
|
|||
|
*
|
|||
|
* @class
|
|||
|
* @public
|
|||
|
*
|
|||
|
* @example
|
|||
|
* сonst instance = new hotline(shell);
|
|||
|
* instance.step = '-5';
|
|||
|
* instance.start();
|
|||
|
*
|
|||
|
* {@link https://git.mirzaev.sexy/mirzaev/hotline.mjs}
|
|||
|
*
|
|||
|
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
|||
|
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
|||
|
*/
|
|||
|
export default class hotline{#e;#t={};#s={};#n=null;#i=null;interval=10;alive=!0;#l=!1;#r="false";get moving(){return this.#r}movable=!0;wheel=!1;delta=30;button=0;hover=!0;step=1;transfer=!0;#o=!0;sticky=!1;#a=Object.freeze({beginning:Symbol("beginning"),center:Symbol("center"),end:Symbol("end")});get magnetism(){return this.#a}magnetic=null;magnet=1;vertical=!1;observe=!1;#h=null;events=new Map([["ready",!1],["started",!1],["stopped",!1],["configured",!1],["move",!1],["move.mouse",!1],["move.touch",!1],["move.freezed",!1],["move.unfreezed",!1],["moved.forward",!1],["moved.backward",!1],["offset",!1],["transfer.beginning",!0],["transfer.end",!0],["observer.started",!1],["observer.stopped",!1]]);#m=new Set(["events"]);#v=new Map;constructor(e,t=!1){e instanceof HTMLElement&&(this.#e=e,t&&(this.#e.hotline=this),this.#e.childElementCount>1&&(this.#n="ready",this.events.get("ready")&&this.#e.dispatchEvent(new CustomEvent("hotline.ready"))))}start(){if(null===this.#i){const e=this;this.#i=setInterval((()=>{e.#t.element=e.#e.firstElementChild,e.#t.rectangle=e.#t.element.getBoundingClientRect(),e.vertical?(e.#t.position=parseFloat(e.#t.element.style.marginTop)||0,e.#t.offset=parseFloat(getComputedStyle(e.#t.element).marginBottom)||0,e.#t.end=e.#t.rectangle.y+e.#t.rectangle.height+e.#t.offset):(e.#t.position=parseFloat(e.#t.element.style.marginLeft)||0,e.#t.offset=parseFloat(getComputedStyle(e.#t.element).marginRight)||0,e.#t.end=e.#t.rectangle.x+e.#t.rectangle.width+e.#t.offset),e.vertical&&Math.round(e.#t.end)<e.#e.offsetTop||!e.vertical&&Math.round(e.#t.end)<e.#e.offsetLeft?!0===e.transfer&&e.#o&&(e.#e.appendChild(e.#t.element),e.vertical?(e.#t.element.style.marginTop=null,e.events.get("transfer.end")&&e.#e.dispatchEvent(new CustomEvent("hotline.transfer.end",{detail:{element:e.#t.element,offset:-(e.#t.rectangle.height+e.#t.offset)}})),e.#t={}):(e.#t.element.style.marginLeft=null,e.events.get("transfer.end")&&e.#e.dispatchEvent(new CustomEvent("hotline.transfer.end",{detail:{element:e.#t.element,offset:-(e.#t.rectangle.width+e.#t.offset)}})),e.#t={})):e.vertical&&Math.round(e.#t.rectangle.y)>e.#e.offsetTop||!e.vertical&&Math.round(e.#t.rectangle.x)>e.#e.offsetLeft?!0===e.transfer&&e.#o&&(e.#s.element=e.#e.lastElementChild,e.#s.rectangle=e.#s.element.getBoundingClientRect(),e.#e.insertBefore(e.#s.element,e.#t.element),e.vertical?(e.#s.offset=parseFloat(getComputedStyle(e.#s.element).marginBottom)||e.#t.offset||0,e.events.get("transfer.beginning")&&e.#e.dispatchEvent(new CustomEvent("hotline.transfer.beginning",{detail:{element:e.#s.element,offset:e.#s.rectangle.height+e.#s.offset}})),e.#s.element.style.marginTop=-e.#s.rectangle.height-e.#s.offset+"px",e.#t.element.style.marginTop=null,e.#t={}):(e.#s.offset=parseFloat(getComputedStyle(e.#s.element).marginRight)||e.#t.offset||0,e.events.get("transfer.beginning")&&e.#e.dispatchEvent(new CustomEvent("hotline.transfer.beginning",{detail:{element:e.#s.element,offset:e.#s.rectangle.width+e.#s.offset}})),e.#s.element.style.marginLeft=-e.#s.rectangle.width-e.#s.offset+"px",e.#t.element.style.marginLeft=null,e.#t={})):!0===this.alive&&!1===this.#l&&e.move()}),e.interval),this.hover?(this.#v.set("hover",(t=>{e.#l=!0,e.events.get("moving.freezed")&&e.#e.dispatchEvent(new CustomEvent("hotline.moving.freezed",{detail:{event:t}}))})),this.#e.addEventListener("mouseover",this.#v.get("hover"))):(this.#e.removeEventListener("mouseover",this.#v.get("hover")),this.#v.delete("hover")),this.wheel?(this.#v.set("wheel",(t=>{"started"===e.#n&&e.position((parseFloat(e.#e.firstElementChild.style[e.vertical?"marginTop":"marginLeft"])||0)+(null===e.delta?t.wheelDelta:t.wheelDelta>0?e.delta:-e.delta))})),this.#e.addEventListener("wheel",this.#v.get("wheel"))):(this.#e.removeEventListener("wheel",this.#v.get("wheel")),this.#v.delete("wheel"));let t=0;const s=function(e){t+=e.detail.offset??0};e.movable?(e.#v.set("move.start",(n=>{if("touchstart"===n.type||n.button===e.button){e.#l=!0,e.events.get("moving.freezed")&&e.#e.dispatchEvent(new CustomEvent("hotline.moving.freezed",{detail:{event:n}}));const i=n.
|