-
Notifications
You must be signed in to change notification settings - Fork 17
/
toolbar.min.js.map
1 lines (1 loc) · 84.7 KB
/
toolbar.min.js.map
1
{"version":3,"file":"toolbar.min.js","sources":["utils/types/isString.js","utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/types/isArray.js","utils/lang/later.js","utils/lang/guid.js","utils/lang/cloneDeep.js","utils/types/isElement.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/lang/hasOwn.js","utils/dom/setAttributes.js","utils/dom/setAttribute.js","utils/dom/createElement.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/dom/removeClass.js","utils/lang/trim.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/icons/defaults.js","utils/icons/symbols.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/lang/extend.js","utils/observer/on.js","command.js","commands.js","utils/types/isSVG.js","utils/icons/createElement.js","_createButton.js","utils/icons/icon.js","toolbar.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","const DEFAULTS = [\r\n '<symbol id=\"outline-icon-up\" viewBox=\"0 0 1024 1024\"><path d=\"M494.784 261.696c0.832-0.448 1.536-1.216 2.368-1.536a38.72 38.72 0 0 1 46.08 8.256l277.824 302.272a41.92 41.92 0 0 1-1.536 58.048 39.104 39.104 0 0 1-56.448-1.6L513.728 355.904 260.736 626.048a39.104 39.104 0 0 1-56.448 1.088 41.6 41.6 0 0 1-1.088-57.984L483.84 269.696c0.512-0.512 1.344-0.768 1.92-1.408l1.088-1.344c2.368-2.496 5.312-3.648 8-5.248z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-down\" viewBox=\"0 0 1024 1024\"><path d=\"M494.784 762.304c0.832 0.448 1.536 1.216 2.368 1.536 15.232 7.488 33.92 4.992 46.08-8.256l277.824-302.272a41.92 41.92 0 0 0-1.536-58.048 39.104 39.104 0 0 0-56.448 1.6l-249.344 271.232-252.992-270.144a39.104 39.104 0 0 0-56.448-1.088 41.6 41.6 0 0 0-1.088 57.984l280.576 299.456c0.512 0.512 1.344 0.768 1.92 1.408l1.088 1.344c2.368 2.496 5.312 3.648 8 5.248z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-menu\" viewBox=\"0 0 1024 1024\"><path d=\"M320 256h640V128H320zM320 576h640V448H320zM320 896h640v-128H320zM64 256h128V128H64zM64 576h128V448H64zM64 896h128v-128H64z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-file\" viewBox=\"0 0 1024 1024\"><path d=\"M320 640h256v128H320z\"></path><path d=\"M320 448h384v128H320z\"></path><path d=\"M640 0l320 320v557.696C960 958.528 909.824 1024 848 1024H176C114.176 1024 64 958.528 64 877.696V146.304C64 65.472 114.176 0 176 0H640z m0 128H192v768h640V320h-192V128z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-hash\" viewBox=\"0 0 24 24\"><path d=\"M14.216 10l-0.444 4h-3.988l0.444-4zM15.006 2.89l-0.568 5.11h-3.988l0.543-4.89c0.061-0.549-0.335-1.043-0.883-1.104s-1.043 0.335-1.104 0.884l-0.568 5.11h-4.438c-0.552 0-1 0.448-1 1s0.448 1 1 1h4.216l-0.444 4h-3.772c-0.552 0-1 0.448-1 1s0.448 1 1 1h3.549l-0.543 4.89c-0.061 0.549 0.335 1.043 0.883 1.104s1.043-0.335 1.104-0.883l0.569-5.111h3.988l-0.543 4.89c-0.061 0.549 0.335 1.043 0.883 1.104s1.043-0.335 1.104-0.883l0.568-5.111h4.438c0.552 0 1-0.448 1-1s-0.448-1-1-1h-4.216l0.444-4h3.772c0.552 0 1-0.448 1-1s-0.448-1-1-1h-3.549l0.543-4.89c0.061-0.549-0.335-1.043-0.883-1.104s-1.043 0.335-1.104 0.883z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-close\" viewBox=\"0 0 1024 1024\"><path d=\"M536.96 491.648L310.592 265.344a32 32 0 1 0-45.248 45.248L491.584 536.96l-226.304 226.304a32 32 0 0 0 45.312 45.248l226.24-226.304 226.304 226.304a32 32 0 0 0 45.248-45.248L582.144 536.896l226.304-226.24a32 32 0 0 0-45.248-45.248L536.896 491.584z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-homepage\" viewBox=\"0 0 26 28\"><path d=\"M22 15.5v7.5c0 0.547-0.453 1-1 1h-6v-6h-4v6h-6c-0.547 0-1-0.453-1-1v-7.5c0-0.031 0.016-0.063 0.016-0.094l8.984-7.406 8.984 7.406c0.016 0.031 0.016 0.063 0.016 0.094zM25.484 14.422l-0.969 1.156c-0.078 0.094-0.203 0.156-0.328 0.172h-0.047c-0.125 0-0.234-0.031-0.328-0.109l-10.813-9.016-10.813 9.016c-0.109 0.078-0.234 0.125-0.375 0.109-0.125-0.016-0.25-0.078-0.328-0.172l-0.969-1.156c-0.172-0.203-0.141-0.531 0.063-0.703l11.234-9.359c0.656-0.547 1.719-0.547 2.375 0l3.813 3.187v-3.047c0-0.281 0.219-0.5 0.5-0.5h3c0.281 0 0.5 0.219 0.5 0.5v6.375l3.422 2.844c0.203 0.172 0.234 0.5 0.063 0.703z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-github\" viewBox=\"0 0 24 28\"><path d=\"M12 2c6.625 0 12 5.375 12 12 0 5.297-3.437 9.797-8.203 11.391-0.609 0.109-0.828-0.266-0.828-0.578 0-0.391 0.016-1.687 0.016-3.297 0-1.125-0.375-1.844-0.812-2.219 2.672-0.297 5.484-1.313 5.484-5.922 0-1.313-0.469-2.375-1.234-3.219 0.125-0.313 0.531-1.531-0.125-3.187-1-0.313-3.297 1.234-3.297 1.234-0.953-0.266-1.984-0.406-3-0.406s-2.047 0.141-3 0.406c0 0-2.297-1.547-3.297-1.234-0.656 1.656-0.25 2.875-0.125 3.187-0.766 0.844-1.234 1.906-1.234 3.219 0 4.594 2.797 5.625 5.469 5.922-0.344 0.313-0.656 0.844-0.766 1.609-0.688 0.313-2.438 0.844-3.484-1-0.656-1.141-1.844-1.234-1.844-1.234-1.172-0.016-0.078 0.734-0.078 0.734 0.781 0.359 1.328 1.75 1.328 1.75 0.703 2.141 4.047 1.422 4.047 1.422 0 1 0.016 1.937 0.016 2.234 0 0.313-0.219 0.688-0.828 0.578-4.766-1.594-8.203-6.094-8.203-11.391 0-6.625 5.375-12 12-12zM4.547 19.234c0.031-0.063-0.016-0.141-0.109-0.187-0.094-0.031-0.172-0.016-0.203 0.031-0.031 0.063 0.016 0.141 0.109 0.187 0.078 0.047 0.172 0.031 0.203-0.031zM5.031 19.766c0.063-0.047 0.047-0.156-0.031-0.25-0.078-0.078-0.187-0.109-0.25-0.047-0.063 0.047-0.047 0.156 0.031 0.25 0.078 0.078 0.187 0.109 0.25 0.047zM5.5 20.469c0.078-0.063 0.078-0.187 0-0.297-0.063-0.109-0.187-0.156-0.266-0.094-0.078 0.047-0.078 0.172 0 0.281s0.203 0.156 0.266 0.109zM6.156 21.125c0.063-0.063 0.031-0.203-0.063-0.297-0.109-0.109-0.25-0.125-0.313-0.047-0.078 0.063-0.047 0.203 0.063 0.297 0.109 0.109 0.25 0.125 0.313 0.047zM7.047 21.516c0.031-0.094-0.063-0.203-0.203-0.25-0.125-0.031-0.266 0.016-0.297 0.109s0.063 0.203 0.203 0.234c0.125 0.047 0.266 0 0.297-0.094zM8.031 21.594c0-0.109-0.125-0.187-0.266-0.172-0.141 0-0.25 0.078-0.25 0.172 0 0.109 0.109 0.187 0.266 0.172 0.141 0 0.25-0.078 0.25-0.172zM8.937 21.438c-0.016-0.094-0.141-0.156-0.281-0.141-0.141 0.031-0.234 0.125-0.219 0.234 0.016 0.094 0.141 0.156 0.281 0.125s0.234-0.125 0.219-0.219z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-issues\" viewBox=\"0 0 24 28\"><path d=\"M25.5 15c0 0.547-0.453 1-1 1h-3.5c0 1.953-0.422 3.422-1.047 4.531l3.25 3.266c0.391 0.391 0.391 1.016 0 1.406-0.187 0.203-0.453 0.297-0.703 0.297s-0.516-0.094-0.703-0.297l-3.094-3.078s-2.047 1.875-4.703 1.875v-14h-2v14c-2.828 0-4.891-2.063-4.891-2.063l-2.859 3.234c-0.203 0.219-0.469 0.328-0.75 0.328-0.234 0-0.469-0.078-0.672-0.25-0.406-0.375-0.438-1-0.078-1.422l3.156-3.547c-0.547-1.078-0.906-2.469-0.906-4.281h-3.5c-0.547 0-1-0.453-1-1s0.453-1 1-1h3.5v-4.594l-2.703-2.703c-0.391-0.391-0.391-1.016 0-1.406s1.016-0.391 1.406 0l2.703 2.703h13.188l2.703-2.703c0.391-0.391 1.016-0.391 1.406 0s0.391 1.016 0 1.406l-2.703 2.703v4.594h3.5c0.547 0 1 0.453 1 1zM18 6h-10c0-2.766 2.234-5 5-5s5 2.234 5 5z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-tags\" viewBox=\"0 0 26 28\"><path d=\"M7 7c0-1.109-0.891-2-2-2s-2 0.891-2 2 0.891 2 2 2 2-0.891 2-2zM23.672 16c0 0.531-0.219 1.047-0.578 1.406l-7.672 7.688c-0.375 0.359-0.891 0.578-1.422 0.578s-1.047-0.219-1.406-0.578l-11.172-11.188c-0.797-0.781-1.422-2.297-1.422-3.406v-6.5c0-1.094 0.906-2 2-2h6.5c1.109 0 2.625 0.625 3.422 1.422l11.172 11.156c0.359 0.375 0.578 0.891 0.578 1.422zM29.672 16c0 0.531-0.219 1.047-0.578 1.406l-7.672 7.688c-0.375 0.359-0.891 0.578-1.422 0.578-0.812 0-1.219-0.375-1.75-0.922l7.344-7.344c0.359-0.359 0.578-0.875 0.578-1.406s-0.219-1.047-0.578-1.422l-11.172-11.156c-0.797-0.797-2.312-1.422-3.422-1.422h3.5c1.109 0 2.625 0.625 3.422 1.422l11.172 11.156c0.359 0.375 0.578 0.891 0.578 1.422z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-print\" viewBox=\"0 0 24 24\"><path d=\"M18 3v3.984h-12v-3.984h12zM18.984 12q0.422 0 0.727-0.281t0.305-0.703-0.305-0.727-0.727-0.305-0.703 0.305-0.281 0.727 0.281 0.703 0.703 0.281zM15.984 18.984v-4.969h-7.969v4.969h7.969zM18.984 8.016q1.219 0 2.109 0.891t0.891 2.109v6h-3.984v3.984h-12v-3.984h-3.984v-6q0-1.219 0.891-2.109t2.109-0.891h13.969z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-info\" viewBox=\"0 0 1024 1024\"><path d=\"M512 384.295982a95.994 95.994 0 0 1 95.994 95.994V928.006a95.994 95.994 0 0 1-191.988 0V480.289982a95.994 95.994 0 0 1 95.994-95.994z m0-128.375977A127.992 127.992 0 1 1 512 0.063996a127.992 127.992 0 0 1 0 255.984001z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-warning\" viewBox=\"0 0 1024 1024\"><path d=\"M512 639.704018a95.994 95.994 0 0 1-95.994-95.994V95.994a95.994 95.994 0 0 1 191.988 0v447.716018a95.994 95.994 0 0 1-95.994 95.994z m0 128.375977A127.992 127.992 0 1 1 512 1023.936004a127.992 127.992 0 0 1 0-255.984001z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-error\" viewBox=\"0 0 1024 1024\"><path d=\"M512.64 376.96L263.744 128 128 263.744l248.96 248.96L128 761.472l135.744 135.808 248.96-248.96 248.832 248.96 135.808-135.808-248.96-248.896 248.96-248.896L761.536 128 512.64 376.96z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-success\" viewBox=\"0 0 1024 1024\"><path d=\"M426.368 580.864l-226.56-226.56L64 489.984l362.048 362.112 0.32-0.32 0.32 0.32 588.288-588.352L879.36 128 426.304 580.864z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-circle-info\" viewBox=\"0 0 1024 1024\"><path d=\"M512 810.666667s-42.666667 4.266667-42.666667-42.666667v-341.333333c0-46.933333 42.666667-42.666667 42.666667-42.666667s42.666667-4.266667 42.666667 42.666667v341.333333c0 46.933333-42.666667 42.666667-42.666667 42.666667z m0 213.333333C228.949333 1024 0 795.050667 0 512S228.949333 0 512 0s512 228.949333 512 512-229.674667 512-512 512z m0-938.666667C276.608 85.333333 85.333333 276.608 85.333333 512s191.274667 426.666667 426.666667 426.666667 426.666667-191.274667 426.666667-426.666667S747.392 85.333333 512 85.333333z m0 213.333334c-23.466667 0-42.666667-19.2-42.666667-42.666667s19.2-42.666667 42.666667-42.666667 42.666667 19.2 42.666667 42.666667-19.2 42.666667-42.666667 42.666667z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-circle-warning\" viewBox=\"0 0 1024 1024\"><path d=\"M512 213.333333s-42.666667-4.266667-42.666667 42.666667v341.333333c0 46.933333 42.666667 42.666667 42.666667 42.666667s42.666667 4.266667 42.666667-42.666667V256c0-46.933333-42.666667-42.666667-42.666667-42.666667z m0-213.333333C228.949333 0 0 228.949333 0 512s228.949333 512 512 512 512-228.949333 512-512S794.325333 0 512 0z m0 938.666667C276.608 938.666667 85.333333 747.392 85.333333 512S276.608 85.333333 512 85.333333s426.666667 191.274667 426.666667 426.666667-191.274667 426.666667-426.666667 426.666667z m0-213.333334c-23.466667 0-42.666667 19.2-42.666667 42.666667s19.2 42.666667 42.666667 42.666667 42.666667-19.2 42.666667-42.666667-19.2-42.666667-42.666667-42.666667z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-circle-error\" viewBox=\"0 0 1024 1024\"><path d=\"M512 0a512 512 0 1 0 512 512 512 512 0 0 0-512-512z m0 955.776A443.84 443.84 0 0 1 512 68.224a443.904 443.904 0 0 1 0 887.552z\"></path><path d=\"M641.664 326.144a32 32 0 0 1 50.304 39.168l-3.52 4.48-306.112 328.064a32 32 0 0 1-50.304-39.168l3.52-4.48 306.112-328.064z\"></path><path d=\"M324.608 337.088a32 32 0 0 1 40.704-5.12l4.48 3.584 328.064 306.112a32 32 0 0 1-39.168 50.304l-4.48-3.52-328.064-306.112a32 32 0 0 1-1.536-45.248z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-circle-success\" viewBox=\"0 0 1024 1024\"><path d=\"M512 0C228.949333 0 0 228.949333 0 512s228.949333 512 512 512 512-228.949333 512-512S794.325333 0 512 0z m0 950.869333C269.909333 950.869333 73.130667 754.090667 73.130667 512 73.130667 269.909333 269.909333 73.130667 512 73.130667c242.090667 0 438.869333 196.778667 438.869333 438.869333 0 242.090667-196.778667 438.869333-438.869333 438.869333z\"></path><path d=\"M737.834667 353.834667a42.666667 42.666667 0 0 1 63.872 56.32l-3.541334 4.010666L486.997333 725.333333a85.333333 85.333333 0 0 1-115.242666 4.992L366.336 725.333333l-140.501333-140.501333a42.666667 42.666667 0 0 1 56.32-63.872l4.010666 3.541333L426.666667 665.002667l311.168-311.168z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-sound\" viewBox=\"0 0 16 16\"><path d=\"M12.757 4.708c-0.406 0.405-1.062 0.405-1.468 0s-0.405-1.062 0-1.468l2.935-2.935c0.406-0.405 1.062-0.405 1.468 0 0.405 0.405 0.405 1.062 0 1.468l-2.935 2.935zM7.996 15.991l-3.996-3.996h-2.997c-0.552 0-0.999-0.447-0.999-0.999v-5.994c0-0.552 0.447-0.999 0.999-0.999h2.997l3.996-3.996c0 0 0.999-0.125 0.999 0.999 0 5.976 0 14.966 0 13.985 0 1.124-0.999 0.999-0.999 0.999zM6.997 4.004l-1.998 1.998h-2.997v3.996h2.997l1.998 1.998v-7.992zM11.992 8.999c-0.552 0-0.999-0.447-0.999-0.999s0.447-0.999 0.999-0.999h2.997c0.552 0 0.999 0.447 0.999 0.999s-0.447 0.999-0.999 0.999h-2.997zM12.757 11.292l2.935 2.935c0.405 0.406 0.405 1.063 0 1.468s-1.062 0.405-1.468 0l-2.935-2.935c-0.405-0.406-0.405-1.063 0-1.468s1.062-0.405 1.468 0z\"></path></symbol>'\r\n]\r\n\r\nexport default DEFAULTS\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n `<svg id=\"outline-icons\" aria-hidden=\"true\" style=\"position:absolute;display:none;width:0;height:0;overflow:hidden;\">` +\r\n `${symbols.join('')}` +\r\n `</svg>`\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*<![^>]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = '<svg[^>]*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = `<svg><use ${binds}></use></svg>`\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attrs('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isArray","Array","later","fn","delay","setTimeout","guid","uuid","prefix","cloneDeep","obj","clone","from","assign","keys","forEach","key","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","hasOwn","prop","hasOwnProperty","call","setAttributes","attrs","attr","value","setAttribute","toLowerCase","style","cssText","className","innerHTML","innerText","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","length","removeClass","remove","replace","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","getListeners","filter","arguments","off","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","push","addEventListener","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","name","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","insertBefore","firstChild","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Command","action","Commands","commands","get","cmd","command","del","clear","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","_createButton","button","rounded","icon","$anchor","href","link","$button","disabled","DISABLED","HIDDEN","ACTIVE","Toolbar","super","_default","DEFAULTS","closed","buttons","created","isHighlight","isDisabled","isExist","isClosed","_getCommand","_self","bind","mounted","placement","id","_paint","hide","disable","erase","_remove","removeChild","_add","item","_disable","_enable","enable","enabled","show","opened","toggle","highlight","beforeDestroy","afterDestroy","onExecute","getAttribute","afterClosed","afterOpened","afterDisabled","afterEnabled"],"mappings":"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"}