diff --git a/.gitignore b/.gitignore index 47a7eba..fddb859 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ node_modules/ *.DS_Store .DS_Store doc/ -dist/ + release/ npm-debug.log* coverage/ diff --git a/dist/selecto.cjs.js b/dist/selecto.cjs.js new file mode 100644 index 0000000..b10ebfa --- /dev/null +++ b/dist/selecto.cjs.js @@ -0,0 +1,1059 @@ +/* +Copyright (c) 2020 Daybrush +name: selecto +license: MIT +author: Daybrush +repository: git+https://github.com/daybrush/selecto.git +version: 1.6.1 +*/ +'use strict'; + +var Component = require('@egjs/component'); +var Dragger = require('@daybrush/drag'); +var frameworkUtils = require('framework-utils'); +var utils = require('@daybrush/utils'); +var ChildrenDiffer = require('@egjs/children-differ'); +var DragScroll = require('@scena/dragscroll'); +var KeyController = require('keycon'); +var styled = require('css-styled'); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ + +/* global Reflect, Promise */ +var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} +var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + + return t; + }; + + return __assign.apply(this, arguments); +}; +function __rest(s, e) { + var t = {}; + + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; + + if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; + } + return t; +} +function __decorate(decorators, target, key, desc) { + var c = arguments.length, + r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, + d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} +function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + + for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; + + return r; +} + +function getClient(e) { + if ("touches" in e) { + var touch = e.touches[0] || e.changedTouches[0]; + return { + clientX: touch.clientX, + clientY: touch.clientY + }; + } else { + return { + clientX: e.clientX, + clientY: e.clientY + }; + } +} +function createElement(jsx, prevTarget, container) { + var tag = jsx.tag, + children = jsx.children, + attributes = jsx.attributes, + className = jsx.className, + style = jsx.style; + var el = prevTarget || document.createElement(tag); + + for (var name in attributes) { + el.setAttribute(name, attributes[name]); + } + + var elChildren = el.children; + children.forEach(function (child, i) { + createElement(child, elChildren[i], el); + }); + + if (className) { + className.split(" ").forEach(function (name) { + if (!utils.hasClass(el, name)) { + utils.addClass(el, name); + } + }); + } + + if (style) { + var elStyle = el.style; + + for (var name in style) { + elStyle[name] = style[name]; + } + } + + if (!prevTarget && container) { + container.appendChild(el); + } + + return el; +} +function h(tag, attrs) { + var children = []; + + for (var _i = 2; _i < arguments.length; _i++) { + children[_i - 2] = arguments[_i]; + } + + var _a = attrs || {}, + _b = _a.className, + className = _b === void 0 ? "" : _b, + _c = _a.style, + style = _c === void 0 ? {} : _c, + attributes = __rest(_a, ["className", "style"]); + + return { + tag: tag, + className: className, + style: style, + attributes: attributes, + children: children + }; +} +function diffValue(prev, cur, func) { + if (prev !== cur) { + func(prev, cur); + } +} +function getRect(e, ratio) { + var _a = e.distX, + distX = _a === void 0 ? 0 : _a, + _b = e.distY, + distY = _b === void 0 ? 0 : _b; + var _c = e.datas, + startX = _c.startX, + startY = _c.startY; + + if (ratio > 0) { + var nextHeight = Math.sqrt((distX * distX + distY * distY) / (1 + ratio * ratio)); + var nextWidth = ratio * nextHeight; + distX = (distX >= 0 ? 1 : -1) * nextWidth; + distY = (distY >= 0 ? 1 : -1) * nextHeight; + } + + var tx = Math.min(0, distX); + var ty = Math.min(0, distY); // h ^ 2 + (ratio * h) ^ 2 = dist + // (1 + ratio ^ 2) * h^2 = dist ^ 2 + // dist * Math.atan(ratio); + + var width = Math.abs(distX); + var height = Math.abs(distY); + var left = startX + tx; + var top = startY + ty; + return { + left: left, + top: top, + right: left + width, + bottom: top + height, + width: width, + height: height + }; +} + +var injector = styled("\n:host {\n position: fixed;\n display: none;\n border: 1px solid #4af;\n background: rgba(68, 170, 255, 0.5);\n z-index: 100;\n}\n"); +/** + * @memberof Selecto + */ + +var CLASS_NAME = "selecto-selection " + injector.className; +var PROPERTIES = ["selectableTargets", "selectByClick", "selectFromInside", "continueSelect", "toggleContinueSelect", "keyContainer", "hitRate", "scrollOptions", "checkInput", "preventDefault", "ratio"]; +/** + * @memberof Selecto + */ + +var OPTIONS = __spreadArrays([// ignore target, container, +"dragContainer", "cspNonce"], PROPERTIES); +var OPTION_TYPES = { + target: null, + container: null, + dragContainer: null, + selectableTargets: Array, + selectByClick: Boolean, + selectFromInside: Boolean, + continueSelect: Boolean, + toggleContinueSelect: Array, + keyContainer: null, + hitRate: Number, + scrollOptions: Object, + checkInput: Boolean, + preventDefault: Boolean, + cspNonce: String, + ratio: Number +}; +/** + * @memberof Selecto + */ + +var EVENTS = ["dragStart", "drag", "dragEnd", "selectStart", "select", "selectEnd", "keydown", "keyup", "scroll"]; +/** + * @memberof Selecto + */ + +var METHODS = ["clickTarget", "setSelectedTargets", "triggerDragStart"]; + +/** + * Selecto.js is a component that allows you to select elements in the drag area using the mouse or touch. + * @sort 1 + * @extends eg.Component + */ + +var Selecto = +/*#__PURE__*/ +function (_super) { + __extends(Selecto, _super); + /** + * + */ + + + function Selecto(options) { + if (options === void 0) { + options = {}; + } + + var _this = _super.call(this) || this; + + _this.selectedTargets = []; + _this.differ = new ChildrenDiffer(); + _this.dragScroll = new DragScroll(); + + _this.onDragStart = function (e, clickedTarget) { + var datas = e.datas, + clientX = e.clientX, + clientY = e.clientY, + inputEvent = e.inputEvent; + var _a = _this.options, + continueSelect = _a.continueSelect, + selectFromInside = _a.selectFromInside, + selectByClick = _a.selectByClick; + + var selectableTargets = _this.getSelectableTargets(); + + var selectableRects = selectableTargets.map(function (target) { + var rect = target.getBoundingClientRect(); + var left = rect.left, + top = rect.top, + width = rect.width, + height = rect.height; + return { + left: left, + top: top, + right: left + width, + bottom: top + height, + width: width, + height: height + }; + }); + datas.selectableTargets = selectableTargets; + datas.selectableRects = selectableRects; + datas.startSelectedTargets = _this.selectedTargets; + var hitRect = { + left: clientX, + top: clientY, + right: clientX, + bottom: clientY, + width: 0, + height: 0 + }; + var firstPassedTargets = []; + + if (selectFromInside || selectByClick) { + var pointTarget = clickedTarget || document.elementFromPoint(clientX, clientY); + + while (pointTarget) { + if (selectableTargets.indexOf(pointTarget) > -1) { + break; + } + + pointTarget = pointTarget.parentElement; + } + + firstPassedTargets = pointTarget ? [pointTarget] : []; + } + + var hasInsideTargets = firstPassedTargets.length > 0; + var isPreventSelect = !selectFromInside && hasInsideTargets; + + if (isPreventSelect && !selectByClick) { + return false; + } + + var type = inputEvent.type; + var isTrusted = type === "mousedown" || type === "touchstart"; + /** + * When the drag starts, the dragStart event is called. + * Call the stop () function if you have a specific element or don't want to raise a select + * @memberof Selecto + * @event dragStart + * @param {OnDragStart} - Parameters for the dragStart event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("dragStart", e => { + * if (e.inputEvent.target.tagName === "SPAN") { + * e.stop(); + * } + * }).on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + var result = isTrusted ? _this.trigger("dragStart", e) : true; + + if (!result) { + return false; + } + + if (!continueSelect) { + _this.selectedTargets = []; + } else { + firstPassedTargets = _this.passSelectedTargets(firstPassedTargets); + } + + _this.select(firstPassedTargets, hitRect, inputEvent, true); + + datas.startX = clientX; + datas.startY = clientY; + datas.selectedTargets = firstPassedTargets; + _this.target.style.cssText += "left:0px;top:0px;transform: translate(" + clientX + "px, " + clientY + "px)"; + + if (isPreventSelect && selectByClick) { + _this.onDragEnd(e); + + inputEvent.preventDefault(); + return false; + } else { + if (type === "touchstart") { + inputEvent.preventDefault(); + } + + var scrollOptions = _this.options.scrollOptions; + + if (scrollOptions && scrollOptions.container) { + _this.dragScroll.dragStart(e, scrollOptions); + } + + return true; + } + }; + + _this.onDrag = function (e) { + var scrollOptions = _this.options.scrollOptions; + + if (scrollOptions && scrollOptions.container) { + if (_this.dragScroll.drag(e, scrollOptions)) { + return; + } + } + + _this.check(e); + }; + + _this.onDragEnd = function (e) { + var datas = e.datas; + var rect = getRect(e, _this.options.ratio); + + _this.dragScroll.dragEnd(); + + _this.target.style.cssText += "display: none;"; + + _this.trigger("dragEnd", __assign(__assign({}, e), { + rect: rect + })); + + _this.selectEnd(datas.startSelectedTargets, datas.selectedTargets, rect, e); + + _this.selectedTargets = datas.selectedTargets; + }; + + _this.onKeyDown = function (e) { + if (!_this.sameCombiKey(e)) { + return; + } + + _this.continueSelect = true; + /** + * When you keydown the key you specified in toggleContinueSelect, the keydown event is called. + * @memberof Selecto + * @event keydown + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * toggleContinueSelect: "shift"; + * keyContainer: window, + * }); + * + * selecto.on("keydown", () => { + * document.querySelector(".button").classList.add("selected"); + * }).on("keyup", () => { + * document.querySelector(".button").classList.remove("selected"); + * }).on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + _this.trigger("keydown", {}); + }; + + _this.onKeyUp = function (e) { + if (!_this.sameCombiKey(e)) { + return; + } + + _this.continueSelect = false; + /** + * When you keyup the key you specified in toggleContinueSelect, the keyup event is called. + * @memberof Selecto + * @event keyup + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * toggleContinueSelect: "shift"; + * keyContainer: window, + * }); + * + * selecto.on("keydown", () => { + * document.querySelector(".button").classList.add("selected"); + * }).on("keyup", () => { + * document.querySelector(".button").classList.remove("selected"); + * }).on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + _this.trigger("keyup", {}); + }; + + _this.onBlur = function () { + if (_this.toggleContinueSelect && _this.continueSelect) { + _this.trigger("keyup", {}); + } + }; + + _this.onDocumentSelectStart = function (e) { + if (!_this.dragger.isFlag()) { + return; + } + + var dragContainer = _this.dragContainer; + + if (dragContainer === window) { + dragContainer = document.documentElement; + } + + var containers = dragContainer instanceof Element ? [dragContainer] : [].slice.call(dragContainer); + var target = e.target; + containers.some(function (container) { + if (container === target || container.contains(target)) { + e.preventDefault(); + return true; + } + }); + }; + + _this.target = options.target; + _this.container = options.container; + _this.options = __assign({ + target: null, + container: null, + dragContainer: null, + selectableTargets: [], + selectByClick: true, + selectFromInside: true, + hitRate: 100, + continueSelect: false, + toggleContinueSelect: null, + keyContainer: null, + scrollOptions: undefined, + checkInput: false, + preventDefault: false, + cspNonce: "", + ratio: 0 + }, options); + + _this.initElement(); + + _this.initDragScroll(); + + _this.setKeyController(); + + return _this; + } + /** + * You can set the currently selected targets. + */ + + + var __proto = Selecto.prototype; + + __proto.setSelectedTargets = function (selectedTargets) { + this.selectedTargets = selectedTargets; + this.differ = new ChildrenDiffer(selectedTargets); + return this; + }; + /** + * You can get the currently selected targets. + */ + + + __proto.getSelectedTargets = function () { + return this.selectedTargets; + }; + + __proto.setKeyContainer = function (keyContainer) { + var _this = this; + + var options = this.options; + diffValue(options.keyContainer, keyContainer, function () { + options.keyContainer = keyContainer; + + _this.setKeyController(); + }); + }; + + __proto.setToggleContinueSelect = function (toggleContinueSelect) { + var _this = this; + + var options = this.options; + diffValue(options.toggleContinueSelect, toggleContinueSelect, function () { + options.toggleContinueSelect = toggleContinueSelect; + + _this.setKeyEvent(); + }); + }; + + __proto.setPreventDefault = function (value) { + this.dragger.options.preventDefault = value; + }; + + __proto.setCheckInput = function (value) { + this.dragger.options.checkInput = value; + }; + /** + * `OnDragStart` is triggered by an external event. + * @param - external event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto(); + * + * window.addEventListener("mousedown", e => { + * selecto.triggerDragStart(e); + * }); + */ + + + __proto.triggerDragStart = function (e) { + this.dragger.triggerDragStart(e); + return this; + }; + /** + * Destroy elements, properties, and events. + */ + + + __proto.destroy = function () { + this.off(); + this.keycon && this.keycon.destroy(); + this.dragger.unset(); + this.injectResult.destroy(); + utils.removeEvent(document, "selectstart", this.onDocumentSelectStart); + this.keycon = null; + this.dragger = null; + this.injectResult = null; + this.target = null; + this.container = null; + this.options = null; + }; + /** + * External click or mouse events can be applied to the selecto. + * @params - Extenal click or mouse event + * @params - Specify the clicked target directly. + */ + + + __proto.clickTarget = function (e, clickedTarget) { + var _a = getClient(e), + clientX = _a.clientX, + clientY = _a.clientY; + + var dragEvent = { + datas: {}, + clientX: clientX, + clientY: clientY, + inputEvent: e + }; + + if (this.onDragStart(dragEvent, clickedTarget)) { + this.onDragEnd(dragEvent); + } + + return this; + }; + + __proto.setKeyController = function () { + var _a = this.options, + keyContainer = _a.keyContainer, + toggleContinueSelect = _a.toggleContinueSelect; + + if (this.keycon) { + this.keycon.destroy(); + this.keycon = null; + } + + if (toggleContinueSelect) { + this.keycon = new KeyController(keyContainer || window); + this.keycon.keydown(this.onKeyDown).keyup(this.onKeyUp).on("blur", this.onBlur); + } + }; + + __proto.setKeyEvent = function () { + var toggleContinueSelect = this.options.toggleContinueSelect; + + if (!toggleContinueSelect || this.keycon) { + return; + } + + this.setKeyController(); + }; + + __proto.initElement = function () { + this.target = createElement(h("div", { + className: CLASS_NAME + }), this.target, this.container); + var target = this.target; + var _a = this.options, + dragContainer = _a.dragContainer, + checkInput = _a.checkInput, + preventDefault = _a.preventDefault; + this.dragContainer = typeof dragContainer === "string" ? [].slice.call(document.querySelectorAll(dragContainer)) : this.options.dragContainer || this.target.parentNode; + this.dragger = new Dragger(this.dragContainer, { + container: window, + checkInput: checkInput, + preventDefault: preventDefault, + dragstart: this.onDragStart, + drag: this.onDrag, + dragend: this.onDragEnd + }); + utils.addEvent(document, "selectstart", this.onDocumentSelectStart); + this.injectResult = injector.inject(target, { + nonce: this.options.cspNonce + }); + }; + + __proto.hitTest = function (selectRect, clientX, clientY, targets, rects) { + var _a = this.options, + hitRate = _a.hitRate, + selectByClick = _a.selectByClick; + var left = selectRect.left, + top = selectRect.top, + right = selectRect.right, + bottom = selectRect.bottom; + return targets.filter(function (target, i) { + var _a = rects[i], + rectLeft = _a.left, + rectTop = _a.top, + rectRight = _a.right, + rectBottom = _a.bottom; + var isStart = rectLeft <= clientX && clientX <= rectRight && rectTop <= clientY && clientY <= rectBottom; + var rectSize = (rectRight - rectLeft) * (rectBottom - rectTop); + var testLeft = Math.max(rectLeft, left); + var testRight = Math.min(rectRight, right); + var testTop = Math.max(rectTop, top); + var testBottom = Math.min(rectBottom, bottom); + + if (selectByClick && isStart) { + return true; + } + + if (testRight < testLeft || testBottom < testTop) { + return false; + } + + var rate = Math.round((testRight - testLeft) * (testBottom - testTop) / rectSize * 100); + + if (rate >= hitRate) { + return true; + } + + return false; + }); + }; + + __proto.initDragScroll = function () { + var _this = this; + + this.dragScroll.on("scroll", function (_a) { + var container = _a.container, + direction = _a.direction; + + _this.trigger("scroll", { + container: container, + direction: direction + }); + }).on("move", function (_a) { + var offsetX = _a.offsetX, + offsetY = _a.offsetY, + inputEvent = _a.inputEvent; + var datas = inputEvent.datas; + datas.startX -= offsetX; + datas.startY -= offsetY; + datas.selectableRects.forEach(function (rect) { + rect.top -= offsetY; + rect.bottom -= offsetY; + rect.left -= offsetX; + rect.right -= offsetX; + }); + + _this.dragger.scrollBy(offsetX, offsetY, inputEvent.inputEvent, false); + + inputEvent.distX += offsetX; + inputEvent.distY += offsetY; + + _this.check(inputEvent); + }); + }; + + __proto.getSelectableTargets = function () { + var selectableTargets = []; + this.options.selectableTargets.forEach(function (target) { + if (utils.isObject(target)) { + selectableTargets.push(target); + } else { + var elements = [].slice.call(document.querySelectorAll(target)); + elements.forEach(function (el) { + selectableTargets.push(el); + }); + } + }); + return selectableTargets; + }; + + __proto.passSelectedTargets = function (passedTargets) { + var _a = ChildrenDiffer.diff(this.selectedTargets, passedTargets), + list = _a.list, + prevList = _a.prevList, + added = _a.added, + removed = _a.removed; + + return added.map(function (index) { + return list[index]; + }).concat(removed.map(function (index) { + return prevList[index]; + })); + }; + + __proto.select = function (selectedTargets, rect, inputEvent, isStart) { + var _a = this.differ.update(selectedTargets), + added = _a.added, + removed = _a.removed, + prevList = _a.prevList, + list = _a.list; + + if (isStart) { + /** + * When the select(drag) starts, the selectStart event is called. + * @memberof Selecto + * @event selectStart + * @param {Selecto.OnSelect} - Parameters for the selectStart event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("selectStart", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }).on("selectEnd", e => { + * e.afterAdded.forEach(el => { + * el.classList.add("selected"); + * }); + * e.afterRemoved.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + this.trigger("selectStart", { + selected: selectedTargets, + added: added.map(function (index) { + return list[index]; + }), + removed: removed.map(function (index) { + return prevList[index]; + }), + rect: rect, + inputEvent: inputEvent + }); + } + + if (added.length || removed.length) { + /** + * When the select in real time, the select event is called. + * @memberof Selecto + * @event select + * @param {Selecto.OnSelect} - Parameters for the select event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + this.trigger("select", { + selected: selectedTargets, + added: added.map(function (index) { + return list[index]; + }), + removed: removed.map(function (index) { + return prevList[index]; + }), + rect: rect, + inputEvent: inputEvent + }); + } + }; + + __proto.selectEnd = function (startSelectedTargets, selectedTargets, rect, e) { + var inputEvent = e.inputEvent, + isDouble = e.isDouble; + + var _a = ChildrenDiffer.diff(startSelectedTargets, selectedTargets), + added = _a.added, + removed = _a.removed, + prevList = _a.prevList, + list = _a.list; + + var _b = ChildrenDiffer.diff(this.selectedTargets, selectedTargets), + afterAdded = _b.added, + afterRemoved = _b.removed, + afterPrevList = _b.prevList, + afterList = _b.list; + + var type = inputEvent.type; + var isDragStart = type === "mousedown" || type === "touchstart"; + /** + * When the select(dragEnd or click) ends, the selectEnd event is called. + * @memberof Selecto + * @event selectEnd + * @param {Selecto.OnSelectEnd} - Parameters for the selectEnd event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("selectStart", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }).on("selectEnd", e => { + * e.afterAdded.forEach(el => { + * el.classList.add("selected"); + * }); + * e.afterRemoved.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + this.trigger("selectEnd", { + selected: selectedTargets, + added: added.map(function (index) { + return list[index]; + }), + removed: removed.map(function (index) { + return prevList[index]; + }), + afterAdded: afterAdded.map(function (index) { + return afterList[index]; + }), + afterRemoved: afterRemoved.map(function (index) { + return afterPrevList[index]; + }), + isDragStart: isDragStart, + isDouble: !!isDouble, + rect: rect, + inputEvent: inputEvent + }); + }; + + __proto.check = function (e) { + var datas = e.datas, + inputEvent = e.inputEvent; + var rect = getRect(e, this.options.ratio); + var top = rect.top, + left = rect.left, + width = rect.width, + height = rect.height; + this.target.style.cssText += "display: block;" + "left:0px;top:0px;" + ("transform: translate(" + left + "px, " + top + "px);") + ("width:" + width + "px;height:" + height + "px;"); + var passedTargets = this.hitTest(rect, datas.startX, datas.startY, datas.selectableTargets, datas.selectableRects); + var selectedTargets = this.passSelectedTargets(passedTargets); + this.trigger("drag", __assign(__assign({}, e), { + rect: rect + })); + this.select(selectedTargets, rect, inputEvent); + datas.selectedTargets = selectedTargets; + }; + + __proto.sameCombiKey = function (e) { + var toggleContinueSelect = [].concat(this.options.toggleContinueSelect); + var combi = KeyController.getCombi(e.inputEvent, e.key); + var toggleKeys = utils.isArray(toggleContinueSelect[0]) ? toggleContinueSelect : [toggleContinueSelect]; + return toggleKeys.some(function (keys) { + return keys.every(function (key) { + return combi.indexOf(key) > -1; + }); + }); + }; + + Selecto = __decorate([frameworkUtils.Properties(PROPERTIES, function (prototype, property) { + var attributes = { + enumerable: true, + configurable: true, + get: function () { + return this.options[property]; + } + }; + var setter = utils.camelize("set " + property); + + if (prototype[setter]) { + attributes.set = function set(value) { + this[setter](value); + }; + } else { + attributes.set = function set(value) { + this.options[property] = value; + }; + } + + Object.defineProperty(prototype, property, attributes); + })], Selecto); + return Selecto; +}(Component); + + + +var modules = ({ + __proto__: null, + 'default': Selecto, + OPTIONS: OPTIONS, + OPTION_TYPES: OPTION_TYPES, + PROPERTIES: PROPERTIES, + EVENTS: EVENTS, + METHODS: METHODS, + CLASS_NAME: CLASS_NAME +}); + +for (var name in modules) { + Selecto[name] = modules[name]; +} + +module.exports = Selecto; +//# sourceMappingURL=selecto.cjs.js.map diff --git a/dist/selecto.cjs.js.map b/dist/selecto.cjs.js.map new file mode 100644 index 0000000..963cca5 --- /dev/null +++ b/dist/selecto.cjs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"selecto.cjs.js","sources":["../src/utils.ts","../src/consts.ts","../src/Selecto.tsx","../src/index.umd.ts"],"sourcesContent":["import { Hypertext, Rect } from \"./types\";\nimport { IObject, addClass, hasClass } from \"@daybrush/utils\";\n\nexport function getClient(e: MouseEvent | TouchEvent) {\n if (\"touches\" in e) {\n const touch = e.touches[0] || e.changedTouches[0];\n\n return {\n clientX: touch.clientX,\n clientY: touch.clientY,\n };\n } else {\n return {\n clientX: e.clientX,\n clientY: e.clientY,\n };\n }\n}\n\nexport function createElement(\n jsx: Hypertext,\n prevTarget?: HTMLElement | SVGElement,\n container?: HTMLElement | SVGElement,\n) {\n const { tag, children, attributes, className, style } = jsx;\n const el = prevTarget || document.createElement(tag) as HTMLElement | SVGElement;\n\n for (const name in attributes) {\n el.setAttribute(name, attributes[name]);\n }\n const elChildren = el.children;\n children.forEach((child, i) => {\n createElement(child, elChildren[i] as HTMLElement | SVGElement, el);\n });\n if (className) {\n className.split(\" \").forEach(name => {\n if (!hasClass(el, name)) {\n addClass(el, name);\n }\n });\n }\n if (style) {\n const elStyle = el.style;\n for (const name in style) {\n elStyle[name] = style[name];\n }\n }\n if (!prevTarget && container) {\n container.appendChild(el);\n }\n return el;\n}\nexport function h(\n tag: string,\n attrs: IObject,\n ...children: Hypertext[]\n): Hypertext {\n const {\n className = \"\",\n style = {},\n ...attributes\n } = attrs || {};\n return {\n tag,\n className,\n style,\n attributes,\n children,\n };\n}\n\nexport function diffValue(prev: T, cur: T, func: (prev: T, cur: T) => void) {\n if (prev !== cur) {\n func(prev, cur);\n }\n}\n\nexport function getRect(e: any, ratio: number): Rect {\n let {\n distX = 0,\n distY = 0,\n } = e;\n const { startX, startY } = e.datas;\n\n if (ratio > 0) {\n const nextHeight = Math.sqrt((distX * distX + distY * distY) / (1 + ratio * ratio));\n const nextWidth = ratio * nextHeight;\n\n distX = (distX >= 0 ? 1 : -1) * nextWidth;\n distY = (distY >= 0 ? 1 : -1) * nextHeight;\n }\n const tx = Math.min(0, distX);\n const ty = Math.min(0, distY);\n // h ^ 2 + (ratio * h) ^ 2 = dist\n // (1 + ratio ^ 2) * h^2 = dist ^ 2\n // dist * Math.atan(ratio);\n const width = Math.abs(distX);\n const height = Math.abs(distY);\n const left = startX + tx;\n const top = startY + ty;\n\n return {\n left,\n top,\n right: left + width,\n bottom: top + height,\n width,\n height,\n };\n}\n","import styled from \"css-styled\";\nimport { SelectoOptions } from \"./types\";\n\nexport const injector = styled(`\n:host {\n position: fixed;\n display: none;\n border: 1px solid #4af;\n background: rgba(68, 170, 255, 0.5);\n z-index: 100;\n}\n`);\n\n/**\n * @memberof Selecto\n */\nexport const CLASS_NAME = `selecto-selection ${injector.className}`;\n\nexport const PROPERTIES = [\n \"selectableTargets\",\n \"selectByClick\",\n \"selectFromInside\",\n \"continueSelect\",\n \"toggleContinueSelect\",\n \"keyContainer\",\n \"hitRate\",\n \"scrollOptions\",\n \"checkInput\",\n \"preventDefault\",\n \"ratio\",\n] as const;\n/**\n * @memberof Selecto\n */\nexport const OPTIONS = [\n // ignore target, container,\n \"dragContainer\",\n \"cspNonce\",\n ...PROPERTIES,\n] as const;\n\nexport const OPTION_TYPES: { [key in keyof SelectoOptions]: any } = {\n target: null,\n container: null,\n dragContainer: null,\n selectableTargets: Array,\n selectByClick: Boolean,\n selectFromInside: Boolean,\n continueSelect: Boolean,\n toggleContinueSelect: Array,\n keyContainer: null,\n hitRate: Number,\n scrollOptions: Object,\n checkInput: Boolean,\n preventDefault: Boolean,\n cspNonce: String,\n ratio: Number,\n};\n\n/**\n * @memberof Selecto\n */\nexport const EVENTS = [\n \"dragStart\",\n \"drag\",\n \"dragEnd\",\n \"selectStart\",\n \"select\",\n \"selectEnd\",\n \"keydown\",\n \"keyup\",\n \"scroll\",\n] as const;\n\n/**\n * @memberof Selecto\n */\nexport const METHODS = [\n \"clickTarget\",\n \"setSelectedTargets\",\n \"triggerDragStart\",\n] as const;\n","import Component from \"@egjs/component\";\nimport Dragger, { OnDrag } from \"@daybrush/drag\";\nimport { InjectResult } from \"css-styled\";\nimport { Properties } from \"framework-utils\";\nimport { isObject, camelize, IObject, addEvent, removeEvent, isArray } from \"@daybrush/utils\";\nimport ChildrenDiffer, { diff, ChildrenDiffResult } from \"@egjs/children-differ\";\nimport DragScroll from \"@scena/dragscroll\";\nimport KeyController, { getCombi } from \"keycon\";\nimport { createElement, h, getClient, diffValue, getRect } from \"./utils\";\nimport { SelectoOptions, Rect, SelectoProperties, OnDragEvent, SelectoEvents } from \"./types\";\nimport { PROPERTIES, injector, CLASS_NAME } from \"./consts\";\n\n/**\n * Selecto.js is a component that allows you to select elements in the drag area using the mouse or touch.\n * @sort 1\n * @extends eg.Component\n */\n@Properties(PROPERTIES as any, (prototype, property) => {\n const attributes: IObject = {\n enumerable: true,\n configurable: true,\n get() {\n return this.options[property];\n },\n };\n const setter = camelize(`set ${property}`);\n if (prototype[setter]) {\n attributes.set = function set(value) {\n this[setter](value);\n };\n } else {\n attributes.set = function set(value) {\n this.options[property] = value;\n };\n }\n Object.defineProperty(prototype, property, attributes);\n})\nclass Selecto extends Component {\n public options: SelectoOptions;\n private target!: HTMLElement | SVGElement;\n private dragContainer!: Element | Window | Element[];\n private container!: HTMLElement;\n private dragger!: Dragger;\n private injectResult!: InjectResult;\n private selectedTargets: Array = [];\n private differ = new ChildrenDiffer();\n private dragScroll: DragScroll = new DragScroll();\n private keycon!: KeyController;\n /**\n *\n */\n constructor(\n options: Partial = {},\n ) {\n super();\n this.target = options.target;\n this.container = options.container;\n this.options = {\n target: null,\n container: null,\n dragContainer: null,\n selectableTargets: [],\n selectByClick: true,\n selectFromInside: true,\n hitRate: 100,\n continueSelect: false,\n toggleContinueSelect: null,\n keyContainer: null,\n scrollOptions: undefined,\n checkInput: false,\n preventDefault: false,\n cspNonce: \"\",\n ratio: 0,\n ...options,\n };\n this.initElement();\n this.initDragScroll();\n this.setKeyController();\n }\n /**\n * You can set the currently selected targets.\n */\n public setSelectedTargets(selectedTargets: Array): this {\n this.selectedTargets = selectedTargets;\n this.differ = new ChildrenDiffer(selectedTargets);\n\n return this;\n }\n /**\n * You can get the currently selected targets.\n */\n public getSelectedTargets(): Array {\n return this.selectedTargets;\n }\n public setKeyContainer(keyContainer: HTMLElement | Document | Window) {\n const options = this.options;\n\n diffValue(options.keyContainer, keyContainer, () => {\n options.keyContainer = keyContainer;\n\n this.setKeyController();\n });\n }\n public setToggleContinueSelect(toggleContinueSelect: string[][] | string[] | string) {\n const options = this.options;\n\n diffValue(options.toggleContinueSelect, toggleContinueSelect, () => {\n options.toggleContinueSelect = toggleContinueSelect;\n\n this.setKeyEvent();\n });\n }\n public setPreventDefault(value: boolean) {\n this.dragger.options.preventDefault = value;\n }\n public setCheckInput(value: boolean) {\n this.dragger.options.checkInput = value;\n }\n /**\n * `OnDragStart` is triggered by an external event.\n * @param - external event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto();\n *\n * window.addEventListener(\"mousedown\", e => {\n * selecto.triggerDragStart(e);\n * });\n */\n public triggerDragStart(e: MouseEvent | TouchEvent) {\n this.dragger.triggerDragStart(e);\n return this;\n }\n /**\n * Destroy elements, properties, and events.\n */\n public destroy(): void {\n this.off();\n this.keycon && this.keycon.destroy();\n this.dragger.unset();\n this.injectResult.destroy();\n removeEvent(document, \"selectstart\", this.onDocumentSelectStart);\n\n this.keycon = null;\n this.dragger = null;\n this.injectResult = null;\n this.target = null;\n this.container = null;\n this.options = null;\n }\n\n /**\n * External click or mouse events can be applied to the selecto.\n * @params - Extenal click or mouse event\n * @params - Specify the clicked target directly.\n */\n public clickTarget(e: MouseEvent | TouchEvent, clickedTarget?: Element): this {\n const { clientX, clientY } = getClient(e);\n const dragEvent: OnDragEvent = {\n datas: {},\n clientX,\n clientY,\n inputEvent: e,\n };\n if (this.onDragStart(dragEvent, clickedTarget)) {\n this.onDragEnd(dragEvent);\n }\n return this;\n }\n private setKeyController() {\n const { keyContainer, toggleContinueSelect } = this.options;\n\n if (this.keycon) {\n this.keycon.destroy();\n this.keycon = null;\n }\n if (toggleContinueSelect) {\n this.keycon = new KeyController(keyContainer || window);\n this.keycon.keydown(this.onKeyDown).keyup(this.onKeyUp).on(\"blur\", this.onBlur);\n }\n }\n private setKeyEvent() {\n const { toggleContinueSelect } = this.options;\n if (!toggleContinueSelect || this.keycon) {\n return;\n }\n this.setKeyController();\n }\n private initElement() {\n this.target = createElement(\n
as any,\n this.target,\n this.container,\n );\n\n const target = this.target;\n\n const { dragContainer, checkInput, preventDefault } = this.options;\n this.dragContainer = typeof dragContainer === \"string\"\n ? [].slice.call(document.querySelectorAll(dragContainer))\n : (this.options.dragContainer || this.target.parentNode as any);\n this.dragger = new Dragger(this.dragContainer, {\n container: window,\n checkInput,\n preventDefault,\n dragstart: this.onDragStart,\n drag: this.onDrag,\n dragend: this.onDragEnd,\n });\n addEvent(document, \"selectstart\", this.onDocumentSelectStart);\n\n this.injectResult = injector.inject(target, {\n nonce: this.options.cspNonce,\n });\n }\n private hitTest(\n selectRect: Rect,\n clientX: number,\n clientY: number,\n targets: Array,\n rects: Rect[],\n ) {\n const { hitRate, selectByClick } = this.options;\n const { left, top, right, bottom } = selectRect;\n\n return targets.filter((target, i) => {\n const {\n left: rectLeft,\n top: rectTop,\n right: rectRight,\n bottom: rectBottom,\n } = rects[i];\n const isStart\n = rectLeft <= clientX\n && clientX <= rectRight\n && rectTop <= clientY\n && clientY <= rectBottom;\n const rectSize = (rectRight - rectLeft) * (rectBottom - rectTop);\n const testLeft = Math.max(rectLeft, left);\n const testRight = Math.min(rectRight, right);\n const testTop = Math.max(rectTop, top);\n const testBottom = Math.min(rectBottom, bottom);\n\n if (selectByClick && isStart) {\n return true;\n }\n if (testRight < testLeft || testBottom < testTop) {\n return false;\n }\n const rate = Math.round((testRight - testLeft) * (testBottom - testTop) / rectSize * 100);\n\n if (rate >= hitRate) {\n return true;\n }\n return false;\n });\n }\n private initDragScroll() {\n this.dragScroll.on(\"scroll\", ({ container, direction }) => {\n this.trigger(\"scroll\", {\n container,\n direction,\n });\n }).on(\"move\", ({ offsetX, offsetY, inputEvent }) => {\n const datas = inputEvent.datas;\n datas.startX -= offsetX;\n datas.startY -= offsetY;\n datas.selectableRects.forEach(rect => {\n rect.top -= offsetY;\n rect.bottom -= offsetY;\n rect.left -= offsetX;\n rect.right -= offsetX;\n });\n this.dragger.scrollBy(offsetX, offsetY, inputEvent.inputEvent, false);\n\n inputEvent.distX += offsetX;\n inputEvent.distY += offsetY;\n this.check(inputEvent);\n });\n }\n private getSelectableTargets() {\n const selectableTargets: Array = [];\n\n this.options.selectableTargets.forEach(target => {\n if (isObject(target)) {\n selectableTargets.push(target);\n } else {\n const elements = [].slice.call(document.querySelectorAll(target));\n\n elements.forEach(el => {\n selectableTargets.push(el);\n });\n }\n });\n\n return selectableTargets;\n }\n private passSelectedTargets(passedTargets: Array) {\n const {\n list,\n prevList,\n added,\n removed,\n } = diff(this.selectedTargets, passedTargets) as ChildrenDiffResult;\n\n return added.map(index => list[index]).concat(removed.map(index => prevList[index]));\n }\n private select(\n selectedTargets: Array, rect: Rect, inputEvent: any, isStart?: boolean) {\n const {\n added,\n removed,\n prevList,\n list,\n } = this.differ.update(selectedTargets);\n\n if (isStart) {\n /**\n * When the select(drag) starts, the selectStart event is called.\n * @memberof Selecto\n * @event selectStart\n * @param {Selecto.OnSelect} - Parameters for the selectStart event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"selectStart\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * }).on(\"selectEnd\", e => {\n * e.afterAdded.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.afterRemoved.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"selectStart\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n rect,\n inputEvent,\n });\n }\n if (added.length || removed.length) {\n /**\n * When the select in real time, the select event is called.\n * @memberof Selecto\n * @event select\n * @param {Selecto.OnSelect} - Parameters for the select event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"select\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n rect,\n inputEvent,\n });\n }\n }\n private selectEnd(\n startSelectedTargets: Array,\n selectedTargets: Array,\n rect: Rect,\n e: OnDragEvent,\n ) {\n const { inputEvent, isDouble } = e;\n const {\n added,\n removed,\n prevList,\n list,\n } = diff(startSelectedTargets, selectedTargets);\n const {\n added: afterAdded,\n removed: afterRemoved,\n prevList: afterPrevList,\n list: afterList,\n } = diff(this.selectedTargets, selectedTargets);\n const type = inputEvent.type;\n const isDragStart = type === \"mousedown\" || type === \"touchstart\";\n\n /**\n * When the select(dragEnd or click) ends, the selectEnd event is called.\n * @memberof Selecto\n * @event selectEnd\n * @param {Selecto.OnSelectEnd} - Parameters for the selectEnd event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"selectStart\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * }).on(\"selectEnd\", e => {\n * e.afterAdded.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.afterRemoved.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"selectEnd\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n afterAdded: afterAdded.map(index => afterList[index]),\n afterRemoved: afterRemoved.map(index => afterPrevList[index]),\n isDragStart,\n isDouble: !!isDouble,\n rect,\n inputEvent,\n });\n }\n private onDragStart = (e: OnDragEvent, clickedTarget?: Element) => {\n const { datas, clientX, clientY, inputEvent } = e;\n const { continueSelect, selectFromInside, selectByClick } = this.options;\n const selectableTargets = this.getSelectableTargets();\n const selectableRects = selectableTargets.map(target => {\n const rect = target.getBoundingClientRect();\n const { left, top, width, height } = rect;\n\n return {\n left,\n top,\n right: left + width,\n bottom: top + height,\n width,\n height,\n };\n });\n datas.selectableTargets = selectableTargets;\n datas.selectableRects = selectableRects;\n datas.startSelectedTargets = this.selectedTargets;\n const hitRect = {\n left: clientX,\n top: clientY,\n right: clientX,\n bottom: clientY,\n width: 0,\n height: 0,\n };\n let firstPassedTargets: Array = [];\n if (selectFromInside || selectByClick) {\n let pointTarget\n = (clickedTarget || document.elementFromPoint(clientX, clientY)) as HTMLElement | SVGElement;\n\n while (pointTarget) {\n if (selectableTargets.indexOf(pointTarget as HTMLElement | SVGElement) > -1) {\n break;\n }\n pointTarget = pointTarget.parentElement;\n }\n firstPassedTargets = pointTarget ? [pointTarget] : [];\n }\n const hasInsideTargets = firstPassedTargets.length > 0;\n const isPreventSelect = !selectFromInside && hasInsideTargets;\n\n if (isPreventSelect && !selectByClick) {\n return false;\n }\n const type = inputEvent.type;\n const isTrusted = type === \"mousedown\" || type === \"touchstart\";\n /**\n * When the drag starts, the dragStart event is called.\n * Call the stop () function if you have a specific element or don't want to raise a select\n * @memberof Selecto\n * @event dragStart\n * @param {OnDragStart} - Parameters for the dragStart event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"dragStart\", e => {\n * if (e.inputEvent.target.tagName === \"SPAN\") {\n * e.stop();\n * }\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n const result = isTrusted ? this.trigger(\"dragStart\", e) : true;\n\n if (!result) {\n return false;\n }\n\n if (!continueSelect) {\n this.selectedTargets = [];\n } else {\n firstPassedTargets = this.passSelectedTargets(firstPassedTargets);\n }\n\n this.select(firstPassedTargets, hitRect, inputEvent, true);\n datas.startX = clientX;\n datas.startY = clientY;\n datas.selectedTargets = firstPassedTargets;\n this.target.style.cssText\n += `left:0px;top:0px;transform: translate(${clientX}px, ${clientY}px)`;\n\n if (isPreventSelect && selectByClick) {\n this.onDragEnd(e);\n inputEvent.preventDefault();\n return false;\n } else {\n if (type === \"touchstart\") {\n inputEvent.preventDefault();\n }\n const { scrollOptions } = this.options;\n if (scrollOptions && scrollOptions.container) {\n this.dragScroll.dragStart(e, scrollOptions);\n }\n return true;\n }\n }\n private check(e: any) {\n const {\n datas,\n inputEvent,\n } = e;\n const rect = getRect(e, this.options.ratio);\n const {\n top,\n left,\n width,\n height,\n } = rect;\n this.target.style.cssText\n += `display: block;`\n + `left:0px;top:0px;`\n + `transform: translate(${left}px, ${top}px);`\n + `width:${width}px;height:${height}px;`;\n\n const passedTargets = this.hitTest(\n rect, datas.startX, datas.startY, datas.selectableTargets, datas.selectableRects);\n const selectedTargets = this.passSelectedTargets(passedTargets);\n\n this.trigger(\"drag\", {\n ...e,\n rect,\n });\n this.select(selectedTargets, rect, inputEvent);\n datas.selectedTargets = selectedTargets;\n }\n private onDrag = (e: OnDrag) => {\n const { scrollOptions } = this.options;\n if (scrollOptions && scrollOptions.container) {\n if (this.dragScroll.drag(e, scrollOptions)) {\n return;\n }\n }\n this.check(e);\n }\n private onDragEnd = (e: OnDragEvent) => {\n const { datas } = e;\n const rect = getRect(e, this.options.ratio);\n this.dragScroll.dragEnd();\n this.target.style.cssText += \"display: none;\";\n this.trigger(\"dragEnd\", {\n ...e,\n rect,\n });\n this.selectEnd(\n datas.startSelectedTargets, datas.selectedTargets, rect, e);\n this.selectedTargets = datas.selectedTargets;\n }\n private sameCombiKey(e: any) {\n const toggleContinueSelect = [].concat(this.options.toggleContinueSelect);\n const combi = getCombi(e.inputEvent, e.key);\n const toggleKeys = (isArray(toggleContinueSelect[0]) ? toggleContinueSelect : [toggleContinueSelect]);\n\n return toggleKeys.some(keys => keys.every(key => combi.indexOf(key) > -1));\n }\n private onKeyDown = (e: any) => {\n if (!this.sameCombiKey(e)) {\n return;\n }\n this.continueSelect = true;\n /**\n * When you keydown the key you specified in toggleContinueSelect, the keydown event is called.\n * @memberof Selecto\n * @event keydown\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * toggleContinueSelect: \"shift\";\n * keyContainer: window,\n * });\n *\n * selecto.on(\"keydown\", () => {\n * document.querySelector(\".button\").classList.add(\"selected\");\n * }).on(\"keyup\", () => {\n * document.querySelector(\".button\").classList.remove(\"selected\");\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"keydown\", {});\n }\n private onKeyUp = (e: any) => {\n if (!this.sameCombiKey(e)) {\n return;\n }\n this.continueSelect = false;\n /**\n * When you keyup the key you specified in toggleContinueSelect, the keyup event is called.\n * @memberof Selecto\n * @event keyup\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * toggleContinueSelect: \"shift\";\n * keyContainer: window,\n * });\n *\n * selecto.on(\"keydown\", () => {\n * document.querySelector(\".button\").classList.add(\"selected\");\n * }).on(\"keyup\", () => {\n * document.querySelector(\".button\").classList.remove(\"selected\");\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"keyup\", {});\n }\n private onBlur = () => {\n if (this.toggleContinueSelect && this.continueSelect) {\n this.trigger(\"keyup\", {});\n }\n }\n private onDocumentSelectStart = (e: any) => {\n if (!this.dragger.isFlag()) {\n return;\n }\n let dragContainer = this.dragContainer;\n\n if (dragContainer === window) {\n dragContainer = document.documentElement;\n }\n const containers = dragContainer instanceof Element\n ? [dragContainer] : [].slice.call(dragContainer) as Element[];\n const target = e.target;\n\n containers.some(container => {\n if (container === target || container.contains(target)) {\n e.preventDefault();\n return true;\n }\n });\n }\n}\n\ninterface Selecto extends Component, SelectoProperties {\n on(eventName: T, handlerToAttach: (event: SelectoEvents[T]) => any): this;\n on(eventName: string, handlerToAttach: (event: { [key: string]: any }) => any): this;\n on(events: { [key: string]: (event: { [key: string]: any }) => any }): this;\n}\n\nexport default Selecto;\n","import Selecto, * as modules from \"./index\";\n\nfor (const name in modules) {\n (Selecto as any)[name] = modules[name];\n}\n\nexport default Selecto;\n"],"names":["getClient","e","touch","touches","changedTouches","clientX","clientY","createElement","jsx","prevTarget","container","tag","children","attributes","className","style","el","document","name","setAttribute","elChildren","forEach","child","i","split","hasClass","addClass","elStyle","appendChild","h","attrs","_i","_a","_b","_c","diffValue","prev","cur","func","getRect","ratio","distX","distY","startX","startY","nextHeight","Math","sqrt","nextWidth","tx","min","ty","width","abs","height","left","top","right","bottom","injector","styled","CLASS_NAME","PROPERTIES","OPTIONS","__spreadArrays","OPTION_TYPES","target","dragContainer","selectableTargets","Array","selectByClick","Boolean","selectFromInside","continueSelect","toggleContinueSelect","keyContainer","hitRate","Number","scrollOptions","Object","checkInput","preventDefault","cspNonce","String","EVENTS","METHODS","__extends","options","_super","_this","ChildrenDiffer","DragScroll","clickedTarget","datas","inputEvent","getSelectableTargets","selectableRects","map","rect","getBoundingClientRect","startSelectedTargets","selectedTargets","hitRect","firstPassedTargets","pointTarget","elementFromPoint","indexOf","parentElement","hasInsideTargets","length","isPreventSelect","type","isTrusted","result","trigger","passSelectedTargets","select","cssText","onDragEnd","dragScroll","dragStart","drag","check","dragEnd","selectEnd","sameCombiKey","dragger","isFlag","window","documentElement","containers","Element","slice","call","some","contains","undefined","initElement","initDragScroll","setKeyController","differ","setKeyEvent","value","triggerDragStart","off","keycon","destroy","unset","injectResult","removeEvent","onDocumentSelectStart","dragEvent","onDragStart","KeyController","keydown","onKeyDown","keyup","onKeyUp","on","onBlur","querySelectorAll","parentNode","Dragger","dragstart","onDrag","dragend","addEvent","inject","nonce","selectRect","targets","rects","filter","rectLeft","rectTop","rectRight","rectBottom","isStart","rectSize","testLeft","max","testRight","testTop","testBottom","rate","round","direction","offsetX","offsetY","scrollBy","isObject","push","elements","passedTargets","list","prevList","added","removed","index","concat","selected","isDouble","afterAdded","afterRemoved","afterPrevList","afterList","isDragStart","hitTest","combi","getCombi","key","toggleKeys","isArray","keys","every","Selecto","Properties","prototype","property","enumerable","configurable","get","setter","camelize","set","defineProperty","Component","modules"],"mappings":"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"} \ No newline at end of file diff --git a/dist/selecto.esm.js b/dist/selecto.esm.js new file mode 100644 index 0000000..71edcca --- /dev/null +++ b/dist/selecto.esm.js @@ -0,0 +1,1041 @@ +/* +Copyright (c) 2020 Daybrush +name: selecto +license: MIT +author: Daybrush +repository: git+https://github.com/daybrush/selecto.git +version: 1.6.1 +*/ +import Component from '@egjs/component'; +import Dragger from '@daybrush/drag'; +import { Properties } from 'framework-utils'; +import { hasClass, addClass, removeEvent, addEvent, isObject, isArray, camelize } from '@daybrush/utils'; +import ChildrenDiffer, { diff } from '@egjs/children-differ'; +import DragScroll from '@scena/dragscroll'; +import KeyController, { getCombi } from 'keycon'; +import styled from 'css-styled'; + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ + +/* global Reflect, Promise */ +var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} +var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + + return t; + }; + + return __assign.apply(this, arguments); +}; +function __rest(s, e) { + var t = {}; + + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; + + if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; + } + return t; +} +function __decorate(decorators, target, key, desc) { + var c = arguments.length, + r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, + d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} +function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + + for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; + + return r; +} + +function getClient(e) { + if ("touches" in e) { + var touch = e.touches[0] || e.changedTouches[0]; + return { + clientX: touch.clientX, + clientY: touch.clientY + }; + } else { + return { + clientX: e.clientX, + clientY: e.clientY + }; + } +} +function createElement(jsx, prevTarget, container) { + var tag = jsx.tag, + children = jsx.children, + attributes = jsx.attributes, + className = jsx.className, + style = jsx.style; + var el = prevTarget || document.createElement(tag); + + for (var name in attributes) { + el.setAttribute(name, attributes[name]); + } + + var elChildren = el.children; + children.forEach(function (child, i) { + createElement(child, elChildren[i], el); + }); + + if (className) { + className.split(" ").forEach(function (name) { + if (!hasClass(el, name)) { + addClass(el, name); + } + }); + } + + if (style) { + var elStyle = el.style; + + for (var name in style) { + elStyle[name] = style[name]; + } + } + + if (!prevTarget && container) { + container.appendChild(el); + } + + return el; +} +function h(tag, attrs) { + var children = []; + + for (var _i = 2; _i < arguments.length; _i++) { + children[_i - 2] = arguments[_i]; + } + + var _a = attrs || {}, + _b = _a.className, + className = _b === void 0 ? "" : _b, + _c = _a.style, + style = _c === void 0 ? {} : _c, + attributes = __rest(_a, ["className", "style"]); + + return { + tag: tag, + className: className, + style: style, + attributes: attributes, + children: children + }; +} +function diffValue(prev, cur, func) { + if (prev !== cur) { + func(prev, cur); + } +} +function getRect(e, ratio) { + var _a = e.distX, + distX = _a === void 0 ? 0 : _a, + _b = e.distY, + distY = _b === void 0 ? 0 : _b; + var _c = e.datas, + startX = _c.startX, + startY = _c.startY; + + if (ratio > 0) { + var nextHeight = Math.sqrt((distX * distX + distY * distY) / (1 + ratio * ratio)); + var nextWidth = ratio * nextHeight; + distX = (distX >= 0 ? 1 : -1) * nextWidth; + distY = (distY >= 0 ? 1 : -1) * nextHeight; + } + + var tx = Math.min(0, distX); + var ty = Math.min(0, distY); // h ^ 2 + (ratio * h) ^ 2 = dist + // (1 + ratio ^ 2) * h^2 = dist ^ 2 + // dist * Math.atan(ratio); + + var width = Math.abs(distX); + var height = Math.abs(distY); + var left = startX + tx; + var top = startY + ty; + return { + left: left, + top: top, + right: left + width, + bottom: top + height, + width: width, + height: height + }; +} + +var injector = styled("\n:host {\n position: fixed;\n display: none;\n border: 1px solid #4af;\n background: rgba(68, 170, 255, 0.5);\n z-index: 100;\n}\n"); +/** + * @memberof Selecto + */ + +var CLASS_NAME = "selecto-selection " + injector.className; +var PROPERTIES = ["selectableTargets", "selectByClick", "selectFromInside", "continueSelect", "toggleContinueSelect", "keyContainer", "hitRate", "scrollOptions", "checkInput", "preventDefault", "ratio"]; +/** + * @memberof Selecto + */ + +var OPTIONS = __spreadArrays([// ignore target, container, +"dragContainer", "cspNonce"], PROPERTIES); +var OPTION_TYPES = { + target: null, + container: null, + dragContainer: null, + selectableTargets: Array, + selectByClick: Boolean, + selectFromInside: Boolean, + continueSelect: Boolean, + toggleContinueSelect: Array, + keyContainer: null, + hitRate: Number, + scrollOptions: Object, + checkInput: Boolean, + preventDefault: Boolean, + cspNonce: String, + ratio: Number +}; +/** + * @memberof Selecto + */ + +var EVENTS = ["dragStart", "drag", "dragEnd", "selectStart", "select", "selectEnd", "keydown", "keyup", "scroll"]; +/** + * @memberof Selecto + */ + +var METHODS = ["clickTarget", "setSelectedTargets", "triggerDragStart"]; + +/** + * Selecto.js is a component that allows you to select elements in the drag area using the mouse or touch. + * @sort 1 + * @extends eg.Component + */ + +var Selecto = +/*#__PURE__*/ +function (_super) { + __extends(Selecto, _super); + /** + * + */ + + + function Selecto(options) { + if (options === void 0) { + options = {}; + } + + var _this = _super.call(this) || this; + + _this.selectedTargets = []; + _this.differ = new ChildrenDiffer(); + _this.dragScroll = new DragScroll(); + + _this.onDragStart = function (e, clickedTarget) { + var datas = e.datas, + clientX = e.clientX, + clientY = e.clientY, + inputEvent = e.inputEvent; + var _a = _this.options, + continueSelect = _a.continueSelect, + selectFromInside = _a.selectFromInside, + selectByClick = _a.selectByClick; + + var selectableTargets = _this.getSelectableTargets(); + + var selectableRects = selectableTargets.map(function (target) { + var rect = target.getBoundingClientRect(); + var left = rect.left, + top = rect.top, + width = rect.width, + height = rect.height; + return { + left: left, + top: top, + right: left + width, + bottom: top + height, + width: width, + height: height + }; + }); + datas.selectableTargets = selectableTargets; + datas.selectableRects = selectableRects; + datas.startSelectedTargets = _this.selectedTargets; + var hitRect = { + left: clientX, + top: clientY, + right: clientX, + bottom: clientY, + width: 0, + height: 0 + }; + var firstPassedTargets = []; + + if (selectFromInside || selectByClick) { + var pointTarget = clickedTarget || document.elementFromPoint(clientX, clientY); + + while (pointTarget) { + if (selectableTargets.indexOf(pointTarget) > -1) { + break; + } + + pointTarget = pointTarget.parentElement; + } + + firstPassedTargets = pointTarget ? [pointTarget] : []; + } + + var hasInsideTargets = firstPassedTargets.length > 0; + var isPreventSelect = !selectFromInside && hasInsideTargets; + + if (isPreventSelect && !selectByClick) { + return false; + } + + var type = inputEvent.type; + var isTrusted = type === "mousedown" || type === "touchstart"; + /** + * When the drag starts, the dragStart event is called. + * Call the stop () function if you have a specific element or don't want to raise a select + * @memberof Selecto + * @event dragStart + * @param {OnDragStart} - Parameters for the dragStart event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("dragStart", e => { + * if (e.inputEvent.target.tagName === "SPAN") { + * e.stop(); + * } + * }).on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + var result = isTrusted ? _this.trigger("dragStart", e) : true; + + if (!result) { + return false; + } + + if (!continueSelect) { + _this.selectedTargets = []; + } else { + firstPassedTargets = _this.passSelectedTargets(firstPassedTargets); + } + + _this.select(firstPassedTargets, hitRect, inputEvent, true); + + datas.startX = clientX; + datas.startY = clientY; + datas.selectedTargets = firstPassedTargets; + _this.target.style.cssText += "left:0px;top:0px;transform: translate(" + clientX + "px, " + clientY + "px)"; + + if (isPreventSelect && selectByClick) { + _this.onDragEnd(e); + + inputEvent.preventDefault(); + return false; + } else { + if (type === "touchstart") { + inputEvent.preventDefault(); + } + + var scrollOptions = _this.options.scrollOptions; + + if (scrollOptions && scrollOptions.container) { + _this.dragScroll.dragStart(e, scrollOptions); + } + + return true; + } + }; + + _this.onDrag = function (e) { + var scrollOptions = _this.options.scrollOptions; + + if (scrollOptions && scrollOptions.container) { + if (_this.dragScroll.drag(e, scrollOptions)) { + return; + } + } + + _this.check(e); + }; + + _this.onDragEnd = function (e) { + var datas = e.datas; + var rect = getRect(e, _this.options.ratio); + + _this.dragScroll.dragEnd(); + + _this.target.style.cssText += "display: none;"; + + _this.trigger("dragEnd", __assign(__assign({}, e), { + rect: rect + })); + + _this.selectEnd(datas.startSelectedTargets, datas.selectedTargets, rect, e); + + _this.selectedTargets = datas.selectedTargets; + }; + + _this.onKeyDown = function (e) { + if (!_this.sameCombiKey(e)) { + return; + } + + _this.continueSelect = true; + /** + * When you keydown the key you specified in toggleContinueSelect, the keydown event is called. + * @memberof Selecto + * @event keydown + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * toggleContinueSelect: "shift"; + * keyContainer: window, + * }); + * + * selecto.on("keydown", () => { + * document.querySelector(".button").classList.add("selected"); + * }).on("keyup", () => { + * document.querySelector(".button").classList.remove("selected"); + * }).on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + _this.trigger("keydown", {}); + }; + + _this.onKeyUp = function (e) { + if (!_this.sameCombiKey(e)) { + return; + } + + _this.continueSelect = false; + /** + * When you keyup the key you specified in toggleContinueSelect, the keyup event is called. + * @memberof Selecto + * @event keyup + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * toggleContinueSelect: "shift"; + * keyContainer: window, + * }); + * + * selecto.on("keydown", () => { + * document.querySelector(".button").classList.add("selected"); + * }).on("keyup", () => { + * document.querySelector(".button").classList.remove("selected"); + * }).on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + _this.trigger("keyup", {}); + }; + + _this.onBlur = function () { + if (_this.toggleContinueSelect && _this.continueSelect) { + _this.trigger("keyup", {}); + } + }; + + _this.onDocumentSelectStart = function (e) { + if (!_this.dragger.isFlag()) { + return; + } + + var dragContainer = _this.dragContainer; + + if (dragContainer === window) { + dragContainer = document.documentElement; + } + + var containers = dragContainer instanceof Element ? [dragContainer] : [].slice.call(dragContainer); + var target = e.target; + containers.some(function (container) { + if (container === target || container.contains(target)) { + e.preventDefault(); + return true; + } + }); + }; + + _this.target = options.target; + _this.container = options.container; + _this.options = __assign({ + target: null, + container: null, + dragContainer: null, + selectableTargets: [], + selectByClick: true, + selectFromInside: true, + hitRate: 100, + continueSelect: false, + toggleContinueSelect: null, + keyContainer: null, + scrollOptions: undefined, + checkInput: false, + preventDefault: false, + cspNonce: "", + ratio: 0 + }, options); + + _this.initElement(); + + _this.initDragScroll(); + + _this.setKeyController(); + + return _this; + } + /** + * You can set the currently selected targets. + */ + + + var __proto = Selecto.prototype; + + __proto.setSelectedTargets = function (selectedTargets) { + this.selectedTargets = selectedTargets; + this.differ = new ChildrenDiffer(selectedTargets); + return this; + }; + /** + * You can get the currently selected targets. + */ + + + __proto.getSelectedTargets = function () { + return this.selectedTargets; + }; + + __proto.setKeyContainer = function (keyContainer) { + var _this = this; + + var options = this.options; + diffValue(options.keyContainer, keyContainer, function () { + options.keyContainer = keyContainer; + + _this.setKeyController(); + }); + }; + + __proto.setToggleContinueSelect = function (toggleContinueSelect) { + var _this = this; + + var options = this.options; + diffValue(options.toggleContinueSelect, toggleContinueSelect, function () { + options.toggleContinueSelect = toggleContinueSelect; + + _this.setKeyEvent(); + }); + }; + + __proto.setPreventDefault = function (value) { + this.dragger.options.preventDefault = value; + }; + + __proto.setCheckInput = function (value) { + this.dragger.options.checkInput = value; + }; + /** + * `OnDragStart` is triggered by an external event. + * @param - external event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto(); + * + * window.addEventListener("mousedown", e => { + * selecto.triggerDragStart(e); + * }); + */ + + + __proto.triggerDragStart = function (e) { + this.dragger.triggerDragStart(e); + return this; + }; + /** + * Destroy elements, properties, and events. + */ + + + __proto.destroy = function () { + this.off(); + this.keycon && this.keycon.destroy(); + this.dragger.unset(); + this.injectResult.destroy(); + removeEvent(document, "selectstart", this.onDocumentSelectStart); + this.keycon = null; + this.dragger = null; + this.injectResult = null; + this.target = null; + this.container = null; + this.options = null; + }; + /** + * External click or mouse events can be applied to the selecto. + * @params - Extenal click or mouse event + * @params - Specify the clicked target directly. + */ + + + __proto.clickTarget = function (e, clickedTarget) { + var _a = getClient(e), + clientX = _a.clientX, + clientY = _a.clientY; + + var dragEvent = { + datas: {}, + clientX: clientX, + clientY: clientY, + inputEvent: e + }; + + if (this.onDragStart(dragEvent, clickedTarget)) { + this.onDragEnd(dragEvent); + } + + return this; + }; + + __proto.setKeyController = function () { + var _a = this.options, + keyContainer = _a.keyContainer, + toggleContinueSelect = _a.toggleContinueSelect; + + if (this.keycon) { + this.keycon.destroy(); + this.keycon = null; + } + + if (toggleContinueSelect) { + this.keycon = new KeyController(keyContainer || window); + this.keycon.keydown(this.onKeyDown).keyup(this.onKeyUp).on("blur", this.onBlur); + } + }; + + __proto.setKeyEvent = function () { + var toggleContinueSelect = this.options.toggleContinueSelect; + + if (!toggleContinueSelect || this.keycon) { + return; + } + + this.setKeyController(); + }; + + __proto.initElement = function () { + this.target = createElement(h("div", { + className: CLASS_NAME + }), this.target, this.container); + var target = this.target; + var _a = this.options, + dragContainer = _a.dragContainer, + checkInput = _a.checkInput, + preventDefault = _a.preventDefault; + this.dragContainer = typeof dragContainer === "string" ? [].slice.call(document.querySelectorAll(dragContainer)) : this.options.dragContainer || this.target.parentNode; + this.dragger = new Dragger(this.dragContainer, { + container: window, + checkInput: checkInput, + preventDefault: preventDefault, + dragstart: this.onDragStart, + drag: this.onDrag, + dragend: this.onDragEnd + }); + addEvent(document, "selectstart", this.onDocumentSelectStart); + this.injectResult = injector.inject(target, { + nonce: this.options.cspNonce + }); + }; + + __proto.hitTest = function (selectRect, clientX, clientY, targets, rects) { + var _a = this.options, + hitRate = _a.hitRate, + selectByClick = _a.selectByClick; + var left = selectRect.left, + top = selectRect.top, + right = selectRect.right, + bottom = selectRect.bottom; + return targets.filter(function (target, i) { + var _a = rects[i], + rectLeft = _a.left, + rectTop = _a.top, + rectRight = _a.right, + rectBottom = _a.bottom; + var isStart = rectLeft <= clientX && clientX <= rectRight && rectTop <= clientY && clientY <= rectBottom; + var rectSize = (rectRight - rectLeft) * (rectBottom - rectTop); + var testLeft = Math.max(rectLeft, left); + var testRight = Math.min(rectRight, right); + var testTop = Math.max(rectTop, top); + var testBottom = Math.min(rectBottom, bottom); + + if (selectByClick && isStart) { + return true; + } + + if (testRight < testLeft || testBottom < testTop) { + return false; + } + + var rate = Math.round((testRight - testLeft) * (testBottom - testTop) / rectSize * 100); + + if (rate >= hitRate) { + return true; + } + + return false; + }); + }; + + __proto.initDragScroll = function () { + var _this = this; + + this.dragScroll.on("scroll", function (_a) { + var container = _a.container, + direction = _a.direction; + + _this.trigger("scroll", { + container: container, + direction: direction + }); + }).on("move", function (_a) { + var offsetX = _a.offsetX, + offsetY = _a.offsetY, + inputEvent = _a.inputEvent; + var datas = inputEvent.datas; + datas.startX -= offsetX; + datas.startY -= offsetY; + datas.selectableRects.forEach(function (rect) { + rect.top -= offsetY; + rect.bottom -= offsetY; + rect.left -= offsetX; + rect.right -= offsetX; + }); + + _this.dragger.scrollBy(offsetX, offsetY, inputEvent.inputEvent, false); + + inputEvent.distX += offsetX; + inputEvent.distY += offsetY; + + _this.check(inputEvent); + }); + }; + + __proto.getSelectableTargets = function () { + var selectableTargets = []; + this.options.selectableTargets.forEach(function (target) { + if (isObject(target)) { + selectableTargets.push(target); + } else { + var elements = [].slice.call(document.querySelectorAll(target)); + elements.forEach(function (el) { + selectableTargets.push(el); + }); + } + }); + return selectableTargets; + }; + + __proto.passSelectedTargets = function (passedTargets) { + var _a = diff(this.selectedTargets, passedTargets), + list = _a.list, + prevList = _a.prevList, + added = _a.added, + removed = _a.removed; + + return added.map(function (index) { + return list[index]; + }).concat(removed.map(function (index) { + return prevList[index]; + })); + }; + + __proto.select = function (selectedTargets, rect, inputEvent, isStart) { + var _a = this.differ.update(selectedTargets), + added = _a.added, + removed = _a.removed, + prevList = _a.prevList, + list = _a.list; + + if (isStart) { + /** + * When the select(drag) starts, the selectStart event is called. + * @memberof Selecto + * @event selectStart + * @param {Selecto.OnSelect} - Parameters for the selectStart event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("selectStart", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }).on("selectEnd", e => { + * e.afterAdded.forEach(el => { + * el.classList.add("selected"); + * }); + * e.afterRemoved.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + this.trigger("selectStart", { + selected: selectedTargets, + added: added.map(function (index) { + return list[index]; + }), + removed: removed.map(function (index) { + return prevList[index]; + }), + rect: rect, + inputEvent: inputEvent + }); + } + + if (added.length || removed.length) { + /** + * When the select in real time, the select event is called. + * @memberof Selecto + * @event select + * @param {Selecto.OnSelect} - Parameters for the select event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + this.trigger("select", { + selected: selectedTargets, + added: added.map(function (index) { + return list[index]; + }), + removed: removed.map(function (index) { + return prevList[index]; + }), + rect: rect, + inputEvent: inputEvent + }); + } + }; + + __proto.selectEnd = function (startSelectedTargets, selectedTargets, rect, e) { + var inputEvent = e.inputEvent, + isDouble = e.isDouble; + + var _a = diff(startSelectedTargets, selectedTargets), + added = _a.added, + removed = _a.removed, + prevList = _a.prevList, + list = _a.list; + + var _b = diff(this.selectedTargets, selectedTargets), + afterAdded = _b.added, + afterRemoved = _b.removed, + afterPrevList = _b.prevList, + afterList = _b.list; + + var type = inputEvent.type; + var isDragStart = type === "mousedown" || type === "touchstart"; + /** + * When the select(dragEnd or click) ends, the selectEnd event is called. + * @memberof Selecto + * @event selectEnd + * @param {Selecto.OnSelectEnd} - Parameters for the selectEnd event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("selectStart", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }).on("selectEnd", e => { + * e.afterAdded.forEach(el => { + * el.classList.add("selected"); + * }); + * e.afterRemoved.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + this.trigger("selectEnd", { + selected: selectedTargets, + added: added.map(function (index) { + return list[index]; + }), + removed: removed.map(function (index) { + return prevList[index]; + }), + afterAdded: afterAdded.map(function (index) { + return afterList[index]; + }), + afterRemoved: afterRemoved.map(function (index) { + return afterPrevList[index]; + }), + isDragStart: isDragStart, + isDouble: !!isDouble, + rect: rect, + inputEvent: inputEvent + }); + }; + + __proto.check = function (e) { + var datas = e.datas, + inputEvent = e.inputEvent; + var rect = getRect(e, this.options.ratio); + var top = rect.top, + left = rect.left, + width = rect.width, + height = rect.height; + this.target.style.cssText += "display: block;" + "left:0px;top:0px;" + ("transform: translate(" + left + "px, " + top + "px);") + ("width:" + width + "px;height:" + height + "px;"); + var passedTargets = this.hitTest(rect, datas.startX, datas.startY, datas.selectableTargets, datas.selectableRects); + var selectedTargets = this.passSelectedTargets(passedTargets); + this.trigger("drag", __assign(__assign({}, e), { + rect: rect + })); + this.select(selectedTargets, rect, inputEvent); + datas.selectedTargets = selectedTargets; + }; + + __proto.sameCombiKey = function (e) { + var toggleContinueSelect = [].concat(this.options.toggleContinueSelect); + var combi = getCombi(e.inputEvent, e.key); + var toggleKeys = isArray(toggleContinueSelect[0]) ? toggleContinueSelect : [toggleContinueSelect]; + return toggleKeys.some(function (keys) { + return keys.every(function (key) { + return combi.indexOf(key) > -1; + }); + }); + }; + + Selecto = __decorate([Properties(PROPERTIES, function (prototype, property) { + var attributes = { + enumerable: true, + configurable: true, + get: function () { + return this.options[property]; + } + }; + var setter = camelize("set " + property); + + if (prototype[setter]) { + attributes.set = function set(value) { + this[setter](value); + }; + } else { + attributes.set = function set(value) { + this.options[property] = value; + }; + } + + Object.defineProperty(prototype, property, attributes); + })], Selecto); + return Selecto; +}(Component); + +export default Selecto; +export { CLASS_NAME, EVENTS, METHODS, OPTIONS, OPTION_TYPES, PROPERTIES }; +//# sourceMappingURL=selecto.esm.js.map diff --git a/dist/selecto.esm.js.map b/dist/selecto.esm.js.map new file mode 100644 index 0000000..0ae684a --- /dev/null +++ b/dist/selecto.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"selecto.esm.js","sources":["../src/utils.ts","../src/consts.ts","../src/Selecto.tsx"],"sourcesContent":["import { Hypertext, Rect } from \"./types\";\nimport { IObject, addClass, hasClass } from \"@daybrush/utils\";\n\nexport function getClient(e: MouseEvent | TouchEvent) {\n if (\"touches\" in e) {\n const touch = e.touches[0] || e.changedTouches[0];\n\n return {\n clientX: touch.clientX,\n clientY: touch.clientY,\n };\n } else {\n return {\n clientX: e.clientX,\n clientY: e.clientY,\n };\n }\n}\n\nexport function createElement(\n jsx: Hypertext,\n prevTarget?: HTMLElement | SVGElement,\n container?: HTMLElement | SVGElement,\n) {\n const { tag, children, attributes, className, style } = jsx;\n const el = prevTarget || document.createElement(tag) as HTMLElement | SVGElement;\n\n for (const name in attributes) {\n el.setAttribute(name, attributes[name]);\n }\n const elChildren = el.children;\n children.forEach((child, i) => {\n createElement(child, elChildren[i] as HTMLElement | SVGElement, el);\n });\n if (className) {\n className.split(\" \").forEach(name => {\n if (!hasClass(el, name)) {\n addClass(el, name);\n }\n });\n }\n if (style) {\n const elStyle = el.style;\n for (const name in style) {\n elStyle[name] = style[name];\n }\n }\n if (!prevTarget && container) {\n container.appendChild(el);\n }\n return el;\n}\nexport function h(\n tag: string,\n attrs: IObject,\n ...children: Hypertext[]\n): Hypertext {\n const {\n className = \"\",\n style = {},\n ...attributes\n } = attrs || {};\n return {\n tag,\n className,\n style,\n attributes,\n children,\n };\n}\n\nexport function diffValue(prev: T, cur: T, func: (prev: T, cur: T) => void) {\n if (prev !== cur) {\n func(prev, cur);\n }\n}\n\nexport function getRect(e: any, ratio: number): Rect {\n let {\n distX = 0,\n distY = 0,\n } = e;\n const { startX, startY } = e.datas;\n\n if (ratio > 0) {\n const nextHeight = Math.sqrt((distX * distX + distY * distY) / (1 + ratio * ratio));\n const nextWidth = ratio * nextHeight;\n\n distX = (distX >= 0 ? 1 : -1) * nextWidth;\n distY = (distY >= 0 ? 1 : -1) * nextHeight;\n }\n const tx = Math.min(0, distX);\n const ty = Math.min(0, distY);\n // h ^ 2 + (ratio * h) ^ 2 = dist\n // (1 + ratio ^ 2) * h^2 = dist ^ 2\n // dist * Math.atan(ratio);\n const width = Math.abs(distX);\n const height = Math.abs(distY);\n const left = startX + tx;\n const top = startY + ty;\n\n return {\n left,\n top,\n right: left + width,\n bottom: top + height,\n width,\n height,\n };\n}\n","import styled from \"css-styled\";\nimport { SelectoOptions } from \"./types\";\n\nexport const injector = styled(`\n:host {\n position: fixed;\n display: none;\n border: 1px solid #4af;\n background: rgba(68, 170, 255, 0.5);\n z-index: 100;\n}\n`);\n\n/**\n * @memberof Selecto\n */\nexport const CLASS_NAME = `selecto-selection ${injector.className}`;\n\nexport const PROPERTIES = [\n \"selectableTargets\",\n \"selectByClick\",\n \"selectFromInside\",\n \"continueSelect\",\n \"toggleContinueSelect\",\n \"keyContainer\",\n \"hitRate\",\n \"scrollOptions\",\n \"checkInput\",\n \"preventDefault\",\n \"ratio\",\n] as const;\n/**\n * @memberof Selecto\n */\nexport const OPTIONS = [\n // ignore target, container,\n \"dragContainer\",\n \"cspNonce\",\n ...PROPERTIES,\n] as const;\n\nexport const OPTION_TYPES: { [key in keyof SelectoOptions]: any } = {\n target: null,\n container: null,\n dragContainer: null,\n selectableTargets: Array,\n selectByClick: Boolean,\n selectFromInside: Boolean,\n continueSelect: Boolean,\n toggleContinueSelect: Array,\n keyContainer: null,\n hitRate: Number,\n scrollOptions: Object,\n checkInput: Boolean,\n preventDefault: Boolean,\n cspNonce: String,\n ratio: Number,\n};\n\n/**\n * @memberof Selecto\n */\nexport const EVENTS = [\n \"dragStart\",\n \"drag\",\n \"dragEnd\",\n \"selectStart\",\n \"select\",\n \"selectEnd\",\n \"keydown\",\n \"keyup\",\n \"scroll\",\n] as const;\n\n/**\n * @memberof Selecto\n */\nexport const METHODS = [\n \"clickTarget\",\n \"setSelectedTargets\",\n \"triggerDragStart\",\n] as const;\n","import Component from \"@egjs/component\";\nimport Dragger, { OnDrag } from \"@daybrush/drag\";\nimport { InjectResult } from \"css-styled\";\nimport { Properties } from \"framework-utils\";\nimport { isObject, camelize, IObject, addEvent, removeEvent, isArray } from \"@daybrush/utils\";\nimport ChildrenDiffer, { diff, ChildrenDiffResult } from \"@egjs/children-differ\";\nimport DragScroll from \"@scena/dragscroll\";\nimport KeyController, { getCombi } from \"keycon\";\nimport { createElement, h, getClient, diffValue, getRect } from \"./utils\";\nimport { SelectoOptions, Rect, SelectoProperties, OnDragEvent, SelectoEvents } from \"./types\";\nimport { PROPERTIES, injector, CLASS_NAME } from \"./consts\";\n\n/**\n * Selecto.js is a component that allows you to select elements in the drag area using the mouse or touch.\n * @sort 1\n * @extends eg.Component\n */\n@Properties(PROPERTIES as any, (prototype, property) => {\n const attributes: IObject = {\n enumerable: true,\n configurable: true,\n get() {\n return this.options[property];\n },\n };\n const setter = camelize(`set ${property}`);\n if (prototype[setter]) {\n attributes.set = function set(value) {\n this[setter](value);\n };\n } else {\n attributes.set = function set(value) {\n this.options[property] = value;\n };\n }\n Object.defineProperty(prototype, property, attributes);\n})\nclass Selecto extends Component {\n public options: SelectoOptions;\n private target!: HTMLElement | SVGElement;\n private dragContainer!: Element | Window | Element[];\n private container!: HTMLElement;\n private dragger!: Dragger;\n private injectResult!: InjectResult;\n private selectedTargets: Array = [];\n private differ = new ChildrenDiffer();\n private dragScroll: DragScroll = new DragScroll();\n private keycon!: KeyController;\n /**\n *\n */\n constructor(\n options: Partial = {},\n ) {\n super();\n this.target = options.target;\n this.container = options.container;\n this.options = {\n target: null,\n container: null,\n dragContainer: null,\n selectableTargets: [],\n selectByClick: true,\n selectFromInside: true,\n hitRate: 100,\n continueSelect: false,\n toggleContinueSelect: null,\n keyContainer: null,\n scrollOptions: undefined,\n checkInput: false,\n preventDefault: false,\n cspNonce: \"\",\n ratio: 0,\n ...options,\n };\n this.initElement();\n this.initDragScroll();\n this.setKeyController();\n }\n /**\n * You can set the currently selected targets.\n */\n public setSelectedTargets(selectedTargets: Array): this {\n this.selectedTargets = selectedTargets;\n this.differ = new ChildrenDiffer(selectedTargets);\n\n return this;\n }\n /**\n * You can get the currently selected targets.\n */\n public getSelectedTargets(): Array {\n return this.selectedTargets;\n }\n public setKeyContainer(keyContainer: HTMLElement | Document | Window) {\n const options = this.options;\n\n diffValue(options.keyContainer, keyContainer, () => {\n options.keyContainer = keyContainer;\n\n this.setKeyController();\n });\n }\n public setToggleContinueSelect(toggleContinueSelect: string[][] | string[] | string) {\n const options = this.options;\n\n diffValue(options.toggleContinueSelect, toggleContinueSelect, () => {\n options.toggleContinueSelect = toggleContinueSelect;\n\n this.setKeyEvent();\n });\n }\n public setPreventDefault(value: boolean) {\n this.dragger.options.preventDefault = value;\n }\n public setCheckInput(value: boolean) {\n this.dragger.options.checkInput = value;\n }\n /**\n * `OnDragStart` is triggered by an external event.\n * @param - external event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto();\n *\n * window.addEventListener(\"mousedown\", e => {\n * selecto.triggerDragStart(e);\n * });\n */\n public triggerDragStart(e: MouseEvent | TouchEvent) {\n this.dragger.triggerDragStart(e);\n return this;\n }\n /**\n * Destroy elements, properties, and events.\n */\n public destroy(): void {\n this.off();\n this.keycon && this.keycon.destroy();\n this.dragger.unset();\n this.injectResult.destroy();\n removeEvent(document, \"selectstart\", this.onDocumentSelectStart);\n\n this.keycon = null;\n this.dragger = null;\n this.injectResult = null;\n this.target = null;\n this.container = null;\n this.options = null;\n }\n\n /**\n * External click or mouse events can be applied to the selecto.\n * @params - Extenal click or mouse event\n * @params - Specify the clicked target directly.\n */\n public clickTarget(e: MouseEvent | TouchEvent, clickedTarget?: Element): this {\n const { clientX, clientY } = getClient(e);\n const dragEvent: OnDragEvent = {\n datas: {},\n clientX,\n clientY,\n inputEvent: e,\n };\n if (this.onDragStart(dragEvent, clickedTarget)) {\n this.onDragEnd(dragEvent);\n }\n return this;\n }\n private setKeyController() {\n const { keyContainer, toggleContinueSelect } = this.options;\n\n if (this.keycon) {\n this.keycon.destroy();\n this.keycon = null;\n }\n if (toggleContinueSelect) {\n this.keycon = new KeyController(keyContainer || window);\n this.keycon.keydown(this.onKeyDown).keyup(this.onKeyUp).on(\"blur\", this.onBlur);\n }\n }\n private setKeyEvent() {\n const { toggleContinueSelect } = this.options;\n if (!toggleContinueSelect || this.keycon) {\n return;\n }\n this.setKeyController();\n }\n private initElement() {\n this.target = createElement(\n
as any,\n this.target,\n this.container,\n );\n\n const target = this.target;\n\n const { dragContainer, checkInput, preventDefault } = this.options;\n this.dragContainer = typeof dragContainer === \"string\"\n ? [].slice.call(document.querySelectorAll(dragContainer))\n : (this.options.dragContainer || this.target.parentNode as any);\n this.dragger = new Dragger(this.dragContainer, {\n container: window,\n checkInput,\n preventDefault,\n dragstart: this.onDragStart,\n drag: this.onDrag,\n dragend: this.onDragEnd,\n });\n addEvent(document, \"selectstart\", this.onDocumentSelectStart);\n\n this.injectResult = injector.inject(target, {\n nonce: this.options.cspNonce,\n });\n }\n private hitTest(\n selectRect: Rect,\n clientX: number,\n clientY: number,\n targets: Array,\n rects: Rect[],\n ) {\n const { hitRate, selectByClick } = this.options;\n const { left, top, right, bottom } = selectRect;\n\n return targets.filter((target, i) => {\n const {\n left: rectLeft,\n top: rectTop,\n right: rectRight,\n bottom: rectBottom,\n } = rects[i];\n const isStart\n = rectLeft <= clientX\n && clientX <= rectRight\n && rectTop <= clientY\n && clientY <= rectBottom;\n const rectSize = (rectRight - rectLeft) * (rectBottom - rectTop);\n const testLeft = Math.max(rectLeft, left);\n const testRight = Math.min(rectRight, right);\n const testTop = Math.max(rectTop, top);\n const testBottom = Math.min(rectBottom, bottom);\n\n if (selectByClick && isStart) {\n return true;\n }\n if (testRight < testLeft || testBottom < testTop) {\n return false;\n }\n const rate = Math.round((testRight - testLeft) * (testBottom - testTop) / rectSize * 100);\n\n if (rate >= hitRate) {\n return true;\n }\n return false;\n });\n }\n private initDragScroll() {\n this.dragScroll.on(\"scroll\", ({ container, direction }) => {\n this.trigger(\"scroll\", {\n container,\n direction,\n });\n }).on(\"move\", ({ offsetX, offsetY, inputEvent }) => {\n const datas = inputEvent.datas;\n datas.startX -= offsetX;\n datas.startY -= offsetY;\n datas.selectableRects.forEach(rect => {\n rect.top -= offsetY;\n rect.bottom -= offsetY;\n rect.left -= offsetX;\n rect.right -= offsetX;\n });\n this.dragger.scrollBy(offsetX, offsetY, inputEvent.inputEvent, false);\n\n inputEvent.distX += offsetX;\n inputEvent.distY += offsetY;\n this.check(inputEvent);\n });\n }\n private getSelectableTargets() {\n const selectableTargets: Array = [];\n\n this.options.selectableTargets.forEach(target => {\n if (isObject(target)) {\n selectableTargets.push(target);\n } else {\n const elements = [].slice.call(document.querySelectorAll(target));\n\n elements.forEach(el => {\n selectableTargets.push(el);\n });\n }\n });\n\n return selectableTargets;\n }\n private passSelectedTargets(passedTargets: Array) {\n const {\n list,\n prevList,\n added,\n removed,\n } = diff(this.selectedTargets, passedTargets) as ChildrenDiffResult;\n\n return added.map(index => list[index]).concat(removed.map(index => prevList[index]));\n }\n private select(\n selectedTargets: Array, rect: Rect, inputEvent: any, isStart?: boolean) {\n const {\n added,\n removed,\n prevList,\n list,\n } = this.differ.update(selectedTargets);\n\n if (isStart) {\n /**\n * When the select(drag) starts, the selectStart event is called.\n * @memberof Selecto\n * @event selectStart\n * @param {Selecto.OnSelect} - Parameters for the selectStart event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"selectStart\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * }).on(\"selectEnd\", e => {\n * e.afterAdded.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.afterRemoved.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"selectStart\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n rect,\n inputEvent,\n });\n }\n if (added.length || removed.length) {\n /**\n * When the select in real time, the select event is called.\n * @memberof Selecto\n * @event select\n * @param {Selecto.OnSelect} - Parameters for the select event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"select\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n rect,\n inputEvent,\n });\n }\n }\n private selectEnd(\n startSelectedTargets: Array,\n selectedTargets: Array,\n rect: Rect,\n e: OnDragEvent,\n ) {\n const { inputEvent, isDouble } = e;\n const {\n added,\n removed,\n prevList,\n list,\n } = diff(startSelectedTargets, selectedTargets);\n const {\n added: afterAdded,\n removed: afterRemoved,\n prevList: afterPrevList,\n list: afterList,\n } = diff(this.selectedTargets, selectedTargets);\n const type = inputEvent.type;\n const isDragStart = type === \"mousedown\" || type === \"touchstart\";\n\n /**\n * When the select(dragEnd or click) ends, the selectEnd event is called.\n * @memberof Selecto\n * @event selectEnd\n * @param {Selecto.OnSelectEnd} - Parameters for the selectEnd event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"selectStart\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * }).on(\"selectEnd\", e => {\n * e.afterAdded.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.afterRemoved.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"selectEnd\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n afterAdded: afterAdded.map(index => afterList[index]),\n afterRemoved: afterRemoved.map(index => afterPrevList[index]),\n isDragStart,\n isDouble: !!isDouble,\n rect,\n inputEvent,\n });\n }\n private onDragStart = (e: OnDragEvent, clickedTarget?: Element) => {\n const { datas, clientX, clientY, inputEvent } = e;\n const { continueSelect, selectFromInside, selectByClick } = this.options;\n const selectableTargets = this.getSelectableTargets();\n const selectableRects = selectableTargets.map(target => {\n const rect = target.getBoundingClientRect();\n const { left, top, width, height } = rect;\n\n return {\n left,\n top,\n right: left + width,\n bottom: top + height,\n width,\n height,\n };\n });\n datas.selectableTargets = selectableTargets;\n datas.selectableRects = selectableRects;\n datas.startSelectedTargets = this.selectedTargets;\n const hitRect = {\n left: clientX,\n top: clientY,\n right: clientX,\n bottom: clientY,\n width: 0,\n height: 0,\n };\n let firstPassedTargets: Array = [];\n if (selectFromInside || selectByClick) {\n let pointTarget\n = (clickedTarget || document.elementFromPoint(clientX, clientY)) as HTMLElement | SVGElement;\n\n while (pointTarget) {\n if (selectableTargets.indexOf(pointTarget as HTMLElement | SVGElement) > -1) {\n break;\n }\n pointTarget = pointTarget.parentElement;\n }\n firstPassedTargets = pointTarget ? [pointTarget] : [];\n }\n const hasInsideTargets = firstPassedTargets.length > 0;\n const isPreventSelect = !selectFromInside && hasInsideTargets;\n\n if (isPreventSelect && !selectByClick) {\n return false;\n }\n const type = inputEvent.type;\n const isTrusted = type === \"mousedown\" || type === \"touchstart\";\n /**\n * When the drag starts, the dragStart event is called.\n * Call the stop () function if you have a specific element or don't want to raise a select\n * @memberof Selecto\n * @event dragStart\n * @param {OnDragStart} - Parameters for the dragStart event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"dragStart\", e => {\n * if (e.inputEvent.target.tagName === \"SPAN\") {\n * e.stop();\n * }\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n const result = isTrusted ? this.trigger(\"dragStart\", e) : true;\n\n if (!result) {\n return false;\n }\n\n if (!continueSelect) {\n this.selectedTargets = [];\n } else {\n firstPassedTargets = this.passSelectedTargets(firstPassedTargets);\n }\n\n this.select(firstPassedTargets, hitRect, inputEvent, true);\n datas.startX = clientX;\n datas.startY = clientY;\n datas.selectedTargets = firstPassedTargets;\n this.target.style.cssText\n += `left:0px;top:0px;transform: translate(${clientX}px, ${clientY}px)`;\n\n if (isPreventSelect && selectByClick) {\n this.onDragEnd(e);\n inputEvent.preventDefault();\n return false;\n } else {\n if (type === \"touchstart\") {\n inputEvent.preventDefault();\n }\n const { scrollOptions } = this.options;\n if (scrollOptions && scrollOptions.container) {\n this.dragScroll.dragStart(e, scrollOptions);\n }\n return true;\n }\n }\n private check(e: any) {\n const {\n datas,\n inputEvent,\n } = e;\n const rect = getRect(e, this.options.ratio);\n const {\n top,\n left,\n width,\n height,\n } = rect;\n this.target.style.cssText\n += `display: block;`\n + `left:0px;top:0px;`\n + `transform: translate(${left}px, ${top}px);`\n + `width:${width}px;height:${height}px;`;\n\n const passedTargets = this.hitTest(\n rect, datas.startX, datas.startY, datas.selectableTargets, datas.selectableRects);\n const selectedTargets = this.passSelectedTargets(passedTargets);\n\n this.trigger(\"drag\", {\n ...e,\n rect,\n });\n this.select(selectedTargets, rect, inputEvent);\n datas.selectedTargets = selectedTargets;\n }\n private onDrag = (e: OnDrag) => {\n const { scrollOptions } = this.options;\n if (scrollOptions && scrollOptions.container) {\n if (this.dragScroll.drag(e, scrollOptions)) {\n return;\n }\n }\n this.check(e);\n }\n private onDragEnd = (e: OnDragEvent) => {\n const { datas } = e;\n const rect = getRect(e, this.options.ratio);\n this.dragScroll.dragEnd();\n this.target.style.cssText += \"display: none;\";\n this.trigger(\"dragEnd\", {\n ...e,\n rect,\n });\n this.selectEnd(\n datas.startSelectedTargets, datas.selectedTargets, rect, e);\n this.selectedTargets = datas.selectedTargets;\n }\n private sameCombiKey(e: any) {\n const toggleContinueSelect = [].concat(this.options.toggleContinueSelect);\n const combi = getCombi(e.inputEvent, e.key);\n const toggleKeys = (isArray(toggleContinueSelect[0]) ? toggleContinueSelect : [toggleContinueSelect]);\n\n return toggleKeys.some(keys => keys.every(key => combi.indexOf(key) > -1));\n }\n private onKeyDown = (e: any) => {\n if (!this.sameCombiKey(e)) {\n return;\n }\n this.continueSelect = true;\n /**\n * When you keydown the key you specified in toggleContinueSelect, the keydown event is called.\n * @memberof Selecto\n * @event keydown\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * toggleContinueSelect: \"shift\";\n * keyContainer: window,\n * });\n *\n * selecto.on(\"keydown\", () => {\n * document.querySelector(\".button\").classList.add(\"selected\");\n * }).on(\"keyup\", () => {\n * document.querySelector(\".button\").classList.remove(\"selected\");\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"keydown\", {});\n }\n private onKeyUp = (e: any) => {\n if (!this.sameCombiKey(e)) {\n return;\n }\n this.continueSelect = false;\n /**\n * When you keyup the key you specified in toggleContinueSelect, the keyup event is called.\n * @memberof Selecto\n * @event keyup\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * toggleContinueSelect: \"shift\";\n * keyContainer: window,\n * });\n *\n * selecto.on(\"keydown\", () => {\n * document.querySelector(\".button\").classList.add(\"selected\");\n * }).on(\"keyup\", () => {\n * document.querySelector(\".button\").classList.remove(\"selected\");\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"keyup\", {});\n }\n private onBlur = () => {\n if (this.toggleContinueSelect && this.continueSelect) {\n this.trigger(\"keyup\", {});\n }\n }\n private onDocumentSelectStart = (e: any) => {\n if (!this.dragger.isFlag()) {\n return;\n }\n let dragContainer = this.dragContainer;\n\n if (dragContainer === window) {\n dragContainer = document.documentElement;\n }\n const containers = dragContainer instanceof Element\n ? [dragContainer] : [].slice.call(dragContainer) as Element[];\n const target = e.target;\n\n containers.some(container => {\n if (container === target || container.contains(target)) {\n e.preventDefault();\n return true;\n }\n });\n }\n}\n\ninterface Selecto extends Component, SelectoProperties {\n on(eventName: T, handlerToAttach: (event: SelectoEvents[T]) => any): this;\n on(eventName: string, handlerToAttach: (event: { [key: string]: any }) => any): this;\n on(events: { [key: string]: (event: { [key: string]: any }) => any }): this;\n}\n\nexport default Selecto;\n"],"names":["getClient","e","touch","touches","changedTouches","clientX","clientY","createElement","jsx","prevTarget","container","tag","children","attributes","className","style","el","document","name","setAttribute","elChildren","forEach","child","i","split","hasClass","addClass","elStyle","appendChild","h","attrs","_i","_a","_b","_c","diffValue","prev","cur","func","getRect","ratio","distX","distY","startX","startY","nextHeight","Math","sqrt","nextWidth","tx","min","ty","width","abs","height","left","top","right","bottom","injector","styled","CLASS_NAME","PROPERTIES","OPTIONS","__spreadArrays","OPTION_TYPES","target","dragContainer","selectableTargets","Array","selectByClick","Boolean","selectFromInside","continueSelect","toggleContinueSelect","keyContainer","hitRate","Number","scrollOptions","Object","checkInput","preventDefault","cspNonce","String","EVENTS","METHODS","__extends","options","_super","_this","ChildrenDiffer","DragScroll","clickedTarget","datas","inputEvent","getSelectableTargets","selectableRects","map","rect","getBoundingClientRect","startSelectedTargets","selectedTargets","hitRect","firstPassedTargets","pointTarget","elementFromPoint","indexOf","parentElement","hasInsideTargets","length","isPreventSelect","type","isTrusted","result","trigger","passSelectedTargets","select","cssText","onDragEnd","dragScroll","dragStart","drag","check","dragEnd","selectEnd","sameCombiKey","dragger","isFlag","window","documentElement","containers","Element","slice","call","some","contains","undefined","initElement","initDragScroll","setKeyController","differ","setKeyEvent","value","triggerDragStart","off","keycon","destroy","unset","injectResult","removeEvent","onDocumentSelectStart","dragEvent","onDragStart","KeyController","keydown","onKeyDown","keyup","onKeyUp","on","onBlur","querySelectorAll","parentNode","Dragger","dragstart","onDrag","dragend","addEvent","inject","nonce","selectRect","targets","rects","filter","rectLeft","rectTop","rectRight","rectBottom","isStart","rectSize","testLeft","max","testRight","testTop","testBottom","rate","round","direction","offsetX","offsetY","scrollBy","isObject","push","elements","passedTargets","list","prevList","added","removed","index","concat","selected","isDouble","afterAdded","afterRemoved","afterPrevList","afterList","isDragStart","hitTest","combi","getCombi","key","toggleKeys","isArray","keys","every","Selecto","Properties","prototype","property","enumerable","configurable","get","setter","camelize","set","defineProperty","Component"],"mappings":"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"} \ No newline at end of file diff --git a/dist/selecto.js b/dist/selecto.js new file mode 100644 index 0000000..fd706cb --- /dev/null +++ b/dist/selecto.js @@ -0,0 +1,3599 @@ +/* +Copyright (c) 2020 Daybrush +name: selecto +license: MIT +author: Daybrush +repository: git+https://github.com/daybrush/selecto.git +version: 1.6.1 +*/ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.Selecto = factory()); +}(this, (function () { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + /* global Reflect, Promise */ + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + + return t; + }; + + return __assign.apply(this, arguments); + }; + function __rest(s, e) { + var t = {}; + + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; + + if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; + } + return t; + } + function __decorate(decorators, target, key, desc) { + var c = arguments.length, + r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, + d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + } + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + + for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; + + return r; + } + + /* + Copyright (c) 2017 NAVER Corp. + @egjs/component project is licensed under the MIT license + + @egjs/component JavaScript library + https://naver.github.io/egjs-component + + @version 2.1.2 + */ + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + function isUndefined(value) { + return typeof value === "undefined"; + } + /** + * A class used to manage events in a component + * @ko 컴포넌트의 이벤트을 관리할 수 있게 하는 클래스 + * @alias eg.Component + */ + + + var Component = + /*#__PURE__*/ + function () { + var Component = + /*#__PURE__*/ + function () { + /** + * Version info string + * @ko 버전정보 문자열 + * @name VERSION + * @static + * @type {String} + * @example + * eg.Component.VERSION; // ex) 2.0.0 + * @memberof eg.Component + */ + + /** + * @support {"ie": "7+", "ch" : "latest", "ff" : "latest", "sf" : "latest", "edge" : "latest", "ios" : "7+", "an" : "2.1+ (except 3.x)"} + */ + function Component() { + this._eventHandler = {}; + this.options = {}; + } + /** + * Triggers a custom event. + * @ko 커스텀 이벤트를 발생시킨다 + * @param {String} eventName The name of the custom event to be triggered 발생할 커스텀 이벤트의 이름 + * @param {Object} customEvent Event data to be sent when triggering a custom event 커스텀 이벤트가 발생할 때 전달할 데이터 + * @return {Boolean} Indicates whether the event has occurred. If the stop() method is called by a custom event handler, it will return false and prevent the event from occurring. Ref 이벤트 발생 여부. 커스텀 이벤트 핸들러에서 stop() 메서드를 호출하면 'false'를 반환하고 이벤트 발생을 중단한다. 참고 + * @example + class Some extends eg.Component { + some(){ + if(this.trigger("beforeHi")){ // When event call to stop return false. + this.trigger("hi");// fire hi event. + } + } + } + const some = new Some(); + some.on("beforeHi", (e) => { + if(condition){ + e.stop(); // When event call to stop, `hi` event not call. + } + }); + some.on("hi", (e) => { + // `currentTarget` is component instance. + console.log(some === e.currentTarget); // true + }); + // If you want to more know event design. You can see article. + // https://github.com/naver/egjs-component/wiki/How-to-make-Component-event-design%3F + */ + + + var _proto = Component.prototype; + + _proto.trigger = function trigger(eventName, customEvent) { + if (customEvent === void 0) { + customEvent = {}; + } + + var handlerList = this._eventHandler[eventName] || []; + var hasHandlerList = handlerList.length > 0; + + if (!hasHandlerList) { + return true; + } // If detach method call in handler in first time then handler list calls. + + + handlerList = handlerList.concat(); + customEvent.eventType = eventName; + var isCanceled = false; + var arg = [customEvent]; + var i = 0; + + customEvent.stop = function () { + isCanceled = true; + }; + + customEvent.currentTarget = this; + + for (var _len = arguments.length, restParam = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + restParam[_key - 2] = arguments[_key]; + } + + if (restParam.length >= 1) { + arg = arg.concat(restParam); + } + + for (i = 0; handlerList[i]; i++) { + handlerList[i].apply(this, arg); + } + + return !isCanceled; + }; + /** + * Executed event just one time. + * @ko 이벤트가 한번만 실행된다. + * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름 + * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수 + * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스 + * @example + class Some extends eg.Component { + hi() { + alert("hi"); + } + thing() { + this.once("hi", this.hi); + } + } + var some = new Some(); + some.thing(); + some.trigger("hi"); + // fire alert("hi"); + some.trigger("hi"); + // Nothing happens + */ + + + _proto.once = function once(eventName, handlerToAttach) { + if (typeof eventName === "object" && isUndefined(handlerToAttach)) { + var eventHash = eventName; + var i; + + for (i in eventHash) { + this.once(i, eventHash[i]); + } + + return this; + } else if (typeof eventName === "string" && typeof handlerToAttach === "function") { + var self = this; + this.on(eventName, function listener() { + for (var _len2 = arguments.length, arg = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + arg[_key2] = arguments[_key2]; + } + + handlerToAttach.apply(self, arg); + self.off(eventName, listener); + }); + } + + return this; + }; + /** + * Checks whether an event has been attached to a component. + * @ko 컴포넌트에 이벤트가 등록됐는지 확인한다. + * @param {String} eventName The name of the event to be attached 등록 여부를 확인할 이벤트의 이름 + * @return {Boolean} Indicates whether the event is attached. 이벤트 등록 여부 + * @example + class Some extends eg.Component { + some() { + this.hasOn("hi");// check hi event. + } + } + */ + + + _proto.hasOn = function hasOn(eventName) { + return !!this._eventHandler[eventName]; + }; + /** + * Attaches an event to a component. + * @ko 컴포넌트에 이벤트를 등록한다. + * @param {eventName} eventName The name of the event to be attached 등록할 이벤트의 이름 + * @param {Function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수 + * @return {eg.Component} An instance of a component itself컴포넌트 자신의 인스턴스 + * @example + class Some extends eg.Component { + hi() { + console.log("hi"); + } + some() { + this.on("hi",this.hi); //attach event + } + } + */ + + + _proto.on = function on(eventName, handlerToAttach) { + if (typeof eventName === "object" && isUndefined(handlerToAttach)) { + var eventHash = eventName; + var name; + + for (name in eventHash) { + this.on(name, eventHash[name]); + } + + return this; + } else if (typeof eventName === "string" && typeof handlerToAttach === "function") { + var handlerList = this._eventHandler[eventName]; + + if (isUndefined(handlerList)) { + this._eventHandler[eventName] = []; + handlerList = this._eventHandler[eventName]; + } + + handlerList.push(handlerToAttach); + } + + return this; + }; + /** + * Detaches an event from the component. + * @ko 컴포넌트에 등록된 이벤트를 해제한다 + * @param {eventName} eventName The name of the event to be detached 해제할 이벤트의 이름 + * @param {Function} handlerToDetach The handler function of the event to be detached 해제할 이벤트의 핸들러 함수 + * @return {eg.Component} An instance of a component itself 컴포넌트 자신의 인스턴스 + * @example + class Some extends eg.Component { + hi() { + console.log("hi"); + } + some() { + this.off("hi",this.hi); //detach event + } + } + */ + + + _proto.off = function off(eventName, handlerToDetach) { + // All event detach. + if (isUndefined(eventName)) { + this._eventHandler = {}; + return this; + } // All handler of specific event detach. + + + if (isUndefined(handlerToDetach)) { + if (typeof eventName === "string") { + this._eventHandler[eventName] = undefined; + return this; + } else { + var eventHash = eventName; + var name; + + for (name in eventHash) { + this.off(name, eventHash[name]); + } + + return this; + } + } // The handler of specific event detach. + + + var handlerList = this._eventHandler[eventName]; + + if (handlerList) { + var k; + var handlerFunction; + + for (k = 0; (handlerFunction = handlerList[k]) !== undefined; k++) { + if (handlerFunction === handlerToDetach) { + handlerList = handlerList.splice(k, 1); + break; + } + } + } + + return this; + }; + + return Component; + }(); + + Component.VERSION = "2.1.2"; + return Component; + }(); + + /* + Copyright (c) 2018 Daybrush + @name: @daybrush/utils + license: MIT + author: Daybrush + repository: https://github.com/daybrush/utils + @version 1.0.0 + */ + /** + * get string "object" + * @memberof Consts + * @example + import {OBJECT} from "@daybrush/utils"; + + console.log(OBJECT); // "object" + */ + + var OBJECT = "object"; + var OPEN_CLOSED_CHARACTER = ["\"", "'", "\\\"", "\\'"]; + /** + * Check the type that the value is object. + * @memberof Utils + * @param {string} value - Value to check the type + * @return {} true if the type is correct, false otherwise + * @example + import {isObject} from "@daybrush/utils"; + + console.log(isObject({})); // true + console.log(isObject(undefined)); // false + console.log(isObject("")); // false + console.log(isObject(null)); // false + */ + + function isObject(value) { + return value && typeof value === OBJECT; + } + /** + * Check the type that the value is isArray. + * @memberof Utils + * @param {string} value - Value to check the type + * @return {} true if the type is correct, false otherwise + * @example + import {isArray} from "@daybrush/utils"; + + console.log(isArray([])); // true + console.log(isArray({})); // false + console.log(isArray(undefined)); // false + console.log(isArray(null)); // false + */ + + function isArray(value) { + return Array.isArray(value); + } + + function findClosed(closedCharacter, texts, index, length) { + for (var i = index; i < length; ++i) { + var character = texts[i].trim(); + + if (character === closedCharacter) { + return i; + } + + var nextIndex = i; + + if (character === "(") { + nextIndex = findClosed(")", texts, i + 1, length); + } else if (OPEN_CLOSED_CHARACTER.indexOf(character) > -1) { + nextIndex = findClosed(character, texts, i + 1, length); + } + + if (nextIndex === -1) { + break; + } + + i = nextIndex; + } + + return -1; + } + + function splitText(text, separator) { + var regexText = "(\\s*" + (separator || ",") + "\\s*|\\(|\\)|\"|'|\\\\\"|\\\\'|\\s+)"; + var regex = new RegExp(regexText, "g"); + var texts = text.split(regex).filter(Boolean); + var length = texts.length; + var values = []; + var tempValues = []; + + for (var i = 0; i < length; ++i) { + var character = texts[i].trim(); + var nextIndex = i; + + if (character === "(") { + nextIndex = findClosed(")", texts, i + 1, length); + } else if (character === ")") { + throw new Error("invalid format"); + } else if (OPEN_CLOSED_CHARACTER.indexOf(character) > -1) { + nextIndex = findClosed(character, texts, i + 1, length); + } else if (character === separator) { + if (tempValues.length) { + values.push(tempValues.join("")); + tempValues = []; + } + + continue; + } + + if (nextIndex === -1) { + nextIndex = length - 1; + } + + tempValues.push(texts.slice(i, nextIndex + 1).join("")); + i = nextIndex; + } + + if (tempValues.length) { + values.push(tempValues.join("")); + } + + return values; + } + /** + * divide text by comma. + * @memberof Utils + * @param {string} text - text to divide + * @return {Array} divided texts + * @example + import {splitComma} from "@daybrush/utils"; + + console.log(splitComma("a,b,c,d,e,f,g")); + // ["a", "b", "c", "d", "e", "f", "g"] + console.log(splitComma("'a,b',c,'d,e',f,g")); + // ["'a,b'", "c", "'d,e'", "f", "g"] + */ + + function splitComma(text) { + // divide comma(,) + // "[^"]*"|'[^']*' + return splitText(text, ","); + } + /** + * transform strings to camel-case + * @memberof Utils + * @param {String} text - string + * @return {String} camel-case string + * @example + import {camelize} from "@daybrush/utils"; + + console.log(camelize("transform-origin")); // transformOrigin + console.log(camelize("abcd_efg")); // abcdEfg + console.log(camelize("abcd efg")); // abcdEfg + */ + + function camelize(str) { + return str.replace(/[\s-_]([a-z])/g, function (all, letter) { + return letter.toUpperCase(); + }); + } + /** + * Date.now() method + * @memberof CrossBrowser + * @return {number} milliseconds + * @example + import {now} from "@daybrush/utils"; + + console.log(now()); // 12121324241(milliseconds) + */ + + function now() { + return Date.now ? Date.now() : new Date().getTime(); + } + /** + * Checks if the specified class value exists in the element's class attribute. + * @memberof DOM + * @param element - target + * @param className - the class name to search + * @return {boolean} return false if the class is not found. + * @example + import {hasClass} from "@daybrush/utils"; + + console.log(hasClass(element, "start")); // true or false + */ + + function hasClass(element, className) { + if (element.classList) { + return element.classList.contains(className); + } + + return !!element.className.match(new RegExp("(\\s|^)" + className + "(\\s|$)")); + } + /** + * Add the specified class value. If these classe already exist in the element's class attribute they are ignored. + * @memberof DOM + * @param element - target + * @param className - the class name to add + * @example + import {addClass} from "@daybrush/utils"; + + addClass(element, "start"); + */ + + function addClass(element, className) { + if (element.classList) { + element.classList.add(className); + } else { + element.className += " " + className; + } + } + /** + * Sets up a function that will be called whenever the specified event is delivered to the target + * @memberof DOM + * @param - event target + * @param - A case-sensitive string representing the event type to listen for. + * @param - The object which receives a notification (an object that implements the Event interface) when an event of the specified type occurs + * @param - An options object that specifies characteristics about the event listener. The available options are: + * @example + import {addEvent} from "@daybrush/utils"; + + addEvent(el, "click", e => { + console.log(e); + }); + */ + + function addEvent(el, type, listener, options) { + el.addEventListener(type, listener, options); + } + /** + * removes from the EventTarget an event listener previously registered with EventTarget.addEventListener() + * @memberof DOM + * @param - event target + * @param - A case-sensitive string representing the event type to listen for. + * @param - The EventListener function of the event handler to remove from the event target. + * @example + import {addEvent, removeEvent} from "@daybrush/utils"; + const listener = e => { + console.log(e); + }; + addEvent(el, "click", listener); + removeEvent(el, "click", listener); + */ + + function removeEvent(el, type, listener) { + el.removeEventListener(type, listener); + } + + /* + Copyright (c) 2019 Daybrush + name: @daybrush/drag + license: MIT + author: Daybrush + repository: git+https://github.com/daybrush/drag.git + version: 0.19.3 + */ + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + var __assign$1 = function () { + __assign$1 = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + + return t; + }; + + return __assign$1.apply(this, arguments); + }; + + function getRad(pos1, pos2) { + var distX = pos2[0] - pos1[0]; + var distY = pos2[1] - pos1[1]; + var rad = Math.atan2(distY, distX); + return rad >= 0 ? rad : rad + Math.PI * 2; + } + function getRotatiion(touches) { + return getRad([touches[0].clientX, touches[0].clientY], [touches[1].clientX, touches[1].clientY]) / Math.PI * 180; + } + function getPinchDragPosition(clients, prevClients, startClients, startPinchClients) { + var nowCenter = getAverageClient(clients); + var prevCenter = getAverageClient(prevClients); + var startCenter = getAverageClient(startPinchClients); + var pinchClient = plueClient(startPinchClients[0], minusClient(nowCenter, startCenter)); + var pinchPrevClient = plueClient(startPinchClients[0], minusClient(prevCenter, startCenter)); + return getPosition(pinchClient, pinchPrevClient, startClients[0]); + } + function isMultiTouch(e) { + return e.touches && e.touches.length >= 2; + } + function getPositionEvent(e) { + if (e.touches) { + return getClients(e.touches); + } else { + return [getClient(e)]; + } + } + function getPosition(client, prevClient, startClient) { + var clientX = client.clientX, + clientY = client.clientY; + var prevX = prevClient.clientX, + prevY = prevClient.clientY; + var startX = startClient.clientX, + startY = startClient.clientY; + var deltaX = clientX - prevX; + var deltaY = clientY - prevY; + var distX = clientX - startX; + var distY = clientY - startY; + return { + clientX: clientX, + clientY: clientY, + deltaX: deltaX, + deltaY: deltaY, + distX: distX, + distY: distY + }; + } + function getDist(clients) { + return Math.sqrt(Math.pow(clients[0].clientX - clients[1].clientX, 2) + Math.pow(clients[0].clientY - clients[1].clientY, 2)); + } + function getPositions(clients, prevClients, startClients) { + return clients.map(function (client, i) { + return getPosition(client, prevClients[i], startClients[i]); + }); + } + function getClients(touches) { + var length = Math.min(touches.length, 2); + var clients = []; + + for (var i = 0; i < length; ++i) { + clients.push(getClient(touches[i])); + } + + return clients; + } + function getClient(e) { + return { + clientX: e.clientX, + clientY: e.clientY + }; + } + function getAverageClient(clients) { + if (clients.length === 1) { + return clients[0]; + } + + return { + clientX: (clients[0].clientX + clients[1].clientX) / 2, + clientY: (clients[0].clientY + clients[1].clientY) / 2 + }; + } + function plueClient(client1, client2) { + return { + clientX: client1.clientX + client2.clientX, + clientY: client1.clientY + client2.clientY + }; + } + function minusClient(client1, client2) { + return { + clientX: client1.clientX - client2.clientX, + clientY: client1.clientY - client2.clientY + }; + } + + var INPUT_TAGNAMES = ["textarea", "input"]; + /** + * You can set up drag events in any browser. + */ + + var Dragger = + /*#__PURE__*/ + function () { + /** + * + */ + function Dragger(targets, options) { + var _this = this; + + if (options === void 0) { + options = {}; + } + + this.options = {}; + this.flag = false; + this.pinchFlag = false; + this.datas = {}; + this.isDrag = false; + this.isPinch = false; + this.isMouse = false; + this.isTouch = false; + this.prevClients = []; + this.startClients = []; + this.movement = 0; + this.startPinchClients = []; + this.startDistance = 0; + this.customDist = [0, 0]; + this.targets = []; + this.prevTime = 0; + this.isDouble = false; + this.startRotate = 0; + /** + * @method + */ + + this.onDragStart = function (e, isTrusted) { + if (isTrusted === void 0) { + isTrusted = true; + } + + if (!_this.flag && e.cancelable === false) { + return; + } + + var _a = _this.options, + container = _a.container, + pinchOutside = _a.pinchOutside, + dragstart = _a.dragstart, + preventRightClick = _a.preventRightClick, + preventDefault = _a.preventDefault, + checkInput = _a.checkInput; + var isTouch = _this.isTouch; + + if (!_this.flag) { + var activeElement = document.activeElement; + var target = e.target; + var tagName = target.tagName.toLowerCase(); + var hasInput = INPUT_TAGNAMES.indexOf(tagName) > -1; + var hasContentEditable = target.isContentEditable; + + if (hasInput || hasContentEditable) { + if (checkInput || activeElement === target) { + // force false or already focused. + return false; + } + + if (activeElement && hasContentEditable && activeElement.isContentEditable && activeElement.contains(target)) { + return false; + } + } else if ((preventDefault || e.type === "touchstart") && activeElement) { + var activeTagName = activeElement.tagName; + + if (activeElement.isContentEditable || INPUT_TAGNAMES.indexOf(activeTagName) > -1) { + activeElement.blur(); + } + } + } + + var timer = 0; + + if (!_this.flag && isTouch && pinchOutside) { + timer = setTimeout(function () { + addEvent(container, "touchstart", _this.onDragStart, { + passive: false + }); + }); + } + + if (_this.flag && isTouch && pinchOutside) { + removeEvent(container, "touchstart", _this.onDragStart); + } + + if (isMultiTouch(e)) { + clearTimeout(timer); + + if (!_this.flag && e.touches.length !== e.changedTouches.length) { + return; + } + + if (!_this.pinchFlag) { + _this.onPinchStart(e); + } + } + + if (_this.flag) { + return; + } + + var clients = _this.startClients[0] ? _this.startClients : getPositionEvent(e); + _this.customDist = [0, 0]; + _this.flag = true; + _this.isDrag = false; + _this.startClients = clients; + _this.prevClients = clients; + _this.datas = {}; + _this.movement = 0; + var position = getPosition(clients[0], _this.prevClients[0], _this.startClients[0]); + + if (preventRightClick && (e.which === 3 || e.button === 2)) { + clearTimeout(timer); + + _this.initDrag(); + + return false; + } + + var result = dragstart && dragstart(__assign$1({ + type: "dragstart", + datas: _this.datas, + inputEvent: e, + isTrusted: isTrusted + }, position)); + + if (result === false) { + clearTimeout(timer); + + _this.initDrag(); + } + + _this.isDouble = now() - _this.prevTime < 200; + _this.flag && preventDefault && e.preventDefault(); + }; + + this.onDrag = function (e, isScroll) { + if (!_this.flag) { + return; + } + + var clients = getPositionEvent(e); + + if (_this.pinchFlag) { + _this.onPinch(e, clients); + } + + var result = _this.move([0, 0], e, clients); + + if (!result || !result.deltaX && !result.deltaY) { + return; + } + + var drag = _this.options.drag; + drag && drag(__assign$1({}, result, { + isScroll: !!isScroll, + inputEvent: e + })); + }; + + this.onDragEnd = function (e) { + if (!_this.flag) { + return; + } + + var _a = _this.options, + dragend = _a.dragend, + pinchOutside = _a.pinchOutside, + container = _a.container; + + if (_this.isTouch && pinchOutside) { + removeEvent(container, "touchstart", _this.onDragStart); + } + + if (_this.pinchFlag) { + _this.onPinchEnd(e); + } + + _this.flag = false; + var prevClients = _this.prevClients; + var startClients = _this.startClients; + var position = _this.pinchFlag ? getPinchDragPosition(prevClients, prevClients, startClients, _this.startPinchClients) : getPosition(prevClients[0], prevClients[0], startClients[0]); + var currentTime = now(); + var isDouble = !_this.isDrag && _this.isDouble; + _this.prevTime = _this.isDrag || isDouble ? 0 : currentTime; + _this.startClients = []; + _this.prevClients = []; + dragend && dragend(__assign$1({ + type: "dragend", + datas: _this.datas, + isDouble: isDouble, + isDrag: _this.isDrag, + inputEvent: e + }, position)); + }; + + var elements = [].concat(targets); + this.options = __assign$1({ + checkInput: false, + container: elements.length > 1 ? window : elements[0], + preventRightClick: true, + preventDefault: true, + pinchThreshold: 0, + events: ["touch", "mouse"] + }, options); + var _a = this.options, + container = _a.container, + events = _a.events; + this.isTouch = events.indexOf("touch") > -1; + this.isMouse = events.indexOf("mouse") > -1; + this.customDist = [0, 0]; + this.targets = elements; + + if (this.isMouse) { + elements.forEach(function (el) { + addEvent(el, "mousedown", _this.onDragStart); + }); + addEvent(container, "mousemove", this.onDrag); + addEvent(container, "mouseup", this.onDragEnd); + addEvent(container, "contextmenu", this.onDragEnd); + } + + if (this.isTouch) { + var passive_1 = { + passive: false + }; + elements.forEach(function (el) { + addEvent(el, "touchstart", _this.onDragStart, passive_1); + }); + addEvent(container, "touchmove", this.onDrag, passive_1); + addEvent(container, "touchend", this.onDragEnd, passive_1); + addEvent(container, "touchcancel", this.onDragEnd, passive_1); + } + } + /** + * + */ + + + var __proto = Dragger.prototype; + + __proto.isDragging = function () { + return this.isDrag; + }; + /** + * + */ + + + __proto.isFlag = function () { + return this.flag; + }; + /** + * + */ + + + __proto.isPinchFlag = function () { + return this.pinchFlag; + }; + /** + * + */ + + + __proto.isPinching = function () { + return this.isPinch; + }; + /** + * + */ + + + __proto.scrollBy = function (deltaX, deltaY, e, isCallDrag) { + if (isCallDrag === void 0) { + isCallDrag = true; + } + + if (!this.flag) { + return; + } + + this.startClients.forEach(function (client) { + client.clientX -= deltaX; + client.clientY -= deltaY; + }); + this.prevClients.forEach(function (client) { + client.clientX -= deltaX; + client.clientY -= deltaY; + }); + isCallDrag && this.onDrag(e, true); + }; + + __proto.move = function (_a, inputEvent, clients) { + var deltaX = _a[0], + deltaY = _a[1]; + + if (clients === void 0) { + clients = this.prevClients; + } + + var customDist = this.customDist; + var prevClients = this.prevClients; + var startClients = this.startClients; + var position = this.pinchFlag ? getPinchDragPosition(clients, prevClients, startClients, this.startPinchClients) : getPosition(clients[0], prevClients[0], startClients[0]); + customDist[0] += deltaX; + customDist[1] += deltaY; + position.deltaX += deltaX; + position.deltaY += deltaY; + var positionDeltaX = position.deltaX, + positionDeltaY = position.deltaY; + position.distX += customDist[0]; + position.distY += customDist[1]; + this.movement += Math.sqrt(positionDeltaX * positionDeltaX + positionDeltaY * positionDeltaY); + this.prevClients = clients; + this.isDrag = true; + return __assign$1({ + type: "drag", + datas: this.datas + }, position, { + movement: this.movement, + isDrag: this.isDrag, + isPinch: this.isPinch, + isScroll: false, + inputEvent: inputEvent + }); + }; + + __proto.onPinchStart = function (e) { + var _a, _b; + + var _c = this.options, + pinchstart = _c.pinchstart, + pinchThreshold = _c.pinchThreshold; + + if (this.isDrag && this.movement > pinchThreshold) { + return; + } + + var pinchClients = getClients(e.changedTouches); + this.pinchFlag = true; + + (_a = this.startClients).push.apply(_a, pinchClients); + + (_b = this.prevClients).push.apply(_b, pinchClients); + + this.startDistance = getDist(this.prevClients); + this.startPinchClients = this.prevClients.slice(); + + if (!pinchstart) { + return; + } + + var startClients = this.prevClients; + var startAverageClient = getAverageClient(startClients); + var centerPosition = getPosition(startAverageClient, startAverageClient, startAverageClient); + this.startRotate = getRotatiion(startClients); + pinchstart(__assign$1({ + type: "pinchstart", + datas: this.datas, + angle: this.startRotate, + touches: getPositions(startClients, startClients, startClients) + }, centerPosition, { + inputEvent: e + })); + }; + + __proto.onPinch = function (e, clients) { + if (!this.flag || !this.pinchFlag || clients.length < 2) { + return; + } + + this.isPinch = true; + var pinch = this.options.pinch; + + if (!pinch) { + return; + } + + var prevClients = this.prevClients; + var startClients = this.startClients; + var centerPosition = getPosition(getAverageClient(clients), getAverageClient(prevClients), getAverageClient(startClients)); + var angle = getRotatiion(clients); + var distance = getDist(clients); + pinch(__assign$1({ + type: "pinch", + datas: this.datas, + movement: this.movement, + angle: angle, + rotation: angle - this.startRotate, + touches: getPositions(clients, prevClients, startClients), + scale: distance / this.startDistance, + distance: distance + }, centerPosition, { + inputEvent: e + })); + }; + + __proto.onPinchEnd = function (e) { + if (!this.flag || !this.pinchFlag) { + return; + } + + var isPinch = this.isPinch; + this.isPinch = false; + this.pinchFlag = false; + var pinchend = this.options.pinchend; + + if (!pinchend) { + return; + } + + var prevClients = this.prevClients; + var startClients = this.startClients; + var centerPosition = getPosition(getAverageClient(prevClients), getAverageClient(prevClients), getAverageClient(startClients)); + pinchend(__assign$1({ + type: "pinchend", + datas: this.datas, + isPinch: isPinch, + touches: getPositions(prevClients, prevClients, startClients) + }, centerPosition, { + inputEvent: e + })); + this.isPinch = false; + this.pinchFlag = false; + }; + + __proto.triggerDragStart = function (e) { + this.onDragStart(e, false); + }; + /** + * + */ + + + __proto.unset = function () { + var _this = this; + + var targets = this.targets; + var container = this.options.container; + + if (this.isMouse) { + targets.forEach(function (target) { + removeEvent(target, "mousedown", _this.onDragStart); + }); + removeEvent(container, "mousemove", this.onDrag); + removeEvent(container, "mouseup", this.onDragEnd); + removeEvent(container, "contextmenu", this.onDragEnd); + } + + if (this.isTouch) { + targets.forEach(function (target) { + removeEvent(target, "touchstart", _this.onDragStart); + }); + removeEvent(container, "touchstart", this.onDragStart); + removeEvent(container, "touchmove", this.onDrag); + removeEvent(container, "touchend", this.onDragEnd); + removeEvent(container, "touchcancel", this.onDragEnd); + } + }; + + __proto.initDrag = function () { + this.startClients = []; + this.prevClients = []; + this.flag = false; + }; + + return Dragger; + }(); + + /* + Copyright (c) 2019 Daybrush + name: framework-utils + license: MIT + author: Daybrush + repository: git+https://github.com/daybrush/framework-utils.git + version: 0.3.4 + */ + /* Class Decorator */ + + function Properties(properties, action) { + return function (component) { + var prototype = component.prototype; + properties.forEach(function (property) { + action(prototype, property); + }); + }; + } + + /* + Copyright (c) 2019-present NAVER Corp. + name: @egjs/list-differ + license: MIT + author: NAVER Corp. + repository: https://github.com/naver/egjs-list-differ + version: 1.0.0 + */ + /* + egjs-list-differ + Copyright (c) 2019-present NAVER Corp. + MIT license + */ + var PolyMap = + /*#__PURE__*/ + function () { + function PolyMap() { + this.keys = []; + this.values = []; + } + + var __proto = PolyMap.prototype; + + __proto.get = function (key) { + return this.values[this.keys.indexOf(key)]; + }; + + __proto.set = function (key, value) { + var keys = this.keys; + var values = this.values; + var prevIndex = keys.indexOf(key); + var index = prevIndex === -1 ? keys.length : prevIndex; + keys[index] = key; + values[index] = value; + }; + + return PolyMap; + }(); + + /* + egjs-list-differ + Copyright (c) 2019-present NAVER Corp. + MIT license + */ + var HashMap = + /*#__PURE__*/ + function () { + function HashMap() { + this.object = {}; + } + + var __proto = HashMap.prototype; + + __proto.get = function (key) { + return this.object[key]; + }; + + __proto.set = function (key, value) { + this.object[key] = value; + }; + + return HashMap; + }(); + + /* + egjs-list-differ + Copyright (c) 2019-present NAVER Corp. + MIT license + */ + var SUPPORT_MAP = typeof Map === "function"; + + /* + egjs-list-differ + Copyright (c) 2019-present NAVER Corp. + MIT license + */ + var Link = + /*#__PURE__*/ + function () { + function Link() {} + + var __proto = Link.prototype; + + __proto.connect = function (prevLink, nextLink) { + this.prev = prevLink; + this.next = nextLink; + prevLink && (prevLink.next = this); + nextLink && (nextLink.prev = this); + }; + + __proto.disconnect = function () { + // In double linked list, diconnect the interconnected relationship. + var prevLink = this.prev; + var nextLink = this.next; + prevLink && (prevLink.next = nextLink); + nextLink && (nextLink.prev = prevLink); + }; + + __proto.getIndex = function () { + var link = this; + var index = -1; + + while (link) { + link = link.prev; + ++index; + } + + return index; + }; + + return Link; + }(); + + /* + egjs-list-differ + Copyright (c) 2019-present NAVER Corp. + MIT license + */ + + function orderChanged(changed, fixed) { + // It is roughly in the order of these examples. + // 4, 6, 0, 2, 1, 3, 5, 7 + var fromLinks = []; // 0, 1, 2, 3, 4, 5, 6, 7 + + var toLinks = []; + changed.forEach(function (_a) { + var from = _a[0], + to = _a[1]; + var link = new Link(); + fromLinks[from] = link; + toLinks[to] = link; + }); // `fromLinks` are connected to each other by double linked list. + + fromLinks.forEach(function (link, i) { + link.connect(fromLinks[i - 1]); + }); + return changed.filter(function (_, i) { + return !fixed[i]; + }).map(function (_a, i) { + var from = _a[0], + to = _a[1]; + + if (from === to) { + return [0, 0]; + } + + var fromLink = fromLinks[from]; + var toLink = toLinks[to - 1]; + var fromIndex = fromLink.getIndex(); // Disconnect the link connected to `fromLink`. + + fromLink.disconnect(); // Connect `fromLink` to the right of `toLink`. + + if (!toLink) { + fromLink.connect(undefined, fromLinks[0]); + } else { + fromLink.connect(toLink, toLink.next); + } + + var toIndex = fromLink.getIndex(); + return [fromIndex, toIndex]; + }); + } + + var Result = + /*#__PURE__*/ + function () { + function Result(prevList, list, added, removed, changed, maintained, changedBeforeAdded, fixed) { + this.prevList = prevList; + this.list = list; + this.added = added; + this.removed = removed; + this.changed = changed; + this.maintained = maintained; + this.changedBeforeAdded = changedBeforeAdded; + this.fixed = fixed; + } + + var __proto = Result.prototype; + Object.defineProperty(__proto, "ordered", { + get: function () { + if (!this.cacheOrdered) { + this.caculateOrdered(); + } + + return this.cacheOrdered; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(__proto, "pureChanged", { + get: function () { + if (!this.cachePureChanged) { + this.caculateOrdered(); + } + + return this.cachePureChanged; + }, + enumerable: true, + configurable: true + }); + + __proto.caculateOrdered = function () { + var ordered = orderChanged(this.changedBeforeAdded, this.fixed); + var changed = this.changed; + var pureChanged = []; + this.cacheOrdered = ordered.filter(function (_a, i) { + var from = _a[0], + to = _a[1]; + var _b = changed[i], + fromBefore = _b[0], + toBefore = _b[1]; + + if (from !== to) { + pureChanged.push([fromBefore, toBefore]); + return true; + } + }); + this.cachePureChanged = pureChanged; + }; + + return Result; + }(); + + /** + * + * @memberof eg.ListDiffer + * @static + * @function + * @param - Previous List 이전 목록 + * @param - List to Update 업데이트 할 목록 + * @param - This callback function returns the key of the item. 아이템의 키를 반환하는 콜백 함수입니다. + * @return - Returns the diff between `prevList` and `list` `prevList`와 `list`의 다른 점을 반환한다. + * @example + * import { diff } from "@egjs/list-differ"; + * // script => eg.ListDiffer.diff + * const result = diff([0, 1, 2, 3, 4, 5], [7, 8, 0, 4, 3, 6, 2, 1], e => e); + * // List before update + * // [1, 2, 3, 4, 5] + * console.log(result.prevList); + * // Updated list + * // [4, 3, 6, 2, 1] + * console.log(result.list); + * // Index array of values added to `list` + * // [0, 1, 5] + * console.log(result.added); + * // Index array of values removed in `prevList` + * // [5] + * console.log(result.removed); + * // An array of index pairs of `prevList` and `list` with different indexes from `prevList` and `list` + * // [[0, 2], [4, 3], [3, 4], [2, 6], [1, 7]] + * console.log(result.changed); + * // The subset of `changed` and an array of index pairs that moved data directly. Indicate an array of absolute index pairs of `ordered`.(Formatted by: Array<[index of prevList, index of list]>) + * // [[4, 3], [3, 4], [2, 6]] + * console.log(result.pureChanged); + * // An array of index pairs to be `ordered` that can synchronize `list` before adding data. (Formatted by: Array<[prevIndex, nextIndex]>) + * // [[4, 1], [4, 2], [4, 3]] + * console.log(result.ordered); + * // An array of index pairs of `prevList` and `list` that have not been added/removed so data is preserved + * // [[0, 2], [4, 3], [3, 4], [2, 6], [1, 7]] + * console.log(result.maintained); + */ + + function diff(prevList, list, findKeyCallback) { + var mapClass = SUPPORT_MAP ? Map : findKeyCallback ? HashMap : PolyMap; + + var callback = findKeyCallback || function (e) { + return e; + }; + + var added = []; + var removed = []; + var maintained = []; + var prevKeys = prevList.map(callback); + var keys = list.map(callback); + var prevKeyMap = new mapClass(); + var keyMap = new mapClass(); + var changedBeforeAdded = []; + var fixed = []; + var removedMap = {}; + var changed = []; + var addedCount = 0; + var removedCount = 0; // Add prevKeys and keys to the hashmap. + + prevKeys.forEach(function (key, prevListIndex) { + prevKeyMap.set(key, prevListIndex); + }); + keys.forEach(function (key, listIndex) { + keyMap.set(key, listIndex); + }); // Compare `prevKeys` and `keys` and add them to `removed` if they are not in `keys`. + + prevKeys.forEach(function (key, prevListIndex) { + var listIndex = keyMap.get(key); // In prevList, but not in list, it is removed. + + if (typeof listIndex === "undefined") { + ++removedCount; + removed.push(prevListIndex); + } else { + removedMap[listIndex] = removedCount; + } + }); // Compare `prevKeys` and `keys` and add them to `added` if they are not in `prevKeys`. + + keys.forEach(function (key, listIndex) { + var prevListIndex = prevKeyMap.get(key); // In list, but not in prevList, it is added. + + if (typeof prevListIndex === "undefined") { + added.push(listIndex); + ++addedCount; + } else { + maintained.push([prevListIndex, listIndex]); + removedCount = removedMap[listIndex] || 0; + changedBeforeAdded.push([prevListIndex - removedCount, listIndex - addedCount]); + fixed.push(listIndex === prevListIndex); + + if (prevListIndex !== listIndex) { + changed.push([prevListIndex, listIndex]); + } + } + }); // Sort by ascending order of 'to(list's index). + + removed.reverse(); + return new Result(prevList, list, added, removed, changed, maintained, changedBeforeAdded, fixed); + } + + /** + * A module that checks diff when values are added, removed, or changed in an array. + * @ko 배열 또는 오브젝트에서 값이 추가되거나 삭제되거나 순서가 변경사항을 체크하는 모듈입니다. + * @memberof eg + */ + + var ListDiffer = + /*#__PURE__*/ + function () { + /** + * @param - Initializing Data Array. 초기 설정할 데이터 배열. + * @param - This callback function returns the key of the item. 아이템의 키를 반환하는 콜백 함수입니다. + * @example + * import ListDiffer from "@egjs/list-differ"; + * // script => eg.ListDiffer + * const differ = new ListDiffer([0, 1, 2, 3, 4, 5], e => e); + * const result = differ.update([7, 8, 0, 4, 3, 6, 2, 1]); + * // List before update + * // [1, 2, 3, 4, 5] + * console.log(result.prevList); + * // Updated list + * // [4, 3, 6, 2, 1] + * console.log(result.list); + * // Index array of values added to `list`. + * // [0, 1, 5] + * console.log(result.added); + * // Index array of values removed in `prevList`. + * // [5] + * console.log(result.removed); + * // An array of index pairs of `prevList` and `list` with different indexes from `prevList` and `list`. + * // [[0, 2], [4, 3], [3, 4], [2, 6], [1, 7]] + * console.log(result.changed); + * // The subset of `changed` and an array of index pairs that moved data directly. Indicate an array of absolute index pairs of `ordered`.(Formatted by: Array<[index of prevList, index of list]>) + * // [[4, 3], [3, 4], [2, 6]] + * console.log(result.pureChanged); + * // An array of index pairs to be `ordered` that can synchronize `list` before adding data. (Formatted by: Array<[prevIndex, nextIndex]>) + * // [[4, 1], [4, 2], [4, 3]] + * console.log(result.ordered); + * // An array of index pairs of `prevList` and `list` that have not been added/removed so data is preserved. + * // [[0, 2], [4, 3], [3, 4], [2, 6], [1, 7]] + * console.log(result.maintained); + */ + function ListDiffer(list, findKeyCallback) { + if (list === void 0) { + list = []; + } + + this.findKeyCallback = findKeyCallback; + this.list = [].slice.call(list); + } + /** + * Update list. + * @ko 리스트를 업데이트를 합니다. + * @param - List to update 업데이트할 리스트 + * @return - Returns the results of an update from `prevList` to `list`. `prevList`에서 `list`로 업데이트한 결과를 반환한다. + */ + + + var __proto = ListDiffer.prototype; + + __proto.update = function (list) { + var newData = [].slice.call(list); + var result = diff(this.list, newData, this.findKeyCallback); + this.list = newData; + return result; + }; + + return ListDiffer; + }(); + + /* + Copyright (c) 2019-present NAVER Corp. + name: @egjs/children-differ + license: MIT + author: NAVER Corp. + repository: https://github.com/naver/egjs-children-differ + version: 1.0.0 + */ + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + /* global Reflect, Promise */ + var extendStatics$1 = function (d, b) { + extendStatics$1 = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics$1(d, b); + }; + + function __extends$1(d, b) { + extendStatics$1(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + /* + egjs-children-differ + Copyright (c) 2019-present NAVER Corp. + MIT license + */ + var findKeyCallback = typeof Map === "function" ? undefined : function () { + var childrenCount = 0; + return function (el) { + return el.__DIFF_KEY__ || (el.__DIFF_KEY__ = ++childrenCount); + }; + }(); + + /** + * A module that checks diff when child are added, removed, or changed . + * @ko 자식 노드들에서 자식 노드가 추가되거나 삭제되거나 순서가 변경된 사항을 체크하는 모듈입니다. + * @memberof eg + * @extends eg.ListDiffer + */ + + var ChildrenDiffer = + /*#__PURE__*/ + function (_super) { + __extends$1(ChildrenDiffer, _super); + /** + * @param - Initializing Children 초기 설정할 자식 노드들 + */ + + + function ChildrenDiffer(list) { + if (list === void 0) { + list = []; + } + + return _super.call(this, list, findKeyCallback) || this; + } + + return ChildrenDiffer; + }(ListDiffer); + + /* + egjs-children-differ + Copyright (c) 2019-present NAVER Corp. + MIT license + */ + /** + * + * @memberof eg.ChildrenDiffer + * @static + * @function + * @param - Previous List 이전 목록 + * @param - List to Update 업데이트 할 목록 + * @return - Returns the diff between `prevList` and `list` `prevList`와 `list`의 다른 점을 반환한다. + * @example + * import { diff } from "@egjs/children-differ"; + * // script => eg.ChildrenDiffer.diff + * const result = diff([0, 1, 2, 3, 4, 5], [7, 8, 0, 4, 3, 6, 2, 1]); + * // List before update + * // [1, 2, 3, 4, 5] + * console.log(result.prevList); + * // Updated list + * // [4, 3, 6, 2, 1] + * console.log(result.list); + * // Index array of values added to `list` + * // [0, 1, 5] + * console.log(result.added); + * // Index array of values removed in `prevList` + * // [5] + * console.log(result.removed); + * // An array of index pairs of `prevList` and `list` with different indexes from `prevList` and `list` + * // [[0, 2], [4, 3], [3, 4], [2, 6], [1, 7]] + * console.log(result.changed); + * // The subset of `changed` and an array of index pairs that moved data directly. Indicate an array of absolute index pairs of `ordered`.(Formatted by: Array<[index of prevList, index of list]>) + * // [[4, 3], [3, 4], [2, 6]] + * console.log(result.pureChanged); + * // An array of index pairs to be `ordered` that can synchronize `list` before adding data. (Formatted by: Array<[prevIndex, nextIndex]>) + * // [[4, 1], [4, 2], [4, 3]] + * console.log(result.ordered); + * // An array of index pairs of `prevList` and `list` that have not been added/removed so data is preserved + * // [[0, 2], [4, 3], [3, 4], [2, 6], [1, 7]] + * console.log(result.maintained); + */ + + function diff$1(prevList, list) { + return diff(prevList, list, findKeyCallback); + } + + /* + Copyright (c) 2019 Daybrush + name: @scena/dragscroll + license: MIT + author: Daybrush + repository: git+https://github.com/daybrush/dragscroll.git + version: 0.2.1 + */ + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + /* global Reflect, Promise */ + var extendStatics$2 = function (d, b) { + extendStatics$2 = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics$2(d, b); + }; + + function __extends$2(d, b) { + extendStatics$2(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + function getDefaultScrollPosition(e) { + var container = e.container; + return [container.scrollLeft, container.scrollTop]; + } + + var DragScroll = + /*#__PURE__*/ + function (_super) { + __extends$2(DragScroll, _super); + + function DragScroll() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.startRect = null; + _this.startPos = []; + _this.prevTime = 0; + _this.timer = 0; + return _this; + } + + var __proto = DragScroll.prototype; + + __proto.dragStart = function (e, options) { + var _a = options.container.getBoundingClientRect(), + top = _a.top, + left = _a.left, + width = _a.width, + height = _a.height; + + this.startPos = [e.clientX, e.clientY]; + this.startRect = { + top: top, + left: left, + width: width, + height: height + }; + }; + + __proto.drag = function (e, options) { + var _this = this; + + var clientX = e.clientX, + clientY = e.clientY; + var container = options.container, + _a = options.threshold, + threshold = _a === void 0 ? 0 : _a, + _b = options.throttleTime, + throttleTime = _b === void 0 ? 0 : _b, + _c = options.getScrollPosition, + getScrollPosition = _c === void 0 ? getDefaultScrollPosition : _c; + + var _d = this, + startRect = _d.startRect, + startPos = _d.startPos; + + var nowTime = now(); + var distTime = Math.max(throttleTime + this.prevTime - nowTime, 0); + var direction = [0, 0]; + + if (startRect.top > clientY - threshold) { + if (startPos[1] > startRect.top || clientY < startPos[1]) { + direction[1] = -1; + } + } else if (startRect.top + startRect.height < clientY + threshold) { + if (startPos[1] < startRect.top + startRect.height || clientY > startPos[1]) { + direction[1] = 1; + } + } + + if (startRect.left > clientX - threshold) { + if (startPos[0] > startRect.left || clientX < startPos[0]) { + direction[0] = -1; + } + } else if (startRect.left + startRect.width < clientX + threshold) { + if (startPos[0] < startRect.left + startRect.width || clientX > startPos[0]) { + direction[0] = 1; + } + } + + clearTimeout(this.timer); + + if (!direction[0] && !direction[1]) { + return false; + } + + if (distTime > 0) { + this.timer = window.setTimeout(function () { + _this.drag(e, options); + }, distTime); + return false; + } + + this.prevTime = nowTime; + var prevPos = getScrollPosition({ + container: container, + direction: direction + }); + this.trigger("scroll", { + container: container, + direction: direction, + inputEvent: e + }); + var nextPos = getScrollPosition({ + container: container, + direction: direction + }); + var offsetX = nextPos[0] - prevPos[0]; + var offsetY = nextPos[1] - prevPos[1]; + + if (!offsetX && !offsetY) { + return false; + } + + this.trigger("move", { + offsetX: direction[0] ? offsetX : 0, + offsetY: direction[1] ? offsetY : 0, + inputEvent: e + }); + + if (throttleTime) { + this.timer = window.setTimeout(function () { + _this.drag(e, options); + }, throttleTime); + } + + return true; + }; + + __proto.dragEnd = function () { + clearTimeout(this.timer); + }; + + return DragScroll; + }(Component); + + /* + Copyright (c) Daybrush + name: keycon + license: MIT + author: Daybrush + repository: git+https://github.com/daybrush/keycon.git + version: 1.0.0 + */ + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + /* global Reflect, Promise */ + var extendStatics$3 = function (d, b) { + extendStatics$3 = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics$3(d, b); + }; + + function __extends$3(d, b) { + extendStatics$3(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + function createCommonjsModule(fn, module) { + return module = { + exports: {} + }, fn(module, module.exports), module.exports; + } + + var keycode = createCommonjsModule(function (module, exports) { + // Source: http://jsfiddle.net/vWx8V/ + // http://stackoverflow.com/questions/5603195/full-list-of-javascript-keycodes + + /** + * Conenience method returns corresponding value for given keyName or keyCode. + * + * @param {Mixed} keyCode {Number} or keyName {String} + * @return {Mixed} + * @api public + */ + + function keyCode(searchInput) { + // Keyboard Events + if (searchInput && 'object' === typeof searchInput) { + var hasKeyCode = searchInput.which || searchInput.keyCode || searchInput.charCode; + if (hasKeyCode) searchInput = hasKeyCode; + } + + // Numbers + if ('number' === typeof searchInput) return names[searchInput] + + // Everything else (cast to string) + var search = String(searchInput); + + // check codes + var foundNamedKey = codes[search.toLowerCase()]; + if (foundNamedKey) return foundNamedKey + + // check aliases + var foundNamedKey = aliases[search.toLowerCase()]; + if (foundNamedKey) return foundNamedKey + + // weird character? + if (search.length === 1) return search.charCodeAt(0) + + return undefined + } + + /** + * Compares a keyboard event with a given keyCode or keyName. + * + * @param {Event} event Keyboard event that should be tested + * @param {Mixed} keyCode {Number} or keyName {String} + * @return {Boolean} + * @api public + */ + keyCode.isEventKey = function isEventKey(event, nameOrCode) { + if (event && 'object' === typeof event) { + var keyCode = event.which || event.keyCode || event.charCode; + if (keyCode === null || keyCode === undefined) { return false; } + if (typeof nameOrCode === 'string') { + // check codes + var foundNamedKey = codes[nameOrCode.toLowerCase()]; + if (foundNamedKey) { return foundNamedKey === keyCode; } + + // check aliases + var foundNamedKey = aliases[nameOrCode.toLowerCase()]; + if (foundNamedKey) { return foundNamedKey === keyCode; } + } else if (typeof nameOrCode === 'number') { + return nameOrCode === keyCode; + } + return false; + } + }; + + exports = module.exports = keyCode; + + /** + * Get by name + * + * exports.code['enter'] // => 13 + */ + + var codes = exports.code = exports.codes = { + 'backspace': 8, + 'tab': 9, + 'enter': 13, + 'shift': 16, + 'ctrl': 17, + 'alt': 18, + 'pause/break': 19, + 'caps lock': 20, + 'esc': 27, + 'space': 32, + 'page up': 33, + 'page down': 34, + 'end': 35, + 'home': 36, + 'left': 37, + 'up': 38, + 'right': 39, + 'down': 40, + 'insert': 45, + 'delete': 46, + 'command': 91, + 'left command': 91, + 'right command': 93, + 'numpad *': 106, + 'numpad +': 107, + 'numpad -': 109, + 'numpad .': 110, + 'numpad /': 111, + 'num lock': 144, + 'scroll lock': 145, + 'my computer': 182, + 'my calculator': 183, + ';': 186, + '=': 187, + ',': 188, + '-': 189, + '.': 190, + '/': 191, + '`': 192, + '[': 219, + '\\': 220, + ']': 221, + "'": 222 + }; + + // Helper aliases + + var aliases = exports.aliases = { + 'windows': 91, + '⇧': 16, + '⌥': 18, + '⌃': 17, + '⌘': 91, + 'ctl': 17, + 'control': 17, + 'option': 18, + 'pause': 19, + 'break': 19, + 'caps': 20, + 'return': 13, + 'escape': 27, + 'spc': 32, + 'spacebar': 32, + 'pgup': 33, + 'pgdn': 34, + 'ins': 45, + 'del': 46, + 'cmd': 91 + }; + + /*! + * Programatically add the following + */ + + // lower case chars + for (i = 97; i < 123; i++) codes[String.fromCharCode(i)] = i - 32; + + // numbers + for (var i = 48; i < 58; i++) codes[i - 48] = i; + + // function keys + for (i = 1; i < 13; i++) codes['f'+i] = i + 111; + + // numpad keys + for (i = 0; i < 10; i++) codes['numpad '+i] = i + 96; + + /** + * Get by code + * + * exports.name[13] // => 'Enter' + */ + + var names = exports.names = exports.title = {}; // title for backward compat + + // Create reverse mapping + for (i in codes) names[codes[i]] = i; + + // Add aliases + for (var alias in aliases) { + codes[alias] = aliases[alias]; + } + }); + var keycode_1 = keycode.code; + var keycode_2 = keycode.codes; + var keycode_3 = keycode.aliases; + var keycode_4 = keycode.names; + var keycode_5 = keycode.title; + + /* + Copyright (c) 2018 Daybrush + @name: @daybrush/utils + license: MIT + author: Daybrush + repository: https://github.com/daybrush/utils + @version 1.0.0 + */ + /** + * get string "string" + * @memberof Consts + * @example + import {STRING} from "@daybrush/utils"; + + console.log(STRING); // "string" + */ + + var STRING = "string"; + /** + * Check the type that the value is isArray. + * @memberof Utils + * @param {string} value - Value to check the type + * @return {} true if the type is correct, false otherwise + * @example + import {isArray} from "@daybrush/utils"; + + console.log(isArray([])); // true + console.log(isArray({})); // false + console.log(isArray(undefined)); // false + console.log(isArray(null)); // false + */ + + function isArray$1(value) { + return Array.isArray(value); + } + /** + * Check the type that the value is string. + * @memberof Utils + * @param {string} value - Value to check the type + * @return {} true if the type is correct, false otherwise + * @example + import {isString} from "@daybrush/utils"; + + console.log(isString("1234")); // true + console.log(isString(undefined)); // false + console.log(isString(1)); // false + console.log(isString(null)); // false + */ + + function isString(value) { + return typeof value === STRING; + } + /** + * Sets up a function that will be called whenever the specified event is delivered to the target + * @memberof DOM + * @param - event target + * @param - A case-sensitive string representing the event type to listen for. + * @param - The object which receives a notification (an object that implements the Event interface) when an event of the specified type occurs + * @param - An options object that specifies characteristics about the event listener. The available options are: + * @example + import {addEvent} from "@daybrush/utils"; + + addEvent(el, "click", e => { + console.log(e); + }); + */ + + function addEvent$1(el, type, listener, options) { + el.addEventListener(type, listener, options); + } + /** + * removes from the EventTarget an event listener previously registered with EventTarget.addEventListener() + * @memberof DOM + * @param - event target + * @param - A case-sensitive string representing the event type to listen for. + * @param - The EventListener function of the event handler to remove from the event target. + * @example + import {addEvent, removeEvent} from "@daybrush/utils"; + const listener = e => { + console.log(e); + }; + addEvent(el, "click", listener); + removeEvent(el, "click", listener); + */ + + function removeEvent$1(el, type, listener) { + el.removeEventListener(type, listener); + } + + var codeData = { + "+": "plus", + "left command": "meta", + "right command": "meta" + }; + var keysSort = { + shift: 1, + ctrl: 2, + alt: 3, + meta: 4 + }; + /** + * @memberof KeyController + */ + + function getKey(keyCode) { + var key = keycode_4[keyCode] || ""; + + for (var name in codeData) { + key = key.replace(name, codeData[name]); + } + + return key.replace(/\s/g, ""); + } + /** + * @memberof KeyController + */ + + function getCombi(e, key) { + if (key === void 0) { + key = getKey(e.keyCode); + } + + var keys = [e.shiftKey && "shift", e.ctrlKey && "ctrl", e.altKey && "alt", e.metaKey && "meta"]; + keys.indexOf(key) === -1 && keys.push(key); + return keys.filter(Boolean); + } + + function getArrangeCombi(keys) { + var arrangeKeys = keys.slice(); + arrangeKeys.sort(function (prev, next) { + var prevScore = keysSort[prev] || 5; + var nextScore = keysSort[next] || 5; + return prevScore - nextScore; + }); + return arrangeKeys; + } + + var globalKeyController; + /** + */ + + var KeyController = + /*#__PURE__*/ + function (_super) { + __extends$3(KeyController, _super); + /** + * + */ + + + function KeyController(container) { + if (container === void 0) { + container = window; + } + + var _this = _super.call(this) || this; + + _this.container = container; + /** + */ + + _this.ctrlKey = false; + /** + */ + + _this.altKey = false; + /** + * + */ + + _this.shiftKey = false; + /** + * + */ + + _this.metaKey = false; + + _this.clear = function () { + _this.ctrlKey = false; + _this.altKey = false; + _this.shiftKey = false; + _this.metaKey = false; + return _this; + }; + + _this.keydownEvent = function (e) { + _this.triggerEvent("keydown", e); + }; + + _this.keyupEvent = function (e) { + _this.triggerEvent("keyup", e); + }; + + _this.blur = function () { + _this.clear(); + + _this.trigger("blur"); + }; + + addEvent$1(container, "blur", _this.blur); + addEvent$1(container, "keydown", _this.keydownEvent); + addEvent$1(container, "keyup", _this.keyupEvent); + return _this; + } + + var __proto = KeyController.prototype; + Object.defineProperty(KeyController, "global", { + /** + */ + get: function () { + return globalKeyController || (globalKeyController = new KeyController()); + }, + enumerable: true, + configurable: true + }); + + KeyController.setGlobal = function () { + return this.global; + }; + /** + * + */ + + + __proto.destroy = function () { + var container = this.container; + this.clear(); + this.off(); + removeEvent$1(container, "blur", this.blur); + removeEvent$1(container, "keydown", this.keydownEvent); + removeEvent$1(container, "keyup", this.keyupEvent); + }; + /** + * + */ + + + __proto.keydown = function (comb, callback) { + return this.addEvent("keydown", comb, callback); + }; + /** + * + */ + + + __proto.offKeydown = function (comb, callback) { + return this.removeEvent("keydown", comb, callback); + }; + /** + * + */ + + + __proto.offKeyup = function (comb, callback) { + return this.removeEvent("keyup", comb, callback); + }; + /** + * + */ + + + __proto.keyup = function (comb, callback) { + return this.addEvent("keyup", comb, callback); + }; + + __proto.addEvent = function (type, comb, callback) { + if (isArray$1(comb)) { + this.on(type + "." + getArrangeCombi(comb).join("."), callback); + } else if (isString(comb)) { + this.on(type + "." + comb, callback); + } else { + this.on(type, comb); + } + + return this; + }; + + __proto.removeEvent = function (type, comb, callback) { + if (isArray$1(comb)) { + this.off(type + "." + getArrangeCombi(comb).join("."), callback); + } else if (isString(comb)) { + this.off(type + "." + comb, callback); + } else { + this.off(type, comb); + } + + return this; + }; + + __proto.triggerEvent = function (type, e) { + this.ctrlKey = e.ctrlKey; + this.shiftKey = e.shiftKey; + this.altKey = e.altKey; + this.metaKey = e.metaKey; + var key = getKey(e.keyCode); + var isToggle = key === "ctrl" || key === "shift" || key === "meta" || key === "alt"; + var param = { + key: key, + isToggle: isToggle, + inputEvent: e, + keyCode: e.keyCode, + ctrlKey: e.ctrlKey, + altKey: e.altKey, + shiftKey: e.shiftKey, + metaKey: e.metaKey + }; + this.trigger(type, param); + this.trigger(type + "." + key, param); + var combi = getCombi(e, key); + combi.length > 1 && this.trigger(type + "." + combi.join("."), param); + }; + + return KeyController; + }(Component); + + function getClient$1(e) { + if ("touches" in e) { + var touch = e.touches[0] || e.changedTouches[0]; + return { + clientX: touch.clientX, + clientY: touch.clientY + }; + } else { + return { + clientX: e.clientX, + clientY: e.clientY + }; + } + } + function createElement(jsx, prevTarget, container) { + var tag = jsx.tag, + children = jsx.children, + attributes = jsx.attributes, + className = jsx.className, + style = jsx.style; + var el = prevTarget || document.createElement(tag); + + for (var name in attributes) { + el.setAttribute(name, attributes[name]); + } + + var elChildren = el.children; + children.forEach(function (child, i) { + createElement(child, elChildren[i], el); + }); + + if (className) { + className.split(" ").forEach(function (name) { + if (!hasClass(el, name)) { + addClass(el, name); + } + }); + } + + if (style) { + var elStyle = el.style; + + for (var name in style) { + elStyle[name] = style[name]; + } + } + + if (!prevTarget && container) { + container.appendChild(el); + } + + return el; + } + function h(tag, attrs) { + var children = []; + + for (var _i = 2; _i < arguments.length; _i++) { + children[_i - 2] = arguments[_i]; + } + + var _a = attrs || {}, + _b = _a.className, + className = _b === void 0 ? "" : _b, + _c = _a.style, + style = _c === void 0 ? {} : _c, + attributes = __rest(_a, ["className", "style"]); + + return { + tag: tag, + className: className, + style: style, + attributes: attributes, + children: children + }; + } + function diffValue(prev, cur, func) { + if (prev !== cur) { + func(prev, cur); + } + } + function getRect(e, ratio) { + var _a = e.distX, + distX = _a === void 0 ? 0 : _a, + _b = e.distY, + distY = _b === void 0 ? 0 : _b; + var _c = e.datas, + startX = _c.startX, + startY = _c.startY; + + if (ratio > 0) { + var nextHeight = Math.sqrt((distX * distX + distY * distY) / (1 + ratio * ratio)); + var nextWidth = ratio * nextHeight; + distX = (distX >= 0 ? 1 : -1) * nextWidth; + distY = (distY >= 0 ? 1 : -1) * nextHeight; + } + + var tx = Math.min(0, distX); + var ty = Math.min(0, distY); // h ^ 2 + (ratio * h) ^ 2 = dist + // (1 + ratio ^ 2) * h^2 = dist ^ 2 + // dist * Math.atan(ratio); + + var width = Math.abs(distX); + var height = Math.abs(distY); + var left = startX + tx; + var top = startY + ty; + return { + left: left, + top: top, + right: left + width, + bottom: top + height, + width: width, + height: height + }; + } + + /* + Copyright (c) 2019 Daybrush + name: css-styled + license: MIT + author: Daybrush + repository: git+https://github.com/daybrush/css-styled.git + version: 0.2.3 + */ + + function hash(str) { + var hash = 5381, + i = str.length; + + while(i) { + hash = (hash * 33) ^ str.charCodeAt(--i); + } + + /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed + * integers. Since we want the results to be always positive, convert the + * signed int to an unsigned by doing an unsigned bitshift. */ + return hash >>> 0; + } + + var stringHash = hash; + + function getHash(str) { + return stringHash(str).toString(36); + } + function getShadowRoot(parentElement) { + if (parentElement && parentElement.getRootNode) { + var rootNode = parentElement.getRootNode(); + + if (rootNode.nodeType === 11) { + return rootNode; + } + } + + return; + } + function injectStyle(className, css, options, shadowRoot) { + var style = document.createElement("style"); + style.setAttribute("type", "text/css"); + style.setAttribute("data-styled-id", className); + + if (options.nonce) { + style.setAttribute("nonce", options.nonce); + } + + var styleCSS = css; + + if (!options.original) { + styleCSS = css.replace(/([^}{]*){/mg, function (all, selector) { + return splitComma(selector).map(function (subSelector) { + if (subSelector.indexOf(":global") > -1) { + return subSelector.replace(/\:global/g, ""); + } else if (subSelector.indexOf(":host") > -1) { + return "" + subSelector.replace(/\:host/g, "." + className); + } + + return "." + className + " " + subSelector; + }).join(", ") + "{"; + }); + } + + style.innerHTML = styleCSS; + (shadowRoot || document.head || document.body).appendChild(style); + return style; + } + + function styled(css) { + var injectClassName = "rCS" + getHash(css); + var injectCount = 0; + var injectElement; + return { + className: injectClassName, + inject: function (el, options) { + if (options === void 0) { + options = {}; + } + + var shadowRoot = getShadowRoot(el); + var firstMount = injectCount === 0; + var styleElement; + + if (shadowRoot || firstMount) { + styleElement = injectStyle(injectClassName, css, options, shadowRoot); + } + + if (firstMount) { + injectElement = styleElement; + } + + if (!shadowRoot) { + ++injectCount; + } + + return { + destroy: function () { + if (shadowRoot) { + el.removeChild(styleElement); + styleElement = null; + } else { + if (injectCount > 0) { + --injectCount; + } + + if (injectCount === 0 && injectElement) { + injectElement.parentNode.removeChild(injectElement); + injectElement = null; + } + } + } + }; + } + }; + } + + var injector = styled("\n:host {\n position: fixed;\n display: none;\n border: 1px solid #4af;\n background: rgba(68, 170, 255, 0.5);\n z-index: 100;\n}\n"); + /** + * @memberof Selecto + */ + + var CLASS_NAME = "selecto-selection " + injector.className; + var PROPERTIES = ["selectableTargets", "selectByClick", "selectFromInside", "continueSelect", "toggleContinueSelect", "keyContainer", "hitRate", "scrollOptions", "checkInput", "preventDefault", "ratio"]; + /** + * @memberof Selecto + */ + + var OPTIONS = __spreadArrays([// ignore target, container, + "dragContainer", "cspNonce"], PROPERTIES); + var OPTION_TYPES = { + target: null, + container: null, + dragContainer: null, + selectableTargets: Array, + selectByClick: Boolean, + selectFromInside: Boolean, + continueSelect: Boolean, + toggleContinueSelect: Array, + keyContainer: null, + hitRate: Number, + scrollOptions: Object, + checkInput: Boolean, + preventDefault: Boolean, + cspNonce: String, + ratio: Number + }; + /** + * @memberof Selecto + */ + + var EVENTS = ["dragStart", "drag", "dragEnd", "selectStart", "select", "selectEnd", "keydown", "keyup", "scroll"]; + /** + * @memberof Selecto + */ + + var METHODS = ["clickTarget", "setSelectedTargets", "triggerDragStart"]; + + /** + * Selecto.js is a component that allows you to select elements in the drag area using the mouse or touch. + * @sort 1 + * @extends eg.Component + */ + + var Selecto = + /*#__PURE__*/ + function (_super) { + __extends(Selecto, _super); + /** + * + */ + + + function Selecto(options) { + if (options === void 0) { + options = {}; + } + + var _this = _super.call(this) || this; + + _this.selectedTargets = []; + _this.differ = new ChildrenDiffer(); + _this.dragScroll = new DragScroll(); + + _this.onDragStart = function (e, clickedTarget) { + var datas = e.datas, + clientX = e.clientX, + clientY = e.clientY, + inputEvent = e.inputEvent; + var _a = _this.options, + continueSelect = _a.continueSelect, + selectFromInside = _a.selectFromInside, + selectByClick = _a.selectByClick; + + var selectableTargets = _this.getSelectableTargets(); + + var selectableRects = selectableTargets.map(function (target) { + var rect = target.getBoundingClientRect(); + var left = rect.left, + top = rect.top, + width = rect.width, + height = rect.height; + return { + left: left, + top: top, + right: left + width, + bottom: top + height, + width: width, + height: height + }; + }); + datas.selectableTargets = selectableTargets; + datas.selectableRects = selectableRects; + datas.startSelectedTargets = _this.selectedTargets; + var hitRect = { + left: clientX, + top: clientY, + right: clientX, + bottom: clientY, + width: 0, + height: 0 + }; + var firstPassedTargets = []; + + if (selectFromInside || selectByClick) { + var pointTarget = clickedTarget || document.elementFromPoint(clientX, clientY); + + while (pointTarget) { + if (selectableTargets.indexOf(pointTarget) > -1) { + break; + } + + pointTarget = pointTarget.parentElement; + } + + firstPassedTargets = pointTarget ? [pointTarget] : []; + } + + var hasInsideTargets = firstPassedTargets.length > 0; + var isPreventSelect = !selectFromInside && hasInsideTargets; + + if (isPreventSelect && !selectByClick) { + return false; + } + + var type = inputEvent.type; + var isTrusted = type === "mousedown" || type === "touchstart"; + /** + * When the drag starts, the dragStart event is called. + * Call the stop () function if you have a specific element or don't want to raise a select + * @memberof Selecto + * @event dragStart + * @param {OnDragStart} - Parameters for the dragStart event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("dragStart", e => { + * if (e.inputEvent.target.tagName === "SPAN") { + * e.stop(); + * } + * }).on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + var result = isTrusted ? _this.trigger("dragStart", e) : true; + + if (!result) { + return false; + } + + if (!continueSelect) { + _this.selectedTargets = []; + } else { + firstPassedTargets = _this.passSelectedTargets(firstPassedTargets); + } + + _this.select(firstPassedTargets, hitRect, inputEvent, true); + + datas.startX = clientX; + datas.startY = clientY; + datas.selectedTargets = firstPassedTargets; + _this.target.style.cssText += "left:0px;top:0px;transform: translate(" + clientX + "px, " + clientY + "px)"; + + if (isPreventSelect && selectByClick) { + _this.onDragEnd(e); + + inputEvent.preventDefault(); + return false; + } else { + if (type === "touchstart") { + inputEvent.preventDefault(); + } + + var scrollOptions = _this.options.scrollOptions; + + if (scrollOptions && scrollOptions.container) { + _this.dragScroll.dragStart(e, scrollOptions); + } + + return true; + } + }; + + _this.onDrag = function (e) { + var scrollOptions = _this.options.scrollOptions; + + if (scrollOptions && scrollOptions.container) { + if (_this.dragScroll.drag(e, scrollOptions)) { + return; + } + } + + _this.check(e); + }; + + _this.onDragEnd = function (e) { + var datas = e.datas; + var rect = getRect(e, _this.options.ratio); + + _this.dragScroll.dragEnd(); + + _this.target.style.cssText += "display: none;"; + + _this.trigger("dragEnd", __assign(__assign({}, e), { + rect: rect + })); + + _this.selectEnd(datas.startSelectedTargets, datas.selectedTargets, rect, e); + + _this.selectedTargets = datas.selectedTargets; + }; + + _this.onKeyDown = function (e) { + if (!_this.sameCombiKey(e)) { + return; + } + + _this.continueSelect = true; + /** + * When you keydown the key you specified in toggleContinueSelect, the keydown event is called. + * @memberof Selecto + * @event keydown + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * toggleContinueSelect: "shift"; + * keyContainer: window, + * }); + * + * selecto.on("keydown", () => { + * document.querySelector(".button").classList.add("selected"); + * }).on("keyup", () => { + * document.querySelector(".button").classList.remove("selected"); + * }).on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + _this.trigger("keydown", {}); + }; + + _this.onKeyUp = function (e) { + if (!_this.sameCombiKey(e)) { + return; + } + + _this.continueSelect = false; + /** + * When you keyup the key you specified in toggleContinueSelect, the keyup event is called. + * @memberof Selecto + * @event keyup + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * toggleContinueSelect: "shift"; + * keyContainer: window, + * }); + * + * selecto.on("keydown", () => { + * document.querySelector(".button").classList.add("selected"); + * }).on("keyup", () => { + * document.querySelector(".button").classList.remove("selected"); + * }).on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + _this.trigger("keyup", {}); + }; + + _this.onBlur = function () { + if (_this.toggleContinueSelect && _this.continueSelect) { + _this.trigger("keyup", {}); + } + }; + + _this.onDocumentSelectStart = function (e) { + if (!_this.dragger.isFlag()) { + return; + } + + var dragContainer = _this.dragContainer; + + if (dragContainer === window) { + dragContainer = document.documentElement; + } + + var containers = dragContainer instanceof Element ? [dragContainer] : [].slice.call(dragContainer); + var target = e.target; + containers.some(function (container) { + if (container === target || container.contains(target)) { + e.preventDefault(); + return true; + } + }); + }; + + _this.target = options.target; + _this.container = options.container; + _this.options = __assign({ + target: null, + container: null, + dragContainer: null, + selectableTargets: [], + selectByClick: true, + selectFromInside: true, + hitRate: 100, + continueSelect: false, + toggleContinueSelect: null, + keyContainer: null, + scrollOptions: undefined, + checkInput: false, + preventDefault: false, + cspNonce: "", + ratio: 0 + }, options); + + _this.initElement(); + + _this.initDragScroll(); + + _this.setKeyController(); + + return _this; + } + /** + * You can set the currently selected targets. + */ + + + var __proto = Selecto.prototype; + + __proto.setSelectedTargets = function (selectedTargets) { + this.selectedTargets = selectedTargets; + this.differ = new ChildrenDiffer(selectedTargets); + return this; + }; + /** + * You can get the currently selected targets. + */ + + + __proto.getSelectedTargets = function () { + return this.selectedTargets; + }; + + __proto.setKeyContainer = function (keyContainer) { + var _this = this; + + var options = this.options; + diffValue(options.keyContainer, keyContainer, function () { + options.keyContainer = keyContainer; + + _this.setKeyController(); + }); + }; + + __proto.setToggleContinueSelect = function (toggleContinueSelect) { + var _this = this; + + var options = this.options; + diffValue(options.toggleContinueSelect, toggleContinueSelect, function () { + options.toggleContinueSelect = toggleContinueSelect; + + _this.setKeyEvent(); + }); + }; + + __proto.setPreventDefault = function (value) { + this.dragger.options.preventDefault = value; + }; + + __proto.setCheckInput = function (value) { + this.dragger.options.checkInput = value; + }; + /** + * `OnDragStart` is triggered by an external event. + * @param - external event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto(); + * + * window.addEventListener("mousedown", e => { + * selecto.triggerDragStart(e); + * }); + */ + + + __proto.triggerDragStart = function (e) { + this.dragger.triggerDragStart(e); + return this; + }; + /** + * Destroy elements, properties, and events. + */ + + + __proto.destroy = function () { + this.off(); + this.keycon && this.keycon.destroy(); + this.dragger.unset(); + this.injectResult.destroy(); + removeEvent(document, "selectstart", this.onDocumentSelectStart); + this.keycon = null; + this.dragger = null; + this.injectResult = null; + this.target = null; + this.container = null; + this.options = null; + }; + /** + * External click or mouse events can be applied to the selecto. + * @params - Extenal click or mouse event + * @params - Specify the clicked target directly. + */ + + + __proto.clickTarget = function (e, clickedTarget) { + var _a = getClient$1(e), + clientX = _a.clientX, + clientY = _a.clientY; + + var dragEvent = { + datas: {}, + clientX: clientX, + clientY: clientY, + inputEvent: e + }; + + if (this.onDragStart(dragEvent, clickedTarget)) { + this.onDragEnd(dragEvent); + } + + return this; + }; + + __proto.setKeyController = function () { + var _a = this.options, + keyContainer = _a.keyContainer, + toggleContinueSelect = _a.toggleContinueSelect; + + if (this.keycon) { + this.keycon.destroy(); + this.keycon = null; + } + + if (toggleContinueSelect) { + this.keycon = new KeyController(keyContainer || window); + this.keycon.keydown(this.onKeyDown).keyup(this.onKeyUp).on("blur", this.onBlur); + } + }; + + __proto.setKeyEvent = function () { + var toggleContinueSelect = this.options.toggleContinueSelect; + + if (!toggleContinueSelect || this.keycon) { + return; + } + + this.setKeyController(); + }; + + __proto.initElement = function () { + this.target = createElement(h("div", { + className: CLASS_NAME + }), this.target, this.container); + var target = this.target; + var _a = this.options, + dragContainer = _a.dragContainer, + checkInput = _a.checkInput, + preventDefault = _a.preventDefault; + this.dragContainer = typeof dragContainer === "string" ? [].slice.call(document.querySelectorAll(dragContainer)) : this.options.dragContainer || this.target.parentNode; + this.dragger = new Dragger(this.dragContainer, { + container: window, + checkInput: checkInput, + preventDefault: preventDefault, + dragstart: this.onDragStart, + drag: this.onDrag, + dragend: this.onDragEnd + }); + addEvent(document, "selectstart", this.onDocumentSelectStart); + this.injectResult = injector.inject(target, { + nonce: this.options.cspNonce + }); + }; + + __proto.hitTest = function (selectRect, clientX, clientY, targets, rects) { + var _a = this.options, + hitRate = _a.hitRate, + selectByClick = _a.selectByClick; + var left = selectRect.left, + top = selectRect.top, + right = selectRect.right, + bottom = selectRect.bottom; + return targets.filter(function (target, i) { + var _a = rects[i], + rectLeft = _a.left, + rectTop = _a.top, + rectRight = _a.right, + rectBottom = _a.bottom; + var isStart = rectLeft <= clientX && clientX <= rectRight && rectTop <= clientY && clientY <= rectBottom; + var rectSize = (rectRight - rectLeft) * (rectBottom - rectTop); + var testLeft = Math.max(rectLeft, left); + var testRight = Math.min(rectRight, right); + var testTop = Math.max(rectTop, top); + var testBottom = Math.min(rectBottom, bottom); + + if (selectByClick && isStart) { + return true; + } + + if (testRight < testLeft || testBottom < testTop) { + return false; + } + + var rate = Math.round((testRight - testLeft) * (testBottom - testTop) / rectSize * 100); + + if (rate >= hitRate) { + return true; + } + + return false; + }); + }; + + __proto.initDragScroll = function () { + var _this = this; + + this.dragScroll.on("scroll", function (_a) { + var container = _a.container, + direction = _a.direction; + + _this.trigger("scroll", { + container: container, + direction: direction + }); + }).on("move", function (_a) { + var offsetX = _a.offsetX, + offsetY = _a.offsetY, + inputEvent = _a.inputEvent; + var datas = inputEvent.datas; + datas.startX -= offsetX; + datas.startY -= offsetY; + datas.selectableRects.forEach(function (rect) { + rect.top -= offsetY; + rect.bottom -= offsetY; + rect.left -= offsetX; + rect.right -= offsetX; + }); + + _this.dragger.scrollBy(offsetX, offsetY, inputEvent.inputEvent, false); + + inputEvent.distX += offsetX; + inputEvent.distY += offsetY; + + _this.check(inputEvent); + }); + }; + + __proto.getSelectableTargets = function () { + var selectableTargets = []; + this.options.selectableTargets.forEach(function (target) { + if (isObject(target)) { + selectableTargets.push(target); + } else { + var elements = [].slice.call(document.querySelectorAll(target)); + elements.forEach(function (el) { + selectableTargets.push(el); + }); + } + }); + return selectableTargets; + }; + + __proto.passSelectedTargets = function (passedTargets) { + var _a = diff$1(this.selectedTargets, passedTargets), + list = _a.list, + prevList = _a.prevList, + added = _a.added, + removed = _a.removed; + + return added.map(function (index) { + return list[index]; + }).concat(removed.map(function (index) { + return prevList[index]; + })); + }; + + __proto.select = function (selectedTargets, rect, inputEvent, isStart) { + var _a = this.differ.update(selectedTargets), + added = _a.added, + removed = _a.removed, + prevList = _a.prevList, + list = _a.list; + + if (isStart) { + /** + * When the select(drag) starts, the selectStart event is called. + * @memberof Selecto + * @event selectStart + * @param {Selecto.OnSelect} - Parameters for the selectStart event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("selectStart", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }).on("selectEnd", e => { + * e.afterAdded.forEach(el => { + * el.classList.add("selected"); + * }); + * e.afterRemoved.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + this.trigger("selectStart", { + selected: selectedTargets, + added: added.map(function (index) { + return list[index]; + }), + removed: removed.map(function (index) { + return prevList[index]; + }), + rect: rect, + inputEvent: inputEvent + }); + } + + if (added.length || removed.length) { + /** + * When the select in real time, the select event is called. + * @memberof Selecto + * @event select + * @param {Selecto.OnSelect} - Parameters for the select event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("select", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + this.trigger("select", { + selected: selectedTargets, + added: added.map(function (index) { + return list[index]; + }), + removed: removed.map(function (index) { + return prevList[index]; + }), + rect: rect, + inputEvent: inputEvent + }); + } + }; + + __proto.selectEnd = function (startSelectedTargets, selectedTargets, rect, e) { + var inputEvent = e.inputEvent, + isDouble = e.isDouble; + + var _a = diff$1(startSelectedTargets, selectedTargets), + added = _a.added, + removed = _a.removed, + prevList = _a.prevList, + list = _a.list; + + var _b = diff$1(this.selectedTargets, selectedTargets), + afterAdded = _b.added, + afterRemoved = _b.removed, + afterPrevList = _b.prevList, + afterList = _b.list; + + var type = inputEvent.type; + var isDragStart = type === "mousedown" || type === "touchstart"; + /** + * When the select(dragEnd or click) ends, the selectEnd event is called. + * @memberof Selecto + * @event selectEnd + * @param {Selecto.OnSelectEnd} - Parameters for the selectEnd event + * @example + * import Selecto from "selecto"; + * + * const selecto = new Selecto({ + * container: document.body, + * selectByClick: true, + * selectFromInside: false, + * }); + * + * selecto.on("selectStart", e => { + * e.added.forEach(el => { + * el.classList.add("selected"); + * }); + * e.removed.forEach(el => { + * el.classList.remove("selected"); + * }); + * }).on("selectEnd", e => { + * e.afterAdded.forEach(el => { + * el.classList.add("selected"); + * }); + * e.afterRemoved.forEach(el => { + * el.classList.remove("selected"); + * }); + * }); + */ + + this.trigger("selectEnd", { + selected: selectedTargets, + added: added.map(function (index) { + return list[index]; + }), + removed: removed.map(function (index) { + return prevList[index]; + }), + afterAdded: afterAdded.map(function (index) { + return afterList[index]; + }), + afterRemoved: afterRemoved.map(function (index) { + return afterPrevList[index]; + }), + isDragStart: isDragStart, + isDouble: !!isDouble, + rect: rect, + inputEvent: inputEvent + }); + }; + + __proto.check = function (e) { + var datas = e.datas, + inputEvent = e.inputEvent; + var rect = getRect(e, this.options.ratio); + var top = rect.top, + left = rect.left, + width = rect.width, + height = rect.height; + this.target.style.cssText += "display: block;" + "left:0px;top:0px;" + ("transform: translate(" + left + "px, " + top + "px);") + ("width:" + width + "px;height:" + height + "px;"); + var passedTargets = this.hitTest(rect, datas.startX, datas.startY, datas.selectableTargets, datas.selectableRects); + var selectedTargets = this.passSelectedTargets(passedTargets); + this.trigger("drag", __assign(__assign({}, e), { + rect: rect + })); + this.select(selectedTargets, rect, inputEvent); + datas.selectedTargets = selectedTargets; + }; + + __proto.sameCombiKey = function (e) { + var toggleContinueSelect = [].concat(this.options.toggleContinueSelect); + var combi = getCombi(e.inputEvent, e.key); + var toggleKeys = isArray(toggleContinueSelect[0]) ? toggleContinueSelect : [toggleContinueSelect]; + return toggleKeys.some(function (keys) { + return keys.every(function (key) { + return combi.indexOf(key) > -1; + }); + }); + }; + + Selecto = __decorate([Properties(PROPERTIES, function (prototype, property) { + var attributes = { + enumerable: true, + configurable: true, + get: function () { + return this.options[property]; + } + }; + var setter = camelize("set " + property); + + if (prototype[setter]) { + attributes.set = function set(value) { + this[setter](value); + }; + } else { + attributes.set = function set(value) { + this.options[property] = value; + }; + } + + Object.defineProperty(prototype, property, attributes); + })], Selecto); + return Selecto; + }(Component); + + + + var modules = ({ + __proto__: null, + 'default': Selecto, + OPTIONS: OPTIONS, + OPTION_TYPES: OPTION_TYPES, + PROPERTIES: PROPERTIES, + EVENTS: EVENTS, + METHODS: METHODS, + CLASS_NAME: CLASS_NAME + }); + + for (var name in modules) { + Selecto[name] = modules[name]; + } + + return Selecto; + +}))); +//# sourceMappingURL=selecto.js.map diff --git a/dist/selecto.js.map b/dist/selecto.js.map new file mode 100644 index 0000000..c193703 --- /dev/null +++ b/dist/selecto.js.map @@ -0,0 +1 @@ +{"version":3,"file":"selecto.js","sources":["../src/utils.ts","../src/consts.ts","../src/Selecto.tsx","../src/index.umd.ts"],"sourcesContent":["import { Hypertext, Rect } from \"./types\";\nimport { IObject, addClass, hasClass } from \"@daybrush/utils\";\n\nexport function getClient(e: MouseEvent | TouchEvent) {\n if (\"touches\" in e) {\n const touch = e.touches[0] || e.changedTouches[0];\n\n return {\n clientX: touch.clientX,\n clientY: touch.clientY,\n };\n } else {\n return {\n clientX: e.clientX,\n clientY: e.clientY,\n };\n }\n}\n\nexport function createElement(\n jsx: Hypertext,\n prevTarget?: HTMLElement | SVGElement,\n container?: HTMLElement | SVGElement,\n) {\n const { tag, children, attributes, className, style } = jsx;\n const el = prevTarget || document.createElement(tag) as HTMLElement | SVGElement;\n\n for (const name in attributes) {\n el.setAttribute(name, attributes[name]);\n }\n const elChildren = el.children;\n children.forEach((child, i) => {\n createElement(child, elChildren[i] as HTMLElement | SVGElement, el);\n });\n if (className) {\n className.split(\" \").forEach(name => {\n if (!hasClass(el, name)) {\n addClass(el, name);\n }\n });\n }\n if (style) {\n const elStyle = el.style;\n for (const name in style) {\n elStyle[name] = style[name];\n }\n }\n if (!prevTarget && container) {\n container.appendChild(el);\n }\n return el;\n}\nexport function h(\n tag: string,\n attrs: IObject,\n ...children: Hypertext[]\n): Hypertext {\n const {\n className = \"\",\n style = {},\n ...attributes\n } = attrs || {};\n return {\n tag,\n className,\n style,\n attributes,\n children,\n };\n}\n\nexport function diffValue(prev: T, cur: T, func: (prev: T, cur: T) => void) {\n if (prev !== cur) {\n func(prev, cur);\n }\n}\n\nexport function getRect(e: any, ratio: number): Rect {\n let {\n distX = 0,\n distY = 0,\n } = e;\n const { startX, startY } = e.datas;\n\n if (ratio > 0) {\n const nextHeight = Math.sqrt((distX * distX + distY * distY) / (1 + ratio * ratio));\n const nextWidth = ratio * nextHeight;\n\n distX = (distX >= 0 ? 1 : -1) * nextWidth;\n distY = (distY >= 0 ? 1 : -1) * nextHeight;\n }\n const tx = Math.min(0, distX);\n const ty = Math.min(0, distY);\n // h ^ 2 + (ratio * h) ^ 2 = dist\n // (1 + ratio ^ 2) * h^2 = dist ^ 2\n // dist * Math.atan(ratio);\n const width = Math.abs(distX);\n const height = Math.abs(distY);\n const left = startX + tx;\n const top = startY + ty;\n\n return {\n left,\n top,\n right: left + width,\n bottom: top + height,\n width,\n height,\n };\n}\n","import styled from \"css-styled\";\nimport { SelectoOptions } from \"./types\";\n\nexport const injector = styled(`\n:host {\n position: fixed;\n display: none;\n border: 1px solid #4af;\n background: rgba(68, 170, 255, 0.5);\n z-index: 100;\n}\n`);\n\n/**\n * @memberof Selecto\n */\nexport const CLASS_NAME = `selecto-selection ${injector.className}`;\n\nexport const PROPERTIES = [\n \"selectableTargets\",\n \"selectByClick\",\n \"selectFromInside\",\n \"continueSelect\",\n \"toggleContinueSelect\",\n \"keyContainer\",\n \"hitRate\",\n \"scrollOptions\",\n \"checkInput\",\n \"preventDefault\",\n \"ratio\",\n] as const;\n/**\n * @memberof Selecto\n */\nexport const OPTIONS = [\n // ignore target, container,\n \"dragContainer\",\n \"cspNonce\",\n ...PROPERTIES,\n] as const;\n\nexport const OPTION_TYPES: { [key in keyof SelectoOptions]: any } = {\n target: null,\n container: null,\n dragContainer: null,\n selectableTargets: Array,\n selectByClick: Boolean,\n selectFromInside: Boolean,\n continueSelect: Boolean,\n toggleContinueSelect: Array,\n keyContainer: null,\n hitRate: Number,\n scrollOptions: Object,\n checkInput: Boolean,\n preventDefault: Boolean,\n cspNonce: String,\n ratio: Number,\n};\n\n/**\n * @memberof Selecto\n */\nexport const EVENTS = [\n \"dragStart\",\n \"drag\",\n \"dragEnd\",\n \"selectStart\",\n \"select\",\n \"selectEnd\",\n \"keydown\",\n \"keyup\",\n \"scroll\",\n] as const;\n\n/**\n * @memberof Selecto\n */\nexport const METHODS = [\n \"clickTarget\",\n \"setSelectedTargets\",\n \"triggerDragStart\",\n] as const;\n","import Component from \"@egjs/component\";\nimport Dragger, { OnDrag } from \"@daybrush/drag\";\nimport { InjectResult } from \"css-styled\";\nimport { Properties } from \"framework-utils\";\nimport { isObject, camelize, IObject, addEvent, removeEvent, isArray } from \"@daybrush/utils\";\nimport ChildrenDiffer, { diff, ChildrenDiffResult } from \"@egjs/children-differ\";\nimport DragScroll from \"@scena/dragscroll\";\nimport KeyController, { getCombi } from \"keycon\";\nimport { createElement, h, getClient, diffValue, getRect } from \"./utils\";\nimport { SelectoOptions, Rect, SelectoProperties, OnDragEvent, SelectoEvents } from \"./types\";\nimport { PROPERTIES, injector, CLASS_NAME } from \"./consts\";\n\n/**\n * Selecto.js is a component that allows you to select elements in the drag area using the mouse or touch.\n * @sort 1\n * @extends eg.Component\n */\n@Properties(PROPERTIES as any, (prototype, property) => {\n const attributes: IObject = {\n enumerable: true,\n configurable: true,\n get() {\n return this.options[property];\n },\n };\n const setter = camelize(`set ${property}`);\n if (prototype[setter]) {\n attributes.set = function set(value) {\n this[setter](value);\n };\n } else {\n attributes.set = function set(value) {\n this.options[property] = value;\n };\n }\n Object.defineProperty(prototype, property, attributes);\n})\nclass Selecto extends Component {\n public options: SelectoOptions;\n private target!: HTMLElement | SVGElement;\n private dragContainer!: Element | Window | Element[];\n private container!: HTMLElement;\n private dragger!: Dragger;\n private injectResult!: InjectResult;\n private selectedTargets: Array = [];\n private differ = new ChildrenDiffer();\n private dragScroll: DragScroll = new DragScroll();\n private keycon!: KeyController;\n /**\n *\n */\n constructor(\n options: Partial = {},\n ) {\n super();\n this.target = options.target;\n this.container = options.container;\n this.options = {\n target: null,\n container: null,\n dragContainer: null,\n selectableTargets: [],\n selectByClick: true,\n selectFromInside: true,\n hitRate: 100,\n continueSelect: false,\n toggleContinueSelect: null,\n keyContainer: null,\n scrollOptions: undefined,\n checkInput: false,\n preventDefault: false,\n cspNonce: \"\",\n ratio: 0,\n ...options,\n };\n this.initElement();\n this.initDragScroll();\n this.setKeyController();\n }\n /**\n * You can set the currently selected targets.\n */\n public setSelectedTargets(selectedTargets: Array): this {\n this.selectedTargets = selectedTargets;\n this.differ = new ChildrenDiffer(selectedTargets);\n\n return this;\n }\n /**\n * You can get the currently selected targets.\n */\n public getSelectedTargets(): Array {\n return this.selectedTargets;\n }\n public setKeyContainer(keyContainer: HTMLElement | Document | Window) {\n const options = this.options;\n\n diffValue(options.keyContainer, keyContainer, () => {\n options.keyContainer = keyContainer;\n\n this.setKeyController();\n });\n }\n public setToggleContinueSelect(toggleContinueSelect: string[][] | string[] | string) {\n const options = this.options;\n\n diffValue(options.toggleContinueSelect, toggleContinueSelect, () => {\n options.toggleContinueSelect = toggleContinueSelect;\n\n this.setKeyEvent();\n });\n }\n public setPreventDefault(value: boolean) {\n this.dragger.options.preventDefault = value;\n }\n public setCheckInput(value: boolean) {\n this.dragger.options.checkInput = value;\n }\n /**\n * `OnDragStart` is triggered by an external event.\n * @param - external event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto();\n *\n * window.addEventListener(\"mousedown\", e => {\n * selecto.triggerDragStart(e);\n * });\n */\n public triggerDragStart(e: MouseEvent | TouchEvent) {\n this.dragger.triggerDragStart(e);\n return this;\n }\n /**\n * Destroy elements, properties, and events.\n */\n public destroy(): void {\n this.off();\n this.keycon && this.keycon.destroy();\n this.dragger.unset();\n this.injectResult.destroy();\n removeEvent(document, \"selectstart\", this.onDocumentSelectStart);\n\n this.keycon = null;\n this.dragger = null;\n this.injectResult = null;\n this.target = null;\n this.container = null;\n this.options = null;\n }\n\n /**\n * External click or mouse events can be applied to the selecto.\n * @params - Extenal click or mouse event\n * @params - Specify the clicked target directly.\n */\n public clickTarget(e: MouseEvent | TouchEvent, clickedTarget?: Element): this {\n const { clientX, clientY } = getClient(e);\n const dragEvent: OnDragEvent = {\n datas: {},\n clientX,\n clientY,\n inputEvent: e,\n };\n if (this.onDragStart(dragEvent, clickedTarget)) {\n this.onDragEnd(dragEvent);\n }\n return this;\n }\n private setKeyController() {\n const { keyContainer, toggleContinueSelect } = this.options;\n\n if (this.keycon) {\n this.keycon.destroy();\n this.keycon = null;\n }\n if (toggleContinueSelect) {\n this.keycon = new KeyController(keyContainer || window);\n this.keycon.keydown(this.onKeyDown).keyup(this.onKeyUp).on(\"blur\", this.onBlur);\n }\n }\n private setKeyEvent() {\n const { toggleContinueSelect } = this.options;\n if (!toggleContinueSelect || this.keycon) {\n return;\n }\n this.setKeyController();\n }\n private initElement() {\n this.target = createElement(\n
as any,\n this.target,\n this.container,\n );\n\n const target = this.target;\n\n const { dragContainer, checkInput, preventDefault } = this.options;\n this.dragContainer = typeof dragContainer === \"string\"\n ? [].slice.call(document.querySelectorAll(dragContainer))\n : (this.options.dragContainer || this.target.parentNode as any);\n this.dragger = new Dragger(this.dragContainer, {\n container: window,\n checkInput,\n preventDefault,\n dragstart: this.onDragStart,\n drag: this.onDrag,\n dragend: this.onDragEnd,\n });\n addEvent(document, \"selectstart\", this.onDocumentSelectStart);\n\n this.injectResult = injector.inject(target, {\n nonce: this.options.cspNonce,\n });\n }\n private hitTest(\n selectRect: Rect,\n clientX: number,\n clientY: number,\n targets: Array,\n rects: Rect[],\n ) {\n const { hitRate, selectByClick } = this.options;\n const { left, top, right, bottom } = selectRect;\n\n return targets.filter((target, i) => {\n const {\n left: rectLeft,\n top: rectTop,\n right: rectRight,\n bottom: rectBottom,\n } = rects[i];\n const isStart\n = rectLeft <= clientX\n && clientX <= rectRight\n && rectTop <= clientY\n && clientY <= rectBottom;\n const rectSize = (rectRight - rectLeft) * (rectBottom - rectTop);\n const testLeft = Math.max(rectLeft, left);\n const testRight = Math.min(rectRight, right);\n const testTop = Math.max(rectTop, top);\n const testBottom = Math.min(rectBottom, bottom);\n\n if (selectByClick && isStart) {\n return true;\n }\n if (testRight < testLeft || testBottom < testTop) {\n return false;\n }\n const rate = Math.round((testRight - testLeft) * (testBottom - testTop) / rectSize * 100);\n\n if (rate >= hitRate) {\n return true;\n }\n return false;\n });\n }\n private initDragScroll() {\n this.dragScroll.on(\"scroll\", ({ container, direction }) => {\n this.trigger(\"scroll\", {\n container,\n direction,\n });\n }).on(\"move\", ({ offsetX, offsetY, inputEvent }) => {\n const datas = inputEvent.datas;\n datas.startX -= offsetX;\n datas.startY -= offsetY;\n datas.selectableRects.forEach(rect => {\n rect.top -= offsetY;\n rect.bottom -= offsetY;\n rect.left -= offsetX;\n rect.right -= offsetX;\n });\n this.dragger.scrollBy(offsetX, offsetY, inputEvent.inputEvent, false);\n\n inputEvent.distX += offsetX;\n inputEvent.distY += offsetY;\n this.check(inputEvent);\n });\n }\n private getSelectableTargets() {\n const selectableTargets: Array = [];\n\n this.options.selectableTargets.forEach(target => {\n if (isObject(target)) {\n selectableTargets.push(target);\n } else {\n const elements = [].slice.call(document.querySelectorAll(target));\n\n elements.forEach(el => {\n selectableTargets.push(el);\n });\n }\n });\n\n return selectableTargets;\n }\n private passSelectedTargets(passedTargets: Array) {\n const {\n list,\n prevList,\n added,\n removed,\n } = diff(this.selectedTargets, passedTargets) as ChildrenDiffResult;\n\n return added.map(index => list[index]).concat(removed.map(index => prevList[index]));\n }\n private select(\n selectedTargets: Array, rect: Rect, inputEvent: any, isStart?: boolean) {\n const {\n added,\n removed,\n prevList,\n list,\n } = this.differ.update(selectedTargets);\n\n if (isStart) {\n /**\n * When the select(drag) starts, the selectStart event is called.\n * @memberof Selecto\n * @event selectStart\n * @param {Selecto.OnSelect} - Parameters for the selectStart event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"selectStart\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * }).on(\"selectEnd\", e => {\n * e.afterAdded.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.afterRemoved.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"selectStart\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n rect,\n inputEvent,\n });\n }\n if (added.length || removed.length) {\n /**\n * When the select in real time, the select event is called.\n * @memberof Selecto\n * @event select\n * @param {Selecto.OnSelect} - Parameters for the select event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"select\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n rect,\n inputEvent,\n });\n }\n }\n private selectEnd(\n startSelectedTargets: Array,\n selectedTargets: Array,\n rect: Rect,\n e: OnDragEvent,\n ) {\n const { inputEvent, isDouble } = e;\n const {\n added,\n removed,\n prevList,\n list,\n } = diff(startSelectedTargets, selectedTargets);\n const {\n added: afterAdded,\n removed: afterRemoved,\n prevList: afterPrevList,\n list: afterList,\n } = diff(this.selectedTargets, selectedTargets);\n const type = inputEvent.type;\n const isDragStart = type === \"mousedown\" || type === \"touchstart\";\n\n /**\n * When the select(dragEnd or click) ends, the selectEnd event is called.\n * @memberof Selecto\n * @event selectEnd\n * @param {Selecto.OnSelectEnd} - Parameters for the selectEnd event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"selectStart\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * }).on(\"selectEnd\", e => {\n * e.afterAdded.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.afterRemoved.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"selectEnd\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n afterAdded: afterAdded.map(index => afterList[index]),\n afterRemoved: afterRemoved.map(index => afterPrevList[index]),\n isDragStart,\n isDouble: !!isDouble,\n rect,\n inputEvent,\n });\n }\n private onDragStart = (e: OnDragEvent, clickedTarget?: Element) => {\n const { datas, clientX, clientY, inputEvent } = e;\n const { continueSelect, selectFromInside, selectByClick } = this.options;\n const selectableTargets = this.getSelectableTargets();\n const selectableRects = selectableTargets.map(target => {\n const rect = target.getBoundingClientRect();\n const { left, top, width, height } = rect;\n\n return {\n left,\n top,\n right: left + width,\n bottom: top + height,\n width,\n height,\n };\n });\n datas.selectableTargets = selectableTargets;\n datas.selectableRects = selectableRects;\n datas.startSelectedTargets = this.selectedTargets;\n const hitRect = {\n left: clientX,\n top: clientY,\n right: clientX,\n bottom: clientY,\n width: 0,\n height: 0,\n };\n let firstPassedTargets: Array = [];\n if (selectFromInside || selectByClick) {\n let pointTarget\n = (clickedTarget || document.elementFromPoint(clientX, clientY)) as HTMLElement | SVGElement;\n\n while (pointTarget) {\n if (selectableTargets.indexOf(pointTarget as HTMLElement | SVGElement) > -1) {\n break;\n }\n pointTarget = pointTarget.parentElement;\n }\n firstPassedTargets = pointTarget ? [pointTarget] : [];\n }\n const hasInsideTargets = firstPassedTargets.length > 0;\n const isPreventSelect = !selectFromInside && hasInsideTargets;\n\n if (isPreventSelect && !selectByClick) {\n return false;\n }\n const type = inputEvent.type;\n const isTrusted = type === \"mousedown\" || type === \"touchstart\";\n /**\n * When the drag starts, the dragStart event is called.\n * Call the stop () function if you have a specific element or don't want to raise a select\n * @memberof Selecto\n * @event dragStart\n * @param {OnDragStart} - Parameters for the dragStart event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"dragStart\", e => {\n * if (e.inputEvent.target.tagName === \"SPAN\") {\n * e.stop();\n * }\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n const result = isTrusted ? this.trigger(\"dragStart\", e) : true;\n\n if (!result) {\n return false;\n }\n\n if (!continueSelect) {\n this.selectedTargets = [];\n } else {\n firstPassedTargets = this.passSelectedTargets(firstPassedTargets);\n }\n\n this.select(firstPassedTargets, hitRect, inputEvent, true);\n datas.startX = clientX;\n datas.startY = clientY;\n datas.selectedTargets = firstPassedTargets;\n this.target.style.cssText\n += `left:0px;top:0px;transform: translate(${clientX}px, ${clientY}px)`;\n\n if (isPreventSelect && selectByClick) {\n this.onDragEnd(e);\n inputEvent.preventDefault();\n return false;\n } else {\n if (type === \"touchstart\") {\n inputEvent.preventDefault();\n }\n const { scrollOptions } = this.options;\n if (scrollOptions && scrollOptions.container) {\n this.dragScroll.dragStart(e, scrollOptions);\n }\n return true;\n }\n }\n private check(e: any) {\n const {\n datas,\n inputEvent,\n } = e;\n const rect = getRect(e, this.options.ratio);\n const {\n top,\n left,\n width,\n height,\n } = rect;\n this.target.style.cssText\n += `display: block;`\n + `left:0px;top:0px;`\n + `transform: translate(${left}px, ${top}px);`\n + `width:${width}px;height:${height}px;`;\n\n const passedTargets = this.hitTest(\n rect, datas.startX, datas.startY, datas.selectableTargets, datas.selectableRects);\n const selectedTargets = this.passSelectedTargets(passedTargets);\n\n this.trigger(\"drag\", {\n ...e,\n rect,\n });\n this.select(selectedTargets, rect, inputEvent);\n datas.selectedTargets = selectedTargets;\n }\n private onDrag = (e: OnDrag) => {\n const { scrollOptions } = this.options;\n if (scrollOptions && scrollOptions.container) {\n if (this.dragScroll.drag(e, scrollOptions)) {\n return;\n }\n }\n this.check(e);\n }\n private onDragEnd = (e: OnDragEvent) => {\n const { datas } = e;\n const rect = getRect(e, this.options.ratio);\n this.dragScroll.dragEnd();\n this.target.style.cssText += \"display: none;\";\n this.trigger(\"dragEnd\", {\n ...e,\n rect,\n });\n this.selectEnd(\n datas.startSelectedTargets, datas.selectedTargets, rect, e);\n this.selectedTargets = datas.selectedTargets;\n }\n private sameCombiKey(e: any) {\n const toggleContinueSelect = [].concat(this.options.toggleContinueSelect);\n const combi = getCombi(e.inputEvent, e.key);\n const toggleKeys = (isArray(toggleContinueSelect[0]) ? toggleContinueSelect : [toggleContinueSelect]);\n\n return toggleKeys.some(keys => keys.every(key => combi.indexOf(key) > -1));\n }\n private onKeyDown = (e: any) => {\n if (!this.sameCombiKey(e)) {\n return;\n }\n this.continueSelect = true;\n /**\n * When you keydown the key you specified in toggleContinueSelect, the keydown event is called.\n * @memberof Selecto\n * @event keydown\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * toggleContinueSelect: \"shift\";\n * keyContainer: window,\n * });\n *\n * selecto.on(\"keydown\", () => {\n * document.querySelector(\".button\").classList.add(\"selected\");\n * }).on(\"keyup\", () => {\n * document.querySelector(\".button\").classList.remove(\"selected\");\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"keydown\", {});\n }\n private onKeyUp = (e: any) => {\n if (!this.sameCombiKey(e)) {\n return;\n }\n this.continueSelect = false;\n /**\n * When you keyup the key you specified in toggleContinueSelect, the keyup event is called.\n * @memberof Selecto\n * @event keyup\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * toggleContinueSelect: \"shift\";\n * keyContainer: window,\n * });\n *\n * selecto.on(\"keydown\", () => {\n * document.querySelector(\".button\").classList.add(\"selected\");\n * }).on(\"keyup\", () => {\n * document.querySelector(\".button\").classList.remove(\"selected\");\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"keyup\", {});\n }\n private onBlur = () => {\n if (this.toggleContinueSelect && this.continueSelect) {\n this.trigger(\"keyup\", {});\n }\n }\n private onDocumentSelectStart = (e: any) => {\n if (!this.dragger.isFlag()) {\n return;\n }\n let dragContainer = this.dragContainer;\n\n if (dragContainer === window) {\n dragContainer = document.documentElement;\n }\n const containers = dragContainer instanceof Element\n ? [dragContainer] : [].slice.call(dragContainer) as Element[];\n const target = e.target;\n\n containers.some(container => {\n if (container === target || container.contains(target)) {\n e.preventDefault();\n return true;\n }\n });\n }\n}\n\ninterface Selecto extends Component, SelectoProperties {\n on(eventName: T, handlerToAttach: (event: SelectoEvents[T]) => any): this;\n on(eventName: string, handlerToAttach: (event: { [key: string]: any }) => any): this;\n on(events: { [key: string]: (event: { [key: string]: any }) => any }): this;\n}\n\nexport default Selecto;\n","import Selecto, * as modules from \"./index\";\n\nfor (const name in modules) {\n (Selecto as any)[name] = modules[name];\n}\n\nexport default Selecto;\n"],"names":["getClient","e","touch","touches","changedTouches","clientX","clientY","createElement","jsx","prevTarget","container","tag","children","attributes","className","style","el","document","name","setAttribute","elChildren","forEach","child","i","split","hasClass","addClass","elStyle","appendChild","h","attrs","_i","_a","_b","_c","diffValue","prev","cur","func","getRect","ratio","distX","distY","startX","startY","nextHeight","Math","sqrt","nextWidth","tx","min","ty","width","abs","height","left","top","right","bottom","injector","styled","CLASS_NAME","PROPERTIES","OPTIONS","__spreadArrays","OPTION_TYPES","target","dragContainer","selectableTargets","Array","selectByClick","Boolean","selectFromInside","continueSelect","toggleContinueSelect","keyContainer","hitRate","Number","scrollOptions","Object","checkInput","preventDefault","cspNonce","String","EVENTS","METHODS","__extends","options","_super","_this","ChildrenDiffer","DragScroll","clickedTarget","datas","inputEvent","getSelectableTargets","selectableRects","map","rect","getBoundingClientRect","startSelectedTargets","selectedTargets","hitRect","firstPassedTargets","pointTarget","elementFromPoint","indexOf","parentElement","hasInsideTargets","length","isPreventSelect","type","isTrusted","result","trigger","passSelectedTargets","select","cssText","onDragEnd","dragScroll","dragStart","drag","check","dragEnd","selectEnd","sameCombiKey","dragger","isFlag","window","documentElement","containers","Element","slice","call","some","contains","undefined","initElement","initDragScroll","setKeyController","differ","setKeyEvent","value","triggerDragStart","off","keycon","destroy","unset","injectResult","removeEvent","onDocumentSelectStart","dragEvent","onDragStart","KeyController","keydown","onKeyDown","keyup","onKeyUp","on","onBlur","querySelectorAll","parentNode","Dragger","dragstart","onDrag","dragend","addEvent","inject","nonce","selectRect","targets","rects","filter","rectLeft","rectTop","rectRight","rectBottom","isStart","rectSize","testLeft","max","testRight","testTop","testBottom","rate","round","direction","offsetX","offsetY","scrollBy","isObject","push","elements","passedTargets","list","prevList","added","removed","index","concat","selected","isDouble","afterAdded","afterRemoved","afterPrevList","afterList","isDragStart","hitTest","combi","getCombi","key","toggleKeys","isArray","keys","every","Selecto","Properties","prototype","property","enumerable","configurable","get","setter","camelize","set","defineProperty","Component","modules"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"} \ No newline at end of file diff --git a/dist/selecto.min.js b/dist/selecto.min.js new file mode 100644 index 0000000..a8294db --- /dev/null +++ b/dist/selecto.min.js @@ -0,0 +1,10 @@ +/* +Copyright (c) 2020 Daybrush +name: selecto +license: MIT +author: Daybrush +repository: git+https://github.com/daybrush/selecto.git +version: 1.6.1 +*/ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Selecto=e()}(this,function(){"use strict";var c=function(t,e){return(c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};var u=function(){return(u=Object.assign||function(t){for(var e,n=1,r=arguments.length;no)){var s=y(t.changedTouches);if(this.pinchFlag=!0,(e=this.startClients).push.apply(e,s),(n=this.prevClients).push.apply(n,s),this.startDistance=g(this.prevClients),this.startPinchClients=this.prevClients.slice(),i){var a=this.prevClients,c=m(a),l=T(c,c,c);this.startRotate=d(a),i(S({type:"pinchstart",datas:this.datas,angle:this.startRotate,touches:v(a,a,a)},l,{inputEvent:t}))}}},e.onPinch=function(t,e){if(this.flag&&this.pinchFlag&&!(e.length<2)){this.isPinch=!0;var n=this.options.pinch;if(n){var r=this.prevClients,i=this.startClients,o=T(m(e),m(r),m(i)),s=d(e),a=g(e);n(S({type:"pinch",datas:this.datas,movement:this.movement,angle:s,rotation:s-this.startRotate,touches:v(e,r,i),scale:a/this.startDistance,distance:a},o,{inputEvent:t}))}}},e.onPinchEnd=function(t){if(this.flag&&this.pinchFlag){var e=this.isPinch;this.isPinch=!1,this.pinchFlag=!1;var n=this.options.pinchend;if(n){var r=this.prevClients,i=this.startClients,o=T(m(r),m(r),m(i));n(S({type:"pinchend",datas:this.datas,isPinch:e,touches:v(r,r,i)},o,{inputEvent:t})),this.isPinch=!1,this.pinchFlag=!1}}},e.triggerDragStart=function(t){this.onDragStart(t,!1)},e.unset=function(){var e=this,t=this.targets,n=this.options.container;this.isMouse&&(t.forEach(function(t){w(t,"mousedown",e.onDragStart)}),w(n,"mousemove",this.onDrag),w(n,"mouseup",this.onDragEnd),w(n,"contextmenu",this.onDragEnd)),this.isTouch&&(t.forEach(function(t){w(t,"touchstart",e.onDragStart)}),w(n,"touchstart",this.onDragStart),w(n,"touchmove",this.onDrag),w(n,"touchend",this.onDragEnd),w(n,"touchcancel",this.onDragEnd))},e.initDrag=function(){this.startClients=[],this.prevClients=[],this.flag=!1},t}();var _=function(){function t(){this.keys=[],this.values=[]}var e=t.prototype;return e.get=function(t){return this.values[this.keys.indexOf(t)]},e.set=function(t,e){var n=this.keys,r=this.values,i=n.indexOf(t),o=-1===i?n.length:i;n[o]=t,r[o]=e},t}(),x=function(){function t(){this.object={}}var e=t.prototype;return e.get=function(t){return this.object[t]},e.set=function(t,e){this.object[t]=e},t}(),P="function"==typeof Map,o=function(){function t(){}var e=t.prototype;return e.connect=function(t,e){this.prev=t,this.next=e,t&&(t.next=this),e&&(e.prev=this)},e.disconnect=function(){var t=this.prev,e=this.next;t&&(t.next=e),e&&(e.prev=t)},e.getIndex=function(){for(var t=this,e=-1;t;)t=t.prev,++e;return e},t}();var K=function(){function t(t,e,n,r,i,o,s,a){this.prevList=t,this.list=e,this.added=n,this.removed=r,this.changed=i,this.maintained=o,this.changedBeforeAdded=s,this.fixed=a}var e=t.prototype;return Object.defineProperty(e,"ordered",{get:function(){return this.cacheOrdered||this.caculateOrdered(),this.cacheOrdered},enumerable:!0,configurable:!0}),Object.defineProperty(e,"pureChanged",{get:function(){return this.cachePureChanged||this.caculateOrdered(),this.cachePureChanged},enumerable:!0,configurable:!0}),e.caculateOrdered=function(){var t,n,a,c,e=(t=this.changedBeforeAdded,n=this.fixed,a=[],c=[],t.forEach(function(t){var e=t[0],n=t[1],r=new o;a[e]=r,c[n]=r}),a.forEach(function(t,e){t.connect(a[e-1])}),t.filter(function(t,e){return!n[e]}).map(function(t,e){var n=t[0],r=t[1];if(n===r)return[0,0];var i=a[n],o=c[r-1],s=i.getIndex();return i.disconnect(),o?i.connect(o,o.next):i.connect(void 0,a[0]),[s,i.getIndex()]})),l=this.changed,u=[];this.cacheOrdered=e.filter(function(t,e){var n=t[0],r=t[1],i=l[e],o=i[0],s=i[1];if(n!==r)return u.push([o,s]),!0}),this.cachePureChanged=u},t}();function r(t,e,n){var r=P?Map:n?x:_,i=n||function(t){return t},o=[],s=[],a=[],c=t.map(i),l=e.map(i),u=new r,h=new r,f=[],d=[],p={},g=[],v=0,y=0;return c.forEach(function(t,e){u.set(t,e)}),l.forEach(function(t,e){h.set(t,e)}),c.forEach(function(t,e){var n=h.get(t);void 0===n?(++y,s.push(e)):p[n]=y}),l.forEach(function(t,e){var n=u.get(t);void 0===n?(o.push(e),++v):(a.push([n,e]),y=p[e]||0,f.push([n-y,e-v]),d.push(e===n),n!==e&&g.push([n,e]))}),s.reverse(),new K(t,e,o,s,g,a,f,d)}var Y=function(t,e){return(Y=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};var e,j="function"==typeof Map?void 0:(e=0,function(t){return t.__DIFF_KEY__||(t.__DIFF_KEY__=++e)}),X=function(e){function t(){this.constructor=n}var n,r;function i(t){return void 0===t&&(t=[]),e.call(this,t,j)||this}return Y(n=i,r=e),n.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t),i}(function(){function t(t,e){void 0===t&&(t=[]),this.findKeyCallback=e,this.list=[].slice.call(t)}return t.prototype.update=function(t){var e=[].slice.call(t),n=r(this.list,e,this.findKeyCallback);return this.list=e,n},t}());function R(t,e){return r(t,e,j)}var M=function(t,e){return(M=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};function A(t){var e=t.container;return[e.scrollLeft,e.scrollTop]}var N=function(e){function t(){this.constructor=n}var n,r;function i(){var t=null!==e&&e.apply(this,arguments)||this;return t.startRect=null,t.startPos=[],t.prevTime=0,t.timer=0,t}M(n=i,r=e),n.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t);var o=i.prototype;return o.dragStart=function(t,e){var n=e.container.getBoundingClientRect(),r=n.top,i=n.left,o=n.width,s=n.height;this.startPos=[t.clientX,t.clientY],this.startRect={top:r,left:i,width:o,height:s}},o.drag=function(t,e){var n=this,r=t.clientX,i=t.clientY,o=e.container,s=e.threshold,a=void 0===s?0:s,c=e.throttleTime,l=void 0===c?0:c,u=e.getScrollPosition,h=void 0===u?A:u,f=this.startRect,d=this.startPos,p=E(),g=Math.max(l+this.prevTime-p,0),v=[0,0];if(f.top>i-a?(d[1]>f.top||id[1])&&(v[1]=1),f.left>r-a?(d[0]>f.left||rd[0])&&(v[0]=1),clearTimeout(this.timer),!v[0]&&!v[1])return!1;if(0>>0}(rt="\n:host {\n position: fixed;\n display: none;\n border: 1px solid #4af;\n background: rgba(68, 170, 255, 0.5);\n z-index: 100;\n}\n").toString(36),st=0,{className:ot,inject:function(t,e){void 0===e&&(e={});var n,r=function(t){if(t&&t.getRootNode){var e=t.getRootNode();if(11===e.nodeType)return e}}(t),i=0===st;return(r||i)&&(n=function(n,t,e,r){var i=document.createElement("style");i.setAttribute("type","text/css"),i.setAttribute("data-styled-id",n),e.nonce&&i.setAttribute("nonce",e.nonce);var o=t;return e.original||(o=t.replace(/([^}{]*){/gm,function(t,e){return s(e).map(function(t){return-1 {\n createElement(child, elChildren[i] as HTMLElement | SVGElement, el);\n });\n if (className) {\n className.split(\" \").forEach(name => {\n if (!hasClass(el, name)) {\n addClass(el, name);\n }\n });\n }\n if (style) {\n const elStyle = el.style;\n for (const name in style) {\n elStyle[name] = style[name];\n }\n }\n if (!prevTarget && container) {\n container.appendChild(el);\n }\n return el;\n}\nexport function h(\n tag: string,\n attrs: IObject,\n ...children: Hypertext[]\n): Hypertext {\n const {\n className = \"\",\n style = {},\n ...attributes\n } = attrs || {};\n return {\n tag,\n className,\n style,\n attributes,\n children,\n };\n}\n\nexport function diffValue(prev: T, cur: T, func: (prev: T, cur: T) => void) {\n if (prev !== cur) {\n func(prev, cur);\n }\n}\n\nexport function getRect(e: any, ratio: number): Rect {\n let {\n distX = 0,\n distY = 0,\n } = e;\n const { startX, startY } = e.datas;\n\n if (ratio > 0) {\n const nextHeight = Math.sqrt((distX * distX + distY * distY) / (1 + ratio * ratio));\n const nextWidth = ratio * nextHeight;\n\n distX = (distX >= 0 ? 1 : -1) * nextWidth;\n distY = (distY >= 0 ? 1 : -1) * nextHeight;\n }\n const tx = Math.min(0, distX);\n const ty = Math.min(0, distY);\n // h ^ 2 + (ratio * h) ^ 2 = dist\n // (1 + ratio ^ 2) * h^2 = dist ^ 2\n // dist * Math.atan(ratio);\n const width = Math.abs(distX);\n const height = Math.abs(distY);\n const left = startX + tx;\n const top = startY + ty;\n\n return {\n left,\n top,\n right: left + width,\n bottom: top + height,\n width,\n height,\n };\n}\n","import styled from \"css-styled\";\nimport { SelectoOptions } from \"./types\";\n\nexport const injector = styled(`\n:host {\n position: fixed;\n display: none;\n border: 1px solid #4af;\n background: rgba(68, 170, 255, 0.5);\n z-index: 100;\n}\n`);\n\n/**\n * @memberof Selecto\n */\nexport const CLASS_NAME = `selecto-selection ${injector.className}`;\n\nexport const PROPERTIES = [\n \"selectableTargets\",\n \"selectByClick\",\n \"selectFromInside\",\n \"continueSelect\",\n \"toggleContinueSelect\",\n \"keyContainer\",\n \"hitRate\",\n \"scrollOptions\",\n \"checkInput\",\n \"preventDefault\",\n \"ratio\",\n] as const;\n/**\n * @memberof Selecto\n */\nexport const OPTIONS = [\n // ignore target, container,\n \"dragContainer\",\n \"cspNonce\",\n ...PROPERTIES,\n] as const;\n\nexport const OPTION_TYPES: { [key in keyof SelectoOptions]: any } = {\n target: null,\n container: null,\n dragContainer: null,\n selectableTargets: Array,\n selectByClick: Boolean,\n selectFromInside: Boolean,\n continueSelect: Boolean,\n toggleContinueSelect: Array,\n keyContainer: null,\n hitRate: Number,\n scrollOptions: Object,\n checkInput: Boolean,\n preventDefault: Boolean,\n cspNonce: String,\n ratio: Number,\n};\n\n/**\n * @memberof Selecto\n */\nexport const EVENTS = [\n \"dragStart\",\n \"drag\",\n \"dragEnd\",\n \"selectStart\",\n \"select\",\n \"selectEnd\",\n \"keydown\",\n \"keyup\",\n \"scroll\",\n] as const;\n\n/**\n * @memberof Selecto\n */\nexport const METHODS = [\n \"clickTarget\",\n \"setSelectedTargets\",\n \"triggerDragStart\",\n] as const;\n","import Component from \"@egjs/component\";\nimport Dragger, { OnDrag } from \"@daybrush/drag\";\nimport { InjectResult } from \"css-styled\";\nimport { Properties } from \"framework-utils\";\nimport { isObject, camelize, IObject, addEvent, removeEvent, isArray } from \"@daybrush/utils\";\nimport ChildrenDiffer, { diff, ChildrenDiffResult } from \"@egjs/children-differ\";\nimport DragScroll from \"@scena/dragscroll\";\nimport KeyController, { getCombi } from \"keycon\";\nimport { createElement, h, getClient, diffValue, getRect } from \"./utils\";\nimport { SelectoOptions, Rect, SelectoProperties, OnDragEvent, SelectoEvents } from \"./types\";\nimport { PROPERTIES, injector, CLASS_NAME } from \"./consts\";\n\n/**\n * Selecto.js is a component that allows you to select elements in the drag area using the mouse or touch.\n * @sort 1\n * @extends eg.Component\n */\n@Properties(PROPERTIES as any, (prototype, property) => {\n const attributes: IObject = {\n enumerable: true,\n configurable: true,\n get() {\n return this.options[property];\n },\n };\n const setter = camelize(`set ${property}`);\n if (prototype[setter]) {\n attributes.set = function set(value) {\n this[setter](value);\n };\n } else {\n attributes.set = function set(value) {\n this.options[property] = value;\n };\n }\n Object.defineProperty(prototype, property, attributes);\n})\nclass Selecto extends Component {\n public options: SelectoOptions;\n private target!: HTMLElement | SVGElement;\n private dragContainer!: Element | Window | Element[];\n private container!: HTMLElement;\n private dragger!: Dragger;\n private injectResult!: InjectResult;\n private selectedTargets: Array = [];\n private differ = new ChildrenDiffer();\n private dragScroll: DragScroll = new DragScroll();\n private keycon!: KeyController;\n /**\n *\n */\n constructor(\n options: Partial = {},\n ) {\n super();\n this.target = options.target;\n this.container = options.container;\n this.options = {\n target: null,\n container: null,\n dragContainer: null,\n selectableTargets: [],\n selectByClick: true,\n selectFromInside: true,\n hitRate: 100,\n continueSelect: false,\n toggleContinueSelect: null,\n keyContainer: null,\n scrollOptions: undefined,\n checkInput: false,\n preventDefault: false,\n cspNonce: \"\",\n ratio: 0,\n ...options,\n };\n this.initElement();\n this.initDragScroll();\n this.setKeyController();\n }\n /**\n * You can set the currently selected targets.\n */\n public setSelectedTargets(selectedTargets: Array): this {\n this.selectedTargets = selectedTargets;\n this.differ = new ChildrenDiffer(selectedTargets);\n\n return this;\n }\n /**\n * You can get the currently selected targets.\n */\n public getSelectedTargets(): Array {\n return this.selectedTargets;\n }\n public setKeyContainer(keyContainer: HTMLElement | Document | Window) {\n const options = this.options;\n\n diffValue(options.keyContainer, keyContainer, () => {\n options.keyContainer = keyContainer;\n\n this.setKeyController();\n });\n }\n public setToggleContinueSelect(toggleContinueSelect: string[][] | string[] | string) {\n const options = this.options;\n\n diffValue(options.toggleContinueSelect, toggleContinueSelect, () => {\n options.toggleContinueSelect = toggleContinueSelect;\n\n this.setKeyEvent();\n });\n }\n public setPreventDefault(value: boolean) {\n this.dragger.options.preventDefault = value;\n }\n public setCheckInput(value: boolean) {\n this.dragger.options.checkInput = value;\n }\n /**\n * `OnDragStart` is triggered by an external event.\n * @param - external event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto();\n *\n * window.addEventListener(\"mousedown\", e => {\n * selecto.triggerDragStart(e);\n * });\n */\n public triggerDragStart(e: MouseEvent | TouchEvent) {\n this.dragger.triggerDragStart(e);\n return this;\n }\n /**\n * Destroy elements, properties, and events.\n */\n public destroy(): void {\n this.off();\n this.keycon && this.keycon.destroy();\n this.dragger.unset();\n this.injectResult.destroy();\n removeEvent(document, \"selectstart\", this.onDocumentSelectStart);\n\n this.keycon = null;\n this.dragger = null;\n this.injectResult = null;\n this.target = null;\n this.container = null;\n this.options = null;\n }\n\n /**\n * External click or mouse events can be applied to the selecto.\n * @params - Extenal click or mouse event\n * @params - Specify the clicked target directly.\n */\n public clickTarget(e: MouseEvent | TouchEvent, clickedTarget?: Element): this {\n const { clientX, clientY } = getClient(e);\n const dragEvent: OnDragEvent = {\n datas: {},\n clientX,\n clientY,\n inputEvent: e,\n };\n if (this.onDragStart(dragEvent, clickedTarget)) {\n this.onDragEnd(dragEvent);\n }\n return this;\n }\n private setKeyController() {\n const { keyContainer, toggleContinueSelect } = this.options;\n\n if (this.keycon) {\n this.keycon.destroy();\n this.keycon = null;\n }\n if (toggleContinueSelect) {\n this.keycon = new KeyController(keyContainer || window);\n this.keycon.keydown(this.onKeyDown).keyup(this.onKeyUp).on(\"blur\", this.onBlur);\n }\n }\n private setKeyEvent() {\n const { toggleContinueSelect } = this.options;\n if (!toggleContinueSelect || this.keycon) {\n return;\n }\n this.setKeyController();\n }\n private initElement() {\n this.target = createElement(\n
as any,\n this.target,\n this.container,\n );\n\n const target = this.target;\n\n const { dragContainer, checkInput, preventDefault } = this.options;\n this.dragContainer = typeof dragContainer === \"string\"\n ? [].slice.call(document.querySelectorAll(dragContainer))\n : (this.options.dragContainer || this.target.parentNode as any);\n this.dragger = new Dragger(this.dragContainer, {\n container: window,\n checkInput,\n preventDefault,\n dragstart: this.onDragStart,\n drag: this.onDrag,\n dragend: this.onDragEnd,\n });\n addEvent(document, \"selectstart\", this.onDocumentSelectStart);\n\n this.injectResult = injector.inject(target, {\n nonce: this.options.cspNonce,\n });\n }\n private hitTest(\n selectRect: Rect,\n clientX: number,\n clientY: number,\n targets: Array,\n rects: Rect[],\n ) {\n const { hitRate, selectByClick } = this.options;\n const { left, top, right, bottom } = selectRect;\n\n return targets.filter((target, i) => {\n const {\n left: rectLeft,\n top: rectTop,\n right: rectRight,\n bottom: rectBottom,\n } = rects[i];\n const isStart\n = rectLeft <= clientX\n && clientX <= rectRight\n && rectTop <= clientY\n && clientY <= rectBottom;\n const rectSize = (rectRight - rectLeft) * (rectBottom - rectTop);\n const testLeft = Math.max(rectLeft, left);\n const testRight = Math.min(rectRight, right);\n const testTop = Math.max(rectTop, top);\n const testBottom = Math.min(rectBottom, bottom);\n\n if (selectByClick && isStart) {\n return true;\n }\n if (testRight < testLeft || testBottom < testTop) {\n return false;\n }\n const rate = Math.round((testRight - testLeft) * (testBottom - testTop) / rectSize * 100);\n\n if (rate >= hitRate) {\n return true;\n }\n return false;\n });\n }\n private initDragScroll() {\n this.dragScroll.on(\"scroll\", ({ container, direction }) => {\n this.trigger(\"scroll\", {\n container,\n direction,\n });\n }).on(\"move\", ({ offsetX, offsetY, inputEvent }) => {\n const datas = inputEvent.datas;\n datas.startX -= offsetX;\n datas.startY -= offsetY;\n datas.selectableRects.forEach(rect => {\n rect.top -= offsetY;\n rect.bottom -= offsetY;\n rect.left -= offsetX;\n rect.right -= offsetX;\n });\n this.dragger.scrollBy(offsetX, offsetY, inputEvent.inputEvent, false);\n\n inputEvent.distX += offsetX;\n inputEvent.distY += offsetY;\n this.check(inputEvent);\n });\n }\n private getSelectableTargets() {\n const selectableTargets: Array = [];\n\n this.options.selectableTargets.forEach(target => {\n if (isObject(target)) {\n selectableTargets.push(target);\n } else {\n const elements = [].slice.call(document.querySelectorAll(target));\n\n elements.forEach(el => {\n selectableTargets.push(el);\n });\n }\n });\n\n return selectableTargets;\n }\n private passSelectedTargets(passedTargets: Array) {\n const {\n list,\n prevList,\n added,\n removed,\n } = diff(this.selectedTargets, passedTargets) as ChildrenDiffResult;\n\n return added.map(index => list[index]).concat(removed.map(index => prevList[index]));\n }\n private select(\n selectedTargets: Array, rect: Rect, inputEvent: any, isStart?: boolean) {\n const {\n added,\n removed,\n prevList,\n list,\n } = this.differ.update(selectedTargets);\n\n if (isStart) {\n /**\n * When the select(drag) starts, the selectStart event is called.\n * @memberof Selecto\n * @event selectStart\n * @param {Selecto.OnSelect} - Parameters for the selectStart event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"selectStart\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * }).on(\"selectEnd\", e => {\n * e.afterAdded.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.afterRemoved.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"selectStart\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n rect,\n inputEvent,\n });\n }\n if (added.length || removed.length) {\n /**\n * When the select in real time, the select event is called.\n * @memberof Selecto\n * @event select\n * @param {Selecto.OnSelect} - Parameters for the select event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"select\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n rect,\n inputEvent,\n });\n }\n }\n private selectEnd(\n startSelectedTargets: Array,\n selectedTargets: Array,\n rect: Rect,\n e: OnDragEvent,\n ) {\n const { inputEvent, isDouble } = e;\n const {\n added,\n removed,\n prevList,\n list,\n } = diff(startSelectedTargets, selectedTargets);\n const {\n added: afterAdded,\n removed: afterRemoved,\n prevList: afterPrevList,\n list: afterList,\n } = diff(this.selectedTargets, selectedTargets);\n const type = inputEvent.type;\n const isDragStart = type === \"mousedown\" || type === \"touchstart\";\n\n /**\n * When the select(dragEnd or click) ends, the selectEnd event is called.\n * @memberof Selecto\n * @event selectEnd\n * @param {Selecto.OnSelectEnd} - Parameters for the selectEnd event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"selectStart\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * }).on(\"selectEnd\", e => {\n * e.afterAdded.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.afterRemoved.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"selectEnd\", {\n selected: selectedTargets,\n added: added.map(index => list[index]),\n removed: removed.map(index => prevList[index]),\n afterAdded: afterAdded.map(index => afterList[index]),\n afterRemoved: afterRemoved.map(index => afterPrevList[index]),\n isDragStart,\n isDouble: !!isDouble,\n rect,\n inputEvent,\n });\n }\n private onDragStart = (e: OnDragEvent, clickedTarget?: Element) => {\n const { datas, clientX, clientY, inputEvent } = e;\n const { continueSelect, selectFromInside, selectByClick } = this.options;\n const selectableTargets = this.getSelectableTargets();\n const selectableRects = selectableTargets.map(target => {\n const rect = target.getBoundingClientRect();\n const { left, top, width, height } = rect;\n\n return {\n left,\n top,\n right: left + width,\n bottom: top + height,\n width,\n height,\n };\n });\n datas.selectableTargets = selectableTargets;\n datas.selectableRects = selectableRects;\n datas.startSelectedTargets = this.selectedTargets;\n const hitRect = {\n left: clientX,\n top: clientY,\n right: clientX,\n bottom: clientY,\n width: 0,\n height: 0,\n };\n let firstPassedTargets: Array = [];\n if (selectFromInside || selectByClick) {\n let pointTarget\n = (clickedTarget || document.elementFromPoint(clientX, clientY)) as HTMLElement | SVGElement;\n\n while (pointTarget) {\n if (selectableTargets.indexOf(pointTarget as HTMLElement | SVGElement) > -1) {\n break;\n }\n pointTarget = pointTarget.parentElement;\n }\n firstPassedTargets = pointTarget ? [pointTarget] : [];\n }\n const hasInsideTargets = firstPassedTargets.length > 0;\n const isPreventSelect = !selectFromInside && hasInsideTargets;\n\n if (isPreventSelect && !selectByClick) {\n return false;\n }\n const type = inputEvent.type;\n const isTrusted = type === \"mousedown\" || type === \"touchstart\";\n /**\n * When the drag starts, the dragStart event is called.\n * Call the stop () function if you have a specific element or don't want to raise a select\n * @memberof Selecto\n * @event dragStart\n * @param {OnDragStart} - Parameters for the dragStart event\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * selectByClick: true,\n * selectFromInside: false,\n * });\n *\n * selecto.on(\"dragStart\", e => {\n * if (e.inputEvent.target.tagName === \"SPAN\") {\n * e.stop();\n * }\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n const result = isTrusted ? this.trigger(\"dragStart\", e) : true;\n\n if (!result) {\n return false;\n }\n\n if (!continueSelect) {\n this.selectedTargets = [];\n } else {\n firstPassedTargets = this.passSelectedTargets(firstPassedTargets);\n }\n\n this.select(firstPassedTargets, hitRect, inputEvent, true);\n datas.startX = clientX;\n datas.startY = clientY;\n datas.selectedTargets = firstPassedTargets;\n this.target.style.cssText\n += `left:0px;top:0px;transform: translate(${clientX}px, ${clientY}px)`;\n\n if (isPreventSelect && selectByClick) {\n this.onDragEnd(e);\n inputEvent.preventDefault();\n return false;\n } else {\n if (type === \"touchstart\") {\n inputEvent.preventDefault();\n }\n const { scrollOptions } = this.options;\n if (scrollOptions && scrollOptions.container) {\n this.dragScroll.dragStart(e, scrollOptions);\n }\n return true;\n }\n }\n private check(e: any) {\n const {\n datas,\n inputEvent,\n } = e;\n const rect = getRect(e, this.options.ratio);\n const {\n top,\n left,\n width,\n height,\n } = rect;\n this.target.style.cssText\n += `display: block;`\n + `left:0px;top:0px;`\n + `transform: translate(${left}px, ${top}px);`\n + `width:${width}px;height:${height}px;`;\n\n const passedTargets = this.hitTest(\n rect, datas.startX, datas.startY, datas.selectableTargets, datas.selectableRects);\n const selectedTargets = this.passSelectedTargets(passedTargets);\n\n this.trigger(\"drag\", {\n ...e,\n rect,\n });\n this.select(selectedTargets, rect, inputEvent);\n datas.selectedTargets = selectedTargets;\n }\n private onDrag = (e: OnDrag) => {\n const { scrollOptions } = this.options;\n if (scrollOptions && scrollOptions.container) {\n if (this.dragScroll.drag(e, scrollOptions)) {\n return;\n }\n }\n this.check(e);\n }\n private onDragEnd = (e: OnDragEvent) => {\n const { datas } = e;\n const rect = getRect(e, this.options.ratio);\n this.dragScroll.dragEnd();\n this.target.style.cssText += \"display: none;\";\n this.trigger(\"dragEnd\", {\n ...e,\n rect,\n });\n this.selectEnd(\n datas.startSelectedTargets, datas.selectedTargets, rect, e);\n this.selectedTargets = datas.selectedTargets;\n }\n private sameCombiKey(e: any) {\n const toggleContinueSelect = [].concat(this.options.toggleContinueSelect);\n const combi = getCombi(e.inputEvent, e.key);\n const toggleKeys = (isArray(toggleContinueSelect[0]) ? toggleContinueSelect : [toggleContinueSelect]);\n\n return toggleKeys.some(keys => keys.every(key => combi.indexOf(key) > -1));\n }\n private onKeyDown = (e: any) => {\n if (!this.sameCombiKey(e)) {\n return;\n }\n this.continueSelect = true;\n /**\n * When you keydown the key you specified in toggleContinueSelect, the keydown event is called.\n * @memberof Selecto\n * @event keydown\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * toggleContinueSelect: \"shift\";\n * keyContainer: window,\n * });\n *\n * selecto.on(\"keydown\", () => {\n * document.querySelector(\".button\").classList.add(\"selected\");\n * }).on(\"keyup\", () => {\n * document.querySelector(\".button\").classList.remove(\"selected\");\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"keydown\", {});\n }\n private onKeyUp = (e: any) => {\n if (!this.sameCombiKey(e)) {\n return;\n }\n this.continueSelect = false;\n /**\n * When you keyup the key you specified in toggleContinueSelect, the keyup event is called.\n * @memberof Selecto\n * @event keyup\n * @example\n * import Selecto from \"selecto\";\n *\n * const selecto = new Selecto({\n * container: document.body,\n * toggleContinueSelect: \"shift\";\n * keyContainer: window,\n * });\n *\n * selecto.on(\"keydown\", () => {\n * document.querySelector(\".button\").classList.add(\"selected\");\n * }).on(\"keyup\", () => {\n * document.querySelector(\".button\").classList.remove(\"selected\");\n * }).on(\"select\", e => {\n * e.added.forEach(el => {\n * el.classList.add(\"selected\");\n * });\n * e.removed.forEach(el => {\n * el.classList.remove(\"selected\");\n * });\n * });\n */\n this.trigger(\"keyup\", {});\n }\n private onBlur = () => {\n if (this.toggleContinueSelect && this.continueSelect) {\n this.trigger(\"keyup\", {});\n }\n }\n private onDocumentSelectStart = (e: any) => {\n if (!this.dragger.isFlag()) {\n return;\n }\n let dragContainer = this.dragContainer;\n\n if (dragContainer === window) {\n dragContainer = document.documentElement;\n }\n const containers = dragContainer instanceof Element\n ? [dragContainer] : [].slice.call(dragContainer) as Element[];\n const target = e.target;\n\n containers.some(container => {\n if (container === target || container.contains(target)) {\n e.preventDefault();\n return true;\n }\n });\n }\n}\n\ninterface Selecto extends Component, SelectoProperties {\n on(eventName: T, handlerToAttach: (event: SelectoEvents[T]) => any): this;\n on(eventName: string, handlerToAttach: (event: { [key: string]: any }) => any): this;\n on(events: { [key: string]: (event: { [key: string]: any }) => any }): this;\n}\n\nexport default Selecto;\n","import Selecto, * as modules from \"./index\";\n\nfor (const name in modules) {\n (Selecto as any)[name] = modules[name];\n}\n\nexport default Selecto;\n"],"names":["createElement","jsx","prevTarget","container","tag","children","attributes","className","style","el","document","name","setAttribute","elChildren","forEach","child","i","split","elStyle","appendChild","h","attrs","_i","_a","_b","_c","diffValue","prev","cur","func","getRect","e","ratio","distX","distY","startX","startY","nextHeight","Math","sqrt","tx","min","ty","width","abs","height","left","top","right","bottom","injector","CLASS_NAME","PROPERTIES","OPTIONS","__spreadArrays","OPTION_TYPES","target","dragContainer","selectableTargets","Array","selectByClick","Boolean","selectFromInside","continueSelect","toggleContinueSelect","keyContainer","hitRate","Number","scrollOptions","Object","checkInput","preventDefault","cspNonce","String","options","_super","_this","ChildrenDiffer","DragScroll","clickedTarget","datas","clientX","clientY","inputEvent","getSelectableTargets","selectableRects","map","rect","getBoundingClientRect","startSelectedTargets","selectedTargets","hitRect","firstPassedTargets","pointTarget","elementFromPoint","indexOf","parentElement","hasInsideTargets","length","isPreventSelect","type","trigger","passSelectedTargets","select","cssText","onDragEnd","dragScroll","dragStart","drag","check","dragEnd","selectEnd","sameCombiKey","dragger","isFlag","window","documentElement","containers","Element","slice","call","some","contains","undefined","initElement","initDragScroll","setKeyController","differ","this","setKeyEvent","value","triggerDragStart","off","keycon","destroy","unset","injectResult","removeEvent","onDocumentSelectStart","touch","touches","changedTouches","dragEvent","onDragStart","KeyController","keydown","onKeyDown","keyup","onKeyUp","on","onBlur","querySelectorAll","parentNode","Dragger","dragstart","onDrag","dragend","addEvent","inject","nonce","selectRect","targets","rects","filter","rectLeft","rectTop","rectRight","rectBottom","isStart","rectSize","testLeft","max","testRight","testTop","testBottom","rate","round","direction","offsetX","offsetY","scrollBy","push","passedTargets","list","prevList","added","removed","index","concat","selected","isDouble","afterAdded","afterRemoved","afterPrevList","afterList","isDragStart","hitTest","combi","getCombi","key","keys","every","Selecto","prototype","property","enumerable","configurable","get","setter","set","defineProperty","Component","modules"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6d77a5d..75c3a4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "selecto", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 7847dd6..6e82ee6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "selecto", - "version": "1.6.0", + "version": "1.6.1", "description": "Selecto.js is a component that allows you to select elements in the drag area using the mouse or touch.", "main": "./dist/selecto.cjs.js", "module": "./dist/selecto.esm.js", diff --git a/packages/lit-selecto/package-lock.json b/packages/lit-selecto/package-lock.json index 7324c6d..50c28a9 100755 --- a/packages/lit-selecto/package-lock.json +++ b/packages/lit-selecto/package-lock.json @@ -1,6 +1,6 @@ { "name": "lit-selecto", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -676,9 +676,9 @@ } }, "selecto": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.0.tgz", - "integrity": "sha512-Bc+JBpIFfCg3uT8YDnrNvtELZouzuoW8VXmsbXkwpU/QFD01NEC5BNzDBcgdMkq9xfM4nPJ4eocyHU5cmwmQVw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.1.tgz", + "integrity": "sha512-pbuLQnk2Pghj+hoAgCxEe5f1T+N3SqcO/WXz9OAEcUWGXToPdyzA/w8QY3/pN07Y7kD60pkhHwT5uZxg+cvcRQ==", "requires": { "@daybrush/drag": "^0.19.3", "@daybrush/utils": "^1.0.0", diff --git a/packages/lit-selecto/package.json b/packages/lit-selecto/package.json index 1d2c9a2..0a3eaa7 100755 --- a/packages/lit-selecto/package.json +++ b/packages/lit-selecto/package.json @@ -1,6 +1,6 @@ { "name": "lit-selecto", - "version": "1.6.0", + "version": "1.6.1", "types": "declaration/index.d.ts", "main": "dist/selecto.cjs.js", "module": "dist/selecto.esm.js", @@ -35,6 +35,6 @@ "typescript": "3.6.4" }, "dependencies": { - "selecto": "^1.6.0" + "selecto": "^1.6.1" } } diff --git a/packages/ngx-selecto/projects/ngx-selecto/package-lock.json b/packages/ngx-selecto/projects/ngx-selecto/package-lock.json index 6991189..1919546 100644 --- a/packages/ngx-selecto/projects/ngx-selecto/package-lock.json +++ b/packages/ngx-selecto/projects/ngx-selecto/package-lock.json @@ -1,6 +1,6 @@ { "name": "ngx-selecto", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -73,9 +73,9 @@ } }, "selecto": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.0.tgz", - "integrity": "sha512-Bc+JBpIFfCg3uT8YDnrNvtELZouzuoW8VXmsbXkwpU/QFD01NEC5BNzDBcgdMkq9xfM4nPJ4eocyHU5cmwmQVw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.1.tgz", + "integrity": "sha512-pbuLQnk2Pghj+hoAgCxEe5f1T+N3SqcO/WXz9OAEcUWGXToPdyzA/w8QY3/pN07Y7kD60pkhHwT5uZxg+cvcRQ==", "requires": { "@daybrush/drag": "^0.19.3", "@daybrush/utils": "^1.0.0", diff --git a/packages/ngx-selecto/projects/ngx-selecto/package.json b/packages/ngx-selecto/projects/ngx-selecto/package.json index fb1ccae..a8002d1 100644 --- a/packages/ngx-selecto/projects/ngx-selecto/package.json +++ b/packages/ngx-selecto/projects/ngx-selecto/package.json @@ -1,6 +1,6 @@ { "name": "ngx-selecto", - "version": "1.6.0", + "version": "1.6.1", "description": "An Angular Selecto Component that allows you to select elements in the drag area using the mouse or touch.", "keywords": [ "select", @@ -25,6 +25,6 @@ "@angular/core": "^8.2.14" }, "dependencies": { - "selecto": "^1.6.0" + "selecto": "^1.6.1" } } diff --git a/packages/preact-selecto/package-lock.json b/packages/preact-selecto/package-lock.json index 5176cf0..13d2bf6 100644 --- a/packages/preact-selecto/package-lock.json +++ b/packages/preact-selecto/package-lock.json @@ -1,6 +1,6 @@ { "name": "preact-selecto", - "version": "1.5.0", + "version": "1.5.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -716,11 +716,11 @@ "dev": true }, "react-selecto": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/react-selecto/-/react-selecto-1.6.0.tgz", - "integrity": "sha512-PVjW+0Zdq4Bxn6CgZGb5Kpuhur/wd/m3xl4SVFsv9VPscbGODjdM5sG0aAZ64DzPTNXK2QmGiozGN2JJET2wZA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/react-selecto/-/react-selecto-1.6.1.tgz", + "integrity": "sha512-axbEZUxlV51quPX4R9xq49/pC/JgwHe+n+7Vsj2GST/IOmRLSBG5LDWMCrFpmIZ3QUJxmyEiEgy/jA39ZdcTDA==", "requires": { - "selecto": "^1.6.0" + "selecto": "^1.6.1" } }, "resolve": { @@ -874,9 +874,9 @@ } }, "selecto": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.0.tgz", - "integrity": "sha512-Bc+JBpIFfCg3uT8YDnrNvtELZouzuoW8VXmsbXkwpU/QFD01NEC5BNzDBcgdMkq9xfM4nPJ4eocyHU5cmwmQVw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.1.tgz", + "integrity": "sha512-pbuLQnk2Pghj+hoAgCxEe5f1T+N3SqcO/WXz9OAEcUWGXToPdyzA/w8QY3/pN07Y7kD60pkhHwT5uZxg+cvcRQ==", "requires": { "@daybrush/drag": "^0.19.3", "@daybrush/utils": "^1.0.0", diff --git a/packages/preact-selecto/package.json b/packages/preact-selecto/package.json index 43de3da..bfd84b3 100644 --- a/packages/preact-selecto/package.json +++ b/packages/preact-selecto/package.json @@ -1,6 +1,6 @@ { "name": "preact-selecto", - "version": "1.5.0", + "version": "1.5.1", "description": "A Preact Selecto Component that allows you to select elements in the drag area using the mouse or touch.", "main": "./dist/selecto.cjs.js", "module": "./dist/selecto.esm.js", @@ -41,6 +41,6 @@ "typescript": "^3.4.5" }, "dependencies": { - "react-selecto": "^1.6.0" + "react-selecto": "^1.6.1" } } diff --git a/packages/react-selecto/package-lock.json b/packages/react-selecto/package-lock.json index c31d9f7..27a5c6f 100644 --- a/packages/react-selecto/package-lock.json +++ b/packages/react-selecto/package-lock.json @@ -1,6 +1,6 @@ { "name": "react-selecto", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -13314,9 +13314,9 @@ "dev": true }, "selecto": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.0.tgz", - "integrity": "sha512-Bc+JBpIFfCg3uT8YDnrNvtELZouzuoW8VXmsbXkwpU/QFD01NEC5BNzDBcgdMkq9xfM4nPJ4eocyHU5cmwmQVw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.1.tgz", + "integrity": "sha512-pbuLQnk2Pghj+hoAgCxEe5f1T+N3SqcO/WXz9OAEcUWGXToPdyzA/w8QY3/pN07Y7kD60pkhHwT5uZxg+cvcRQ==", "requires": { "@daybrush/drag": "^0.19.3", "@daybrush/utils": "^1.0.0", diff --git a/packages/react-selecto/package.json b/packages/react-selecto/package.json index 19e5e8c..819db10 100644 --- a/packages/react-selecto/package.json +++ b/packages/react-selecto/package.json @@ -1,6 +1,6 @@ { "name": "react-selecto", - "version": "1.6.0", + "version": "1.6.1", "description": "A React Selecto Component that allows you to select elements in the drag area using the mouse or touch.", "main": "./dist/selecto.cjs.js", "module": "./dist/selecto.esm.js", @@ -43,7 +43,7 @@ "typescript": "^3.4.5" }, "dependencies": { - "selecto": "^1.6.0" + "selecto": "^1.6.1" }, "browserslist": { "production": [ diff --git a/packages/svelte-selecto/package-lock.json b/packages/svelte-selecto/package-lock.json index 887093e..c58ccb4 100644 --- a/packages/svelte-selecto/package-lock.json +++ b/packages/svelte-selecto/package-lock.json @@ -1,6 +1,6 @@ { "name": "svelte-selecto", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2230,9 +2230,9 @@ } }, "selecto": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.0.tgz", - "integrity": "sha512-Bc+JBpIFfCg3uT8YDnrNvtELZouzuoW8VXmsbXkwpU/QFD01NEC5BNzDBcgdMkq9xfM4nPJ4eocyHU5cmwmQVw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.1.tgz", + "integrity": "sha512-pbuLQnk2Pghj+hoAgCxEe5f1T+N3SqcO/WXz9OAEcUWGXToPdyzA/w8QY3/pN07Y7kD60pkhHwT5uZxg+cvcRQ==", "requires": { "@daybrush/drag": "^0.19.3", "@daybrush/utils": "^1.0.0", diff --git a/packages/svelte-selecto/package.json b/packages/svelte-selecto/package.json index 3805bb3..1446b60 100644 --- a/packages/svelte-selecto/package.json +++ b/packages/svelte-selecto/package.json @@ -1,6 +1,6 @@ { "name": "svelte-selecto", - "version": "1.6.0", + "version": "1.6.1", "description": "A Svelte Selecto Component that allows you to select elements in the drag area using the mouse or touch.", "main": "./dist/selecto.cjs.js", "module": "./dist/selecto.esm.js", @@ -44,6 +44,6 @@ "typescript": "^3.7.4" }, "dependencies": { - "selecto": "^1.6.0" + "selecto": "^1.6.1" } } diff --git a/packages/vue-selecto/package-lock.json b/packages/vue-selecto/package-lock.json index e4dd640..71ac7af 100644 --- a/packages/vue-selecto/package-lock.json +++ b/packages/vue-selecto/package-lock.json @@ -1,6 +1,6 @@ { "name": "vue-selecto", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -7804,9 +7804,9 @@ "dev": true }, "selecto": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.0.tgz", - "integrity": "sha512-Bc+JBpIFfCg3uT8YDnrNvtELZouzuoW8VXmsbXkwpU/QFD01NEC5BNzDBcgdMkq9xfM4nPJ4eocyHU5cmwmQVw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.1.tgz", + "integrity": "sha512-pbuLQnk2Pghj+hoAgCxEe5f1T+N3SqcO/WXz9OAEcUWGXToPdyzA/w8QY3/pN07Y7kD60pkhHwT5uZxg+cvcRQ==", "requires": { "@daybrush/drag": "^0.19.3", "@daybrush/utils": "^1.0.0", diff --git a/packages/vue-selecto/package.json b/packages/vue-selecto/package.json index 99dd1cd..2be07e1 100755 --- a/packages/vue-selecto/package.json +++ b/packages/vue-selecto/package.json @@ -1,6 +1,6 @@ { "name": "vue-selecto", - "version": "1.6.0", + "version": "1.6.1", "types": "declaration/index.d.ts", "main": "dist/selecto.cjs.js", "module": "dist/selecto.esm.js", @@ -30,7 +30,7 @@ }, "homepage": "https://daybrush.com/selecto", "dependencies": { - "selecto": "^1.6.0", + "selecto": "^1.6.1", "vue-property-decorator": "^8.1.0" }, "devDependencies": { diff --git a/storybook/package-lock.json b/storybook/package-lock.json index e467c99..fce746b 100644 --- a/storybook/package-lock.json +++ b/storybook/package-lock.json @@ -7556,14 +7556,14 @@ "dev": true }, "infinite-viewer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/infinite-viewer/-/infinite-viewer-0.6.0.tgz", - "integrity": "sha512-8ke9RlF36CfHI6Gx+nPhqUdkhsUCVungmtYR6t/H6Q0mCUhIKvNKS4PIdAqRUDt3e6WPOYPfKG/KOPmBgWYKjw==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/infinite-viewer/-/infinite-viewer-0.6.1.tgz", + "integrity": "sha512-89Q6i7dw6ld7DyJ1Ii/mlqvahMgija+XnNicMI4f5x59JjpaAkkzWDx0RvQcs31dEgolApzRIzCQnSkoxm74fw==", "requires": { - "@daybrush/drag": "^0.19.1", - "@daybrush/utils": "^0.10.5", + "@daybrush/drag": "^0.19.3", + "@daybrush/utils": "^1.0.0", "@egjs/component": "^2.1.2", - "css-styled": "^0.2.1", + "css-styled": "^0.2.3", "framework-utils": "^0.3.4" }, "dependencies": { @@ -7573,19 +7573,12 @@ "integrity": "sha512-gW5bffP4JWBWXOnkDQ3rKm0Bw0wEapIOHi/8DJDMUVi3jpS/haMFppQ50CcpABgBtMmIPrnHCCx2zn4ue8HS9Q==", "requires": { "@daybrush/utils": "^1.0.0" - }, - "dependencies": { - "@daybrush/utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@daybrush/utils/-/utils-1.0.0.tgz", - "integrity": "sha512-XaDvJk0qIZVv6FfZOhuO5uchZKDyzFiSqcpNDZgvemOOp3Q5jKKceanDiGwtZlBTRSYmbAs5T+PVfkDpmB25gg==" - } } }, "@daybrush/utils": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@daybrush/utils/-/utils-0.10.5.tgz", - "integrity": "sha512-VCPbgJgImkUmGHX33drZJh/5FYBhfSM+EFqlBY7fzKIahBGEemjYfninVSp9BdzqF9P2MyCh7R3hgxmySXLEzg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@daybrush/utils/-/utils-1.0.0.tgz", + "integrity": "sha512-XaDvJk0qIZVv6FfZOhuO5uchZKDyzFiSqcpNDZgvemOOp3Q5jKKceanDiGwtZlBTRSYmbAs5T+PVfkDpmB25gg==" }, "css-styled": { "version": "0.2.3", @@ -7594,13 +7587,6 @@ "requires": { "@daybrush/utils": "^1.0.0", "string-hash": "^1.1.3" - }, - "dependencies": { - "@daybrush/utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@daybrush/utils/-/utils-1.0.0.tgz", - "integrity": "sha512-XaDvJk0qIZVv6FfZOhuO5uchZKDyzFiSqcpNDZgvemOOp3Q5jKKceanDiGwtZlBTRSYmbAs5T+PVfkDpmB25gg==" - } } } } @@ -10760,11 +10746,11 @@ } }, "react-infinite-viewer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-infinite-viewer/-/react-infinite-viewer-0.6.0.tgz", - "integrity": "sha512-SuFpUQuoY338hCplMX9J6Q9cdC0X4BMadT2z2jOxChgXt+fXOh/CKu73SwyZLUvFDdfomNs0N+eN4+8DB0CMug==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/react-infinite-viewer/-/react-infinite-viewer-0.6.1.tgz", + "integrity": "sha512-XcAgE/mA+mywir/8dOChuJeJdGmg/FHe7Gmfz/bCW5aUCxd/X7a7IH5yZkuEpxrwPB0e4yNQTHDLNzHdwJ4nMw==", "requires": { - "infinite-viewer": "^0.6.0" + "infinite-viewer": "^0.6.1" } }, "react-input-autosize": { @@ -10850,11 +10836,11 @@ } }, "react-selecto": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/react-selecto/-/react-selecto-1.6.0.tgz", - "integrity": "sha512-PVjW+0Zdq4Bxn6CgZGb5Kpuhur/wd/m3xl4SVFsv9VPscbGODjdM5sG0aAZ64DzPTNXK2QmGiozGN2JJET2wZA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/react-selecto/-/react-selecto-1.6.1.tgz", + "integrity": "sha512-axbEZUxlV51quPX4R9xq49/pC/JgwHe+n+7Vsj2GST/IOmRLSBG5LDWMCrFpmIZ3QUJxmyEiEgy/jA39ZdcTDA==", "requires": { - "selecto": "^1.6.0" + "selecto": "^1.6.1" } }, "react-sizeme": { @@ -11423,9 +11409,9 @@ "optional": true }, "selecto": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.0.tgz", - "integrity": "sha512-Bc+JBpIFfCg3uT8YDnrNvtELZouzuoW8VXmsbXkwpU/QFD01NEC5BNzDBcgdMkq9xfM4nPJ4eocyHU5cmwmQVw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/selecto/-/selecto-1.6.1.tgz", + "integrity": "sha512-pbuLQnk2Pghj+hoAgCxEe5f1T+N3SqcO/WXz9OAEcUWGXToPdyzA/w8QY3/pN07Y7kD60pkhHwT5uZxg+cvcRQ==", "requires": { "@daybrush/drag": "^0.19.3", "@daybrush/utils": "^1.0.0", diff --git a/storybook/package.json b/storybook/package.json index 654cc87..ff0c74b 100644 --- a/storybook/package.json +++ b/storybook/package.json @@ -13,9 +13,9 @@ "license": "MIT", "dependencies": { "raw-loader": "^4.0.0", - "react-infinite-viewer": "^0.6.0", + "react-infinite-viewer": "^0.6.1", "react-moveable": "^0.20.6", - "react-selecto": "^1.6.0", + "react-selecto": "^1.6.1", "storybook-addon-preview": "^1.2.0" }, "devDependencies": { diff --git a/test/index.html b/test/index.html index df52aca..7be86b7 100644 --- a/test/index.html +++ b/test/index.html @@ -52,11 +52,11 @@ container: document.body, hitRate: 40, selectableTargets: [".target"], - // selectFromInside: false, - checkInput: true, + selectFromInside: false, selectByClick: true, + checkInput: true, toggleContinueSelect: "shift", - ratio: 0.7, + // ratio: 0.7, }).on("dragStart", e => { console.log("ds", e.inputEvent.target); }).on("selectStart", e => {