3 Star 54 Fork 14

Yaohaixiao / dom.js

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
dom.min.js.map 231.40 KB
一键复制 编辑 原始数据 按行查看 历史
{"version":3,"file":"dom.min.js","sources":["utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/types/isElement.js","utils/types/isString.js","utils/enum.js","getAttribute.js","setAttribute.js","removeAttribute.js","utils/types/isArray.js","getAttributes.js","utils/lang/hasOwn.js","setAttributes.js","getValue.js","setValue.js","hasClass.js","addClass.js","utils/string/trim.js","removeClass.js","utils/types/isUndefined.js","utils/string/toCamel.js","getStyle.js","utils/types/tags.js","utils/types/isHTML.js","utils/string/stripScripts.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/types/isDOM.js","text.js","createElement.js","html.js","attributes/index.js","removeAttributes.js","replaceClass.js","toggleClass.js","attrs.js","enable.js","disable.js","readonly.js","val.js","build.js","clone.js","matches.js","getHostOrParent.js","byId.js","utils/types/isBoolean.js","getEl.js","isCollection.js","filter.js","isText.js","isWindow.js","getNodeName.js","getWindow.js","isShadowRoot.js","getStyles.js","browser.js","isContainingBlock.js","isNode.js","getDocument.js","getOffsetParent.js","getScrollParent.js","getVisualViewport.js","getPreviousSibling.js","getPreviousSiblings.js","getNextSibling.js","getNextSiblings.js","getSiblings.js","siblings.js","base/index.js","closest.js","byClass.js","find.js","findAll.js","fragment.js","getActiveElement.js","getContainingBlock.js","getImages.js","getTagName.js","index.js","children.js","parent.js","parents.js","_HSLToRGB.js","toHex.js","toRGB.js","color/index.js","getColor.js","randomHexColor.js","toHSL.js","_isAncestor.js","inDocument.js","canPosition.js","contains.js","isLayoutViewport.js","isMatched.js","getBoundingClientRect.js","detect/index.js","isScaled.js","has.js","getDocumentScrollLeft.js","getScrollLeft.js","getDocumentScrollTop.js","getScrollTop.js","getScroll.js","getScrollbarWidth.js","getViewportHeight.js","getViewportWidth.js","rect/index.js","getDocumentRect.js","getViewportRect.js","inBounding.js","inViewport.js","insertAfter.js","insertBefore.js","_insertAdjacentHTML.js","utils/string/encodeHTML.js","insertHTMLAfterEnd.js","insertHTMLBeforeBegin.js","insertHTMLBeforeEnd.js","before.js","setStyle.js","hide.js","replace.js","remove.js","show.js","insertion/index.js","insertHTMLAfterBegin.js","append.js","prepend.js","after.js","unwrap.js","wrap.js","wrapAll.js","wrapInner.js","utils/lang/extend.js","utils/lang/debounce.js","observer/index.js","observeIntersections.js","observeMutations.js","observeResize.js","platform/index.js","isBrowser.js","isDeno.js","isNodeJs.js","isMobile.js","isWebKit.js","os.js","getOffsetLeft.js","getOffsetTop.js","getOffset.js","getPageX.js","getPageY.js","getPageXY.js","getScrollTotalLeft.js","getScrollTotalTop.js","offset.js","utils/lang/easeInQuad.js","position/index.js","getScrollTotal.js","positions.js","scrollTo.js","resources/index.js","injectCSS.js","loadCSS.js","loadScript.js","dnsPrefetch.js","prefetch.js","preload.js","getNextSiblingBy.js","getPreviousSiblingBy.js","sibling/index.js","next.js","prev.js","nextBy.js","prevBy.js","nextAll.js","prevAll.js","utils/types/isNumber.js","pixel.js","_getElementSizes.js","innerHeight.js","innerWidth.js","outerHeight.js","outerWidth.js","size/index.js","getDocumentHeight.js","getDocumentWidth.js","getScreenHeight.js","getScreenWidth.js","height.js","width.js","sizes.js","setStyles.js","getProperty.js","setProperty.js","style/index.js","css.js","prop.js","toggle.js","getURLSearchParams.js","toURLSearchParams.js","others/index.js","copyToClipboard.js","createAndDownloadFile.js","fullscreen.js","getSelectedText.js","getURLProps.js","_getURLPattern.js","getURLSearchParamByName.js","openURL.js","onClickOutside.js","redirect.js","serialize.js","toREM.js","toPixels.js","dom.js","types/index.js","isOverflowElement.js","isTableElement.js"],"sourcesContent":["/**\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 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","/**\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","export const KEYWORDS = {\r\n black: '000',\r\n silver: 'c0c0c0',\r\n gray: '808080',\r\n white: 'fff',\r\n maroon: '800000',\r\n red: 'f00',\r\n purple: '800080',\r\n fuchsia: 'f0f',\r\n green: '008000',\r\n lime: '0f0',\r\n olive: '808000',\r\n yellow: 'ff0',\r\n navy: '000080',\r\n blue: '00f',\r\n teal: '008080',\r\n aqua: '0ff'\r\n}\r\n\r\nexport const COLOR_PROPS = [\r\n 'accent-color',\r\n 'background-color',\r\n 'border-color',\r\n 'border-bottom-color',\r\n 'border-left-color',\r\n 'border-right-color',\r\n 'border-top-color',\r\n 'color',\r\n 'outline-color',\r\n 'text-decoration-color'\r\n]\r\n\r\nexport const FROM_ELEMENT_TAGS = [\r\n 'input',\r\n 'textarea',\r\n 'checkbox',\r\n 'radio',\r\n 'select',\r\n 'datalist',\r\n 'option',\r\n 'output'\r\n]\r\n\r\nexport const DISABLE_TAGS = [\r\n 'button',\r\n 'command',\r\n 'fieldset',\r\n 'optgroup',\r\n 'option',\r\n 'select',\r\n 'textarea',\r\n 'input'\r\n]\r\n\r\nexport const READONLY_INPUT_TYPES = [\r\n 'text',\r\n 'search',\r\n 'url',\r\n 'tel',\r\n 'email',\r\n 'password',\r\n 'date',\r\n 'month',\r\n 'week',\r\n 'time',\r\n 'datetime-local',\r\n 'number'\r\n]\r\n\r\nexport const REG_RGB = /^rgb\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\)$/i\r\nexport const REG_HEX = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i\r\nexport const REG_HEX3 = /([0-9A-F])/gi\r\nexport const REG_HSL = /^hsl\\((\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\)$/i\r\n","import isElement from './isElement'\r\nimport isString from './utils/types/isString'\r\nimport { FROM_ELEMENT_TAGS } from './utils/enum'\r\n\r\n/**\r\n * 获取 DOM 元素的某个 HTML 属性的值\r\n * ========================================================================\r\n * @method getAttribute\r\n * @param {HTMLElement} el\r\n * @param {String} attr\r\n * @return {String|Boolean}\r\n */\r\nconst getAttribute = (el, attr) => {\r\n let tagName\r\n\r\n if (!isElement(el) || !isString(attr)) {\r\n return false\r\n }\r\n\r\n tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'className':\r\n return el.getAttribute('class')\r\n case 'htmlFor':\r\n return el.getAttribute('for')\r\n case 'style':\r\n return el.style.cssText\r\n case 'value':\r\n if (FROM_ELEMENT_TAGS.indexOf(tagName) > -1) {\r\n return el.value\r\n } else {\r\n return el.getAttribute(attr)\r\n }\r\n default:\r\n return el.getAttribute(attr)\r\n }\r\n}\r\n\r\nexport default getAttribute\r\n","import isElement from './isElement'\r\nimport { FROM_ELEMENT_TAGS } from './utils/enum'\r\n\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\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (FROM_ELEMENT_TAGS.indexOf(tagName) > -1) {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = 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 isString from './utils/types/isString'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 移除 DOM 元素的 DOM 属性值\r\n * ========================================================================\r\n * @method removeAttribute\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/removeAttribute\r\n * @param {HTMLElement} el\r\n * @param {String} attr\r\n */\r\nconst removeAttribute = (el, attr) => {\r\n let tagName\r\n\r\n if (!isElement(el) || !isString(attr)) {\r\n return false\r\n }\r\n\r\n tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'className':\r\n el.removeAttribute('class')\r\n break\r\n case 'htmlFor':\r\n el.removeAttribute('for')\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = ''\r\n } else {\r\n el.removeAttribute(attr)\r\n }\r\n break\r\n default:\r\n el.removeAttribute(attr)\r\n break\r\n }\r\n}\r\n\r\nexport default removeAttribute\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 isArray from './utils/types/isArray'\r\nimport isElement from './isElement'\r\nimport getAttribute from './getAttribute'\r\n\r\n/**\r\n * 获取 DOM 元素的单个或多个 HTML 属性值(键/值对象)\r\n * ========================================================================\r\n * @method getAttributes\r\n * @param {HTMLElement} el\r\n * @param {Array} [props]\r\n * @return {Object|Boolean}\r\n */\r\nconst getAttributes = (el, props = []) => {\r\n const attrs = {}\r\n let keys = [...props]\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n if (!isArray(keys) || keys.length < 1) {\r\n keys = el.getAttributeNames()\r\n }\r\n\r\n keys.forEach((key) => {\r\n const value = getAttribute(el, key)\r\n\r\n /* istanbul ignore else */\r\n if (value) {\r\n attrs[key] = value\r\n }\r\n })\r\n\r\n return attrs\r\n}\r\n\r\nexport default getAttributes\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 './utils/types/isObject'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\n/**\r\n * DOM 元素一次设置多个 DOM 属性/\r\n * ========================================================================\r\n * @method setAttributes\r\n * @param {HTMLElement} el\r\n * @param {Object} attrs\r\n * @return {boolean}\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\r\n /* istanbul ignore else */\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","import isElement from './isElement'\r\nimport getAttribute from './getAttribute'\r\nimport { FROM_ELEMENT_TAGS } from './utils/enum'\r\n\r\n/**\r\n * 获取 DOM 表单元素的 value 属性值\r\n * ========================================================================\r\n * @method getValue\r\n * @since 0.5.0\r\n * @param {HTMLElement} el\r\n * @return {String}\r\n */\r\nconst getValue = (el) => {\r\n if (\r\n !isElement(el) ||\r\n FROM_ELEMENT_TAGS.indexOf(el.tagName.toLowerCase()) === -1\r\n ) {\r\n return ''\r\n }\r\n\r\n return getAttribute(el, 'value')\r\n}\r\n\r\nexport default getValue\r\n","import isElement from './isElement'\r\nimport setAttribute from './setAttribute'\r\nimport { FROM_ELEMENT_TAGS } from './utils/enum'\r\n\r\n/**\r\n * 给 DOM (表单)元素设置 value 属性值\r\n * ========================================================================\r\n * @method setValue\r\n * @since 0.5.0\r\n * @param {HTMLElement} el\r\n * @param {Boolean|String|Number} val\r\n */\r\nconst setValue = (el, val) => {\r\n if (\r\n !isElement(el) ||\r\n FROM_ELEMENT_TAGS.indexOf(el.tagName.toLowerCase()) === -1\r\n ) {\r\n return false\r\n }\r\n\r\n setAttribute(el, 'value', val)\r\n}\r\n\r\nexport default setValue\r\n","import isElement from './isElement'\r\n\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/classList\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/contains\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n let pattern\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el) || !className) {\r\n return false\r\n }\r\n\r\n pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\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?.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 isElement from './isElement'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/classList\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/add\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (!isElement(el) || 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 isString from '../types/isString'\r\nimport isFunction from '../types/isFunction'\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\r\n if (isFunction(str.trim)) {\r\n return str.trim()\r\n } else {\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n }\r\n}\r\n\r\nexport default trim\r\n","import trim from './utils/string/trim'\r\nimport isElement from './isElement'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/classList\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/remove\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el) || !className) {\r\n return false\r\n }\r\n\r\n allClass = el.className\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","const isUndefined = (val) => {\r\n return typeof val === 'undefined'\r\n}\r\n\r\nexport default isUndefined\r\n","const toCamel = (prop) => {\r\n const props = {}\r\n\r\n function toUpper(x, l) {\r\n return l.toUpperCase()\r\n }\r\n\r\n return (\r\n props[prop] ||\r\n (props[prop] =\r\n prop.indexOf('-') === -1 ? prop : prop.replace(/-([a-z])/gi, toUpper))\r\n )\r\n}\r\n\r\nexport default toCamel\r\n","import toCamel from './utils/string/toCamel'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 获取 DOM 元素的某个 CSS 样式值\r\n * ========================================================================\r\n * @method getStyle\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Window/getComputedStyle\r\n * @param {HTMLElement} el\r\n * @param {String} attr\r\n * @returns {String|Boolean}\r\n */\r\nconst getStyle = (el, attr) => {\r\n let prop\r\n\r\n /* istanbul ignore else */\r\n if (!isElement(el) || !isString(attr)) {\r\n return false\r\n }\r\n\r\n prop = attr === 'float' ? 'cssFloat' : toCamel(attr)\r\n\r\n return getComputedStyle(el)[prop]\r\n}\r\n\r\nexport default getStyle\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import isString from './isString'\r\nimport trim from '../string/trim'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*<!doctype html>|<html\\b[^>]*>|<body\\b[^>]*>|<x-[^>]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ========================================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/<script[^>]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\n/**\r\n * @method isHTMLCollection\r\n * @param {Object|NodeList|HTMLCollection} el\r\n * @return {Boolean}\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","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 isString from './utils/types/isString'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerText 属性值,或者通过字符串,创建 TextNode 元素\r\n * ========================================================================\r\n * @method text\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/textContent\r\n * @param {HTMLElement|String} el\r\n * @param {String} [str]\r\n * @return {Text|*}\r\n */\r\nconst text = (el, str) => {\r\n if (!el || (!isString(el) && !isElement(el))) {\r\n return false\r\n }\r\n\r\n if (isString(el)) {\r\n return document.createTextNode(el)\r\n } else if (isString(str)) {\r\n el.textContent = str\r\n } else {\r\n return el.textContent\r\n }\r\n}\r\n\r\nexport default text\r\n","import isObject from './utils/types/isObject'\r\nimport isString from './utils/types/isString'\r\nimport isArray from './utils/types/isArray'\r\nimport isDOM from './isDOM'\r\nimport text from './text'\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|null}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!tagName) {\r\n return null\r\n }\r\n\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 {\r\n $child = text(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isString(attrs)) {\r\n append(text(attrs))\r\n } else if (isDOM(attrs)) {\r\n append(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 (isObject(attrs) && !isDOM(attrs)) {\r\n setAttributes($el, 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 isHTML from './utils/types/isHTML'\r\nimport isString from './utils/types/isString'\r\nimport stripScripts from './utils/string/stripScripts'\r\nimport isElement from './isElement'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import getAttribute from '../getAttribute'\r\nimport setAttribute from '../setAttribute'\r\nimport removeAttribute from '../removeAttribute'\r\nimport getAttributes from '../getAttributes'\r\nimport setAttributes from '../setAttributes'\r\nimport removeAttributes from '../removeAttributes'\r\nimport getValue from '../getValue'\r\nimport setValue from '../setValue'\r\nimport hasClass from '../hasClass'\r\nimport addClass from '../addClass'\r\nimport replaceClass from '../replaceClass'\r\nimport removeClass from '../removeClass'\r\nimport toggleClass from '../toggleClass'\r\nimport attrs from '../attrs'\r\nimport enable from '../enable'\r\nimport disable from '../disable'\r\nimport readonly from '../readonly'\r\nimport html from '../html'\r\nimport text from '../text'\r\nimport val from '../val'\r\n\r\nconst DOM = {\r\n getAttribute,\r\n setAttribute,\r\n removeAttribute,\r\n getAttributes,\r\n setAttributes,\r\n removeAttributes,\r\n getValue,\r\n setValue,\r\n hasClass,\r\n addClass,\r\n replaceClass,\r\n removeClass,\r\n toggleClass,\r\n attrs,\r\n enable,\r\n disable,\r\n readonly,\r\n html,\r\n text,\r\n val\r\n}\r\n\r\nexport default DOM\r\n","import isArray from './utils/types/isArray'\r\nimport isElement from './isElement'\r\nimport removeAttribute from './removeAttribute'\r\n\r\n/**\r\n * 移除 DOM 元素的 DOM 属性值\r\n * ========================================================================\r\n * @method removeAttributes\r\n * @param {HTMLElement} el\r\n * @param {Array} attrs\r\n */\r\nconst removeAttributes = (el, attrs) => {\r\n let props = []\r\n\r\n if (!isElement(el) || isArray(attrs)) {\r\n return false\r\n }\r\n\r\n props = attrs\r\n\r\n /* istanbul ignore else */\r\n if (!props) {\r\n props = el.getAttributeNames()\r\n }\r\n\r\n props.forEach((prop) => {\r\n removeAttribute(el, prop)\r\n })\r\n}\r\n\r\nexport default removeAttributes\r\n","import isElement from './isElement'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 替换 DOM 节点的样式类\r\n * ========================================================================\r\n * @method replaceClass\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/classList\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/replace\r\n * @param {HTMLElement} el - 要替换样式的 DOM 节点\r\n * @param {String} oldCls - 要替换的目标样式名称\r\n * @param {String} newCls - 新的样式名称\r\n */\r\nconst replaceClass = (el, oldCls, newCls) => {\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 || !hasClass(el, oldCls)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.replace) {\r\n classList.replace(oldCls, newCls)\r\n } else {\r\n el.className = allClass.replace(oldCls, newCls)\r\n }\r\n}\r\n\r\nexport default replaceClass\r\n","import isElement from './isElement'\r\nimport hasClass from './hasClass'\r\nimport addClass from './addClass'\r\nimport removeClass from './removeClass'\r\n\r\n/**\r\n * 切换元素的类。\r\n * ========================================================================\r\n * @method\r\n * @param {HTMLElement} el\r\n * @param {String} className\r\n */\r\nconst toggleClass = (el, className) => {\r\n let classList\r\n\r\n if (!isElement(el) || !className) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.toggle) {\r\n classList.toggle(className)\r\n } else if (hasClass(el, className)) {\r\n removeClass(el, className)\r\n } else {\r\n addClass(el, className)\r\n }\r\n}\r\n\r\nexport default toggleClass\r\n","import isArray from './utils/types/isArray'\r\nimport isObject from './utils/types/isObject'\r\nimport isString from './utils/types/isString'\r\nimport isUndefined from './utils/types/isUndefined'\r\nimport isElement from './isElement'\r\nimport setAttribute from './setAttribute'\r\nimport getAttribute from './getAttribute'\r\nimport setAttributes from './setAttributes'\r\nimport getAttributes from './getAttributes'\r\n\r\n/**\r\n * 获取或者设置 DOM 节点的单个或者多个 DOM 属性\r\n * ========================================================================\r\n * @method attrs\r\n * @param {HTMLElement} el\r\n * @param {String|Object|Array} [attr]\r\n * @param {*} [value]\r\n * @return {Object|null}\r\n */\r\nconst attrs = (el, attr, value) => {\r\n if (!isElement(el)) {\r\n return null\r\n }\r\n\r\n // 仅传递 el 参数,获取 el 元素的所有 DOM 属性\r\n if (!attr && !value) {\r\n return getAttributes(el)\r\n }\r\n\r\n if (!isString(attr) && !isArray(attr) && !isObject(attr)) {\r\n return null\r\n }\r\n\r\n // 传递 attr 属性\r\n if (isString(attr)) {\r\n // 传递了 value 值,用于设置 DOM 属性\r\n if (!isUndefined(value)) {\r\n setAttribute(el, attr, value)\r\n } else {\r\n // 没有传递 value 值,用于获取 DOM 属性\r\n return getAttribute(el, attr)\r\n }\r\n } else if (isArray(attr)) {\r\n // 仅传递了 attr 属性\r\n // attr 为数组是,用于获取 el 元素的多个 DOM 属性\r\n return getAttributes(el, attr)\r\n } else {\r\n // attr 为对象,则用于给 el 元素设置多个 DOM 属性值\r\n setAttributes(el, attr)\r\n }\r\n}\r\n\r\nexport default attrs\r\n","import isElement from './isElement'\r\nimport getAttribute from './getAttribute'\r\nimport removeAttribute from './removeAttribute'\r\nimport { DISABLE_TAGS } from './utils/enum'\r\n\r\n/**\r\n * 启用指定 DOM 元素\r\n * ========================================================================\r\n * @method enable\r\n * @since 1.2.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/HTML/Attributes/disabled\r\n * @param {HTMLElement} el\r\n */\r\nconst enable = (el) => {\r\n if (\r\n !isElement(el) ||\r\n !getAttribute(el, 'disabled') ||\r\n DISABLE_TAGS.indexOf(el.tagName.toLowerCase()) === -1\r\n ) {\r\n return false\r\n }\r\n\r\n removeAttribute(el, 'disabled')\r\n}\r\n\r\nexport default enable\r\n","import isElement from './isElement'\r\nimport getAttribute from './getAttribute'\r\nimport setAttribute from './setAttribute'\r\nimport { DISABLE_TAGS } from './utils/enum'\r\n\r\n/**\r\n * 禁用指定 DOM 元素\r\n * ========================================================================\r\n * @method disable\r\n * @since 1.2.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/HTML/Attributes/disabled\r\n * @param {HTMLElement} el\r\n */\r\nconst disable = (el) => {\r\n if (\r\n !isElement(el) ||\r\n getAttribute(el, 'disabled') ||\r\n DISABLE_TAGS.indexOf(el.tagName.toLowerCase()) === -1\r\n ) {\r\n return false\r\n }\r\n\r\n setAttribute(el, 'disabled', true)\r\n}\r\n\r\nexport default disable\r\n","import isElement from './isElement'\r\nimport getAttribute from './getAttribute'\r\nimport removeAttribute from './removeAttribute'\r\nimport setAttribute from './setAttribute'\r\nimport getStyle from './getStyle'\r\nimport { READONLY_INPUT_TYPES } from './utils/enum'\r\n\r\n/**\r\n * 启用或者取消 DOM 元素的只读模式\r\n * ========================================================================\r\n * @method readonly\r\n * @since 1.2.0\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/readonly\r\n * @param el\r\n * @return {boolean}\r\n */\r\nconst readonly = (el) => {\r\n const TAGS = ['input', 'textarea']\r\n let tagName\r\n let type\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n tagName = el.tagName.toLowerCase()\r\n\r\n if (TAGS.indexOf(tagName) === -1) {\r\n return false\r\n }\r\n\r\n if (tagName === 'input') {\r\n type = getAttribute(el, 'type').toLowerCase()\r\n\r\n if (\r\n READONLY_INPUT_TYPES.indexOf(type) === -1 ||\r\n getStyle(el, 'display') === 'hidden'\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if (getAttribute(el, 'readonly')) {\r\n removeAttribute(el, 'readonly')\r\n } else {\r\n setAttribute(el, 'readonly', true)\r\n }\r\n}\r\n\r\nexport default readonly\r\n","import isUndefined from './utils/types/isUndefined'\r\nimport getValue from './getValue'\r\nimport setValue from './setValue'\r\n\r\n/**\r\n * 获取或者设置 DOM (表单)元素的 value 属性值\r\n * ========================================================================\r\n * @method getValue\r\n * @since 0.5.0\r\n * @param {HTMLElement} el\r\n * @param {Boolean|String|Number} value\r\n * @return {string}\r\n */\r\nconst val = (el, value) => {\r\n if (!isUndefined(value)) {\r\n setValue(el, value)\r\n } else {\r\n return getValue(el)\r\n }\r\n}\r\n\r\nexport default val\r\n","import html from './html'\r\nimport isHTML from './utils/types/isHTML'\r\n\r\n/**\r\n * 通过 HTML 创建 DOM 元素\r\n * ========================================================================\r\n * @method build\r\n * @since 1.1.0\r\n * @param {String} str\r\n * @return {Element|null}\r\n */\r\nconst build = (str) => {\r\n if (!isHTML(str)) {\r\n return null\r\n }\r\n\r\n return html(str).firstElementChild\r\n}\r\n\r\nexport default build\r\n","import isElement from './isElement'\r\n\r\n/**\r\n * 克隆节点\r\n * ========================================================================\r\n * @method clone\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/cloneNode\r\n * @param {HTMLElement|Text|HTMLFrameElement} el\r\n * @param {Boolean} deep - 受否深度拷贝(默认值:false)。\r\n * false - 仅拷贝 DOM 本身;\r\n * true - 拷贝 DOM 以及所有子节点;\r\n * @return {ActiveX.IXMLDOMNode|Node|null}\r\n */\r\nconst clone = (el, deep = false) => {\r\n if (!isElement(el)) {\r\n return null\r\n }\r\n\r\n return el.cloneNode(deep)\r\n}\r\n\r\nexport default clone\r\n","/**\r\n * 获取 el 节点下匹配 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 {HTMLElement|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 getHostOrParent\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {HTMLElement|*}\r\n */\r\nconst getHostOrParent = (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 getHostOrParent\r\n","import isString from './utils/types/isString'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 返回文档中与指定 id 选择器匹配 Element对象\r\n * ========================================================================\r\n * @methods byId\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Document/querySelector\r\n * @param {String} id\r\n * @param {HTMLElement} [el]\r\n * @return {HTMLElement}\r\n */\r\nconst byId = (id, el) => {\r\n let selector\r\n let $el\r\n\r\n if (!isString(id)) {\r\n return null\r\n }\r\n\r\n selector = id.replace(/^#/i, '')\r\n $el = isElement(el) ? el : document\r\n\r\n return $el.querySelector(`#${selector}`)\r\n}\r\n\r\nexport default byId\r\n","const isBoolean = (val) => {\r\n return typeof val === 'boolean'\r\n}\r\n\r\nexport default isBoolean\r\n","import isBoolean from './utils/types/isBoolean'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 返回与指定的选择器组匹配的文档中的 DOM 元素或者 DOM 元素列表。\r\n * ========================================================================\r\n * @method getEl\r\n * @param {String} selector\r\n * @param {HTMLElement|Boolean} [el]\r\n * @param {Boolean} [multiple]\r\n * @return {NodeListOf<*>|HTMLElement|*}\r\n */\r\nconst getEl = (selector, el, multiple = false) => {\r\n const $el = isElement(el) ? el : document\r\n let isMultiple = multiple\r\n\r\n if (isBoolean(el)) {\r\n isMultiple = el\r\n }\r\n\r\n if (isMultiple) {\r\n return $el.querySelectorAll(selector)\r\n }\r\n\r\n return $el.querySelector(selector)\r\n}\r\n\r\nexport default getEl\r\n","import isHTMLCollection from './utils/types/isHTMLCollection'\r\n\r\n/**\r\n * 检测是否为 NodeList\r\n * ========================================================================\r\n * @method isCoolection\r\n * @param {HTMLElement|Object} el\r\n * @return {Boolean}\r\n */\r\nconst isCollection = (el) => {\r\n return isHTMLCollection(el)\r\n}\r\n\r\nexport default isCollection\r\n","import isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isCollection from './isCollection'\r\nimport matches from './matches'\r\n\r\n/**\r\n * 返回 NodeList 的元素中与 selector 过滤条件匹配的 DOM 元素(数组)\r\n * ========================================================================\r\n * @method filter\r\n * @since 1.2.0\r\n * @param {NodeList} collection\r\n * @param {String|Function} selector\r\n * @return {Array}\r\n */\r\nconst filter = (collection, selector) => {\r\n let callback\r\n let items\r\n\r\n if (\r\n !isCollection(collection) ||\r\n (!isString(selector) && !isFunction(selector))\r\n ) {\r\n return []\r\n }\r\n\r\n items = [...collection]\r\n\r\n if (isString(selector)) {\r\n callback = (item) => {\r\n return matches(item, selector)\r\n }\r\n } else {\r\n callback = (item, i) => {\r\n return selector(item, i)\r\n }\r\n }\r\n\r\n return items.filter(callback)\r\n}\r\n\r\nexport default filter\r\n","import isTextNode from './utils/types/isTextNode'\r\n\r\n/**\r\n * 判断 DOM 元素是否未文本节点\r\n * ========================================================================\r\n * @method isText\r\n * @param {HTMLElement} el\r\n * @return {Boolean}\r\n */\r\nconst isText = (el) => {\r\n return isTextNode(el)\r\n}\r\n\r\nexport default isText\r\n","/**\r\n * 检测是否为 window 对象\r\n * ========================================================================\r\n * @method isWindow\r\n * @since 1.6.0\r\n * @param {Object} o\r\n * @return {boolean}\r\n */\r\nconst isWindow = (o) => {\r\n return (\r\n o != null &&\r\n o === o.window &&\r\n o.document &&\r\n o.location &&\r\n o.alert &&\r\n o.setInterval\r\n )\r\n}\r\n\r\nexport default isWindow\r\n","import isWindow from './isWindow'\r\n\r\n/**\r\n * @method getNodeName\r\n * @since 1.9.0\r\n * @see https://github.com/floating-ui/floating-ui\r\n * @param node\r\n * @return {string|string}\r\n */\r\nconst getNodeName = (node) => {\r\n return isWindow(node) ? '' : node ? (node.nodeName || '').toLowerCase() : ''\r\n}\r\n\r\nexport default getNodeName\r\n","import isWindow from './isWindow'\r\n\r\n/**\r\n * 获取 window 对象\r\n * ========================================================================\r\n * @method getWindow\r\n * @since 1.6.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/ownerDocument\r\n * @param {Node|Window} node\r\n * @return {*|Window}\r\n */\r\nconst getWindow = (node) => {\r\n if (node === null) {\r\n return window\r\n }\r\n\r\n if (!isWindow(node)) {\r\n const ownerDocument = node.ownerDocument\r\n return ownerDocument ? ownerDocument.defaultView || window : window\r\n }\r\n\r\n return node\r\n}\r\n\r\nexport default getWindow\r\n","import getWindow from './getWindow'\r\n\r\n/**\r\n * 检测目标 node 是否一个 DOM 子树的根节点\r\n * ========================================================================\r\n * @method isShadowRoot\r\n * @since 1.6.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/ShadowRoot\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Web_components/Using_shadow_DOM\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/shadowRoot\r\n * @param {Node} node\r\n * @return {boolean}\r\n */\r\nconst isShadowRoot = (node) => {\r\n // 浏览器不支持 `ShadowRoot`\r\n if (typeof ShadowRoot === 'undefined') {\r\n return false\r\n }\r\n\r\n const OwnElement = getWindow(node).ShadowRoot\r\n return node instanceof OwnElement || node instanceof ShadowRoot\r\n}\r\n\r\nexport default isShadowRoot\r\n","import toCamel from './utils/string/toCamel'\r\nimport isUndefined from './utils/types/isUndefined'\r\nimport isArray from './utils/types/isArray'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 获取 DOM 元素 attrs 数组中指定的多个 CSS 样式值\r\n * ========================================================================\r\n * @param {HTMLElement} el\r\n * @param {Array} [attrs]\r\n * @returns {Object|null}\r\n */\r\nconst getStyles = (el, attrs = []) => {\r\n const styles = {}\r\n let props = null\r\n let keys\r\n\r\n if (!isElement(el)) {\r\n return props\r\n }\r\n\r\n props = getComputedStyle(el)\r\n keys = Object.keys(props)\r\n\r\n /* istanbul ignore else */\r\n if (isArray(attrs) && attrs.length > 0) {\r\n keys = attrs\r\n }\r\n\r\n keys.forEach((attr) => {\r\n const prop = toCamel(attr)\r\n const isNumber = /\\d+/g\r\n const value = props[prop]\r\n\r\n /* istanbul ignore else */\r\n if (!isUndefined(prop) && !isNumber.test(prop) && !isUndefined(value)) {\r\n styles[prop] = props[prop]\r\n }\r\n })\r\n\r\n return styles\r\n}\r\n\r\nexport default getStyles\r\n","/**\r\n * 检测浏览器信息,返回浏览器名称和版本信息\r\n * ========================================================================\r\n * @method browser\r\n * @see https://stackoverflow.com/questions/9514179/how-to-find-the-operating-system-details-using-javascript\r\n * @return {{major: number, name: string, version: string}}\r\n */\r\nconst browser = () => {\r\n const ua = navigator.userAgent\r\n let index = 0\r\n let name = 'unknown'\r\n let major = ''\r\n let version = '--'\r\n\r\n // Opera\r\n if (ua.indexOf('OPR/') !== -1) {\r\n index = ua.indexOf('OPR/')\r\n name = 'Opera'\r\n version = ua.substring(index + 4)\r\n }\r\n // MSIE\r\n else if (ua.indexOf('MSIE') !== -1) {\r\n index = ua.indexOf('MSIE')\r\n name = 'IE'\r\n version = ua.substring(index + 5)\r\n }\r\n // Edge\r\n else if (ua.indexOf('Edg') !== -1) {\r\n index = ua.indexOf('Edg')\r\n name = 'Edge'\r\n version = ua.substring(index + 4)\r\n }\r\n // Chrome\r\n else if (ua.indexOf('Chrome') !== -1) {\r\n index = ua.indexOf('Chrome')\r\n name = 'Chrome'\r\n version = ua.substring(index + 7)\r\n }\r\n // Safari\r\n else if (ua.indexOf('Safari') !== -1) {\r\n index = ua.indexOf('Safari')\r\n name = 'Safari'\r\n version = ua.substring(index + 7)\r\n\r\n if (ua.indexOf('Version') !== -1) {\r\n index = ua.indexOf('Version')\r\n version = ua.substring(index + 8)\r\n }\r\n }\r\n // Firefox\r\n else if (ua.indexOf('Firefox') !== -1) {\r\n index = ua.indexOf('Firefox')\r\n name = 'Firefox'\r\n version = ua.substring(index + 8)\r\n }\r\n // MSIE 11+\r\n else if (ua.indexOf('Trident/') !== -1) {\r\n name = 'IE 11'\r\n version = ua.substring(ua.indexOf('rv:') + 3)\r\n }\r\n // Other browsers\r\n else if (ua.lastIndexOf(' ') + 1 < ua.lastIndexOf('/')) {\r\n index = ua.lastIndexOf('/')\r\n name = ua.substring(ua.lastIndexOf(' ') + 1, index)\r\n version = ua.substring(index + 1)\r\n\r\n if (name.toLowerCase() == name.toUpperCase()) {\r\n name = navigator.appName || 'unknown'\r\n }\r\n }\r\n\r\n // trim the version string\r\n if (version.indexOf(';') !== -1) {\r\n index = version.indexOf(';')\r\n } else if (version.indexOf(' ') !== -1) {\r\n index = version.indexOf(' ')\r\n } else if (version.indexOf(')') !== -1) {\r\n index = version.indexOf(')')\r\n }\r\n\r\n if (index > -1) {\r\n version = version.substring(0, index)\r\n }\r\n\r\n major = parseInt('' + version, 10)\r\n\r\n if (isNaN(major)) {\r\n version = '' + parseFloat(navigator.appVersion)\r\n major = parseInt(navigator.appVersion, 10)\r\n }\r\n\r\n return {\r\n name,\r\n major,\r\n version\r\n }\r\n}\r\n\r\nexport default browser\r\n","import getStyles from './getStyles'\r\nimport browser from './browser'\r\n\r\n/**\r\n * 用来检测 DOM 元素是否为布局和包含块\r\n * ========================================================================\r\n * @method isContainingBlock\r\n * @since 1.9.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/Containing_block#identifying_the_containing_block\r\n * @see https://github.com/floating-ui/floating-ui\r\n * @param {HTMLElement} el\r\n * @return {Boolean}\r\n */\r\nconst isContainingBlock = (el) => {\r\n const isFirefox = browser().name === 'Firefox'\r\n const css = getStyles(el)\r\n\r\n // 这里并没有详尽列举所有属性,但涵盖了创建包含块的最常见的CSS属性。\r\n return (\r\n css.transform !== 'none' ||\r\n css.perspective !== 'none' ||\r\n // @ts-ignore (TS 4.1 compat)\r\n css.contain === 'paint' ||\r\n ['transform', 'perspective'].includes(css.willChange) ||\r\n (isFirefox && css.willChange === 'filter') ||\r\n (isFirefox && (css.filter ? css.filter !== 'none' : false))\r\n )\r\n}\r\n\r\nexport default isContainingBlock\r\n","import getWindow from './getWindow'\r\n\r\n/**\r\n * 检测指定对象是否为 Node (接口)实例\r\n * ========================================================================\r\n * @method isNode\r\n * @since 1.6.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node\r\n * @param {Node} node\r\n * @return {boolean}\r\n */\r\nconst isNode = (node) => {\r\n return node instanceof getWindow(node).Node\r\n}\r\n\r\nexport default isNode\r\n","import isNode from './isNode'\r\n\r\n/**\r\n * 获取 Node 对象(DOM 元素)所在的文档的 documentElement 对象\r\n * ========================================================================\r\n * @method getDocument\r\n * @since 1.6.0\r\n * @param node\r\n * @return {HTMLElement}\r\n */\r\nconst getDocument = (node) => {\r\n return (\r\n (isNode(node) ? node.ownerDocument : node.document) || window.document\r\n ).documentElement\r\n}\r\n\r\nexport default getDocument\r\n","import isElement from './isElement'\r\n\r\n/**\r\n * 返回一个指向最近的(指包含层级上的最近)包含该元素的定位元素。\r\n * 当元素的 style.display 设置为 \"none\" 时,offsetParent 返回 null。\r\n * ========================================================================\r\n * @method getOffsetParent\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLElement/offsetParent\r\n * @param {HTMLElement} el\r\n * @return {HTMLElement|null}\r\n */\r\nconst getOffsetParent = (el) => {\r\n if (!isElement(el)) {\r\n return null\r\n }\r\n return el.offsetParent\r\n}\r\n\r\nexport default getOffsetParent\r\n","import isElement from './isElement'\r\nimport getStyle from './getStyle'\r\n\r\n/**\r\n * 返回最近的(指包含层级上的最近)包含该元素的滚动父元素\r\n * (overflow/overflow-x/overflow-y: auto )。\r\n * ========================================================================\r\n * @method getScrollParent\r\n * @param {HTMLElement|Object} el\r\n * @return {HTMLElement|Document|null}\r\n */\r\nconst getScrollParent = (el) => {\r\n const $root = window\r\n let $parent\r\n\r\n if (!isElement(el) && el !== document) {\r\n return null\r\n }\r\n\r\n $parent = el.parentNode\r\n\r\n if (!$parent) {\r\n return el\r\n }\r\n\r\n if ($parent === $root.document) {\r\n if ($root.document.body.scrollTop || $root.document.body.scrollLeft) {\r\n return $root.document.body\r\n } else {\r\n return $root.document.documentElement\r\n }\r\n }\r\n\r\n // Firefox want us to check `-x` and `-y` variations as well\r\n /* istanbul ignore else */\r\n if (\r\n ['scroll', 'auto'].indexOf(getStyle($parent, 'overflow')) !== -1 ||\r\n ['scroll', 'auto'].indexOf(getStyle($parent, 'overflow-x')) !== -1 ||\r\n ['scroll', 'auto'].indexOf(getStyle($parent, 'overflow-y')) !== -1\r\n ) {\r\n return $parent\r\n }\r\n\r\n return getScrollParent(el.parentNode)\r\n}\r\n\r\nexport default getScrollParent\r\n","import isElement from './isElement'\r\nimport getWindow from './getWindow'\r\n\r\n/**\r\n * 获取(el元素所在窗口的)VisualViewport 对象\r\n * ========================================================================\r\n * @method getVisualViewport\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/VisualViewport\r\n * @see https://www.quirksmode.org/mobile/viewports2.html\r\n * @param {HTMLElement} [el]\r\n * @return {VisualViewport}\r\n */\r\nconst getVisualViewport = (el) => {\r\n return isElement(el) ? getWindow(el).visualViewport : window.visualViewport\r\n}\r\n\r\nexport default getVisualViewport\r\n","import isElement from './isElement'\r\n\r\n/**\r\n * 获取 DOM 元素的前一个邻居元素节点\r\n * ========================================================================\r\n * @method getPreviousSibling\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/previousElementSibling\r\n * @param {HTMLElement} el\r\n * @return {HTMLElement|null}\r\n */\r\nconst getPreviousSibling = (el) => {\r\n return isElement(el) ? el.previousElementSibling : null\r\n}\r\n\r\nexport default getPreviousSibling\r\n","import isElement from './isElement'\r\nimport getPreviousSibling from './getPreviousSibling'\r\n\r\n/**\r\n * 获取 DOM 元素的前面所有邻居元素节点。\r\n * ========================================================================\r\n * @method getPreviousSiblings\r\n * @param {HTMLElement} el\r\n * @return {Array}\r\n */\r\nconst getPreviousSiblings = (el) => {\r\n const prev = []\r\n let $sibling\r\n\r\n if (!isElement(el)) {\r\n return prev\r\n }\r\n\r\n $sibling = getPreviousSibling(el)\r\n\r\n if ($sibling) {\r\n prev.push($sibling)\r\n }\r\n\r\n while ($sibling) {\r\n $sibling = getPreviousSibling($sibling)\r\n\r\n if ($sibling) {\r\n prev.push($sibling)\r\n }\r\n }\r\n\r\n return prev\r\n}\r\n\r\nexport default getPreviousSiblings\r\n","import isElement from './isElement'\r\n\r\n/**\r\n * 获取 DOM 元素的后一个邻居元素节点\r\n * ========================================================================\r\n * @method getNextSibling\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/nextElementSibling\r\n * @param {HTMLElement} el\r\n * @return {HTMLElement|null}\r\n */\r\nconst getNextSibling = (el) => {\r\n return isElement(el) ? el.nextElementSibling : null\r\n}\r\n\r\nexport default getNextSibling\r\n","import isElement from './isElement'\r\nimport getNextSibling from './getNextSibling'\r\n\r\n/**\r\n * 获取 DOM 元素的后面所有邻居元素节点。\r\n * ========================================================================\r\n * @method getNextSiblings\r\n * @param {HTMLElement} el\r\n * @return {Array}\r\n */\r\nconst getNextSiblings = (el) => {\r\n const next = []\r\n let $sibling\r\n\r\n if (!isElement(el)) {\r\n return next\r\n }\r\n\r\n $sibling = getNextSibling(el)\r\n\r\n if ($sibling) {\r\n next.push($sibling)\r\n }\r\n\r\n while ($sibling) {\r\n $sibling = getNextSibling($sibling)\r\n\r\n if ($sibling) {\r\n next.push($sibling)\r\n }\r\n }\r\n\r\n return next\r\n}\r\n\r\nexport default getNextSiblings\r\n","import isElement from './isElement'\r\nimport getPreviousSiblings from './getPreviousSiblings'\r\nimport getNextSiblings from './getNextSiblings'\r\n\r\n/**\r\n * 获取 DOM 元素的前面或后面所有邻居元素节点。\r\n * ========================================================================\r\n * @method getSiblings\r\n * @param {HTMLElement} el\r\n * @param {Boolean} [includeSelf]\r\n * @return {Array}\r\n */\r\nconst getSiblings = (el, includeSelf = false) => {\r\n let list = []\r\n let prev = []\r\n let next = []\r\n\r\n if (!isElement(el)) {\r\n return list\r\n }\r\n\r\n prev = getPreviousSiblings(el)\r\n list.push(...prev)\r\n\r\n /* istanbul ignore else */\r\n if (includeSelf) {\r\n list.push(el)\r\n }\r\n\r\n next = getNextSiblings(el)\r\n list.push(...next)\r\n\r\n return list\r\n}\r\n\r\nexport default getSiblings\r\n","import getSiblings from './getSiblings'\r\n\r\n/**\r\n * 获取 DOM 元素的前面或后面所有邻居元素节点。\r\n * ========================================================================\r\n * @method siblings\r\n * @alias getSiblings\r\n * @param {HTMLElement} el\r\n * @param {Boolean} [includeSelf]\r\n * @return {Array}\r\n */\r\nconst siblings = (el, includeSelf) => {\r\n return getSiblings(el, includeSelf)\r\n}\r\n\r\nexport default siblings\r\n","import build from '../build'\r\nimport createElement from '../createElement'\r\nimport clone from '../clone'\r\nimport closest from '../closest'\r\nimport byClass from '../byClass'\r\nimport byId from '../byId'\r\nimport getEl from '../getEl'\r\nimport filter from '../filter'\r\nimport find from '../find'\r\nimport findAll from '../findAll'\r\nimport fragment from '../fragment'\r\nimport getActiveElement from '../getActiveElement'\r\nimport getContainingBlock from '../getContainingBlock'\r\nimport getDocument from '../getDocument'\r\nimport getImages from '../getImages'\r\nimport getHostOrParent from '../getHostOrParent'\r\nimport getNodeName from '../getNodeName'\r\nimport getOffsetParent from '../getOffsetParent'\r\nimport getScrollParent from '../getScrollParent'\r\nimport getTagName from '../getTagName'\r\nimport getWindow from '../getWindow'\r\nimport getVisualViewport from '../getVisualViewport'\r\nimport index from '../index'\r\nimport children from '../children'\r\nimport parent from '../parent'\r\nimport parents from '../parents'\r\n\r\nconst DOM = {\r\n build,\r\n createElement,\r\n clone,\r\n closest,\r\n byClass,\r\n byId,\r\n getEl,\r\n filter,\r\n find,\r\n findAll,\r\n fragment,\r\n getActiveElement,\r\n getContainingBlock,\r\n getDocument,\r\n getImages,\r\n getHostOrParent,\r\n getNodeName,\r\n getOffsetParent,\r\n getTagName,\r\n getScrollParent,\r\n getWindow,\r\n getVisualViewport,\r\n index,\r\n children,\r\n parent,\r\n parents\r\n}\r\n\r\nexport default DOM\r\n","import matches from './matches'\r\nimport getHostOrParent from './getHostOrParent'\r\n\r\n/**\r\n * 获取 base 元素父元素最近的包含 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 {HTMLElement|null} - 返回最接近的 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 = getHostOrParent(el)))\r\n}\r\n\r\nexport default closest\r\n","import isString from './utils/types/isString'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 返回与指定的类选择器组匹配的文档中的元素列表 (使用深度优先的先序遍历文档的节点)。\r\n * 返回的对象是 NodeList 。\r\n * ========================================================================\r\n * @method byClass\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Document/querySelectorAll\r\n * @param {String} className\r\n * @param {HTMLElement} [el]\r\n * @return {NodeListOf<Element>|null}\r\n */\r\nconst byClass = (className, el) => {\r\n let selector\r\n let $el\r\n\r\n if (!isString(className)) {\r\n return null\r\n }\r\n\r\n selector = className.replace(/^./i, '')\r\n $el = isElement(el) ? el : document\r\n\r\n return $el.querySelectorAll(`.${selector}`)\r\n}\r\n\r\nexport default byClass\r\n","import getEl from './getEl'\r\n\r\n/**\r\n * 获取页面中第一个与 selector 匹配的 DOM 节点\r\n * ========================================================================\r\n * @method find\r\n * @since 0.4.0\r\n * @param {String} selector\r\n * @return {HTMLElement|null}\r\n */\r\nconst find = (selector) => {\r\n return getEl(selector)\r\n}\r\n\r\nexport default find\r\n","import getEl from './getEl'\r\n\r\n/**\r\n * 获取页面中所有与 selector 匹配的 DOM 节点\r\n * ========================================================================\r\n * @method findAll\r\n * @since 0.4.0\r\n * @param {String} selector\r\n * @return {NodeListOf<*>|*}\r\n */\r\nconst findAll = (selector) => {\r\n return getEl(selector, true)\r\n}\r\n\r\nexport default findAll\r\n","import isHTML from './utils/types/isHTML'\r\nimport isCollection from './isCollection'\r\nimport isElement from './isElement'\r\nimport isText from './isText'\r\nimport html from './html'\r\n\r\n/**\r\n * 创建文档碎片\r\n * ========================================================================\r\n * @method fragment\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Document/createDocumentFragment\r\n * @param {String|HTMLElement|HTMLCollection|Text} [innerContent]\r\n * @returns {DocumentFragment}\r\n */\r\nconst fragment = (innerContent) => {\r\n const $fragment = document.createDocumentFragment()\r\n let $children = []\r\n let collection = []\r\n\r\n if (isHTML(innerContent)) {\r\n $children = [html(innerContent)]\r\n } else if (isElement(innerContent) || isText(innerContent)) {\r\n $children = [innerContent]\r\n } else if (isCollection(innerContent)) {\r\n collection = [...innerContent]\r\n collection.forEach((child) => {\r\n $children.push(child)\r\n })\r\n }\r\n\r\n if ($children.length > 0) {\r\n $children.forEach((child) => {\r\n $children.push(child)\r\n })\r\n }\r\n\r\n return $fragment\r\n}\r\n\r\nexport default fragment\r\n","/**\r\n * 返回当前在 DOM 或者 shadow DOM 树中处于聚焦状态的 DOM 元素\r\n * ========================================================================\r\n * @method getActiveElement\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Document/activeElement\r\n * @returns {HTMLElement}\r\n */\r\nconst getActiveElement = () => {\r\n return document.activeElement\r\n}\r\n\r\nexport default getActiveElement\r\n","import getHostOrParent from './getHostOrParent'\r\nimport getNodeName from './getNodeName'\r\nimport isShadowRoot from './isShadowRoot'\r\nimport isElement from './isElement'\r\nimport isContainingBlock from './isContainingBlock'\r\n\r\n/**\r\n *\r\n * @method getContainingBlock\r\n * @since 1.9.0\r\n * @see https://github.com/floating-ui/floating-ui\r\n * @param el\r\n * @return {HTMLElement|*|null}\r\n */\r\nconst getContainingBlock = (el) => {\r\n let currentNode = getHostOrParent(el)\r\n\r\n if (isShadowRoot(currentNode)) {\r\n currentNode = currentNode.host\r\n }\r\n\r\n while (\r\n isElement(currentNode) &&\r\n !['html', 'body'].includes(getNodeName(currentNode))\r\n ) {\r\n if (isContainingBlock(currentNode)) {\r\n return currentNode\r\n } else {\r\n currentNode = currentNode.parentNode\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\nexport default getContainingBlock\r\n","import getEl from './getEl'\r\n\r\n/**\r\n * 返回这个页面页或者某个DOM元素下的所有图片路径的数组\r\n * ========================================================================\r\n * @method getImages\r\n * @since 1.6.0\r\n * @param {String} el\r\n * @param {Boolean} includeDuplicates\r\n * @return Array\r\n */\r\nconst getImages = (el = 'body', includeDuplicates = false) => {\r\n const $el = getEl(el)\r\n const images = [...$el.getElementsByTagName('img')].map((img) =>\r\n img.getAttribute('src')\r\n )\r\n\r\n return includeDuplicates ? images : [...new Set(images)]\r\n}\r\n\r\nexport default getImages\r\n","import isElement from './isElement'\r\n\r\n/**\r\n * @method getTagName\r\n * @since 1.9.0\r\n * @see https://github.com/floating-ui/floating-ui\r\n * @param {HTMLElement} el\r\n * @return {string}\r\n */\r\nconst getTagName = (el) => {\r\n if (!isElement(el)) {\r\n return ''\r\n }\r\n\r\n return el.tagName.toLowerCase()\r\n}\r\n\r\nexport default getTagName\r\n","import isString from './utils/types/isString'\r\nimport isArray from './utils/types/isArray'\r\nimport isElement from './isElement'\r\nimport getSiblings from './getSiblings'\r\nimport getEl from './getEl'\r\n\r\n/**\r\n * 获取 DOM 元素在其父节点中的索引值\r\n * ========================================================================\r\n * @method index\r\n * @param {HTMLElement|String} el\r\n * @param {HTMLElement} [ancestor]\r\n * @return {Number}\r\n */\r\nconst index = function (el, ancestor) {\r\n /**\r\n * 返回 target 元素在 siblings 数组的索引值\r\n * @method indexOf\r\n * @param {Array} siblings\r\n * @param {HTMLElement} target\r\n * @return {number}\r\n */\r\n const indexOf = (siblings, target) => {\r\n let index = -1\r\n\r\n if (!isArray(siblings) || siblings.length < 1 || !isElement(target)) {\r\n return index\r\n }\r\n\r\n siblings.forEach((sibling, j) => {\r\n if (sibling === target) {\r\n index = j\r\n }\r\n })\r\n\r\n return index\r\n }\r\n let $el\r\n\r\n if (isElement(el)) {\r\n $el = el\r\n } else if (isString(el)) {\r\n $el = getEl(el, ancestor)\r\n }\r\n\r\n return indexOf(getSiblings($el, true), $el)\r\n}\r\n\r\nexport default index\r\n","import isElement from './isElement'\r\nimport siblings from './siblings'\r\n\r\n/**\r\n * 获取 DOM 元素下所有 HTMKLElement 类型的 DOM 元素\r\n * ========================================================================\r\n * @method childern\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/firstElementChild\r\n * @param {HTMLElement} el\r\n * @return {Array}\r\n */\r\nconst children = (el) => {\r\n if (!isElement(el)) {\r\n return []\r\n }\r\n\r\n return siblings(el.firstElementChild, true)\r\n}\r\n\r\nexport default children\r\n","import isElement from './isElement'\r\nimport isText from './isText'\r\nimport getOffsetParent from './getOffsetParent'\r\nimport getScrollParent from './getScrollParent'\r\nimport getHostOrParent from './getHostOrParent'\r\n\r\n/**\r\n * 获取给定 el 元素的父节点\r\n * ========================================================================\r\n * @method parent\r\n * @param {HTMLElement|Text} el\r\n * @param {String} [type]\r\n * @return {null|*}\r\n */\r\nconst parent = (el, type) => {\r\n let $parent = null\r\n\r\n if (!isElement(el) && !isText(el)) {\r\n return $parent\r\n }\r\n\r\n switch (type) {\r\n case 'offset':\r\n $parent = getOffsetParent(el)\r\n break\r\n case 'scroll':\r\n $parent = getScrollParent(el)\r\n break\r\n default:\r\n $parent = getHostOrParent(el)\r\n break\r\n }\r\n\r\n return $parent\r\n}\r\n\r\nexport default parent\r\n","import isString from './utils/types/isString'\r\nimport isElement from './isElement'\r\nimport isText from './isText'\r\nimport byId from './byId'\r\n\r\n/**\r\n * 获取给定 el 元素所有的父节点(包括 el 元素自己)\r\n * ========================================================================\r\n * @method parents\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/parentNode\r\n * @param {String|HTMLElement|Text} el\r\n * @param {Boolean} [includeSelf]\r\n * @return {Array}\r\n */\r\nconst parents = (el, includeSelf = false) => {\r\n const $parents = []\r\n let $el\r\n let $parent\r\n\r\n if ($el) {\r\n return $parents\r\n }\r\n\r\n if (isElement(el) || isText(el)) {\r\n $el = el\r\n } else if (isString(el)) {\r\n $el = byId(el)\r\n }\r\n\r\n if (!$el) {\r\n return $parents\r\n }\r\n\r\n if (includeSelf) {\r\n $parents.push($el)\r\n }\r\n\r\n $parent = $el.parentNode\r\n\r\n while ($parent) {\r\n $parents.unshift($parent)\r\n $parent = $parent.parentNode\r\n }\r\n\r\n return $parents\r\n}\r\n\r\nexport default parents\r\n","/**\r\n * @method _HSLToRGB\r\n * @see https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB\r\n * @param {Number} h\r\n * @param {Number} s\r\n * @param {Number} l\r\n * @returns {number[]}\r\n * @private\r\n */\r\nconst _HSLToRGB = (h, s, l) => {\r\n s /= 100\r\n l /= 100\r\n const k = (n) => (n + h / 30) % 12\r\n const a = s * Math.min(l, 1 - l)\r\n const f = (n) =>\r\n l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)))\r\n return [255 * f(0), 255 * f(8), 255 * f(4)]\r\n}\r\n\r\nexport default _HSLToRGB\r\n","import _HSLToRGB from './_HSLToRGB'\r\nimport { KEYWORDS, REG_HSL, REG_RGB, REG_HEX3, REG_HEX } from './utils/enum'\r\n\r\n/**\r\n * 返回将指定颜色(颜色英文名称、RGB格式或者 HSL 格式色值)转化成 16 进制色值\r\n * ========================================================================\r\n * @method toHex\r\n * @since 0.4.0\r\n * @param {String} color\r\n * @return {String|Boolean}\r\n */\r\nconst toHex = (color) => {\r\n let matches = []\r\n let hex\r\n let rgb\r\n let r\r\n let g\r\n let b\r\n\r\n if (!color) {\r\n return false\r\n }\r\n\r\n hex = KEYWORDS[color] || color\r\n\r\n if (REG_HEX.test(hex)) {\r\n return hex\r\n }\r\n\r\n if (REG_HSL.test(hex)) {\r\n matches = REG_HSL.exec(hex)\r\n rgb = _HSLToRGB(\r\n parseInt(matches[1], 10),\r\n parseInt(matches[2], 10),\r\n parseInt(matches[3], 10)\r\n )\r\n\r\n return toHex(`rgb(${rgb.join(',')})`)\r\n } else {\r\n matches = REG_RGB.exec(hex)\r\n }\r\n\r\n if (matches) {\r\n r = matches[1]?.length === 1 ? '0' + matches[1] : Number(matches[1])\r\n g = matches[2]?.length === 1 ? '0' + matches[2] : Number(matches[2])\r\n b = matches[3]?.length === 1 ? '0' + matches[3] : Number(matches[3])\r\n\r\n hex = [r.toString(16), g.toString(16), b.toString(16)].join('')\r\n }\r\n\r\n if (hex.length < 6) {\r\n hex = hex.replace(REG_HEX3, '$1$1')\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (hex !== 'transparent' && hex.indexOf('#') < 0) {\r\n hex = '#' + hex\r\n }\r\n\r\n return hex.toLowerCase()\r\n}\r\n\r\nexport default toHex\r\n","import _HSLToRGB from './_HSLToRGB'\r\nimport toHex from './toHex'\r\nimport { REG_RGB, REG_HEX, REG_HSL } from './utils/enum'\r\n\r\n/**\r\n * 返回将指定颜色(颜色英文名称、16 进制或者 HSL 色值)转化成 RGB 色值\r\n * ========================================================================\r\n * @method toRGB\r\n * @since 0.4.0\r\n * @param {String} color\r\n * @return {String|Boolean}\r\n */\r\nconst toRGB = (color) => {\r\n let matches = []\r\n let hex\r\n let rgb\r\n let r\r\n let g\r\n let b\r\n\r\n if (!color) {\r\n return false\r\n }\r\n\r\n if (REG_RGB.test(color)) {\r\n return color\r\n }\r\n\r\n if (REG_HSL.test(color)) {\r\n matches = REG_HSL.exec(color)\r\n\r\n rgb = _HSLToRGB(\r\n parseInt(matches[1], 10),\r\n parseInt(matches[2], 10),\r\n parseInt(matches[3], 10)\r\n )\r\n\r\n r = rgb[0]\r\n g = rgb[1]\r\n b = rgb[2]\r\n } else {\r\n /* istanbul ignore else */\r\n if (!REG_RGB.test(color)) {\r\n hex = toHex(color)\r\n }\r\n\r\n matches = REG_HEX.exec(hex)\r\n\r\n r = parseInt(matches[1], 16)\r\n g = parseInt(matches[2], 16)\r\n b = parseInt(matches[3], 16)\r\n }\r\n\r\n return 'rgb(' + [r, g, b].join(', ') + ')'\r\n}\r\n\r\nexport default toRGB\r\n","import getColor from '../getColor'\r\nimport randomHexColor from '../randomHexColor'\r\nimport toHex from '../toHex'\r\nimport toHSL from '../toHSL'\r\nimport toRGB from '../toRGB'\r\n\r\nconst DOM = {\r\n getColor,\r\n randomHexColor,\r\n toHex,\r\n toHSL,\r\n toRGB\r\n}\r\n\r\nexport default DOM\r\n","import isString from './utils/types/isString'\r\nimport getStyle from './getStyle'\r\nimport toHex from './toHex'\r\nimport toRGB from './toRGB'\r\nimport isElement from './isElement'\r\nimport { COLOR_PROPS } from './utils/enum'\r\n\r\n/**\r\n * 获取DOM 元素 attr 指定的颜色属性值,可以指定 16 进制或者 RGB 格式\r\n * ========================================================================\r\n * @method getColor\r\n * @since 0.4.0\r\n * @param {HTMLElement} el\r\n * @param {String} attr\r\n * @param {Boolean} [isHex]\r\n * @return {String|Boolean}\r\n */\r\nconst getColor = (el, attr, isHex = true) => {\r\n let color\r\n\r\n if (!isElement(el) || !isString(attr) || COLOR_PROPS.indexOf(attr) === -1) {\r\n return false\r\n }\r\n\r\n color = getStyle(el, attr)\r\n\r\n if (!color) {\r\n return 'transparent'\r\n }\r\n\r\n return isHex ? toHex(color) : toRGB(color)\r\n}\r\n\r\nexport default getColor\r\n","/**\r\n * 随机生成 HEX 格式颜色代码\r\n * ========================================================================\r\n * @method randomHexColor\r\n * @since 1.7.0\r\n * @returns {string}\r\n */\r\nconst randomHexColor = () => {\r\n let hex = (Math.random() * 0xfffff * 1000000).toString(16)\r\n return '#' + hex.slice(0, 6)\r\n}\r\n\r\nexport default randomHexColor\r\n","import toHex from './toHex'\r\nimport { REG_RGB, REG_HEX, REG_HSL } from './utils/enum'\r\n\r\n/**\r\n * 指定颜色(颜色英文名称、16 进制或RGB格式色值)转化成 HSL 格式色值\r\n * ========================================================================\r\n * @method toHSL\r\n * @since 1.3.0\r\n * @see https://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/\r\n * @param {String} color\r\n * @returns {string|boolean}\r\n */\r\nconst toHSL = (color) => {\r\n let matches = []\r\n let hex\r\n let r\r\n let g\r\n let b\r\n let l\r\n let s\r\n let h\r\n\r\n if (!color) {\r\n return false\r\n }\r\n\r\n if (REG_HSL.test(color)) {\r\n return color\r\n }\r\n\r\n // hex to hsl\r\n if (!REG_RGB.test(color)) {\r\n hex = toHex(color)\r\n matches = REG_HEX.exec(hex)\r\n\r\n r = parseInt(matches[1], 16)\r\n g = parseInt(matches[2], 16)\r\n b = parseInt(matches[3], 16)\r\n } else {\r\n // rgb to hsl\r\n matches = REG_RGB.exec(color)\r\n\r\n r = matches[1]\r\n g = matches[2]\r\n b = matches[3]\r\n }\r\n\r\n r /= 255\r\n g /= 255\r\n b /= 255\r\n\r\n l = Math.max(r, g, b)\r\n s = l - Math.min(r, g, b)\r\n h = s\r\n ? l === r\r\n ? (g - b) / s\r\n : l === g\r\n ? 2 + (b - r) / s\r\n : 4 + (r - g) / s\r\n : 0\r\n\r\n return `hsl(${60 * h < 0 ? 60 * h + 360 : 60 * h}, ${\r\n 100 * (s ? (l <= 0.5 ? s / (2 * l - s) : s / (2 - (2 * l - s))) : 0)\r\n }%, ${(100 * (2 * l - s)) / 2}%)`\r\n}\r\n\r\nexport default toHSL\r\n","/**\r\n * 判断某个 DOM 元素是否为另一个 DOM 节点的祖先节点\r\n * ========================================================================\r\n * @method _isAncestor\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/compareDocumentPosition\r\n * @param {HTMLElement} ancestor\r\n * @param {HTMLElement} descendent\r\n * @return {Boolean}\r\n * @private\r\n */\r\nconst _isAncestor = (ancestor, descendent) => {\r\n let result = false\r\n\r\n if (!ancestor || !descendent || !ancestor.nodeType || !descendent.nodeType) {\r\n return result\r\n }\r\n\r\n if (ancestor.contains && ancestor !== descendent) {\r\n result = ancestor.contains(descendent)\r\n } else {\r\n result = !!(ancestor?.compareDocumentPosition(descendent) & 16)\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport default _isAncestor\r\n","import isElement from './isElement'\r\nimport _isAncestor from './_isAncestor'\r\n\r\n/**\r\n * 判断 DOM 元素是否在当前文档中。\r\n * ========================================================================\r\n * @method inDocument\r\n * @param {String | HTMLElement} el\r\n * @param {Object} [doc]\r\n * @return {Boolean}\r\n */\r\nconst inDocument = (el, doc) => {\r\n let $doc\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n $doc = doc || el.ownerDocument\r\n\r\n return _isAncestor($doc.documentElement, el)\r\n}\r\n\r\nexport default inDocument\r\n","import isElement from './isElement'\r\nimport getStyle from './getStyle'\r\nimport inDocument from './inDocument'\r\n\r\n/**\r\n * 判断 DOM 元素是否可以定位(可见且在当前当前文档中)。\r\n * ========================================================================\r\n * @method canPosition\r\n * @param {HTMLElement} el\r\n * @return {Boolean}\r\n */\r\nconst canPosition = (el) => {\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n return getStyle(el, 'display') !== 'none' && inDocument(el)\r\n}\r\n\r\nexport default canPosition\r\n","import isString from './utils/types/isString'\r\nimport isElement from './isElement'\r\nimport _isAncestor from './_isAncestor'\r\nimport getEl from './getEl'\r\n\r\n/**\r\n * 判断某个 DOM 元素中是否包含另一个 DOM 元素\r\n * ========================================================================\r\n * @method contains\r\n * @param {HTMLElement|String} el\r\n * @param {HTMLElement} ancestor\r\n * @return {Boolean}\r\n */\r\nconst contains = (el, ancestor) => {\r\n if (!isElement(ancestor) || (!isElement(el) && !isString(el))) {\r\n return false\r\n }\r\n\r\n if (isElement(el)) {\r\n return _isAncestor(ancestor, el)\r\n } else {\r\n return !!getEl(el, ancestor)\r\n }\r\n}\r\n\r\nexport default contains\r\n","/**\r\n * 判断当前视图是否为布局视图\r\n * ========================================================================\r\n * @method isLayoutViewport\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/en-US/docs/Glossary/Layout_viewport\r\n * @see https://stackoverflow.com/questions/7344886/visual-viewport-vs-layout-viewport-on-mobile-devices\r\n * @see https://www.quirksmode.org/mobile/viewports2.html\r\n * @return {boolean}\r\n */\r\nconst isLayoutViewport = () => {\r\n return document.documentElement.clientWidth === window.innerWidth\r\n}\r\n\r\nexport default isLayoutViewport\r\n","import isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './isElement'\r\nimport matches from './matches'\r\n\r\n/**\r\n * 检测 DOM 节点是否为符合检测条件的节点\r\n * ========================================================================\r\n * @method isMatched\r\n * @param {HTMLElement} el\r\n * @param {Function|String} filter\r\n * @return {Boolean}\r\n */\r\nconst isMatched = (el, filter) => {\r\n if (!isElement(el) || (!isFunction(filter) && !isString(filter))) {\r\n return false\r\n }\r\n\r\n if (isFunction(filter)) {\r\n return filter(el)\r\n } else {\r\n return !!matches(el, filter)\r\n }\r\n}\r\n\r\nexport default isMatched\r\n","import isElement from './isElement'\r\nimport isLayoutViewport from './isLayoutViewport'\r\nimport getVisualViewport from './getVisualViewport'\r\n\r\n/**\r\n * 获取 DOM 元素的 getBoundingClientRect 数据\r\n * ========================================================================\r\n * @method getBoundingClientRect\r\n * @since 1.7.0\r\n * @see https://github.com/floating-ui/floating-ui\r\n * @param {HTMLElement} el\r\n * @param {Boolean} [includeScale]\r\n * @param {Boolean} [isFixedStrategy]\r\n * @return {Object}\r\n */\r\nconst getBoundingClientRect = (\r\n el,\r\n includeScale = false,\r\n isFixedStrategy = false\r\n) => {\r\n const round = Math.round\r\n const clientRect = el.getBoundingClientRect()\r\n const visualViewport = getVisualViewport(el)\r\n const addVisualOffsets = !isLayoutViewport() && isFixedStrategy\r\n\r\n let scaleX = 1\r\n let scaleY = 1\r\n\r\n if (includeScale && isElement(el)) {\r\n let offsetWidth = el.offsetWidth\r\n let offsetHeight = el.offsetHeight\r\n\r\n scaleX = offsetWidth > 0 ? round(clientRect.width) / offsetWidth || 1 : 1\r\n scaleY = offsetHeight > 0 ? round(clientRect.height) / offsetHeight || 1 : 1\r\n }\r\n\r\n const x =\r\n (clientRect.left +\r\n (addVisualOffsets ? visualViewport?.offsetLeft ?? 0 : 0)) /\r\n scaleX\r\n const y =\r\n (clientRect.top + (addVisualOffsets ? visualViewport?.offsetTop ?? 0 : 0)) /\r\n scaleY\r\n const width = clientRect.width / scaleX\r\n const height = clientRect.height / scaleY\r\n\r\n return {\r\n width,\r\n height,\r\n top: y,\r\n right: x + width,\r\n bottom: y + height,\r\n left: x,\r\n x,\r\n y\r\n }\r\n}\r\n\r\nexport default getBoundingClientRect\r\n","import canPosition from '../canPosition'\r\nimport contains from '../contains'\r\nimport inDocument from '../inDocument'\r\nimport isContainingBlock from '../isContainingBlock'\r\nimport isLayoutViewport from '../isLayoutViewport'\r\nimport isMatched from '../isMatched'\r\nimport isScaled from '../isScaled'\r\nimport isWindow from '../isWindow'\r\nimport has from '../has'\r\nimport matches from '../matches'\r\n\r\nconst DOM = {\r\n canPosition,\r\n contains,\r\n inDocument,\r\n isContainingBlock,\r\n isLayoutViewport,\r\n isMatched,\r\n isScaled,\r\n isWindow,\r\n has,\r\n matches\r\n}\r\n\r\nexport default DOM\r\n","import getBoundingClientRect from './getBoundingClientRect'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 检测 DOM 元素是否被缩放了\r\n * ========================================================================\r\n * @method isScaled\r\n * @since 1.9.0\r\n * @see https://github.com/floating-ui/floating-ui\r\n * @param el\r\n * @return {boolean}\r\n */\r\nconst isScaled = (el) => {\r\n const round = Math.round\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n const rect = getBoundingClientRect(el)\r\n\r\n return (\r\n round(rect.width) !== el.offsetWidth ||\r\n round(rect.height) !== el.offsetHeight\r\n )\r\n}\r\n\r\nexport default isScaled\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isCollection from './isCollection'\r\nimport isElement from './isElement'\r\nimport getEl from './getEl'\r\nimport filter from './filter'\r\n\r\n/**\r\n * 将匹配的元素集减少为具有与选择器或过滤函数匹配的子体的元素集。\r\n * ========================================================================\r\n * @method has\r\n * @since 1.2.0\r\n * @param {HTMLElement|NodeList} el\r\n * @param {String|Function} selector\r\n * @return {Array}\r\n */\r\nconst has = (el, selector) => {\r\n if (\r\n (!isElement(el) && !isCollection(el)) ||\r\n (!isString(selector) && !isFunction(selector))\r\n ) {\r\n return []\r\n }\r\n\r\n if (isElement(el)) {\r\n /* istanbul ignore else */\r\n if (isString(selector)) {\r\n return [...getEl(selector, el, true)]\r\n }\r\n } else {\r\n return filter(el, selector)\r\n }\r\n}\r\n\r\nexport default has\r\n","/**\r\n * 获取当前文档(窗口)滚动条的横向滚动的距离\r\n * ========================================================================\r\n * @method getDocumentScrollLeft\r\n * @param {Document} [doc]\r\n * @return {Number}\r\n */\r\nconst getDocumentScrollLeft = (doc = document) => {\r\n const $document = doc\r\n return Math.max(\r\n $document.documentElement.scrollLeft,\r\n $document.body.scrollLeft\r\n )\r\n}\r\n\r\nexport default getDocumentScrollLeft\r\n","import getDocumentScrollLeft from './getDocumentScrollLeft'\r\n\r\n/**\r\n * 获取 DOM 元素的滚动条横向滚动距离\r\n * ========================================================================\r\n * @method getScrollLeft\r\n * @param {HTMLElement|Object|Window} [el]\r\n * @return {Number}\r\n */\r\nconst getScrollLeft = (el = window) => {\r\n if (el === document) {\r\n return getDocumentScrollLeft()\r\n }\r\n\r\n return el.scrollX !== undefined ? el.scrollX : el.scrollLeft\r\n}\r\n\r\nexport default getScrollLeft\r\n","/**\r\n * 获取当前文档(窗口)滚动条的纵向滚动的距离\r\n * ========================================================================\r\n * @method getDocumentScrollTop\r\n * @param {Document} [doc]\r\n * @return {Number}\r\n */\r\nconst getDocumentScrollTop = (doc = document) => {\r\n const $document = doc\r\n return Math.max($document.documentElement.scrollTop, $document.body.scrollTop)\r\n}\r\n\r\nexport default getDocumentScrollTop\r\n","import getDocumentScrollTop from './getDocumentScrollTop'\r\n\r\n/**\r\n * 获取 DOM 元素的滚动条纵向滚动距离\r\n * ========================================================================\r\n * @method getScrollTop\r\n * @param {HTMLElement|Object|Window} [el]\r\n * @return {Number}\r\n */\r\nconst getScrollTop = (el = window) => {\r\n if (el === document) {\r\n return getDocumentScrollTop()\r\n }\r\n\r\n return el.scrollY !== undefined ? el.scrollY : el.scrollTop\r\n}\r\n\r\nexport default getScrollTop\r\n","import getScrollLeft from './getScrollLeft'\r\nimport getScrollTop from './getScrollTop'\r\n\r\n/**\r\n * 获取 DOM 元素的滚动条横向和纵向滚动距离\r\n * ========================================================================\r\n * @method getScrollLeft\r\n * @param {HTMLElement|Object|Window} [el]\r\n * @return {Object}\r\n */\r\nconst getScroll = (el = window) => {\r\n return {\r\n top: getScrollTop(el),\r\n left: getScrollLeft(el)\r\n }\r\n}\r\n\r\nexport default getScroll\r\n","import isElement from './isElement'\r\n\r\n/**\r\n * 获取浏览器或者 DOM 元素纵向滚动条的宽度\r\n * ========================================================================\r\n * @method getScrollbarWidth\r\n * @since 1.4.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Window/innerWidth\r\n * @return {number}\r\n */\r\nconst getScrollbarWidth = (el) => {\r\n let innerWidth = 0\r\n let clientWidth = 0\r\n\r\n if (!el) {\r\n innerWidth = window.innerWidth\r\n clientWidth = document.documentElement.clientWidth\r\n } else {\r\n if (isElement(el)) {\r\n innerWidth = el.offsetWidth\r\n clientWidth = el.clientWidth\r\n }\r\n }\r\n\r\n return innerWidth - clientWidth\r\n}\r\n\r\nexport default getScrollbarWidth\r\n","/**\r\n * ========================================================================\r\n * @method getViewportHeight\r\n * @return {Number}\r\n */\r\nconst getViewportHeight = () => {\r\n return Math.max(document.documentElement.clientHeight, window.innerHeight)\r\n}\r\n\r\nexport default getViewportHeight\r\n","/**\r\n * ========================================================================\r\n * @method getViewportWidth\r\n * @return {Number}\r\n */\r\nconst getViewportWidth = () => {\r\n return Math.max(document.documentElement.clientWidth, window.innerWidth)\r\n}\r\n\r\nexport default getViewportWidth\r\n","import getBoundingClientRect from '../getBoundingClientRect'\r\nimport getDocumentRect from '../getDocumentRect'\r\nimport getViewportRect from '../getViewportRect'\r\nimport inBounding from '../inBounding'\r\nimport inViewport from '../inViewport'\r\n\r\nconst DOM = {\r\n getBoundingClientRect,\r\n getDocumentRect,\r\n getViewportRect,\r\n inBounding,\r\n inViewport\r\n}\r\n\r\nexport default DOM\r\n","import getDocument from './getDocument'\r\nimport getScroll from './getScroll'\r\nimport getScrollbarWidth from './getScrollbarWidth'\r\nimport getStyles from './getStyles'\r\n\r\n/**\r\n * 获取 DOM 元素所在的文档的 Rect 尺寸\r\n * ========================================================================\r\n * @method getDocumentRect\r\n * @since 1.8.0\r\n * @see https://github.com/floating-ui/floating-ui\r\n * @param {HTMLElement} el\r\n * @return {Object}\r\n */\r\nconst getDocumentRect = (el) => {\r\n const max = Math.max\r\n const html = getDocument(el)\r\n const scroll = getScroll(el)\r\n const body = el.ownerDocument?.body\r\n\r\n const width = max(\r\n html.scrollWidth,\r\n html.clientWidth,\r\n body ? body.scrollWidth : 0,\r\n body ? body.clientWidth : 0\r\n )\r\n const height = max(\r\n html.scrollHeight,\r\n html.clientHeight,\r\n body ? body.scrollHeight : 0,\r\n body ? body.clientHeight : 0\r\n )\r\n\r\n let x = -scroll.left + getScrollbarWidth(el)\r\n const y = -scroll.top\r\n\r\n if (getStyles(body || html, ['direction']).direction === 'rtl') {\r\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width\r\n }\r\n\r\n return {\r\n width,\r\n height,\r\n x,\r\n y\r\n }\r\n}\r\n\r\nexport default getDocumentRect\r\n","import getVisualViewport from './getVisualViewport'\r\nimport getDocument from './getDocument'\r\nimport isLayoutViewport from './isLayoutViewport'\r\n\r\n/**\r\n * 获取 DOM 元素所在的文档的视口的尺寸\r\n * ========================================================================\r\n * @method getDocumentRect\r\n * @since 1.8.0\r\n * @param {HTMLElement} el\r\n * @param {String} strategy\r\n * @return {Object}\r\n */\r\nconst getViewportRect = (el, strategy) => {\r\n const html = getDocument(el)\r\n const visualViewport = getVisualViewport(el)\r\n\r\n let width = html.clientWidth\r\n let height = html.clientHeight\r\n let x = 0\r\n let y = 0\r\n\r\n if (visualViewport) {\r\n width = visualViewport.width\r\n height = visualViewport.height\r\n\r\n const layoutViewport = isLayoutViewport()\r\n\r\n if (layoutViewport || (!layoutViewport && strategy === 'fixed')) {\r\n x = visualViewport.offsetLeft\r\n y = visualViewport.offsetTop\r\n }\r\n }\r\n\r\n return {\r\n width,\r\n height,\r\n x,\r\n y\r\n }\r\n}\r\n\r\nexport default getViewportRect\r\n","import isElement from './isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n}\r\n\r\nexport default inBounding\r\n","import isElement from './isElement'\r\nimport getViewportHeight from './getViewportHeight'\r\nimport getViewportWidth from './getViewportWidth'\r\n\r\n/**\r\n * 检测 DOM 元素是否在当前视口内可见\r\n * ========================================================================\r\n * @method inViewport\r\n * @param {HTMLElement} el\r\n * @return {Boolean}\r\n */\r\nconst inViewport = (el) => {\r\n let rect\r\n let vh\r\n let vw\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n rect = el.getBoundingClientRect()\r\n vh = getViewportHeight()\r\n vw = getViewportWidth()\r\n\r\n return (\r\n rect.top >= 0 && rect.left >= 0 && rect.bottom <= vh && rect.right <= vw\r\n )\r\n}\r\n\r\nexport default inViewport\r\n","import isElement from './isElement'\r\nimport isDOM from './isDOM'\r\nimport getNextSibling from './getNextSibling'\r\n\r\n/**\r\n * 在参考节点之后插入一个拥有指定父节点的子节点。函数返回被插入过的子节点;\r\n * 当 newNode 是 DocumentFragment 时,返回空 DocumentFragment。\r\n * ========================================================================\r\n * @method insertAfter\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore\r\n * @param {Element} el\r\n * @param {HTMLElement} reference\r\n * @return {HTMLElement|null}\r\n */\r\nconst insertAfter = (el, reference) => {\r\n let $parent\r\n let $nextSibling\r\n\r\n if (!isDOM(el)) {\r\n return null\r\n }\r\n\r\n $parent = reference.parentNode\r\n\r\n if (!$parent) {\r\n return null\r\n }\r\n\r\n $nextSibling = getNextSibling(reference)\r\n\r\n if ($nextSibling) {\r\n return $parent.insertBefore(el, $nextSibling)\r\n } else {\r\n return $parent.appendChild(el)\r\n }\r\n}\r\n\r\nexport default insertAfter\r\n","import isElement from './isElement'\r\nimport isDOM from './isDOM'\r\n\r\n/**\r\n * 在参考节点之前插入一个拥有指定父节点的子节点。函数返回被插入过的子节点;\r\n * 当 newNode 是 DocumentFragment 时,返回空 DocumentFragment。\r\n * ========================================================================\r\n * @method insertBefore\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore\r\n * @param {Element} el\r\n * @param {Element} reference\r\n * @return {Element|null}\r\n */\r\nconst insertBefore = (el, reference) => {\r\n let $parent\r\n\r\n if (!isDOM(el)) {\r\n return null\r\n }\r\n\r\n $parent = reference.parentNode\r\n\r\n if (!$parent) {\r\n return null\r\n }\r\n\r\n return $parent.insertBefore(el, reference)\r\n}\r\n\r\nexport default insertBefore\r\n","import isHTML from './utils/types/isHTML'\r\nimport isElement from './isElement'\r\nimport getEl from './getEl'\r\nimport stripScripts from './utils/string/stripScripts'\r\nimport html from './html'\r\nimport encodeHTML from './utils/string/encodeHTML'\r\nimport text from './text'\r\n\r\n/**\r\n * 方法将指定的文本解析为 Element 元素,并将结果节点插入到 DOM 树中的指定位置。它不会\r\n * 重新解析它正在使用的元素,因此它不会破坏元素内的现有元素。这避免了额外的序列化步骤,\r\n * 使其比直接使用 innerHTML 操作更快。\r\n * ========================================================================\r\n * @method _insertAdjacentHTML\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/insertAdjacentHTML\r\n * @param {HTMLElement|String} el\r\n * @param {String} position - 一个 DOMString,表示插入内容相对于元素的位置,并且必须是以下字符串之一:\r\n * 'beforebegin':元素自身的前面。\r\n * 'afterbegin':插入元素内部的第一个子节点之前。\r\n * 'beforeend':插入元素内部的最后一个子节点之后。\r\n * 'afterend':元素自身的后面。\r\n * @param {String} str\r\n * @param {Boolean} [dangerouslyUseHTMLString]\r\n * @return {Element|Text|null}\r\n * @private\r\n */\r\nconst _insertAdjacentHTML = (\r\n el,\r\n position,\r\n str,\r\n dangerouslyUseHTMLString = true\r\n) => {\r\n const POSITIONS = ['beforebegin', 'afterbegin', 'beforeend', 'afterend']\r\n let insertHTML = str\r\n let $el\r\n let $parent\r\n\r\n if (!el || POSITIONS.indexOf(position) === -1 || !isHTML(insertHTML)) {\r\n return null\r\n }\r\n\r\n $el = isElement(el) ? el : getEl(el)\r\n\r\n if (!$el) {\r\n return null\r\n }\r\n\r\n // 'afterend''beforebegin' 位置,仅在 el 节点在树中且节点具有一个 parent 元素时工作\r\n /* istanbul ignore else */\r\n if (position === 'beforebegin' || position === 'afterend') {\r\n $parent = $el.parentNode\r\n\r\n /* istanbul ignore else */\r\n if (!$parent) {\r\n return null\r\n }\r\n }\r\n\r\n if (dangerouslyUseHTMLString) {\r\n insertHTML = stripScripts(insertHTML)\r\n $el.insertAdjacentHTML(position, insertHTML)\r\n return html(insertHTML)\r\n } else {\r\n insertHTML = encodeHTML(insertHTML)\r\n $el.insertAdjacentText(position, insertHTML)\r\n return text(insertHTML)\r\n }\r\n}\r\n\r\nexport default _insertAdjacentHTML\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n \"'\": '&#39;',\r\n '\"': '&quot;'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import _insertAdjacentHTML from './_insertAdjacentHTML'\r\n\r\n/**\r\n * 将指定的文本解析为 Element 元素,并将结果节点插入到 DOM 树中的指定 DOM 节点之后。\r\n * ========================================================================\r\n * @method insertHTMLAfterEnd\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/insertAdjacentHTML\r\n * @param {HTMLElement|String} el\r\n * @param {String} str\r\n * @param {Boolean} [dangerouslyUseHTMLString]\r\n * @return {Element|null}\r\n */\r\nconst insertHTMLAfterEnd = (el, str, dangerouslyUseHTMLString = true) => {\r\n return _insertAdjacentHTML(el, 'afterend', str, dangerouslyUseHTMLString)\r\n}\r\n\r\nexport default insertHTMLAfterEnd\r\n","import _insertAdjacentHTML from './_insertAdjacentHTML'\r\n\r\n/**\r\n * 在指定元素的开头插入HTML字符串。\r\n * ========================================================================\r\n * @method insertHTMLBeforeBegin\r\n * @param {HTMLElement|String} el\r\n * @param {String} str\r\n * @param {Boolean} [dangerouslyUseHTMLString]\r\n * @return {Element|null}\r\n */\r\nconst insertHTMLBeforeBegin = (el, str, dangerouslyUseHTMLString = true) => {\r\n return _insertAdjacentHTML(el, 'beforebegin', str, dangerouslyUseHTMLString)\r\n}\r\n\r\nexport default insertHTMLBeforeBegin\r\n","import _insertAdjacentHTML from './_insertAdjacentHTML'\r\n\r\n/**\r\n * 来将指定的文本解析为 Element 元素,并将结果节点插入元素内部的最后一个子节点之后。\r\n * ========================================================================\r\n * @method insertHTMLBeforeEnd\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/insertAdjacentHTML\r\n * @param {HTMLElement|String} el\r\n * @param {String} str\r\n * @param {Boolean} [dangerouslyUseHTMLString]\r\n * @return {Element|null}\r\n */\r\nconst insertHTMLBeforeEnd = (el, str, dangerouslyUseHTMLString = true) => {\r\n return _insertAdjacentHTML(el, 'beforeend', str, dangerouslyUseHTMLString)\r\n}\r\n\r\nexport default insertHTMLBeforeEnd\r\n","import isHTML from './utils/types/isHTML'\r\nimport isDOM from './isDOM'\r\nimport isElement from './isElement'\r\nimport insertBefore from './insertBefore'\r\nimport insertHTMLBeforeBegin from './insertHTMLBeforeBegin'\r\n\r\n/**\r\n * 在指定 DOM 节点后添加子节点或者将 HTML 字符转化成节点添加到前面\r\n * ========================================================================\r\n * @method after\r\n * @param {HTMLElement|String} el\r\n * @param {HTMLElement} reference\r\n * @return {Element|null}\r\n */\r\nconst before = (el, reference) => {\r\n if (!isElement(reference) || (!isDOM(el) && !isHTML(el))) {\r\n return null\r\n }\r\n\r\n if (isDOM(el)) {\r\n return insertBefore(el, reference)\r\n } else {\r\n return insertHTMLBeforeBegin(reference, el)\r\n }\r\n}\r\n\r\nexport default before\r\n","import toCamel from './utils/string/toCamel'\r\nimport isString from './utils/types/isString'\r\nimport isUndefined from './utils/types/isUndefined'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 给 DOM 元素添加 CSS 样式\r\n * ========================================================================\r\n * @method setStyle\r\n * @param {HTMLElement} el\r\n * @param {String} attr\r\n * @param {String} val\r\n */\r\nconst setStyle = (el, attr, val) => {\r\n let prop\r\n\r\n if (!isElement(el) || !isString(attr) || isUndefined(attr)) {\r\n return false\r\n }\r\n\r\n prop = toCamel(attr)\r\n\r\n if (prop === 'float') {\r\n prop = 'cssFloat'\r\n }\r\n\r\n el.style[prop] = val\r\n}\r\n\r\nexport default setStyle\r\n","import isElement from './isElement'\r\nimport getStyle from './getStyle'\r\nimport setStyle from './setStyle'\r\n\r\n/**\r\n * 隐藏指定 DOM 元素\r\n * ========================================================================\r\n * @method toggle\r\n * @param {HTMLElement} el\r\n */\r\nconst hide = (el) => {\r\n if (!isElement(el) || getStyle(el, 'display') === 'none') {\r\n return false\r\n }\r\n\r\n setStyle(el, 'display', 'none')\r\n}\r\n\r\nexport default hide\r\n","import isHTML from './utils/types/isHTML'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isDOM from './isDOM'\r\nimport isElement from './isElement'\r\nimport insertAfter from './insertAfter'\r\nimport insertHTMLAfterEnd from './insertHTMLAfterEnd'\r\nimport hide from './hide'\r\n\r\n/**\r\n * 用指定 DOM 节点或者将 HTML 字符转化成节点替换 reference 节点\r\n * ========================================================================\r\n * @method replace\r\n * @since 1.1.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/replaceWith\r\n * @param {HTMLElement|String} el\r\n * @param {HTMLElement} reference\r\n * @return {Element|null}\r\n */\r\nconst replace = (el, reference) => {\r\n let $replace\r\n let $parent\r\n\r\n /* istanbul ignore else */\r\n if (!isElement(reference) || (!isDOM(el) && !isHTML(el))) {\r\n return null\r\n }\r\n\r\n $parent = reference.parentNode\r\n\r\n if (!$parent) {\r\n return null\r\n }\r\n\r\n hide(reference)\r\n\r\n if (isDOM(el)) {\r\n $replace = insertAfter(el, reference)\r\n } else {\r\n $replace = insertHTMLAfterEnd(reference, el)\r\n }\r\n\r\n if (isFunction(reference.replaceWith)) {\r\n reference.replaceWith($replace)\r\n } else {\r\n reference.remove()\r\n }\r\n\r\n return $replace\r\n}\r\n\r\nexport default replace\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './isElement'\r\nimport getEl from './getEl'\r\n\r\n/**\r\n * 移除指定 DOM 元素\r\n * ========================================================================\r\n * @method remove\r\n * @since 1.3.1\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/remove\r\n * @param {HTMLElement|String} el\r\n * @return {boolean}\r\n */\r\nconst remove = (el) => {\r\n let $el\r\n\r\n if (!isElement(el) && !isString(el)) {\r\n return false\r\n }\r\n\r\n if (isElement(el)) {\r\n if (isFunction(el.remove)) {\r\n el.remove()\r\n } else {\r\n el.parentNode.removeChild(el)\r\n }\r\n } else {\r\n $el = getEl(el)\r\n\r\n if (isElement($el)) {\r\n remove($el)\r\n }\r\n }\r\n}\r\n\r\nexport default remove\r\n","import isElement from './isElement'\r\nimport getStyle from './getStyle'\r\nimport setStyle from './setStyle'\r\n\r\n/**\r\n * 隐藏指定 DOM 元素\r\n * ========================================================================\r\n * @method toggle\r\n * @param {HTMLElement} el\r\n */\r\nconst show = (el) => {\r\n if (!isElement(el) || getStyle(el, 'display') === 'block') {\r\n return false\r\n }\r\n\r\n setStyle(el, 'display', 'block')\r\n}\r\n\r\nexport default show\r\n","import insertAfter from '../insertAfter'\r\nimport insertBefore from '../insertBefore'\r\nimport insertHTMLAfterBegin from '../insertHTMLAfterBegin'\r\nimport insertHTMLAfterEnd from '../insertHTMLAfterEnd'\r\nimport insertHTMLBeforeBegin from '../insertHTMLBeforeBegin'\r\nimport insertHTMLBeforeEnd from '../insertHTMLBeforeEnd'\r\nimport append from '../append'\r\nimport prepend from '../prepend'\r\nimport after from '../after'\r\nimport before from '../before'\r\nimport replace from '../replace'\r\nimport remove from '../remove'\r\nimport unwrap from '../unwrap'\r\nimport wrap from '../wrap'\r\nimport wrapAll from '../wrapAll'\r\nimport wrapInner from '../wrapInner'\r\n\r\nconst DOM = {\r\n insertAfter,\r\n insertBefore,\r\n insertHTMLAfterBegin,\r\n insertHTMLAfterEnd,\r\n insertHTMLBeforeBegin,\r\n insertHTMLBeforeEnd,\r\n append,\r\n prepend,\r\n after,\r\n before,\r\n replace,\r\n remove,\r\n unwrap,\r\n wrap,\r\n wrapAll,\r\n wrapInner\r\n}\r\n\r\nexport default DOM\r\n","import _insertAdjacentHTML from './_insertAdjacentHTML'\r\n\r\n/**\r\n * 将指定的文本解析为 Element 元素,并将结果节点插入 el 元素内部的第一个子节点之前。\r\n * ========================================================================\r\n * @method insertHTMLAfterBegin\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/insertAdjacentHTML\r\n * @param {HTMLElement|String} el\r\n * @param {String} str\r\n * @param {Boolean} [dangerouslyUseHTMLString]\r\n * @return {Element|null}\r\n */\r\nconst insertHTMLAfterBegin = (el, str, dangerouslyUseHTMLString = true) => {\r\n return _insertAdjacentHTML(el, 'afterbegin', str, dangerouslyUseHTMLString)\r\n}\r\n\r\nexport default insertHTMLAfterBegin\r\n","import isString from './utils/types/isString'\r\nimport isHTML from './utils/types/isHTML'\r\nimport isDOM from './isDOM'\r\nimport isElement from './isElement'\r\nimport text from './text'\r\nimport insertAfter from './insertAfter'\r\nimport insertHTMLBeforeEnd from './insertHTMLBeforeEnd'\r\nimport isFunction from './utils/types/isFunction'\r\nimport html from './html'\r\n\r\n/**\r\n * 将指定 DOM 节点或者 html 文本解析为 Element 元素,并将结果节点插入 el 元素自身\r\n * 内部的最后面。\r\n * ========================================================================\r\n * @method prepend\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/append\r\n * @param {HTMLElement|String} el\r\n * @param {HTMLElement} reference\r\n * @return {Element|Text|null}\r\n */\r\nconst append = (el, reference) => {\r\n let $target\r\n\r\n if (!isElement(reference) || (!isHTML(el) && !isString(el) && !isDOM(el))) {\r\n return null\r\n }\r\n\r\n if (isFunction(reference.append)) {\r\n if (isDOM(el)) {\r\n $target = el\r\n } else if (isHTML(el)) {\r\n $target = html(el)\r\n } else {\r\n $target = text(el)\r\n }\r\n\r\n reference.append($target)\r\n\r\n return $target\r\n } else {\r\n $target = reference.lastChild\r\n }\r\n\r\n if (isDOM(el)) {\r\n return insertAfter(el, $target)\r\n } else if (isHTML(el)) {\r\n return insertHTMLBeforeEnd($target, el)\r\n } else {\r\n return insertAfter(text(el), $target)\r\n }\r\n}\r\n\r\nexport default append\r\n","import isHTML from './utils/types/isHTML'\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isDOM from './isDOM'\r\nimport isElement from './isElement'\r\nimport text from './text'\r\nimport html from './html'\r\nimport insertBefore from './insertBefore'\r\nimport insertHTMLBeforeBegin from './insertHTMLBeforeBegin'\r\n\r\n/**\r\n * 将指定 DOM 节点或者 html 文本解析为 Element 元素,并将结果节点插入 reference 元素\r\n * 自身内部的最前面或者 reference 元素前面。\r\n * ========================================================================\r\n * @method prepend\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/prepend\r\n * @param {HTMLElement|String} el\r\n * @param {HTMLElement} reference\r\n * @return {Element|Text|null}\r\n */\r\nconst prepend = (el, reference) => {\r\n let $target\r\n\r\n if (!isElement(reference) || (!isHTML(el) && !isString(el) && !isDOM(el))) {\r\n return null\r\n }\r\n\r\n if (isFunction(reference.prepend)) {\r\n if (isDOM(el)) {\r\n $target = el\r\n } else if (isHTML(el)) {\r\n $target = html(el)\r\n } else {\r\n $target = text(el)\r\n }\r\n\r\n reference.prepend($target)\r\n\r\n return $target\r\n } else {\r\n $target = reference.firstChild\r\n }\r\n\r\n if (isDOM(el)) {\r\n return insertBefore(el, $target)\r\n } else if (isHTML(el)) {\r\n return insertHTMLBeforeBegin($target, el)\r\n } else {\r\n return insertBefore(text(el), $target)\r\n }\r\n}\r\n\r\nexport default prepend\r\n","import isHTML from './utils/types/isHTML'\r\nimport isDOM from './isDOM'\r\nimport isElement from './isElement'\r\nimport insertAfter from './insertAfter'\r\nimport insertHTMLAfterEnd from './insertHTMLAfterEnd'\r\n\r\n/**\r\n * 在指定 DOM 节点后添加子节点或者将 HTML 字符转化成节点添加到后面\r\n * ========================================================================\r\n * @method after\r\n * @param {HTMLElement|String} el\r\n * @param {HTMLElement} reference\r\n * @return {Element|null}\r\n */\r\nconst after = (el, reference) => {\r\n /* istanbul ignore else */\r\n if (!isElement(reference) || (!isDOM(el) && !isHTML(el))) {\r\n return null\r\n }\r\n\r\n if (isDOM(el)) {\r\n return insertAfter(el, reference)\r\n } else {\r\n return insertHTMLAfterEnd(reference, el)\r\n }\r\n}\r\n\r\nexport default after\r\n","import isString from './utils/types/isString'\r\nimport isCollection from './isCollection'\r\nimport replace from './replace'\r\nimport isMatched from './isMatched'\r\n\r\n/**\r\n * 从 DOM 中移除匹配元素集的父元素,将匹配的元素保留在它们的位置\r\n * ========================================================================\r\n * @method unwrap\r\n * @since 1.1.0\r\n * @param {HTMLCollection|NodeList} collection\r\n * @param {String} selector\r\n */\r\nconst unwrap = (collection, selector) => {\r\n let $collection = []\r\n\r\n if (!isCollection(collection) || !isString(selector)) {\r\n return false\r\n }\r\n\r\n $collection = [...collection]\r\n\r\n if ($collection.length < 1) {\r\n return false\r\n }\r\n\r\n $collection.forEach(($node, i) => {\r\n const $parent = $node.parentNode\r\n\r\n /* istanbul ignore else */\r\n if (isMatched($parent, selector)) {\r\n replace($node, $parent)\r\n }\r\n })\r\n}\r\n\r\nexport default unwrap\r\n","import isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isHTML from './utils/types/isHTML'\r\nimport isElement from './isElement'\r\nimport isCollection from './isCollection'\r\nimport getEl from './getEl'\r\nimport build from './build'\r\nimport clone from './clone'\r\nimport replace from './replace'\r\n\r\n/**\r\n * 给 NodeList 中的每个 DOM 节点包裹上指定 HTML 标签\r\n * ========================================================================\r\n * @method wrap\r\n * @since 1.1.0\r\n * @param {HTMLCollection|NodeList} collection\r\n * @param {String|HTMLElement|Function} wrapElement\r\n */\r\nconst wrap = (collection, wrapElement) => {\r\n let $collection = []\r\n let $temp\r\n let strHTML\r\n let $return\r\n\r\n /* istanbul ignore else */\r\n if (\r\n !isCollection(collection) ||\r\n (!isHTML(wrapElement) &&\r\n !isString(wrapElement) &&\r\n !isElement(wrapElement) &&\r\n !isFunction(wrapElement))\r\n ) {\r\n return false\r\n }\r\n\r\n $collection = [...collection]\r\n\r\n if ($collection.length < 1) {\r\n return false\r\n }\r\n\r\n $collection.forEach(($node, i) => {\r\n if (isHTML(wrapElement)) {\r\n // HTML 字符串\r\n strHTML = build(wrapElement).outerHTML\r\n } else if (isString(wrapElement) && isElement(getEl(wrapElement))) {\r\n // DOM 元素的选择器\r\n strHTML = clone(getEl(wrapElement), true).outerHTML\r\n } else if (isElement(wrapElement)) {\r\n // DOM 元素\r\n strHTML = clone(wrapElement, true).outerHTML\r\n } else {\r\n $return = wrapElement($node, i)\r\n // Function 返回 DOM 元素\r\n if (isElement($return)) {\r\n strHTML = clone($return, true).outerHTML\r\n } else {\r\n // Function 返回(HTML)字符串\r\n strHTML = build(wrapElement($node, i)).outerHTML\r\n }\r\n }\r\n\r\n strHTML = strHTML.replace(\r\n />(?:\\s*)<\\//,\r\n `>${clone($node, true).outerHTML}</`\r\n )\r\n $temp = build(strHTML)\r\n\r\n /* istanbul ignore else */\r\n if ($temp) {\r\n replace($temp, $node)\r\n }\r\n })\r\n}\r\n\r\nexport default wrap\r\n","import isFunction from './utils/types/isFunction'\r\nimport isHTML from './utils/types/isHTML'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './isElement'\r\nimport isCollection from './isCollection'\r\nimport hide from './hide'\r\nimport show from './show'\r\nimport before from './before'\r\nimport build from './build'\r\nimport getEl from './getEl'\r\nimport clone from './clone'\r\n\r\n/**\r\n * 给(以组邻近的)NodeList 包裹上指定的 HTML 标签\r\n * ========================================================================\r\n * @method wrap\r\n * @since 1.1.0\r\n * @param {HTMLCollection|NodeList} collection\r\n * @param {String|HTMLElement|Function} wrapElement\r\n */\r\nconst wrapAll = (collection, wrapElement) => {\r\n let $collection = []\r\n let warpHTML = ''\r\n let strHTML = ''\r\n let $temp\r\n let $first\r\n let $return\r\n\r\n /* istanbul ignore else */\r\n if (\r\n !isCollection(collection) ||\r\n (!isHTML(wrapElement) &&\r\n !isString(wrapElement) &&\r\n !isElement(wrapElement) &&\r\n !isFunction(wrapElement))\r\n ) {\r\n return false\r\n }\r\n\r\n $collection = [...collection]\r\n\r\n if ($collection.length < 1) {\r\n return false\r\n }\r\n\r\n $first = $collection[0]\r\n\r\n if (isHTML(wrapElement)) {\r\n warpHTML = wrapElement\r\n } else if (isString(wrapElement) && isElement(getEl(wrapElement))) {\r\n warpHTML = clone(getEl(wrapElement), true).outerHTML\r\n } else if (isElement(wrapElement)) {\r\n warpHTML = clone(wrapElement, true).outerHTML\r\n } else {\r\n $return = wrapElement()\r\n\r\n if (isElement($return)) {\r\n warpHTML = clone($return, true).outerHTML\r\n } else {\r\n warpHTML = build($return).outerHTML\r\n }\r\n }\r\n\r\n $temp = build(warpHTML)\r\n hide($temp)\r\n before($temp, $first)\r\n\r\n $collection.forEach(($node, i) => {\r\n strHTML += $node.outerHTML\r\n hide($node)\r\n $node.remove()\r\n })\r\n\r\n strHTML = warpHTML.replace(/>(?:\\s*)<\\//, `>${strHTML}</`)\r\n $temp.outerHTML = strHTML\r\n\r\n show($temp)\r\n}\r\n\r\nexport default wrapAll\r\n","import isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isHTML from './utils/types/isHTML'\r\nimport isElement from './isElement'\r\nimport isCollection from './isCollection'\r\nimport build from './build'\r\nimport clone from './clone'\r\nimport getEl from './getEl'\r\n\r\n/**\r\n * 给 NodeList 中的每个 DOM 节点内部包裹上指定 HTML 标签\r\n * ========================================================================\r\n * @method wrapInner\r\n * @since 1.1.0\r\n * @param {HTMLCollection|NodeList} collection\r\n * @param {String|HTMLElement|Function} wrapElement\r\n */\r\nconst wrapInner = (collection, wrapElement) => {\r\n let $collection = []\r\n let strHTML = ''\r\n let wrapHTML = ''\r\n let $return\r\n\r\n /* istanbul ignore else */\r\n if (\r\n !isCollection(collection) ||\r\n (!isHTML(wrapElement) &&\r\n !isString(wrapElement) &&\r\n !isElement(wrapElement) &&\r\n !isFunction(wrapElement))\r\n ) {\r\n return false\r\n }\r\n\r\n $collection = [...collection]\r\n\r\n if ($collection.length < 1) {\r\n return false\r\n }\r\n\r\n $collection.forEach(($node, i) => {\r\n strHTML = $node.innerHTML\r\n\r\n // HTML 字符串\r\n if (isHTML(wrapElement)) {\r\n wrapHTML = build(wrapElement).outerHTML\r\n } else if (isString(wrapElement) && isElement(getEl(wrapElement))) {\r\n // DOM 元素选择器\r\n wrapHTML = clone(getEl(wrapElement), true).outerHTML\r\n } else if (isElement(wrapElement)) {\r\n // DOM 元素\r\n wrapHTML = clone(wrapElement, true).outerHTML\r\n } else {\r\n $return = wrapElement($node, i)\r\n\r\n // Function 返回 DOM 元素\r\n if (isElement($return)) {\r\n wrapHTML = clone($return, true).outerHTML\r\n } else {\r\n // Function 返回(HTML)字符串\r\n wrapHTML = build($return).outerHTML\r\n }\r\n }\r\n\r\n strHTML = wrapHTML.replace(/>(?:\\s*)<\\//, `>${strHTML}</`)\r\n $node.innerHTML = strHTML\r\n })\r\n}\r\n\r\nexport default wrapInner\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","/**\r\n * 函数防抖:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设\r\n * 定的时间到来之前,又一次触发了事件,就重新开始延时。\r\n * ========================================================================\r\n * @method debounce\r\n * @param {Function} fn - 要采用防抖技术执行的函数\r\n * @param {Number} ms - 等待时间(单位:毫秒)\r\n * @returns {Function}\r\n *\r\n * @example\r\n * window.addEventListener(\r\n * 'resize',\r\n * debounce(() => {\r\n * console.log(window.innerWidth);\r\n * console.log(window.innerHeight);\r\n * }, 250)\r\n * );\r\n * // => Will log the window dimensions at most every 250ms\r\n */\r\nconst debounce = (fn, ms = 300) => {\r\n let timer\r\n\r\n return function (...args) {\r\n if (timer) {\r\n clearTimeout(timer)\r\n }\r\n\r\n timer = setTimeout(() => {\r\n fn.apply(this, args)\r\n }, ms)\r\n }\r\n}\r\n\r\nexport default debounce\r\n","import observeIntersections from '../observeIntersections'\r\nimport observeMutations from '../observeMutations'\r\nimport observeResize from '../observeResize'\r\n\r\nconst DOM = {\r\n observeIntersections,\r\n observeMutations,\r\n observeResize\r\n}\r\n\r\nexport default DOM\r\n","import isFunction from './utils/types/isFunction'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method observeIntersections\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/IntersectionObserver\r\n * @sse https://developer.mozilla.org/zh-CN/docs/Web/API/Intersection_Observer_API\r\n * @param {HTMLElement} el\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {Array} [props.thresholds]\r\n * @param {Number} [props.intersectionRatio]\r\n * @param {String} [props.rootMargin]\r\n * @return {IntersectionObserver}\r\n */\r\nconst observeIntersections = (el, fn, props = {}) => {\r\n const root = el || null\r\n const selector = props.selector || 'h1,h2,h3,h4,h5,h6'\r\n const context = props.context || null\r\n const thresholds = props.thresholds || [0]\r\n const intersectionRatio = props.intersectionRatio || 0\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin,\r\n thresholds\r\n }\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n const target = entry.target\r\n if (entry.intersectionRatio > intersectionRatio) {\r\n if (isFunction(fn)) {\r\n fn.call(context || target, target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n observer.observe(section)\r\n })\r\n\r\n return observer\r\n}\r\n\r\nexport default observeIntersections\r\n","import isFunction from './utils/types/isFunction'\r\nimport extend from './utils/lang/extend'\r\n\r\n/**\r\n * 通用的 MutationObserver 观察者处理器,提供了监视对 DOM 树所做更改的能力。\r\n * ========================================================================\r\n * @method observeMutations\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver\r\n * @param {HTMLElement} el\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Boolean} [props.childList]\r\n * @param {Boolean} [props.attributes]\r\n * @param {Boolean} [props.attributeOldValue]\r\n * @param {Boolean} [props.caracterData]\r\n * @param {Boolean} [props.caracterDataOldValue]\r\n * @param {Boolean} [props.subtree]\r\n * @returns {MutationObserver}\r\n */\r\nconst observeMutations = (el, fn, props = {}) => {\r\n const observer = new MutationObserver((mutations) =>\r\n mutations.forEach((m) => {\r\n if (isFunction(fn)) {\r\n fn(m)\r\n }\r\n })\r\n )\r\n const options = {\r\n childList: true,\r\n attributes: true,\r\n attributeOldValue: true,\r\n characterData: true,\r\n characterDataOldValue: true,\r\n subtree: true\r\n }\r\n\r\n extend(options, props)\r\n observer.observe(el, options)\r\n\r\n return observer\r\n}\r\n\r\nexport default observeMutations\r\n","import debounce from './utils/lang/debounce'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 通用的 ResizeObserver 观察者处理器\r\n * ========================================================================\r\n * @method observeResize\r\n * @since 1.8.0\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/ResizeObserverEntry/contentBoxSize\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/writing-mode\r\n * @param {HTMLElement} el\r\n * @param {Function} callback\r\n * @param {Number} [delay]\r\n * @return {ResizeObserver|boolean}\r\n */\r\nconst observeResize = (el, callback, delay = 300) => {\r\n let observer\r\n let fn\r\n\r\n if (!isElement(el) || !isFunction(callback)) {\r\n return false\r\n }\r\n\r\n fn = debounce(callback, delay)\r\n observer = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n fn(entry)\r\n }\r\n })\r\n\r\n observer.observe(el)\r\n\r\n return observer\r\n}\r\n\r\nexport default observeResize\r\n","import isBrowser from '../isBrowser'\r\nimport isDeno from '../isDeno'\r\nimport isNodeJs from '../isNodeJs'\r\nimport isMobile from '../isMobile'\r\nimport isWebKit from '../isWebKit'\r\nimport browser from '../browser'\r\nimport os from '../os'\r\n\r\nconst DOM = {\r\n isBrowser,\r\n isDeno,\r\n isNodeJs,\r\n isMobile,\r\n isWebKit,\r\n browser,\r\n os\r\n}\r\n\r\nexport default DOM\r\n","/**\r\n * 检测当前运行环境是否为浏览器\r\n * ========================================================================\r\n * @method isBrowser\r\n * @return {Boolean}\r\n */\r\nconst isBrowser = () => {\r\n return ![typeof window, typeof document].includes('undefined')\r\n}\r\n\r\nexport default isBrowser\r\n","/**\r\n * 检测当前运行环境是否为 Done 环境\r\n * ========================================================================\r\n * @method isDeno\r\n * @return {boolean}\r\n */\r\nconst isDeno = () => {\r\n try {\r\n return Deno?.core !== 'undefined'\r\n } catch (e) {\r\n return false\r\n }\r\n}\r\n\r\nexport default isDeno\r\n","/**\r\n * 检测当前运行环境是否为 Node.js 环境\r\n * ========================================================================\r\n * @method isNodeJs\r\n * @return {boolean}\r\n */\r\nconst isNodeJs = () => {\r\n return (\r\n typeof process !== 'undefined' &&\r\n !!process.versions &&\r\n !!process.versions.node\r\n )\r\n}\r\n\r\nexport default isNodeJs\r\n","/**\r\n * 检测当前设备是否为移动设备\r\n * ========================================================================\r\n * @method isMobile\r\n * @return {boolean}\r\n */\r\nconst isMobile = () => {\r\n const ua = navigator.userAgent\r\n\r\n return /Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(ua)\r\n}\r\n\r\nexport default isMobile\r\n","/**\r\n * 检测当前浏览器引擎是否为 WebKit 内核\r\n * ========================================================================\r\n * @method isWebKit\r\n * @return {string|boolean}\r\n */\r\nconst isWebKit = () => {\r\n const ua = navigator.userAgent\r\n const matches = ua.match(/AppleWebKit\\/(\\S*)/)\r\n\r\n if (/KHTML/.test(ua)) {\r\n return true\r\n }\r\n\r\n return matches && matches[1]\r\n}\r\n\r\nexport default isWebKit\r\n","/**\r\n * 检测当前操作系统信息,返回操作名称合版本信息\r\n * ========================================================================\r\n * @method os\r\n * @see https://stackoverflow.com/questions/9514179/how-to-find-the-operating-system-details-using-javascript\r\n * @return {{name: string, version: string}}\r\n */\r\nconst os = () => {\r\n const PLATFORMS = [\r\n {\r\n name: 'Windows 10',\r\n pattern: /(Windows (NT)? 10.0)/\r\n },\r\n {\r\n name: 'Windows 8.1',\r\n pattern: /(Windows 8.1|Windows NT 6.3)/\r\n },\r\n {\r\n name: 'Windows 8',\r\n pattern: /(Windows 8|Windows NT 6.2)/\r\n },\r\n {\r\n name: 'Windows 7',\r\n pattern: /(Windows 7|Windows NT 6.1)/\r\n },\r\n {\r\n name: 'Windows Vista',\r\n pattern: /Windows NT 6.0/\r\n },\r\n {\r\n name: 'Windows Server 2003',\r\n pattern: /Windows NT 5.2/\r\n },\r\n {\r\n name: 'Windows XP',\r\n pattern: /(Windows NT 5.1|Windows XP)/\r\n },\r\n {\r\n name: 'Windows 2000',\r\n pattern: /(Windows NT 5.0|Windows 2000)/\r\n },\r\n {\r\n name: 'Windows ME',\r\n pattern: /(Win 9x 4.90|Windows ME)/\r\n },\r\n {\r\n name: 'Windows 98',\r\n pattern: /(Windows 98|Win98)/\r\n },\r\n {\r\n name: 'Windows 95',\r\n pattern: /(Windows 95|Win95|Windows_95)/\r\n },\r\n {\r\n name: 'Windows NT 4.0',\r\n pattern: /(Windows (NT)? 4.0|WinNT4.0|WinNT)/\r\n },\r\n {\r\n name: 'Windows CE',\r\n pattern: /Windows CE/\r\n },\r\n {\r\n name: 'Windows 3.11',\r\n pattern: /Win16/\r\n },\r\n {\r\n name: 'Android',\r\n pattern: /Android/\r\n },\r\n {\r\n name: 'Open BSD',\r\n pattern: /OpenBSD/\r\n },\r\n {\r\n name: 'Sun OS',\r\n pattern: /SunOS/\r\n },\r\n {\r\n name: 'Linux',\r\n pattern: /(Linux|X11)/\r\n },\r\n {\r\n name: 'iOS',\r\n pattern: /(iPhone|iPad|iPod)/\r\n },\r\n {\r\n name: 'Mac OS X',\r\n pattern: /Mac OS X/\r\n },\r\n {\r\n name: 'Mac OS',\r\n pattern: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/\r\n },\r\n {\r\n name: 'QNX',\r\n pattern: /QNX/\r\n },\r\n {\r\n name: 'UNIX',\r\n pattern: /UNIX/\r\n },\r\n {\r\n name: 'BeOS',\r\n pattern: /BeOS/\r\n },\r\n {\r\n name: 'OS/2',\r\n pattern: /OS\\/2/\r\n },\r\n {\r\n name: 'Search Bot',\r\n pattern:\r\n /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\\/Teoma|ia_archiver)/\r\n }\r\n ]\r\n const ua = navigator.userAgent\r\n let name = 'unknown'\r\n let version = '--'\r\n let match\r\n\r\n match = PLATFORMS.find((platform) => platform.pattern.test(ua))\r\n\r\n if (match) {\r\n name = match.name\r\n }\r\n\r\n if (/Windows/.test(name)) {\r\n version = /Windows (.*)/.exec(name)[1]\r\n name = 'Windows'\r\n }\r\n\r\n switch (name) {\r\n case 'Mac OS X':\r\n version = /Mac OS X (1\\d[._\\d]+)/.exec(ua)[1]\r\n break\r\n\r\n case 'Android':\r\n version = /Android ([._\\d]+)/.exec(ua)[1]\r\n break\r\n\r\n case 'iOS':\r\n version = /OS (\\d+)_(\\d+)_?(\\d+)?/.exec(navigator.appVersion)\r\n version = version[1] + '.' + version[2] + '.' + (version[3] | 0)\r\n break\r\n }\r\n\r\n return {\r\n name,\r\n version\r\n }\r\n}\r\n\r\nexport default os\r\n","import isElement from './isElement'\r\n\r\n/**\r\n * 获取 DOM 节点相对于窗口的 left(横坐标)值\r\n * ========================================================================\r\n * @method getOffsetLeft\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst getOffsetLeft = (el) => {\r\n let left = 0\r\n\r\n if (!isElement(el)) {\r\n return left\r\n }\r\n\r\n left = el.offsetLeft\r\n\r\n /* istanbul ignore else */\r\n if (el.offsetParent !== null) {\r\n left += getOffsetLeft(el.offsetParent)\r\n }\r\n\r\n return left\r\n}\r\n\r\nexport default getOffsetLeft\r\n","import isElement from './isElement'\r\n\r\n/**\r\n * 获取 DOM 节点相对于窗口的 top (纵坐标)值\r\n * ========================================================================\r\n * @method getOffsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst getOffsetTop = (el) => {\r\n let top = 0\r\n\r\n if (!isElement(el)) {\r\n return top\r\n }\r\n\r\n top = el.offsetTop\r\n\r\n /* istanbul ignore else */\r\n if (el.offsetParent !== null) {\r\n top += getOffsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default getOffsetTop\r\n","import isElement from './isElement'\r\nimport getOffsetLeft from './getOffsetLeft'\r\nimport getOffsetTop from './getOffsetTop'\r\n\r\n/**\r\n * 获取 DOM 节点相对于窗口的 left 和 top 值\r\n * ========================================================================\r\n * @method getOffset\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Object|null}\r\n */\r\nconst getOffset = (el) => {\r\n let top\r\n let left\r\n let width\r\n let height\r\n\r\n if (!isElement(el)) {\r\n return null\r\n }\r\n\r\n top = getOffsetTop(el)\r\n left = getOffsetLeft(el)\r\n width = el.offsetWidth\r\n height = el.offsetHeight\r\n\r\n return {\r\n width,\r\n height,\r\n top,\r\n left\r\n }\r\n}\r\n\r\nexport default getOffset\r\n","import isElement from './isElement'\r\nimport getDocumentScrollLeft from './getDocumentScrollLeft'\r\nimport canPosition from './canPosition'\r\n\r\n/**\r\n * 基于页面坐标获取元素的当前 X 位置。\r\n * ========================================================================\r\n * @method getPageX\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/ownerDocument\r\n * @param {HTMLElement} el\r\n * @return {Number|Boolean}\r\n */\r\nconst getPageX = (el) => {\r\n const floor = Math.floor\r\n let scrollLeft\r\n let box\r\n let doc\r\n let pageX\r\n\r\n /* istanbul ignore else */\r\n if (!isElement(el) || !canPosition(el)) {\r\n return false\r\n }\r\n\r\n box = el.getBoundingClientRect()\r\n doc = el.ownerDocument\r\n scrollLeft = getDocumentScrollLeft(doc)\r\n\r\n pageX = floor(box.left)\r\n\r\n if (scrollLeft) {\r\n pageX += scrollLeft\r\n }\r\n\r\n return pageX\r\n}\r\n\r\nexport default getPageX\r\n","import isElement from './isElement'\r\nimport getDocumentScrollTop from './getDocumentScrollTop'\r\nimport canPosition from './canPosition'\r\n\r\n/**\r\n * 基于页面坐标获取元素的当前 Y 位置。\r\n * ========================================================================\r\n * @method getPageY\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/ownerDocument\r\n * @param {HTMLElement} el\r\n * @return {Number|Boolean}\r\n */\r\nconst getPageY = (el) => {\r\n const floor = Math.floor\r\n let scrollTop\r\n let box\r\n let doc\r\n let pageY\r\n\r\n if (!isElement(el) || !canPosition(el)) {\r\n return false\r\n }\r\n\r\n box = el.getBoundingClientRect()\r\n doc = el.ownerDocument\r\n scrollTop = getDocumentScrollTop(doc)\r\n\r\n pageY = floor(box.left)\r\n\r\n if (scrollTop) {\r\n pageY += scrollTop\r\n }\r\n\r\n return pageY\r\n}\r\n\r\nexport default getPageY\r\n","import isElement from './isElement'\r\nimport getPageX from './getPageX'\r\nimport getPageY from './getPageY'\r\nimport canPosition from './canPosition'\r\n\r\n/**\r\n * 基于页面坐标获取元素的当前( X 和 Y )位置。\r\n * ========================================================================\r\n * @method getPageXY\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/ownerDocument\r\n * @param {HTMLElement} el\r\n * @return {Object|Boolean}\r\n */\r\nconst getPageXY = (el) => {\r\n if (!isElement(el) || !canPosition(el)) {\r\n return false\r\n }\r\n\r\n return {\r\n x: getPageY(el),\r\n y: getPageX(el)\r\n }\r\n}\r\n\r\nexport default getPageXY\r\n","import isElement from './isElement'\r\nimport getScrollLeft from './getScrollLeft'\r\nimport getStyle from './getStyle'\r\n\r\n/**\r\n * 获取 DOM 节点预期所有父节点的横向滚动距离\r\n * ========================================================================\r\n * @method getScrollTotalLeft\r\n * @return {Number}\r\n */\r\nconst getScrollTotalLeft = (() => {\r\n const $root = window\r\n let scrollX = []\r\n\r\n return (el) => {\r\n let $parent\r\n\r\n if (!isElement(el)) {\r\n return scrollX\r\n }\r\n\r\n $parent = el.parentNode\r\n\r\n if (!$parent) {\r\n return scrollX\r\n }\r\n\r\n if ($parent === $root.document) {\r\n const $body = document.body || document.documentElement\r\n const position = getScrollLeft($body)\r\n const x = [...scrollX]\r\n\r\n x.push(position.x)\r\n\r\n scrollX = []\r\n\r\n return x\r\n }\r\n\r\n if (\r\n ['scroll', 'auto'].indexOf(getStyle($parent, 'overflow')) !== -1 ||\r\n ['scroll', 'auto'].indexOf(getStyle($parent, 'overflow-x')) !== -1\r\n ) {\r\n const position = getScrollLeft($parent)\r\n\r\n scrollX.push(position.x)\r\n }\r\n\r\n return getScrollTotalLeft($parent)\r\n }\r\n})()\r\n\r\nexport default getScrollTotalLeft\r\n","import isElement from './isElement'\r\nimport getScrollTop from './getScrollTop'\r\nimport getStyle from './getStyle'\r\n\r\n/**\r\n * 获取 DOM 节点预期所有父节点的纵向滚动距离\r\n * ========================================================================\r\n * @method getScrollTotalTop\r\n * @return {Number}\r\n */\r\nconst getScrollTotalTop = (() => {\r\n const $root = window\r\n let scrollY = []\r\n\r\n return (el) => {\r\n let $parent\r\n\r\n if (!isElement(el)) {\r\n return scrollY\r\n }\r\n\r\n $parent = el.parentNode\r\n\r\n if (!$parent) {\r\n return scrollY\r\n }\r\n\r\n if ($parent === $root.document) {\r\n const $body = document.body || document.documentElement\r\n const position = getScrollTop($body)\r\n const y = [...scrollY]\r\n\r\n y.push(position.y)\r\n\r\n scrollY = []\r\n\r\n return y\r\n }\r\n\r\n if (\r\n ['scroll', 'auto'].indexOf(getStyle($parent, 'overflow')) !== -1 ||\r\n ['scroll', 'auto'].indexOf(getStyle($parent, 'overflow-y')) !== -1\r\n ) {\r\n const position = getScrollTop($parent)\r\n\r\n scrollY.push(position.y)\r\n }\r\n\r\n return getScrollTotalTop($parent)\r\n }\r\n})()\r\n\r\nexport default getScrollTotalTop\r\n","import isElement from './isElement'\r\nimport getOffset from './getOffset'\r\n\r\n/**\r\n * 获取 DOM 节点相对于窗口的 left 和 top 值\r\n * ========================================================================\r\n * @method offset\r\n * @alias getOffset\r\n * @param el\r\n * @return {Object}\r\n */\r\nconst offset = (el) => {\r\n if (!isElement(el)) {\r\n return null\r\n }\r\n\r\n return getOffset(el)\r\n}\r\n\r\nexport default offset\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import getOffset from '../getOffset'\r\nimport getOffsetLeft from '../getOffsetLeft'\r\nimport getOffsetTop from '../getOffsetTop'\r\nimport getPageXY from '../getPageXY'\r\nimport getPageX from '../getPageX'\r\nimport getPageY from '../getPageY'\r\nimport getDocumentScrollLeft from '../getDocumentScrollLeft'\r\nimport getDocumentScrollTop from '../getDocumentScrollTop'\r\nimport getScroll from '../getScroll'\r\nimport getScrollLeft from '../getScrollLeft'\r\nimport getScrollTop from '../getScrollTop'\r\nimport getScrollTotal from '../getScrollTotal'\r\nimport getScrollTotalLeft from '../getScrollTotalLeft'\r\nimport getScrollTotalTop from '../getScrollTotalTop'\r\nimport offset from '../offset'\r\nimport positions from '../positions'\r\nimport scrollTo from '../scrollTo'\r\n\r\nconst DOM = {\r\n getOffset,\r\n getOffsetLeft,\r\n getOffsetTop,\r\n getPageXY,\r\n getPageX,\r\n getPageY,\r\n getDocumentScrollLeft,\r\n getDocumentScrollTop,\r\n getScroll,\r\n getScrollLeft,\r\n getScrollTop,\r\n getScrollTotal,\r\n getScrollTotalLeft,\r\n getScrollTotalTop,\r\n offset,\r\n positions,\r\n scrollTo\r\n}\r\n\r\nexport default DOM\r\n","import getScrollTotalLeft from './getScrollTotalLeft'\r\nimport getScrollTotalTop from './getScrollTotalTop'\r\n\r\n/**\r\n * 获取 DOM 元素的滚动条横向与纵向滚动距离。\r\n * ========================================================================\r\n * @method getScrollTotal\r\n * @param {HTMLElement|Window} [el]\r\n * @return {Object}\r\n */\r\nconst getScrollTotal = (el = window) => {\r\n return {\r\n top: getScrollTotalTop(el),\r\n left: getScrollTotalLeft(el)\r\n }\r\n}\r\n\r\nexport default getScrollTotal\r\n","import isElement from './isElement'\r\nimport getPageXY from './getPageXY'\r\nimport getOffset from './getOffset'\r\nimport canPosition from './canPosition'\r\n\r\n/**\r\n * 获取 DOM 元素的定位信息\r\n * ========================================================================\r\n * @method positions\r\n * @param {HTMLElement} el\r\n * @return {Object|Boolean}\r\n */\r\nconst positions = (el) => {\r\n let offset\r\n\r\n if (!isElement(el) || !canPosition(el)) {\r\n return false\r\n }\r\n\r\n offset = getOffset(el)\r\n\r\n return {\r\n top: offset.top,\r\n left: offset.left,\r\n ...getPageXY(el)\r\n }\r\n}\r\n\r\nexport default positions\r\n","import easeInQuad from './utils/lang/easeInQuad'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './isElement'\r\nimport getEl from './getEl'\r\n\r\n/**\r\n * 使 DOM 节点滚动到指定位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|String} el - (必须)要滚动的 DOM 节点\r\n * @param {Number} position - (必须)滚动的 scrollTop 数值\r\n * @param {String|Function} [direction] - (可选)滚动方向,默认值:'top'\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (el, position, direction = 'vertical', afterStop = null) => {\r\n const $el = isElement(el) ? el : getEl(el)\r\n let scrollValue = direction === 'vertical' ? $el.scrollTop : $el.scrollLeft\r\n let step = 0\r\n const distance = position - scrollValue\r\n const MAX_VALUE =\r\n direction === 'vertical' ? $el.scrollHeight : $el.scrollWidth\r\n const MAX_POSITION = position - MAX_VALUE <= 0 ? position : MAX_VALUE\r\n const stop = (pos) => {\r\n if (isFunction(direction)) {\r\n direction(pos)\r\n } else if (isFunction(afterStop)) {\r\n afterStop(pos)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n if (distance < 0) {\r\n scrollValue -= easeInQuad(step)\r\n $el.scrollTop = scrollValue\r\n\r\n if (scrollValue <= position) {\r\n $el.scrollTop = position\r\n return stop(position)\r\n }\r\n } else {\r\n scrollValue += easeInQuad(step)\r\n $el.scrollTop = scrollValue\r\n\r\n if (scrollValue >= MAX_POSITION) {\r\n $el.scrollTop = MAX_POSITION\r\n return stop(MAX_POSITION)\r\n }\r\n }\r\n\r\n requestAnimationFrame(play)\r\n }\r\n\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import dnsPrefetch from '../dnsPrefetch'\r\nimport injectCSS from '../injectCSS'\r\nimport loadCSS from '../loadCSS'\r\nimport loadScript from '../loadScript'\r\nimport prefetch from '../prefetch'\r\nimport preload from '../preload'\r\n\r\nconst DOM = {\r\n injectCSS,\r\n loadCSS,\r\n loadScript,\r\n dnsPrefetch,\r\n prefetch,\r\n preload\r\n}\r\n\r\nexport default DOM\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 向当前文档动态插入 style 标签,以批量添加样式。返回动态创建的 style 标签节点。\r\n * ========================================================================\r\n * @method injectCSS\r\n * @since 1.4.0\r\n * @param {String} cssRules\r\n * @param {String} [media]\r\n * @param {String} [charset]\r\n * @return {HTMLElement}\r\n */\r\nconst injectCSS = (cssRules, media, charset) => {\r\n const attrs = {\r\n type: 'text/css'\r\n }\r\n let $style\r\n\r\n if (media) {\r\n attrs.media = media\r\n }\r\n\r\n if (charset) {\r\n cssRules = `@charset \"${charset}\";` + cssRules\r\n }\r\n\r\n attrs.innerText = cssRules\r\n\r\n $style = createElement('style', attrs)\r\n\r\n document.head.appendChild($style)\r\n\r\n return $style\r\n}\r\n\r\nexport default injectCSS\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 加载 CSS 文件并在加载时返回 Promise\r\n * ========================================================================\r\n * @method loadCSS\r\n * @since 1.7.0\r\n * @param {String} cssURL\r\n * @param {String} [media]\r\n * @return {Promise}\r\n */\r\nconst loadCSS = (cssURL, media) => {\r\n const attrs = {\r\n type: 'text/css',\r\n rel: 'stylesheet',\r\n href: cssURL + '?random=' + new Date().getTime()\r\n }\r\n\r\n if (media) {\r\n attrs.media = media\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const $link = createElement('link', attrs)\r\n\r\n $link.onload = () => {\r\n resolve($link)\r\n }\r\n $link.onerror = reject\r\n\r\n document.head.append($link)\r\n })\r\n}\r\n\r\nexport default loadCSS\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 加载JavaScript文件并在加载时返回Promise\r\n * ========================================================================\r\n * @method loadScript\r\n * @since 1.7.0\r\n * @param {String} jsURL\r\n * @return {Promise}\r\n */\r\nconst loadScript = (jsURL) => {\r\n return new Promise((resolve, reject) => {\r\n const $script = createElement('script', {\r\n type: 'text/javascript',\r\n src: jsURL + '?random=' + new Date().getTime()\r\n })\r\n\r\n $script.onload = () => {\r\n resolve($script)\r\n }\r\n $script.onerror = reject\r\n\r\n document.body.append($script)\r\n })\r\n}\r\n\r\nexport default loadScript\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 尝试在请求(第三方)资源之前预解析域名。\r\n * ========================================================================\r\n * @method dnsPrefetch\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/en-US/docs/Web/Performance/dns-prefetch\r\n * @param {String} domain\r\n */\r\nconst dnsPrefetch = (domain) => {\r\n if (!domain) {\r\n return false\r\n }\r\n\r\n document.head.appendChild(\r\n createElement('link', {\r\n rel: 'dns-prefetch preconnect',\r\n href: domain\r\n })\r\n )\r\n}\r\n\r\nexport default dnsPrefetch\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 链接预取(重要)资源\r\n * ========================================================================\r\n * @method prefetch\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/en-US/docs/Glossary/Prefetch\r\n * @param {String} url\r\n */\r\nconst prefetch = (url = '') => {\r\n if (!url) {\r\n return false\r\n }\r\n\r\n document.head.append(\r\n createElement('link', {\r\n href: url,\r\n rel: 'prefetch'\r\n })\r\n )\r\n}\r\n\r\nexport default prefetch\r\n","import extend from './utils/lang/extend'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 链接预加载(重要)资源\r\n * ========================================================================\r\n * @method preload\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/HTML/Attributes/rel/preload\r\n * @param {String} url\r\n * @param {Object} options\r\n * @param {String} options.as\r\n * @param {String} options.type\r\n * @param {String} [options.media]\r\n * @param {String} [options.crossorigin]\r\n */\r\nconst preload = (url, options = {}) => {\r\n const attrs = {\r\n href: url || '',\r\n rel: 'preload'\r\n }\r\n\r\n if (!url) {\r\n return false\r\n }\r\n\r\n extend(attrs, options)\r\n\r\n document.head.append(createElement('link', attrs))\r\n}\r\n\r\nexport default preload\r\n","import isElement from './isElement'\r\nimport isMatched from './isMatched'\r\nimport getNextSibling from './getNextSibling'\r\n\r\n/**\r\n * 通过过滤器获取 DOM 元素匹配的后面的邻居元素节点\r\n * ========================================================================\r\n * @method getNextSiblingBy\r\n * @param {HTMLElement} el\r\n * @param {Function|String} filter\r\n * @return {HTMLElement|null}\r\n */\r\nconst getNextSiblingBy = (el, filter) => {\r\n let $el = isElement(el) ? el : null\r\n\r\n while ($el) {\r\n $el = getNextSibling($el)\r\n\r\n if (isMatched($el, filter)) {\r\n return $el\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\nexport default getNextSiblingBy\r\n","import isElement from './isElement'\r\nimport isMatched from './isMatched'\r\nimport getPreviousSibling from './getPreviousSibling'\r\n\r\n/**\r\n * 通过过滤器获取 DOM 元素匹配的前面的邻居元素节点\r\n * ========================================================================\r\n * @method getPreviousSiblingBy\r\n * @param {HTMLElement} el\r\n * @param {Function|String} filter\r\n * @return {HTMLElement|null}\r\n */\r\nconst getPreviousSiblingBy = (el, filter) => {\r\n let $el = isElement(el) ? el : null\r\n\r\n while ($el) {\r\n $el = getPreviousSibling($el)\r\n\r\n if (isMatched($el, filter)) {\r\n return $el\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\nexport default getPreviousSiblingBy\r\n","import getNextSibling from '../getNextSibling'\r\nimport getPreviousSibling from '../getPreviousSibling'\r\nimport getNextSiblingBy from '../getNextSiblingBy'\r\nimport getPreviousSiblingBy from '../getPreviousSiblingBy'\r\nimport getNextSiblings from '../getNextSiblings'\r\nimport getPreviousSiblings from '../getPreviousSiblings'\r\nimport getSiblings from '../getSiblings'\r\nimport next from '../next'\r\nimport prev from '../prev'\r\nimport nextBy from '../nextBy'\r\nimport prevBy from '../prevBy'\r\nimport nextAll from '../nextAll'\r\nimport prevAll from '../prevAll'\r\nimport siblings from '../siblings'\r\n\r\nconst DOM = {\r\n getNextSibling,\r\n getPreviousSibling,\r\n getNextSiblingBy,\r\n getPreviousSiblingBy,\r\n getNextSiblings,\r\n getPreviousSiblings,\r\n getSiblings,\r\n next,\r\n prev,\r\n nextBy,\r\n prevBy,\r\n nextAll,\r\n prevAll,\r\n siblings\r\n}\r\n\r\nexport default DOM\r\n","import getNextSibling from './getNextSibling'\r\n\r\n/**\r\n * 获取 DOM 元素的后一个邻居元素节点\r\n * ========================================================================\r\n * @method next\r\n * @alias getNextSibling\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/nextElementSibling\r\n * @param {HTMLElement} el\r\n * @return {Element|null}\r\n */\r\nconst next = (el) => {\r\n return getNextSibling(el)\r\n}\r\n\r\nexport default next\r\n","import getPreviousSibling from './getPreviousSibling'\r\n\r\n/**\r\n * 获取 DOM 元素的前一个邻居元素节点\r\n * ========================================================================\r\n * @method prev\r\n * @alias getPreviousSibling\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/previousElementSibling\r\n * @param {HTMLElement} el\r\n * @return {Element|null}\r\n */\r\nconst prev = (el) => {\r\n return getPreviousSibling(el)\r\n}\r\n\r\nexport default prev\r\n","import getNextSiblingBy from './getNextSiblingBy'\r\n\r\n/**\r\n * 通过过滤器获取 DOM 元素匹配的后面的邻居元素节点\r\n * ========================================================================\r\n * @method nextBy\r\n * @alias getNextSiblingBy\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/nextElementSibling\r\n * @param {HTMLElement} el\r\n * @param {Function|String} filter\r\n * @return {HTMLElement|null}\r\n */\r\nconst nextBy = (el, filter) => {\r\n return getNextSiblingBy(el, filter)\r\n}\r\n\r\nexport default nextBy\r\n","import getPreviousSiblingBy from './getPreviousSiblingBy'\r\n\r\n/**\r\n * 通过过滤器获取 DOM 元素匹配的前面的邻居元素节点\r\n * ========================================================================\r\n * @method prevBy\r\n * @alias getPreviousSiblingBy\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/previousElementSibling\r\n * @param {HTMLElement} el\r\n * @param {Function|String} filter\r\n * @return {Element|null}\r\n */\r\nconst prevBy = (el, filter) => {\r\n return getPreviousSiblingBy(el, filter)\r\n}\r\n\r\nexport default prevBy\r\n","import getNextSiblings from './getNextSiblings'\r\n\r\n/**\r\n * 获取 DOM 元素的后面所有邻居元素节点。\r\n * ========================================================================\r\n * @method nextAll\r\n * @alias getNextSiblings\r\n * @param {HTMLElement} el\r\n * @return {Array}\r\n */\r\nconst nextAll = (el) => {\r\n return getNextSiblings(el)\r\n}\r\n\r\nexport default nextAll\r\n","import getPreviousSiblings from './getPreviousSiblings'\r\n\r\n/**\r\n * 获取 DOM 元素的前面所有邻居元素节点。\r\n * ========================================================================\r\n * @method prevAll\r\n * @alias getPreviousSiblings\r\n * @param {HTMLElement} el\r\n * @return {Array}\r\n */\r\nconst prevAll = (el) => {\r\n return getPreviousSiblings(el)\r\n}\r\n\r\nexport default prevAll\r\n","/**\r\n * 检测数据是否为 Number 类型\r\n * ========================================================================\r\n * @method isNumber\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isNumber = (o) => {\r\n return typeof o === 'number'\r\n}\r\n\r\nexport default isNumber\r\n","import isString from './utils/types/isString'\r\nimport isNumber from './utils/types/isNumber'\r\n\r\n/**\r\n * CSS 单位值和数值互换\r\n * ========================================================================\r\n * @method pixel\r\n * @since 1.2.0\r\n * @param {String|Number} val\r\n * @return {Number|String|Array|Boolean}\r\n */\r\nconst pixel = (val) => {\r\n const parse = (str) => {\r\n const value = str.replace(/\\D*$/i, '')\r\n\r\n if (value.indexOf('.') > -1) {\r\n return Math.ceil(Number(value))\r\n } else {\r\n return Number(value)\r\n }\r\n }\r\n\r\n if (!isString(val) && !isNumber(val)) {\r\n return false\r\n }\r\n\r\n if (isString(val)) {\r\n if (val.indexOf(' ') > -1) {\r\n return val.split(' ').map((item) => pixel(item))\r\n } else {\r\n return parse(val)\r\n }\r\n } else {\r\n return `${val}px`\r\n }\r\n}\r\n\r\nexport default pixel\r\n","import isElement from './utils/types/isElement'\r\nimport pixel from './pixel'\r\nimport getStyle from './getStyle'\r\nimport offset from './offset'\r\n\r\n/**\r\n * 获取 DOM 节点的相关尺寸信息,返回相关尺寸数据的对象。\r\n * ========================================================================\r\n * @method _getElementSizes\r\n * @param {HTMLElement} el\r\n * @return {Object|null}\r\n * @private\r\n */\r\nconst _getElementSizes = (el) => {\r\n let marginTop\r\n let marginBottom\r\n let marginLeft\r\n let marginRight\r\n\r\n let borderTop\r\n let borderBottom\r\n let borderLeft\r\n let borderRight\r\n\r\n let paddingTop\r\n let paddingBottom\r\n let paddingLeft\r\n let paddingRight\r\n\r\n let offsetSize\r\n let offsetHeight\r\n let offsetWidth\r\n\r\n let rect\r\n\r\n if (!isElement(el)) {\r\n return null\r\n }\r\n\r\n marginTop = pixel(getStyle(el, 'margin-top'))\r\n marginBottom = pixel(getStyle(el, 'margin-bottom'))\r\n marginLeft = pixel(getStyle(el, 'margin-left'))\r\n marginRight = pixel(getStyle(el, 'margin-right'))\r\n\r\n borderTop = pixel(getStyle(el, 'border-top-width'))\r\n borderBottom = pixel(getStyle(el, 'border-bottom-width'))\r\n borderLeft = pixel(getStyle(el, 'border-left-width'))\r\n borderRight = pixel(getStyle(el, 'border-right-width'))\r\n\r\n paddingTop = pixel(getStyle(el, 'padding-top'))\r\n paddingBottom = pixel(getStyle(el, 'padding-bottom'))\r\n paddingLeft = pixel(getStyle(el, 'padding-left'))\r\n paddingRight = pixel(getStyle(el, 'padding-right'))\r\n\r\n offsetSize = offset(el)\r\n offsetHeight = offsetSize.height\r\n offsetWidth = offsetSize.width\r\n\r\n rect = el.getBoundingClientRect()\r\n\r\n return {\r\n marginTop,\r\n marginBottom,\r\n marginLeft,\r\n marginRight,\r\n borderTop,\r\n borderBottom,\r\n borderLeft,\r\n borderRight,\r\n paddingTop,\r\n paddingBottom,\r\n paddingLeft,\r\n paddingRight,\r\n offsetHeight,\r\n offsetWidth,\r\n rect\r\n }\r\n}\r\n\r\nexport default _getElementSizes\r\n","import isUndefined from './utils/types/isUndefined'\r\nimport isFunction from './utils/types/isFunction'\r\nimport pixel from './pixel'\r\nimport isElement from './isElement'\r\nimport _getElementSizes from './_getElementSizes'\r\nimport setStyle from './setStyle'\r\n\r\n/**\r\n * 获取或设置 DOM 元素的 innerHeight 值;\r\n * innerHeight = style.height + padding 高度(paddingTop + paddingBottom)\r\n * ========================================================================\r\n * @method innerHeight\r\n * @param {HTMLElement} el\r\n * @param {Number|Function} [val]\r\n * @return {Number|*}\r\n */\r\nconst innerHeight = (el, val) => {\r\n let height\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n const { borderTop, borderBottom, paddingTop, paddingBottom, offsetHeight } =\r\n _getElementSizes(el)\r\n\r\n if (isFunction(val)) {\r\n return val(el, {\r\n borderTop,\r\n borderBottom,\r\n paddingTop,\r\n paddingBottom,\r\n offsetHeight\r\n })\r\n }\r\n\r\n if (!isUndefined(val)) {\r\n height = offsetHeight - (borderTop + borderBottom)\r\n\r\n /* istanbul ignore else */\r\n if (height !== val) {\r\n setStyle(el, 'height', pixel(val - (paddingTop + paddingBottom)))\r\n }\r\n } else {\r\n return offsetHeight - (borderTop + borderBottom)\r\n }\r\n}\r\n\r\nexport default innerHeight\r\n","import isUndefined from './utils/types/isUndefined'\r\nimport isFunction from './utils/types/isFunction'\r\nimport pixel from './pixel'\r\nimport isElement from './isElement'\r\nimport _getElementSizes from './_getElementSizes'\r\nimport setStyle from './setStyle'\r\n\r\n/**\r\n * 获取或设置 DOM 元素的 innerWidth 值;\r\n * innerWidth = style.height + padding 宽度(paddingRight + paddingLeft)\r\n * ========================================================================\r\n * @method innerHeight\r\n * @param {HTMLElement} el\r\n * @param {Number|Function} [val]\r\n * @return {Number|*}\r\n */\r\nconst innerWidth = (el, val) => {\r\n let width\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n const { borderLeft, borderRight, paddingLeft, paddingRight, offsetWidth } =\r\n _getElementSizes(el)\r\n\r\n if (isFunction(val)) {\r\n return val(el, {\r\n borderLeft,\r\n borderRight,\r\n paddingLeft,\r\n paddingRight,\r\n offsetWidth\r\n })\r\n }\r\n\r\n if (!isUndefined(val)) {\r\n width = offsetWidth - (borderLeft + borderRight)\r\n\r\n /* istanbul ignore else */\r\n if (width !== val) {\r\n setStyle(el, 'width', pixel(val - (paddingLeft + paddingRight)))\r\n }\r\n } else {\r\n return offsetWidth - (borderLeft + borderRight)\r\n }\r\n}\r\n\r\nexport default innerWidth\r\n","import isUndefined from './utils/types/isUndefined'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isBoolean from './utils/types/isBoolean'\r\nimport pixel from './pixel'\r\nimport isElement from './isElement'\r\nimport _getElementSizes from './_getElementSizes'\r\nimport setStyle from './setStyle'\r\n\r\n/**\r\n * 获取 DOM 元素的 outerHeight 值\r\n * ========================================================================\r\n * @method outerHeight\r\n * @param {HTMLElement} el\r\n * @param {Number|String|Function|Boolean} [val]\r\n * @param {Boolean} [includeMargin]\r\n * @return {Number|*}\r\n */\r\nconst outerHeight = (el, val, includeMargin = false) => {\r\n let height\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n const {\r\n marginTop,\r\n marginBottom,\r\n borderTop,\r\n borderBottom,\r\n paddingTop,\r\n paddingBottom,\r\n offsetHeight\r\n } = _getElementSizes(el)\r\n\r\n // val 为 Function 类型,用来获取自定义的 outerHeight\r\n if (isFunction(val)) {\r\n return val(el, {\r\n marginTop,\r\n marginBottom,\r\n borderTop,\r\n borderBottom,\r\n paddingTop,\r\n paddingBottom,\r\n offsetHeight\r\n })\r\n }\r\n\r\n // 有设置 val 参数\r\n if (!isUndefined(val)) {\r\n height = offsetHeight\r\n\r\n // 获取 outerHeight,包含边距\r\n if (isBoolean(val)) {\r\n includeMargin = val\r\n\r\n /* istanbul ignore else */\r\n if (includeMargin) {\r\n height += marginTop + marginBottom\r\n }\r\n\r\n return height\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (height !== val) {\r\n height = val - (borderTop + borderBottom + paddingTop + paddingBottom)\r\n\r\n // 设置 outerHeight,包含边距\r\n /* istanbul ignore else */\r\n if (includeMargin) {\r\n height -= marginTop + marginBottom\r\n }\r\n\r\n setStyle(el, 'height', pixel(height))\r\n }\r\n } else {\r\n return offsetHeight\r\n }\r\n}\r\n\r\nexport default outerHeight\r\n","import isUndefined from './utils/types/isUndefined'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isBoolean from './utils/types/isBoolean'\r\nimport pixel from './pixel'\r\nimport isElement from './isElement'\r\nimport _getElementSizes from './_getElementSizes'\r\nimport setStyle from './setStyle'\r\n\r\n/**\r\n * 获取 DOM 元素的 outerWidth 值\r\n * ========================================================================\r\n * @method outerWidth\r\n * @param {HTMLElement} el\r\n * @param {Number|String|Function|Boolean} [val]\r\n * @param {Boolean} [includeMargin]\r\n * @return {Number|*}\r\n */\r\nconst outerWidth = (el, val, includeMargin = false) => {\r\n let width\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n const {\r\n marginLeft,\r\n marginRight,\r\n borderLeft,\r\n borderRight,\r\n paddingLeft,\r\n paddingRight,\r\n offsetWidth\r\n } = _getElementSizes(el)\r\n\r\n // val 为 Function 类型,用来获取自定义的 outerWidth\r\n if (isFunction(val)) {\r\n return val(el, {\r\n marginLeft,\r\n marginRight,\r\n borderLeft,\r\n borderRight,\r\n paddingLeft,\r\n paddingRight,\r\n offsetWidth\r\n })\r\n }\r\n\r\n // 设置了 val 参数\r\n if (!isUndefined(val)) {\r\n width = offsetWidth\r\n\r\n // 获取 outerWidth,包含边距\r\n if (isBoolean(val)) {\r\n includeMargin = val\r\n\r\n /* istanbul ignore else */\r\n if (includeMargin) {\r\n width += marginLeft + marginRight\r\n }\r\n\r\n return width\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (width !== val) {\r\n width = val - (borderLeft + borderRight + paddingLeft + paddingRight)\r\n\r\n /* istanbul ignore else */\r\n if (includeMargin) {\r\n width -= marginLeft + marginRight\r\n }\r\n\r\n setStyle(el, 'width', pixel(width))\r\n }\r\n } else {\r\n return offsetWidth\r\n }\r\n}\r\n\r\nexport default outerWidth\r\n","import getViewportHeight from '../getViewportHeight'\r\nimport getViewportWidth from '../getViewportWidth'\r\nimport getDocumentHeight from '../getDocumentHeight'\r\nimport getDocumentWidth from '../getDocumentWidth'\r\nimport getScreenHeight from '../getScreenHeight'\r\nimport getScreenWidth from '../getScreenWidth'\r\nimport getScrollbarWidth from '../getScrollbarWidth'\r\nimport innerHeight from '../innerHeight'\r\nimport innerWidth from '../innerWidth'\r\nimport outerHeight from '../outerHeight'\r\nimport outerWidth from '../outerWidth'\r\nimport height from '../height'\r\nimport width from '../width'\r\nimport sizes from '../sizes'\r\n\r\nconst DOM = {\r\n getViewportHeight,\r\n getViewportWidth,\r\n getDocumentHeight,\r\n getDocumentWidth,\r\n getScreenHeight,\r\n getScreenWidth,\r\n getScrollbarWidth,\r\n innerHeight,\r\n innerWidth,\r\n outerHeight,\r\n outerWidth,\r\n height,\r\n width,\r\n sizes\r\n}\r\n\r\nexport default DOM\r\n","import getViewportHeight from './getViewportHeight'\r\n\r\n/**\r\n * 获取当前页面(滚动条)的高度\r\n * ========================================================================\r\n * @method getDocumentHeight\r\n * @return {Number}\r\n */\r\nconst getDocumentHeight = () => {\r\n const scrollHeight =\r\n document.documentElement.scrollHeight || document.body.scrollHeight\r\n return Math.max(scrollHeight, getViewportHeight())\r\n}\r\n\r\nexport default getDocumentHeight\r\n","import getViewportWidth from './getViewportWidth'\r\n\r\n/**\r\n * ========================================================================\r\n * @method getDocumentWidth\r\n * @return {Number}\r\n */\r\nconst getDocumentWidth = () => {\r\n const scrollWidth =\r\n document.documentElement.scrollWidth || document.body.scrollWidth\r\n return Math.max(scrollWidth, getViewportWidth())\r\n}\r\n\r\nexport default getDocumentWidth\r\n","/**\r\n * 获取显示器屏幕分辨率高度\r\n * ========================================================================\r\n * @method getScreenHeight\r\n * @since 1.4.0\r\n * @return {number}\r\n */\r\nconst getScreenHeight = () => {\r\n return window.screen.height\r\n}\r\n\r\nexport default getScreenHeight\r\n","/**\r\n * 获取显示器屏幕分辨率宽度\r\n * ========================================================================\r\n * @method getScreenWidth\r\n * @since 1.4.0\r\n * @return {number}\r\n */\r\nconst getScreenWidth = () => {\r\n return window.screen.width\r\n}\r\n\r\nexport default getScreenWidth\r\n","import isNumber from './utils/types/isNumber'\r\nimport isString from './utils/types/isString'\r\nimport isUndefined from './utils/types/isUndefined'\r\nimport isElement from './isElement'\r\nimport setStyle from './setStyle'\r\nimport offset from './offset'\r\n\r\n/**\r\n * 获取或设置 DOM 元素的高度。\r\n * ========================================================================\r\n * @method height\r\n * @param {HTMLElement} el\r\n * @param {String|Number} [val]\r\n * @return {Number|*}\r\n */\r\nconst height = (el, val) => {\r\n let value\r\n\r\n if (\r\n !isElement(el) ||\r\n (!isUndefined(val) && !isNumber(val) && !isString(val))\r\n ) {\r\n return false\r\n }\r\n\r\n if (isUndefined(val)) {\r\n return offset(el).height\r\n } else {\r\n if (isNumber(val)) {\r\n value = `${val}px`\r\n } else {\r\n value = `${val.replace(/\\D/gi, '')}px`\r\n }\r\n\r\n setStyle(el, 'height', value)\r\n }\r\n}\r\n\r\nexport default height\r\n","import isNumber from './utils/types/isNumber'\r\nimport isString from './utils/types/isString'\r\nimport isUndefined from './utils/types/isUndefined'\r\nimport isElement from './isElement'\r\nimport setStyle from './setStyle'\r\nimport offset from './offset'\r\n\r\n/**\r\n * 获取或设置 DOM 元素的宽度。\r\n * ========================================================================\r\n * @method width\r\n * @param {HTMLElement} el\r\n * @param {Number|String} [val]\r\n * @return {Number|*}\r\n */\r\nconst width = (el, val) => {\r\n let value\r\n\r\n /* istanbul ignore else */\r\n if (\r\n !isElement(el) ||\r\n (!isUndefined(val) && !isNumber(val) && !isString(val))\r\n ) {\r\n return false\r\n }\r\n\r\n if (isUndefined(val)) {\r\n return offset(el).width\r\n } else {\r\n if (isNumber(val)) {\r\n value = `${val}px`\r\n } else {\r\n value = `${val.replace(/\\D/gi, '')}px`\r\n }\r\n\r\n setStyle(el, 'width', value)\r\n }\r\n}\r\n\r\nexport default width\r\n","import _getElementSizes from './_getElementSizes'\r\nimport innerHeight from './innerHeight'\r\nimport innerWidth from './innerWidth'\r\nimport outerHeight from './outerHeight'\r\nimport outerWidth from './outerWidth'\r\n\r\n/**\r\n * 获取 DOM 节点的相关尺寸信息,返回相关尺寸数据的对象。\r\n * ========================================================================\r\n * @method sizes\r\n * @param {HTMLElement} el\r\n * @return {Object|Boolean}\r\n */\r\nconst sizes = (el) => {\r\n const elSizes = _getElementSizes(el)\r\n\r\n if (!elSizes) {\r\n return false\r\n }\r\n\r\n return {\r\n offsetHeight: elSizes.offsetHeight,\r\n offsetWidth: elSizes.offsetWidth,\r\n innerHeight: innerHeight(el),\r\n innerWidth: innerWidth(el),\r\n outerHeight: outerHeight(el),\r\n outerWidth: outerWidth(el),\r\n margin: {\r\n top: elSizes.marginTop,\r\n right: elSizes.marginRight,\r\n bottom: elSizes.marginBottom,\r\n left: elSizes.marginLeft\r\n },\r\n border: {\r\n top: elSizes.borderTop,\r\n right: elSizes.borderRight,\r\n bottom: elSizes.borderBottom,\r\n left: elSizes.borderLeft\r\n },\r\n padding: {\r\n top: elSizes.paddingTop,\r\n right: elSizes.paddingRight,\r\n bottom: elSizes.paddingBottom,\r\n left: elSizes.paddingLeft\r\n },\r\n rect: elSizes.rect\r\n }\r\n}\r\n\r\nexport default sizes\r\n","import isString from './utils/types/isString'\r\nimport isObject from './utils/types/isObject'\r\nimport isElement from './isElement'\r\n\r\n/**\r\n * 给 DOM 元素批量添加 CSS 样式\r\n * ========================================================================\r\n * @methods setStyles\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleDeclaration/cssText\r\n * @param {HTMLElement} el\r\n * @param {Object|String} styles\r\n */\r\nconst setStyles = (el, styles) => {\r\n let rules = ''\r\n\r\n if (!isElement(el) || (!isObject(styles) && !isString(styles))) {\r\n return false\r\n }\r\n\r\n if (isObject(styles)) {\r\n Object.keys(styles).forEach((prop) => {\r\n const val = styles[prop]\r\n rules += `${prop}:${val};`\r\n })\r\n } else {\r\n rules = styles\r\n }\r\n\r\n el.style.cssText += rules\r\n}\r\n\r\nexport default setStyles\r\n","/**\r\n * 获取 CSS 变量(属性)值。返回一个 DOMString ,其中包含请求的 CSS 属性的值。\r\n * ========================================================================\r\n * @method getPropperty\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/CSSStyleDeclaration/getPropertyValue\r\n * @param {String} prop\r\n * @return {String}\r\n */\r\nconst getProperty = (prop) => {\r\n const documentElement = document.documentElement\r\n return documentElement.style.getPropertyValue(prop)\r\n}\r\n\r\nexport default getProperty\r\n","import isString from './utils/types/isString'\r\n\r\n/**\r\n * 为一个声明了 CSS 样式的对象设置一个新的值。\r\n * ========================================================================\r\n * @method setProperty\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/CSSStyleDeclaration/setProperty\r\n * @param {String} prop\r\n * @param {String} value\r\n */\r\nconst setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n\r\n if (!isString(prop) || !isString(value)) {\r\n return false\r\n }\r\n\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import getStyle from '../getStyle'\r\nimport setStyle from '../setStyle'\r\nimport getStyles from '../getStyles'\r\nimport setStyles from '../setStyles'\r\nimport getProperty from '../getProperty'\r\nimport setProperty from '../setProperty'\r\nimport css from '../css'\r\nimport prop from '../prop'\r\nimport show from '../show'\r\nimport hide from '../hide'\r\nimport toggle from '../toggle'\r\n\r\nconst DOM = {\r\n getStyle,\r\n setStyle,\r\n getStyles,\r\n setStyles,\r\n getProperty,\r\n setProperty,\r\n css,\r\n prop,\r\n show,\r\n hide,\r\n toggle\r\n}\r\n\r\nexport default DOM\r\n","import isString from './utils/types/isString'\r\nimport isObject from './utils/types/isObject'\r\nimport isUndefined from './utils/types/isUndefined'\r\nimport isArray from './utils/types/isArray'\r\nimport isElement from './isElement'\r\nimport setStyle from './setStyle'\r\nimport getStyle from './getStyle'\r\nimport setStyles from './setStyles'\r\nimport getStyles from './getStyles'\r\n\r\n/**\r\n * 用来设置或者查询 DOM 元素的 CSS 样式\r\n * ========================================================================\r\n * @method css\r\n * @param {HTMLElement} el\r\n * @param {String|Object|Array} attr\r\n * @param {String} [value]\r\n * @return {Object|String|*}\r\n */\r\nconst css = (el, attr, value) => {\r\n if (\r\n !isElement(el) ||\r\n (!isString(attr) && !isObject(attr) && !isArray(attr))\r\n ) {\r\n return false\r\n }\r\n\r\n if (isString(attr)) {\r\n if (!isUndefined(value)) {\r\n setStyle(el, attr, value)\r\n } else {\r\n return getStyle(el, attr)\r\n }\r\n } else if (isArray(attr)) {\r\n return getStyles(el, attr)\r\n } else {\r\n setStyles(el, attr)\r\n }\r\n}\r\n\r\nexport default css\r\n","import isUndefined from './utils/types/isUndefined'\r\nimport getProperty from './getProperty'\r\nimport setProperty from './setProperty'\r\n\r\n/**\r\n * 设置或获取 CSS 样式变量\r\n * ========================================================================\r\n * @method prop\r\n * @param {String} prop\r\n * @param {String} [value]\r\n * @return {String|*}\r\n */\r\nconst prop = (prop, value) => {\r\n if (!isUndefined(value)) {\r\n setProperty(prop, value)\r\n } else {\r\n return getProperty(prop)\r\n }\r\n}\r\n\r\nexport default prop\r\n","import isElement from './isElement'\r\nimport getStyle from './getStyle'\r\nimport show from './show'\r\nimport hide from './hide'\r\n\r\n/**\r\n * 隐藏或者显示指定 DOM 元素\r\n * ========================================================================\r\n * @method toggle\r\n * @param {HTMLElement} el\r\n */\r\nconst toggle = (el) => {\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n if (getStyle(el, 'display') !== 'none') {\r\n hide(el)\r\n } else {\r\n show(el)\r\n }\r\n}\r\n\r\nexport default toggle\r\n","/**\r\n * 返回 URL 地址中的查询参数(键/值)对象\r\n * ====================================================\r\n * @method getURLSearchParams\r\n * @param {String} [url] - 可选参数,URL 地址\r\n * @returns {Object}\r\n */\r\nconst getURLSearchParams = (url = location.search) => {\r\n const pattern = /([^?=&]+)(=([^&]*))/g\r\n return (url.match(pattern) || []).reduce((a, v) => {\r\n const index = v.indexOf('=')\r\n const key = v.slice(0, index)\r\n const value = v.slice(index + 1)\r\n return (a[key] = value.replace(/\\+/g, ' ')), a\r\n }, {})\r\n}\r\n\r\nexport default getURLSearchParams\r\n","import isObject from './utils/types/isObject'\r\n\r\n/**\r\n * 将普通对象类型的数据转化成 URL 地址中的查询参数字符串\r\n * ====================================================\r\n * @method toURLSearchParams\r\n * @param {Object} o\r\n * @return {string}\r\n */\r\nconst toURLSearchParams = (o) => {\r\n const params = []\r\n const keys = Object.keys(o)\r\n\r\n if (!isObject(o)) {\r\n return ''\r\n }\r\n\r\n if (URLSearchParams) {\r\n return new URLSearchParams(o).toString()\r\n }\r\n\r\n keys.forEach((key) => {\r\n params.push(`${key}=${o[key]}`)\r\n })\r\n\r\n return decodeURIComponent(params.join('&'))\r\n}\r\n\r\nexport default toURLSearchParams\r\n","import copyToClipboard from '../copyToClipboard'\r\nimport createAndDownloadFile from '../createAndDownloadFile'\r\nimport fullscreen from '../fullscreen'\r\nimport getSelectedText from '../getSelectedText'\r\nimport getURLProps from '../getURLProps'\r\nimport getURLSearchParams from '../getURLSearchParams'\r\nimport getURLSearchParamByName from '../getURLSearchParamByName'\r\nimport openURL from '../openURL'\r\nimport pixel from '../pixel'\r\nimport onClickOutside from '../onClickOutside'\r\nimport redirect from '../redirect'\r\nimport serialize from '../serialize'\r\nimport toPixels from '../toPixels'\r\nimport toREM from '../toREM'\r\nimport toURLSearchParams from '../toURLSearchParams'\r\n\r\nconst DOM = {\r\n copyToClipboard,\r\n createAndDownloadFile,\r\n fullscreen,\r\n getSelectedText,\r\n getURLProps,\r\n getURLSearchParams,\r\n getURLSearchParamByName,\r\n openURL,\r\n pixel,\r\n onClickOutside,\r\n redirect,\r\n serialize,\r\n toREM,\r\n toPixels,\r\n toURLSearchParams\r\n}\r\n\r\nexport default DOM\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 复制文本到粘贴板\r\n * =============================================================\r\n * @method copyToClipboard\r\n * @since 1.4.0\r\n * @param {String} str - 要复制的文本\r\n */\r\nconst copyToClipboard = (str) => {\r\n const el = createElement('textarea', {\r\n value: str,\r\n readonly: 'position:absolute;left:-99999px;',\r\n style: ''\r\n })\r\n const $body = document.body\r\n let selected\r\n\r\n $body.appendChild(el)\r\n selected =\r\n document.getSelection().rangeCount > 0\r\n ? document.getSelection().getRangeAt(0)\r\n : false\r\n el.select()\r\n document.execCommand('copy')\r\n $body.removeChild(el)\r\n\r\n if (selected) {\r\n document.getSelection().removeAllRanges()\r\n document.getSelection().addRange(selected)\r\n }\r\n}\r\n\r\nexport default copyToClipboard\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * (通过文本)创建二进制的文件并下载文件\r\n * ====================================================\r\n * @method createAndDownloadFile\r\n * @since 1.4.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Blob/Blob\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/URL/createObjectURL_static\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/URL/revokeObjectURL_static\r\n * @param {String} fileName 文件名\r\n * @param {String|Blob} content 文件内容\r\n */\r\nconst createAndDownloadFile = (fileName, content) => {\r\n const $blob = new Blob([content])\r\n const $anchor = createElement('a', {\r\n download: fileName,\r\n href: URL.createObjectURL($blob)\r\n })\r\n\r\n $anchor.click()\r\n URL.revokeObjectURL($blob)\r\n}\r\n\r\nexport default createAndDownloadFile\r\n","import getEl from './getEl'\r\n\r\n/**\r\n * 指定(某个DOM元素)进入或者退出全屏模式\r\n * ========================================================================\r\n * @method fullscreen\r\n * @since 1.6.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/requestFullscreen\r\n * @param {Boolean} [mode]\r\n * @param {String} [el]\r\n */\r\nconst fullscreen = (mode = true, el = 'body') => {\r\n const $el = getEl(el)\r\n mode ? $el.requestFullscreen() : document.exitFullscreen()\r\n}\r\n\r\nexport default fullscreen\r\n","/**\r\n * 获取页面中选中的文本内容\r\n * ========================================================================\r\n * @method getSelectedText\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Window/getSelection\r\n * @returns {String}\r\n */\r\nconst getSelectedText = () => {\r\n return window.getSelection().toString()\r\n}\r\n\r\nexport default getSelectedText\r\n","import _getURLPattern from './_getURLPattern'\r\n\r\n/**\r\n * 解析 URL 地址中的相关属性,返回解析后的对象数据\r\n * @method getURLProps\r\n * @since 1.4.0\r\n * @param {String} url\r\n * @return {Object}\r\n */\r\nconst getURLProps = (url = location.href) => {\r\n const pattern = _getURLPattern()\r\n const matches = pattern.exec(url)\r\n const protocol = matches[1] ? matches[1].replace(':', '') : ''\r\n const host = matches[5]\r\n\r\n return {\r\n protocol,\r\n username: matches[3] || '',\r\n password: matches[4] || '',\r\n hostname: matches[6],\r\n port: matches[13] ? matches[13].replace(':', '') : '',\r\n host: matches[5],\r\n pathname: matches[15],\r\n search: matches[17] || '',\r\n path: matches[14],\r\n hash: matches[18] || '',\r\n href: url,\r\n origin: protocol + '://' + host\r\n }\r\n}\r\n\r\nexport default getURLProps\r\n","const _getURLPattern = () => {\r\n const protocol = '(\\\\w+:)?'\r\n const user = '([^\\\\/\\\\?\\\\#\\\\:]+)'\r\n const password = '(.+)'\r\n const auth = '(' + user + ':' + password + '@)?'\r\n const address = '(([a-z\\\\d]([a-z\\\\d-]*[a-z\\\\d])*(\\\\.[a-z]{2,})?)+)'\r\n const ip = '((\\\\d{1,3}\\\\.){3}\\\\d{1,3})'\r\n const hostname = '(' + address + '|' + ip + ')'\r\n const port = '(\\\\:\\\\d+)?'\r\n const host = '(' + hostname + port + ')'\r\n const pathname = '((\\\\/[-a-z\\\\d%_.~+]*)*)'\r\n const search = '(\\\\?[;&a-z\\\\d%_.~+=-]*)?'\r\n const path = '(' + pathname + search + ')*'\r\n const hash = '(\\\\#[-a-z\\\\d_]*)?'\r\n const pattern = '^' + protocol + '\\\\/\\\\/' + auth + host + path + hash + '$'\r\n\r\n return new RegExp(pattern, 'i')\r\n}\r\n\r\nexport default _getURLPattern\r\n","import hasOwn from './utils/lang/hasOwn'\r\nimport getURLSearchParams from './getURLSearchParams'\r\n\r\n/**\r\n * 获取 URL 地址中查询字符串的某个值\r\n * @method getURLSearchParamByName\r\n * @since 1.4.0\r\n * @param {String} prop\r\n * @return {string}\r\n */\r\nconst getURLSearchParamByName = (prop) => {\r\n const params = getURLSearchParams()\r\n\r\n return hasOwn(params, prop) ? params[prop] : ''\r\n}\r\n\r\nexport default getURLSearchParamByName\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 新窗口打开指定 URL 地址\r\n * =============================================================\r\n * @method openURL\r\n * @since 1.4.0\r\n * @param url\r\n */\r\nconst openURL = (url, target = '_blank') => {\r\n const CSSRules =\r\n 'position:absolute;z-index:2;top:0;left:-99999px;opacity:0;overflow:hidden;'\r\n const $anchor = createElement('a', {\r\n href: url,\r\n target,\r\n style: CSSRules\r\n })\r\n const $body = document.body\r\n\r\n $body.appendChild($anchor)\r\n $anchor.click()\r\n $body.removeChild($anchor)\r\n}\r\n\r\nexport default openURL\r\n","import isFunction from './utils/types/isFunction'\r\nimport isElement from './isElement'\r\nimport contains from './contains'\r\n\r\n/**\r\n * 用来处理点击 el 元素以外后执行一些操作。通常用于在弹出窗口后菜单后,点击页面其它\r\n * DOM 元素,隐藏弹出的窗口或者菜单。\r\n * ========================================================================\r\n * @method onClickOutside\r\n * @since 1.7.0\r\n * @param {HTMLElement} el\r\n * @param {Function} callback\r\n */\r\nconst onClickOutside = (el, callback) => {\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n document.addEventListener('click', (evt) => {\r\n const $target = evt?.target || null\r\n\r\n if (!contains(el, $target) && isFunction(callback)) {\r\n callback()\r\n }\r\n })\r\n}\r\n\r\nexport default onClickOutside\r\n","/**\r\n * 重定向 URL 地址\r\n * ========================================================================\r\n * @method redirect\r\n * @since 1.7.0\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Location/replace\r\n * @param {String} url\r\n * @param {Boolean} [asLink]\r\n */\r\nconst redirect = (url, asLink = true) => {\r\n asLink ? (window.location.href = url) : window.location.replace(url)\r\n}\r\n\r\nexport default redirect\r\n","import isElement from './isElement'\r\nimport toURLSearchParams from './toURLSearchParams'\r\n\r\n/**\r\n *\r\n * ========================================================================\r\n * @method serialize\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/FormData\r\n * @param {HTMLElement} formElement\r\n */\r\nconst serialize = (formElement, isParams = false) => {\r\n let serialized = {}\r\n let data\r\n\r\n if (!isElement(formElement) || formElement.tagName.toLowerCase() !== 'form') {\r\n return false\r\n }\r\n\r\n data = new FormData(formElement)\r\n\r\n if (isParams) {\r\n serialized = toURLSearchParams(data)\r\n } else {\r\n for (const [key, value] of data) {\r\n serialized[key] = value\r\n }\r\n }\r\n\r\n return serialized\r\n}\r\n\r\nexport default serialize\r\n","import isString from './utils/types/isString'\r\nimport isNumber from './utils/types/isNumber'\r\nimport getStyle from './getStyle'\r\n\r\n/**\r\n * @method toREM\r\n * @sice 1.4.0\r\n * @param {String|Number} pixels\r\n * @return {string|string}\r\n */\r\nconst toREM = (pixels, digits = 2) => {\r\n const base = parseFloat(getStyle(document.documentElement, 'font-size'))\r\n const size = isString(pixels) ? parseFloat(pixels.replace(/px/i, '')) : pixels\r\n\r\n return isNumber(size) ? `${((1 / base) * size).toFixed(digits)}rem` : ''\r\n}\r\n\r\nexport default toREM\r\n","import isString from './utils/types/isString'\r\nimport isNumber from './utils/types/isNumber'\r\nimport getStyle from './getStyle'\r\n\r\n/**\r\n * @method toPixels\r\n * @since 1.4.0\r\n * @param rem\r\n * @param digits\r\n * @return {string|string}\r\n */\r\nconst toPixels = (rem, digits = 2) => {\r\n const base = parseFloat(getStyle(document.documentElement, 'font-size'))\r\n const size = isString(rem) ? parseFloat(rem.replace(/rem/i, '')) : rem\r\n\r\n return isNumber(size) ? `${(size * base).toFixed(digits)}px` : ''\r\n}\r\n\r\nexport default toPixels\r\n","import Attributes from './attributes'\r\nimport Base from './base'\r\nimport Color from './color'\r\nimport Detect from './detect'\r\nimport DOMRect from './rect'\r\nimport Insertion from './insertion'\r\nimport Observer from './observer'\r\nimport Platform from './platform'\r\nimport Position from './position'\r\nimport Resources from './resources'\r\nimport Sibling from './sibling'\r\nimport Size from './size'\r\nimport Style from './style'\r\nimport Types from './types'\r\nimport Others from './others'\r\n\r\nconst DOM = {\r\n ...Attributes,\r\n ...Base,\r\n ...Color,\r\n ...Detect,\r\n ...DOMRect,\r\n ...Insertion,\r\n ...Observer,\r\n ...Platform,\r\n ...Position,\r\n ...Resources,\r\n ...Sibling,\r\n ...Size,\r\n ...Style,\r\n ...Types,\r\n ...Others\r\n}\r\n\r\nexport default DOM\r\n","import isCollection from '../isCollection'\r\nimport isDOM from '../isDOM'\r\nimport isElement from '../isElement'\r\nimport isFragment from '../isFragment'\r\nimport isNode from '../isNode'\r\nimport isOverflowElement from '../isOverflowElement'\r\nimport isShadowRoot from '../isShadowRoot'\r\nimport isTableElement from '../isTableElement'\r\nimport isText from '../isText'\r\n\r\nconst DOM = {\r\n isCollection,\r\n isDOM,\r\n isElement,\r\n isFragment,\r\n isNode,\r\n isOverflowElement,\r\n isShadowRoot,\r\n isTableElement,\r\n isText\r\n}\r\n\r\nexport default DOM\r\n","import isElement from './isElement'\r\nimport getStyles from './getStyles'\r\n\r\n/**\r\n * 判断 DOM 元素是否设置了 overflow 属性\r\n * ========================================================================\r\n * @method isOverflowElement\r\n * @since 1.7.0\r\n * @see https://github.com/floating-ui/floating-ui\r\n * @param {HTMLElement} el\r\n * @return {boolean}\r\n */\r\nconst isOverflowElement = (el) => {\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n const { overflow, overflowX, overflowY } = getStyles(el)\r\n\r\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX)\r\n}\r\n\r\nexport default isOverflowElement\r\n","import isElement from './isElement'\r\n\r\n/**\r\n * 判断 DOM 元素是为 table 列表类的元素\r\n * ========================================================================\r\n * @method isTableElement\r\n * @since 1.7.0\r\n * @see https://github.com/floating-ui/floating-ui\r\n * @param el\r\n * @return {boolean}\r\n */\r\nconst isTableElement = (el) => {\r\n return (\r\n isElement(el) &&\r\n ['table', 'thead', 'tbody', 'tfoot', 'tr', 'td', 'th'].includes(el.tagName)\r\n )\r\n}\r\n\r\nexport default isTableElement\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","isString","str","KEYWORDS","black","silver","gray","white","maroon","red","purple","fuchsia","green","lime","olive","yellow","navy","blue","teal","aqua","COLOR_PROPS","FROM_ELEMENT_TAGS","DISABLE_TAGS","READONLY_INPUT_TYPES","REG_RGB","REG_HEX","REG_HEX3","REG_HSL","getAttribute","el","attr","toLowerCase","style","cssText","indexOf","value","setAttribute","className","innerText","innerHTML","removeAttribute","isArray","Array","getAttributes","props","attrs","keys","length","getAttributeNames","forEach","key","hasOwn","obj","prop","hasOwnProperty","call","setAttributes","getValue","setValue","hasClass","pattern","allClass","classList","RegExp","contains","exec","addClass","add","trim","replace","removeClass","remove","isUndefined","toCamel","x","l","toUpperCase","getStyle","getComputedStyle","TAGS","isHTML","html","basic","full","slice","map","tag","join","test","stripScripts","isHTMLCollection","isFragment","fragment","isTextNode","isDOM","text","document","createTextNode","textContent","createElement","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","$child","appendChild","every","strHTML","template","childNodes","DOM","removeAttributes","replaceClass","oldCls","newCls","toggleClass","toggle","enable","disable","readonly","type","build","firstElementChild","clone","deep","cloneNode","matches","selector","sel","msMatchesSelector","getHostOrParent","host","parentNode","byId","id","querySelector","isBoolean","getEl","multiple","isMultiple","querySelectorAll","isCollection","filter","collection","callback","items","item","i","isText","isWindow","window","location","alert","setInterval","getNodeName","node","getWindow","ownerDocument","defaultView","isShadowRoot","ShadowRoot","getStyles","styles","browser","ua","navigator","userAgent","index","name","major","version","substring","lastIndexOf","appName","parseInt","isNaN","parseFloat","appVersion","isContainingBlock","isFirefox","css","transform","perspective","contain","includes","willChange","isNode","Node","getDocument","documentElement","getOffsetParent","offsetParent","getScrollParent","$root","$parent","body","scrollTop","scrollLeft","getVisualViewport","visualViewport","getPreviousSibling","previousElementSibling","getPreviousSiblings","prev","$sibling","push","getNextSibling","nextElementSibling","getNextSiblings","next","getSiblings","includeSelf","list","siblings","closest","ctx","includeCTX","context","startsWith","byClass","find","findAll","innerContent","$children","getActiveElement","activeElement","getContainingBlock","currentNode","getImages","includeDuplicates","images","getElementsByTagName","img","Set","getTagName","ancestor","target","sibling","j","parent","parents","$parents","unshift","_HSLToRGB","h","s","k","n","a","Math","min","f","max","toHex","color","hex","rgb","r","g","b","Number","toRGB","getColor","isHex","randomHexColor","random","toHSL","_isAncestor","descendent","result","compareDocumentPosition","inDocument","doc","$doc","canPosition","isLayoutViewport","clientWidth","innerWidth","isMatched","getBoundingClientRect","includeScale","isFixedStrategy","round","clientRect","addVisualOffsets","scaleX","scaleY","offsetWidth","offsetHeight","width","height","left","offsetLeft","y","top","offsetTop","right","bottom","isScaled","rect","has","getDocumentScrollLeft","$document","getScrollLeft","undefined","scrollX","getDocumentScrollTop","getScrollTop","scrollY","getScroll","getScrollbarWidth","getViewportHeight","clientHeight","innerHeight","getViewportWidth","getDocumentRect","scroll","scrollWidth","scrollHeight","direction","getViewportRect","strategy","layoutViewport","inBounding","parentRect","childRect","inViewport","vh","vw","insertAfter","reference","$nextSibling","insertBefore","_insertAdjacentHTML","position","dangerouslyUseHTMLString","insertHTML","insertAdjacentHTML","CHARTS","encodeHTML","insertAdjacentText","insertHTMLAfterEnd","insertHTMLBeforeBegin","insertHTMLBeforeEnd","before","setStyle","hide","$replace","replaceWith","removeChild","show","insertHTMLAfterBegin","$target","lastChild","prepend","firstChild","after","unwrap","$collection","$node","wrap","wrapElement","$temp","$return","outerHTML","wrapAll","$first","warpHTML","wrapInner","wrapHTML","extend","origin","source","debounce","fn","ms","timer","args","clearTimeout","setTimeout","this","observeIntersections","root","thresholds","intersectionRatio","options","rootMargin","observer","IntersectionObserver","entries","entry","section","observe","observeMutations","MutationObserver","mutations","m","childList","attributes","attributeOldValue","characterData","characterDataOldValue","subtree","observeResize","delay","ResizeObserver","isBrowser","isDeno","Deno","core","e","isNodeJs","process","versions","isMobile","isWebKit","match","os","platform","getOffsetLeft","getOffsetTop","getOffset","getPageX","floor","box","pageX","getPageY","pageY","getPageXY","getScrollTotalLeft","$body","getScrollTotalTop","offset","easeInQuad","getScrollTotal","positions","scrollTo","afterStop","scrollValue","step","distance","MAX_VALUE","MAX_POSITION","stop","pos","play","requestAnimationFrame","injectCSS","cssRules","media","charset","$style","head","loadCSS","cssURL","rel","href","Date","getTime","Promise","resolve","reject","$link","onload","onerror","loadScript","jsURL","$script","src","dnsPrefetch","domain","prefetch","url","preload","getNextSiblingBy","getPreviousSiblingBy","nextBy","prevBy","nextAll","prevAll","isNumber","pixel","split","ceil","parse","_getElementSizes","marginTop","marginBottom","marginLeft","marginRight","borderTop","borderBottom","borderLeft","borderRight","paddingTop","paddingBottom","paddingLeft","paddingRight","offsetSize","outerHeight","includeMargin","outerWidth","getDocumentHeight","getDocumentWidth","getScreenHeight","screen","getScreenWidth","sizes","elSizes","margin","border","padding","setStyles","rules","getProperty","getPropertyValue","setProperty","getURLSearchParams","search","reduce","v","toURLSearchParams","params","URLSearchParams","decodeURIComponent","copyToClipboard","selected","getSelection","rangeCount","getRangeAt","select","execCommand","removeAllRanges","addRange","createAndDownloadFile","fileName","content","$blob","Blob","download","URL","createObjectURL","click","revokeObjectURL","fullscreen","mode","requestFullscreen","exitFullscreen","getSelectedText","getURLProps","protocol","username","password","hostname","port","pathname","path","hash","getURLSearchParamByName","openURL","$anchor","onClickOutside","addEventListener","evt","redirect","asLink","serialize","formElement","isParams","data","serialized","FormData","toREM","pixels","digits","base","size","toFixed","toPixels","rem","Attributes","Base","Color","Detect","DOMRect","Insertion","Observer","Platform","Position","Resources","Sibling","Size","Style","isOverflowElement","overflow","overflowX","overflowY","isTableElement","Others"],"mappings":"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B,UAATvB,EAAmB,WAAa2C,EAAQ3C,GAExCgD,iBAAiBjD,GAAIwB,GAAI,ECtB5B0B,EAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,EAAU9E,IACd,IAAI+E,EACAC,EACAC,EAEJ,QAAKlF,EAASC,KAKd+E,EAAOb,EAAKlE,GAAKkF,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAIpB,OAAOgB,EAAKM,KAAKC,GAAQ,IAAIA,eAAgBC,KAAK,KAAM,KAE5DL,EAAMM,KAAKP,IAASE,EAAKK,KAAKP,GAAI,ECtBrCQ,EAAgBvF,GACbA,EAAImE,QAAQ,+BAAgC,ICC/CqB,EAAoB7D,MACdlC,EAASkC,IAAwB,sBAAjBxC,EAASwC,ICN/B8D,EAAcC,MAEhBjG,EAASiG,IAAoC,8BAAvBvG,EAASuG,ICF7BC,EAAchE,MAEhBlC,EAASkC,MACS,kBAAjBxC,EAASwC,IAA4BA,EAAG9B,SAA2B,IAAhB8B,EAAG7B,WCArD8F,EAASjE,MAEXlC,EAASkC,MACRhC,EAAUgC,IAAO6D,EAAiB7D,IAAO8D,EAAW9D,IAAOgE,EAAWhE,KCGrEkE,EAAO,CAAClE,EAAI3B,OACX2B,IAAQ5B,EAAS4B,KAAQhC,EAAUgC,MAIpC5B,EAAS4B,GACJmE,SAASC,eAAepE,GACtB5B,EAASC,QAClB2B,EAAGqE,YAAchG,GAEV2B,EAAGqE,aCNRC,EAAgB,CAACpG,EAAS8C,EAAOuD,KACrC,MAAMC,EAAYL,SAASM,yBAE3B,IAAKvG,EACH,OAAO,KAGT,MAAMwG,EAAMP,SAASG,cAAcpG,GAC7ByG,EAAgBC,GACbX,EAAMW,IAAUxG,EAASwG,GAE5BC,EAAUD,IACd,IAAIE,EAEJ,IAAKH,EAAaC,GAChB,OAAO,EAIPE,EADEb,EAAMW,GACCA,EAEAV,EAAKU,GAGhBJ,EAAUO,YAAYD,EAAO,EAyB/B,OAtBI1G,EAAS4C,GACX6D,EAAOX,EAAKlD,IACHiD,EAAMjD,GACf6D,EAAO7D,GACEJ,EAAQI,IAAUA,EAAMgE,OAAO/E,GAAS0E,EAAa1E,KAC9De,EAAMI,SAASwD,IACbC,EAAOD,EAAM,IAEN9G,EAASkD,KAAWiD,EAAMjD,IACnCW,EAAc+C,EAAK1D,GAGjBJ,EAAQ2D,GACVA,EAASnD,SAASwD,IAChBC,EAAOD,EAAM,IAGfC,EAAON,GAGTG,EAAIK,YAAYP,GAETE,GCnDHtB,EAAO,CAACpD,EAAIiF,KAChB,MAAMT,EAAYL,SAASM,yBAE3B,IAAKzE,IAAQmD,EAAOnD,KAAQ5B,EAAS4B,KAAQhC,EAAUgC,GACrD,OAAO,KAGT,GAAImD,EAAOnD,GAAK,CACd,MAAMkF,EAAWZ,EAAc,OAC/B,IAAIC,EAAW,GAQf,OANAW,EAASxE,UAAYkD,EAAa5D,GAClCuE,EAAW,IAAIW,EAASC,YACxBZ,EAASnD,SAASwD,IAChBJ,EAAUO,YAAYH,EAAM,IAGvBJ,CACX,CAAS,IAAIpG,EAAS6G,GAGlB,OAAOjF,EAAGU,UAFVV,EAAGU,UAAYkD,EAAaqB,EAG7B,ECfGG,EAAM,CACVrF,eACAQ,eACAI,kBACAG,gBACAa,gBACA0D,iBChBuB,CAACrF,EAAIgB,KAC5B,IAAID,EAAQ,GAEZ,IAAK/C,EAAUgC,IAAOY,EAAQI,GAC5B,OAAO,EAGTD,EAAQC,EAGHD,IACHA,EAAQf,EAAGmB,qBAGbJ,EAAMK,SAASI,IACbb,EAAgBX,EAAIwB,EAAK,GACzB,EDCFI,WACAC,WACAC,WACAO,WACAiD,aEnBmB,CAACtF,EAAIuF,EAAQC,KAChC,IAAIxD,EACAC,EAEJ,QAAKjE,EAAUgC,KAIfgC,EAAWhC,EAAGQ,aAETwB,IAAaF,EAAS9B,EAAIuF,MAI/BtD,EAAYjC,EAAGiC,eAEXA,GAAWO,QACbP,EAAUO,QAAQ+C,EAAQC,GAE1BxF,EAAGQ,UAAYwB,EAASQ,QAAQ+C,EAAQC,KACzC,EFAD/C,cACAgD,YGtBkB,CAACzF,EAAIQ,KACvB,IAAIyB,EAEJ,IAAKjE,EAAUgC,KAAQQ,EACrB,OAAO,EAGTyB,EAAYjC,EAAGiC,UAEXA,GAAWyD,OACbzD,EAAUyD,OAAOlF,GACRsB,EAAS9B,EAAIQ,GACtBiC,EAAYzC,EAAIQ,GAEhB6B,EAASrC,EAAIQ,EACd,EHQDQ,MIhBY,CAAChB,EAAIC,EAAMK,KACvB,IAAKtC,EAAUgC,GACb,OAAO,KAIT,IAAKC,IAASK,EACZ,OAAOQ,EAAcd,GAGvB,IAAK5B,EAAS6B,KAAUW,EAAQX,KAAUnC,EAASmC,GACjD,OAAO,KAIT,GAAI7B,EAAS6B,GAAO,CAElB,GAAK0C,EAAYrC,GAIf,OAAOP,EAAaC,EAAIC,GAHxBM,EAAaP,EAAIC,EAAMK,EAK7B,KAAS,IAAIM,EAAQX,GAGjB,OAAOa,EAAcd,EAAIC,GAGzB0B,EAAc3B,EAAIC,EACnB,GJbD0F,OKvBc3F,IACd,IACGhC,EAAUgC,KACVD,EAAaC,EAAI,cACkC,IAApDP,EAAaY,QAAQL,EAAG9B,QAAQgC,eAEhC,OAAO,EAGTS,EAAgBX,EAAI,WAAW,ELe/B4F,QMxBe5F,IACf,IACGhC,EAAUgC,IACXD,EAAaC,EAAI,cACmC,IAApDP,EAAaY,QAAQL,EAAG9B,QAAQgC,eAEhC,OAAO,EAGTK,EAAaP,EAAI,YAAY,EAAK,ENgBlC6F,SOtBgB7F,IAEhB,IAAI9B,EACA4H,EAEJ,QAAK9H,EAAUgC,KAIf9B,EAAU8B,EAAG9B,QAAQgC,eAEU,IAVlB,CAAC,QAAS,YAUdG,QAAQnC,MAID,UAAZA,IACF4H,EAAO/F,EAAaC,EAAI,QAAQE,eAGU,IAAxCR,EAAqBW,QAAQyF,IACD,WAA5B9C,EAAShD,EAAI,mBAMbD,EAAaC,EAAI,YACnBW,EAAgBX,EAAI,YAEpBO,EAAaP,EAAI,YAAY,KAC9B,EPPDoD,OACAc,OACAzG,IQ5BU,CAACuC,EAAIM,KACf,GAAKqC,EAAYrC,GAGf,OAAOsB,EAAS5B,GAFhB6B,EAAS7B,EAAIM,EAGd,GCPGyF,EAAS1H,GACR8E,EAAO9E,GAIL+E,EAAK/E,GAAK2H,kBAHR,KCALC,EAAQ,CAACjG,EAAIkG,GAAO,IACnBlI,EAAUgC,GAIRA,EAAGmG,UAAUD,GAHX,KCFLE,EAAU,CAACpG,EAAIqG,EAAW,MAC9B,MAAMC,EAAMD,EAAS7D,QAAQ,MAAO,IAEpC,SAAK6D,GAAaC,GAAQtG,KAKtBA,EAAGoG,QACEpG,EAAGoG,QAAQE,KACTtG,EAAGuG,mBACLvG,EAAGuG,kBAAkBD,GAG7B,ECpBGE,EAAmBxG,GAChBA,EAAGyG,MAAQzG,IAAOmE,UAAYnE,EAAGyG,KAAKtI,SACzC6B,EAAGyG,KACHzG,EAAG0G,WCEHC,EAAO,CAACC,EAAI5G,KAChB,IAAIqG,EACA3B,EAEJ,OAAKtG,EAASwI,IAIdP,EAAWO,EAAGpE,QAAQ,MAAO,IAC7BkC,EAAM1G,EAAUgC,GAAMA,EAAKmE,SAEpBO,EAAImC,cAAc,IAAIR,MANpB,IAM8B,ECvBnCS,EAAarJ,GACK,kBAARA,ECWVsJ,EAAQ,CAACV,EAAUrG,EAAIgH,GAAW,KACtC,MAAMtC,EAAM1G,EAAUgC,GAAMA,EAAKmE,SACjC,IAAI8C,EAAaD,EAMjB,OAJIF,EAAU9G,KACZiH,EAAajH,GAGXiH,EACKvC,EAAIwC,iBAAiBb,GAGvB3B,EAAImC,cAAcR,EAAQ,ECf7Bc,EAAgBnH,GACb6D,EAAiB7D,GCIpBoH,EAAS,CAACC,EAAYhB,KAC1B,IAAIiB,EACAC,EAEJ,OACGJ,EAAaE,KACZjJ,EAASiI,IAAcxI,EAAWwI,KAKtCkB,EAAQ,IAAIF,GAGVC,EADElJ,EAASiI,GACCmB,GACHpB,EAAQoB,EAAMnB,GAGZ,CAACmB,EAAMC,IACTpB,EAASmB,EAAMC,GAInBF,EAAMH,OAAOE,IAfX,EAemB,EC5BxBI,EAAU1H,GACPgE,EAAWhE,GCFd2H,EAAY5J,GAET,MAALA,GACAA,IAAMA,EAAE6J,QACR7J,EAAEoG,UACFpG,EAAE8J,UACF9J,EAAE+J,OACF/J,EAAEgK,YCNAC,EAAeC,GACZN,EAASM,GAAQ,GAAKA,GAAQA,EAAKhK,UAAY,IAAIiC,cAAgB,GCCtEgI,EAAaD,IACjB,GAAa,OAATA,EACF,OAAOL,OAGT,IAAKD,EAASM,GAAO,CACnB,MAAME,EAAgBF,EAAKE,cAC3B,OAAOA,GAAgBA,EAAcC,aAAwBR,MAC9D,CAED,OAAOK,GCRHI,GAAgBJ,IAEpB,GAA0B,oBAAfK,WACT,OAAO,EAIT,OAAOL,aADYC,EAAUD,GAAMK,YACEL,aAAgBK,YCRjDC,GAAY,CAACvI,EAAIgB,EAAQ,MAC7B,MAAMwH,EAAS,CAAE,EACjB,IACIvH,EADAF,EAAQ,KAGZ,OAAK/C,EAAUgC,IAIfe,EAAQkC,iBAAiBjD,GACzBiB,EAAOvD,OAAOuD,KAAKF,GAGfH,EAAQI,IAAUA,EAAME,OAAS,IACnCD,EAAOD,GAGTC,EAAKG,SAASnB,IACZ,MAAMuB,EAAOoB,EAAQ3C,GAEfK,EAAQS,EAAMS,GAGfmB,EAAYnB,IAJA,OAImBmC,KAAKnC,IAAUmB,EAAYrC,KAC7DkI,EAAOhH,GAAQT,EAAMS,GACtB,IAGIgH,GAtBEzH,CAsBFyH,ECjCHC,GAAU,KACd,MAAMC,EAAKC,UAAUC,UACrB,IAAIC,EAAQ,EACRC,EAAO,UACPC,EAAQ,GACRC,EAAU,KA+Ed,OA5E4B,IAAxBN,EAAGrI,QAAQ,SACbwI,EAAQH,EAAGrI,QAAQ,QACnByI,EAAO,QACPE,EAAUN,EAAGO,UAAUJ,EAAQ,KAGA,IAAxBH,EAAGrI,QAAQ,SAClBwI,EAAQH,EAAGrI,QAAQ,QACnByI,EAAO,KACPE,EAAUN,EAAGO,UAAUJ,EAAQ,KAGD,IAAvBH,EAAGrI,QAAQ,QAClBwI,EAAQH,EAAGrI,QAAQ,OACnByI,EAAO,OACPE,EAAUN,EAAGO,UAAUJ,EAAQ,KAGE,IAA1BH,EAAGrI,QAAQ,WAClBwI,EAAQH,EAAGrI,QAAQ,UACnByI,EAAO,SACPE,EAAUN,EAAGO,UAAUJ,EAAQ,KAGE,IAA1BH,EAAGrI,QAAQ,WAClBwI,EAAQH,EAAGrI,QAAQ,UACnByI,EAAO,SACPE,EAAUN,EAAGO,UAAUJ,EAAQ,IAEA,IAA3BH,EAAGrI,QAAQ,aACbwI,EAAQH,EAAGrI,QAAQ,WACnB2I,EAAUN,EAAGO,UAAUJ,EAAQ,MAIC,IAA3BH,EAAGrI,QAAQ,YAClBwI,EAAQH,EAAGrI,QAAQ,WACnByI,EAAO,UACPE,EAAUN,EAAGO,UAAUJ,EAAQ,KAGI,IAA5BH,EAAGrI,QAAQ,aAClByI,EAAO,QACPE,EAAUN,EAAGO,UAAUP,EAAGrI,QAAQ,OAAS,IAGpCqI,EAAGQ,YAAY,KAAO,EAAIR,EAAGQ,YAAY,OAChDL,EAAQH,EAAGQ,YAAY,KACvBJ,EAAOJ,EAAGO,UAAUP,EAAGQ,YAAY,KAAO,EAAGL,GAC7CG,EAAUN,EAAGO,UAAUJ,EAAQ,GAE3BC,EAAK5I,eAAiB4I,EAAK/F,gBAC7B+F,EAAOH,UAAUQ,SAAW,aAKF,IAA1BH,EAAQ3I,QAAQ,KAClBwI,EAAQG,EAAQ3I,QAAQ,MACW,IAA1B2I,EAAQ3I,QAAQ,KACzBwI,EAAQG,EAAQ3I,QAAQ,MACW,IAA1B2I,EAAQ3I,QAAQ,OACzBwI,EAAQG,EAAQ3I,QAAQ,MAGtBwI,GAAS,IACXG,EAAUA,EAAQC,UAAU,EAAGJ,IAGjCE,EAAQK,SAAS,GAAKJ,EAAS,IAE3BK,MAAMN,KACRC,EAAU,GAAKM,WAAWX,UAAUY,YACpCR,EAAQK,SAAST,UAAUY,WAAY,KAGlC,CACLT,OACAC,QACAC,UACD,EClFGQ,GAAqBxJ,IACzB,MAAMyJ,EAA+B,YAAnBhB,KAAUK,KACtBY,EAAMnB,GAAUvI,GAGtB,MACoB,SAAlB0J,EAAIC,WACgB,SAApBD,EAAIE,aAEY,UAAhBF,EAAIG,SACJ,CAAC,YAAa,eAAeC,SAASJ,EAAIK,aACzCN,GAAgC,WAAnBC,EAAIK,YACjBN,KAAcC,EAAItC,QAAwB,SAAfsC,EAAItC,MACjC,ECfG4C,GAAU/B,GACPA,aAAgBC,EAAUD,GAAMgC,KCFnCC,GAAejC,KAEhB+B,GAAO/B,GAAQA,EAAKE,cAAgBF,EAAK9D,WAAayD,OAAOzD,UAC9DgG,gBCFEC,GAAmBpK,GAClBhC,EAAUgC,GAGRA,EAAGqK,aAFD,KCFLC,GAAmBtK,IACvB,MAAMuK,EAAQ3C,OACd,IAAI4C,EAEJ,OAAKxM,EAAUgC,IAAOA,IAAOmE,UAI7BqG,EAAUxK,EAAG0G,WAER8D,EAIDA,IAAYD,EAAMpG,SAChBoG,EAAMpG,SAASsG,KAAKC,WAAaH,EAAMpG,SAASsG,KAAKE,WAChDJ,EAAMpG,SAASsG,KAEfF,EAAMpG,SAASgG,iBAOuC,IAA/D,CAAC,SAAU,QAAQ9J,QAAQ2C,EAASwH,EAAS,eACoB,IAAjE,CAAC,SAAU,QAAQnK,QAAQ2C,EAASwH,EAAS,iBACoB,IAAjE,CAAC,SAAU,QAAQnK,QAAQ2C,EAASwH,EAAS,eAEtCA,EAGFF,GAAgBtK,EAAG0G,YArBjB1G,GANA,IA2B2B,EC9BhC4K,GAAqB5K,GAClBhC,EAAUgC,GAAMkI,EAAUlI,GAAI6K,eAAiBjD,OAAOiD,eCJzDC,GAAsB9K,GACnBhC,EAAUgC,GAAMA,EAAG+K,uBAAyB,KCD/CC,GAAuBhL,IAC3B,MAAMiL,EAAO,GACb,IAAIC,EAEJ,IAAKlN,EAAUgC,GACb,OAAOiL,EAST,IANAC,EAAWJ,GAAmB9K,GAE1BkL,GACFD,EAAKE,KAAKD,GAGLA,GACLA,EAAWJ,GAAmBI,GAE1BA,GACFD,EAAKE,KAAKD,GAId,OAAOD,GCtBHG,GAAkBpL,GACfhC,EAAUgC,GAAMA,EAAGqL,mBAAqB,KCD3CC,GAAmBtL,IACvB,MAAMuL,EAAO,GACb,IAAIL,EAEJ,IAAKlN,EAAUgC,GACb,OAAOuL,EAST,IANAL,EAAWE,GAAepL,GAEtBkL,GACFK,EAAKJ,KAAKD,GAGLA,GACLA,EAAWE,GAAeF,GAEtBA,GACFK,EAAKJ,KAAKD,GAId,OAAOK,GCpBHC,GAAc,CAACxL,EAAIyL,GAAc,KACrC,IAAIC,EAAO,GACPT,EAAO,GACPM,EAAO,GAEX,OAAKvN,EAAUgC,IAIfiL,EAAOD,GAAoBhL,GAC3B0L,EAAKP,QAAQF,GAGTQ,GACFC,EAAKP,KAAKnL,GAGZuL,EAAOD,GAAgBtL,GACvB0L,EAAKP,QAAQI,GAENG,GAdEA,CAcFA,ECrBHC,GAAW,CAAC3L,EAAIyL,IACbD,GAAYxL,EAAIyL,GCenBrG,GAAM,CACVW,QACAzB,gBACA2B,QACA2F,QClBc,CAAC5L,EAAIqG,EAAUwF,EAAKC,KAClC,MAAMC,EAAUF,GAAO1H,SAEvB,IAAKnE,EACH,OAAO,KAGT,EAAG,CAED,GACe,MAAZqG,IACEA,EAAS2F,WAAW,KACjBhM,EAAG0G,aAAeqF,GAAW3F,EAAQpG,EAAIqG,GACzCD,EAAQpG,EAAIqG,KACjByF,GAAc9L,IAAO+L,EAEtB,OAAO/L,EAIT,GAAIA,IAAO+L,EACT,KAIN,OAAY/L,EAAKwG,EAAgBxG,GAAK,EDNpCiM,QEnBc,CAACzL,EAAWR,KAC1B,IAAIqG,EACA3B,EAEJ,OAAKtG,EAASoC,IAId6F,EAAW7F,EAAUgC,QAAQ,MAAO,IACpCkC,EAAM1G,EAAUgC,GAAMA,EAAKmE,SAEpBO,EAAIwC,iBAAiB,IAAIb,MANvB,IAMiC,EFS1CM,OACAI,QACAK,SACA8E,KG1BY7F,GACLU,EAAMV,GH0Bb8F,QI3Be9F,GACRU,EAAMV,GAAU,GJ2BvBtC,SKvBgBqI,IAChB,MAAM5H,EAAYL,SAASM,yBAC3B,IAAI4H,EAAY,GACZhF,EAAa,GAmBjB,OAjBIlE,EAAOiJ,GACTC,EAAY,CAACjJ,EAAKgJ,IACTpO,EAAUoO,IAAiB1E,EAAO0E,GAC3CC,EAAY,CAACD,GACJjF,EAAaiF,KACtB/E,EAAa,IAAI+E,GACjB/E,EAAWjG,SAASwD,IAClByH,EAAUlB,KAAKvG,EAAM,KAIrByH,EAAUnL,OAAS,GACrBmL,EAAUjL,SAASwD,IACjByH,EAAUlB,KAAKvG,EAAM,IAIlBJ,GLEP8H,iBM/BuB,IAChBnI,SAASoI,cN+BhBC,mBO1B0BxM,IAC1B,IAAIyM,EAAcjG,EAAgBxG,GAMlC,IAJIqI,GAAaoE,KACfA,EAAcA,EAAYhG,MAI1BzI,EAAUyO,KACT,CAAC,OAAQ,QAAQ3C,SAAS9B,EAAYyE,KACvC,CACA,GAAIjD,GAAkBiD,GACpB,OAAOA,EAEPA,EAAcA,EAAY/F,UAE7B,CAED,OAAO,MPSPwD,eACAwC,UQ/BgB,CAAC1M,EAAK,OAAQ2M,GAAoB,KAClD,MACMC,EAAS,IADH7F,EAAM/G,GACK6M,qBAAqB,QAAQrJ,KAAKsJ,GACvDA,EAAI/M,aAAa,SAGnB,OAAO4M,EAAoBC,EAAS,IAAI,IAAIG,IAAIH,GAAO,ER0BvDpG,kBACAwB,cACAoC,mBACA4C,WSrCkBhN,GACbhC,EAAUgC,GAIRA,EAAG9B,QAAQgC,cAHT,GToCToK,mBACApC,YACA0C,qBACA/B,MUpCY,SAAU7I,EAAIiN,GAuB1B,IAAIvI,EAQJ,OANI1G,EAAUgC,GACZ0E,EAAM1E,EACG5B,EAAS4B,KAClB0E,EAAMqC,EAAM/G,EAAIiN,IApBF,EAACtB,EAAUuB,KACzB,IAAIrE,GAAS,EAEb,OAAKjI,EAAQ+K,IAAaA,EAASzK,OAAS,IAAMlD,EAAUkP,IAI5DvB,EAASvK,SAAQ,CAAC+L,EAASC,KACrBD,IAAYD,IACdrE,EAAQuE,EACT,IANMvE,CASFA,EAUFxI,CAAQmL,GAAY9G,GAAK,GAAOA,EACzC,EVKEH,SWxCgBvE,GACXhC,EAAUgC,GAIR2L,GAAS3L,EAAGgG,mBAAmB,GAH7B,GXuCTqH,OYtCa,CAACrN,EAAI8F,KAClB,IAAI0E,EAAU,KAEd,IAAKxM,EAAUgC,KAAQ0H,EAAO1H,GAC5B,OAAOwK,EAGT,OAAQ1E,GACN,IAAK,SACH0E,EAAUJ,GAAgBpK,GAC1B,MACF,IAAK,SACHwK,EAAUF,GAAgBtK,GAC1B,MACF,QACEwK,EAAUhE,EAAgBxG,GAI9B,OAAOwK,GZoBP8C,QatCc,CAACtN,EAAIyL,GAAc,KACjC,MAAM8B,EAAW,GACjB,IAAI7I,EACA8F,EAEJ,GAAI9F,EACF,OAAO6I,EAST,GANIvP,EAAUgC,IAAO0H,EAAO1H,GAC1B0E,EAAM1E,EACG5B,EAAS4B,KAClB0E,EAAMiC,EAAK3G,KAGR0E,EACH,OAAO6I,EAST,IANI9B,GACF8B,EAASpC,KAAKzG,GAGhB8F,EAAU9F,EAAIgC,WAEP8D,GACL+C,EAASC,QAAQhD,GACjBA,EAAUA,EAAQ9D,WAGpB,OAAO6G,ICpCHE,GAAY,CAACC,EAAGC,EAAG7K,KAEvBA,GAAK,IACL,MAAM8K,EAAKC,IAAOA,EAAIH,EAAI,IAAM,GAC1BI,GAHNH,GAAK,KAGSI,KAAKC,IAAIlL,EAAG,EAAIA,GACxBmL,EAAKJ,GACT/K,EAAIgL,EAAIC,KAAKG,KAAK,EAAGH,KAAKC,IAAIJ,EAAEC,GAAK,EAAGE,KAAKC,IAAI,EAAIJ,EAAEC,GAAI,KAC7D,MAAO,CAAC,IAAMI,EAAE,GAAI,IAAMA,EAAE,GAAI,IAAMA,EAAE,GAAE,ECLtCE,GAASC,IACb,IACIC,EACAC,EACAC,EACAC,EACAC,EALArI,EAAU,GAOd,QAAKgI,IAILC,EAAM/P,EAAS8P,IAAUA,EAErBxO,EAAQ+D,KAAK0K,GACRA,EAGLvO,EAAQ6D,KAAK0K,IACfjI,EAAUtG,EAAQsC,KAAKiM,GACvBC,EAAMb,GACJrE,SAAShD,EAAQ,GAAI,IACrBgD,SAAShD,EAAQ,GAAI,IACrBgD,SAAShD,EAAQ,GAAI,KAGhB+H,GAAM,OAAOG,EAAI5K,KAAK,WAE7B0C,EAAUzG,EAAQyC,KAAKiM,GAGrBjI,IACFmI,EAA2B,IAAvBnI,EAAQ,IAAIlF,OAAe,IAAMkF,EAAQ,GAAKsI,OAAOtI,EAAQ,IACjEoI,EAA2B,IAAvBpI,EAAQ,IAAIlF,OAAe,IAAMkF,EAAQ,GAAKsI,OAAOtI,EAAQ,IACjEqI,EAA2B,IAAvBrI,EAAQ,IAAIlF,OAAe,IAAMkF,EAAQ,GAAKsI,OAAOtI,EAAQ,IAEjEiI,EAAM,CAACE,EAAE/Q,SAAS,IAAKgR,EAAEhR,SAAS,IAAKiR,EAAEjR,SAAS,KAAKkG,KAAK,KAG1D2K,EAAInN,OAAS,IACfmN,EAAMA,EAAI7L,QAAQ3C,EAAU,SAIlB,gBAARwO,GAAyBA,EAAIhO,QAAQ,KAAO,IAC9CgO,EAAM,IAAMA,GAGPA,EAAInO,eAAa,EC/CpByO,GAASP,IACb,IACIC,EACAC,EACAC,EACAC,EACAC,EALArI,EAAU,GAOd,QAAKgI,IAIDzO,EAAQgE,KAAKyK,GACRA,GAGLtO,EAAQ6D,KAAKyK,IACfhI,EAAUtG,EAAQsC,KAAKgM,GAEvBE,EAAMb,GACJrE,SAAShD,EAAQ,GAAI,IACrBgD,SAAShD,EAAQ,GAAI,IACrBgD,SAAShD,EAAQ,GAAI,KAGvBmI,EAAID,EAAI,GACRE,EAAIF,EAAI,GACRG,EAAIH,EAAI,KAGH3O,EAAQgE,KAAKyK,KAChBC,EAAMF,GAAMC,IAGdhI,EAAUxG,EAAQwC,KAAKiM,GAEvBE,EAAInF,SAAShD,EAAQ,GAAI,IACzBoI,EAAIpF,SAAShD,EAAQ,GAAI,IACzBqI,EAAIrF,SAAShD,EAAQ,GAAI,KAGpB,OAAS,CAACmI,EAAGC,EAAGC,GAAG/K,KAAK,MAAQ,OC/CnC0B,GAAM,CACVwJ,SCUe,CAAC5O,EAAIC,EAAM4O,GAAQ,KAClC,IAAIT,EAEJ,SAAKpQ,EAAUgC,KAAQ5B,EAAS6B,KAAwC,IAA/BV,EAAYc,QAAQJ,MAI7DmO,EAAQpL,EAAShD,EAAIC,GAEhBmO,EAIES,EAAQV,GAAMC,GAASO,GAAMP,GAH3B,cAGgC,EDtBzCU,eEDqB,IAEd,KADoB,QAAhBf,KAAKgB,SAAqB,KAASvR,SAAS,IACtC+F,MAAM,EAAG,GFA1B4K,SACAa,MGEaZ,IACb,IACIC,EACAE,EACAC,EACAC,EACA3L,EACA6K,EACAD,EAPAtH,EAAU,GASd,QAAKgI,IAIDtO,EAAQ6D,KAAKyK,GACRA,GAIJzO,EAAQgE,KAAKyK,IAShBhI,EAAUzG,EAAQyC,KAAKgM,GAEvBG,EAAInI,EAAQ,GACZoI,EAAIpI,EAAQ,GACZqI,EAAIrI,EAAQ,KAZZiI,EAAMF,GAAMC,GACZhI,EAAUxG,EAAQwC,KAAKiM,GAEvBE,EAAInF,SAAShD,EAAQ,GAAI,IACzBoI,EAAIpF,SAAShD,EAAQ,GAAI,IACzBqI,EAAIrF,SAAShD,EAAQ,GAAI,KAU3BmI,GAAK,IACLC,GAAK,IACLC,GAAK,IAEL3L,EAAIiL,KAAKG,IAAIK,EAAGC,EAAGC,GACnBd,EAAI7K,EAAIiL,KAAKC,IAAIO,EAAGC,EAAGC,GACvBf,EAAIC,EACA7K,IAAMyL,GACHC,EAAIC,GAAKd,EACV7K,IAAM0L,EACN,GAAKC,EAAIF,GAAKZ,EACd,GAAKY,EAAIC,GAAKb,EAChB,EAEG,OAAO,GAAKD,EAAI,EAAI,GAAKA,EAAI,IAAM,GAAKA,MAC7C,KAAOC,EAAK7K,GAAK,GAAM6K,GAAK,EAAI7K,EAAI6K,GAAKA,GAAK,GAAK,EAAI7K,EAAI6K,IAAO,QAC7D,KAAO,EAAI7K,EAAI6K,GAAM,OAAC,EHpD7BgB,UIDIM,GAAc,CAAChC,EAAUiC,KAC7B,IAAIC,GAAS,EAEb,OAAKlC,GAAaiC,GAAejC,EAAS9O,UAAa+Q,EAAW/Q,UAKhEgR,EADElC,EAAS9K,UAAY8K,IAAaiC,EAC3BjC,EAAS9K,SAAS+M,MAEiC,GAAhDjC,GAAUmC,wBAAwBF,IAGzCC,GATEA,CASFA,ECZHE,GAAa,CAACrP,EAAIsP,KACtB,IAAIC,EAEJ,QAAKvR,EAAUgC,KAIfuP,EAAOD,GAAOtP,EAAGmI,cAEV8G,GAAYM,EAAKpF,gBAAiBnK,GAAE,ECTvCwP,GAAexP,KACdhC,EAAUgC,KAIoB,SAA5BgD,EAAShD,EAAI,YAAyBqP,GAAWrP,ICHpDmC,GAAW,CAACnC,EAAIiN,OACfjP,EAAUiP,KAAejP,EAAUgC,KAAQ5B,EAAS4B,MAIrDhC,EAAUgC,GACLiP,GAAYhC,EAAUjN,KAEpB+G,EAAM/G,EAAIiN,ICXjBwC,GAAmB,IAChBtL,SAASgG,gBAAgBuF,cAAgB9H,OAAO+H,WCEnDC,GAAY,CAAC5P,EAAIoH,OAChBpJ,EAAUgC,KAASnC,EAAWuJ,KAAYhJ,EAASgJ,MAIpDvJ,EAAWuJ,GACNA,EAAOpH,KAELoG,EAAQpG,EAAIoH,ICNnByI,GAAwB,CAC5B7P,EACA8P,GAAe,EACfC,GAAkB,KAElB,MAAMC,EAAQjC,KAAKiC,MACbC,EAAajQ,EAAG6P,wBAChBhF,EAAiBD,GAAkB5K,GACnCkQ,GAAoBT,MAAsBM,EAEhD,IAAII,EAAS,EACTC,EAAS,EAEb,GAAIN,GAAgB9R,EAAUgC,GAAK,CACjC,IAAIqQ,EAAcrQ,EAAGqQ,YACjBC,EAAetQ,EAAGsQ,aAEtBH,EAASE,EAAc,GAAIL,EAAMC,EAAWM,OAASF,GAAmB,EACxED,EAASE,EAAe,GAAIN,EAAMC,EAAWO,QAAUF,GAAoB,CAC5E,CAED,MAAMzN,GACHoN,EAAWQ,MACTP,EAAmBrF,GAAgB6F,YAAc,EAAI,IACxDP,EACIQ,GACHV,EAAWW,KAAOV,EAAmBrF,GAAgBgG,WAAa,EAAI,IACvET,EACIG,EAAQN,EAAWM,MAAQJ,EAC3BK,EAASP,EAAWO,OAASJ,EAEnC,MAAO,CACLG,QACAC,SACAI,IAAKD,EACLG,MAAOjO,EAAI0N,EACXQ,OAAQJ,EAAIH,EACZC,KAAM5N,EACNA,IACA8N,IACD,EC5CGvL,GAAM,CACVoK,eACArN,YACAkN,cACA7F,qBACAiG,oBACAG,aACAoB,SCNgBhR,IAChB,MAAMgQ,EAAQjC,KAAKiC,MAEnB,IAAKhS,EAAUgC,GACb,OAAO,EAGT,MAAMiR,EAAOpB,GAAsB7P,GAEnC,OACEgQ,EAAMiB,EAAKV,SAAWvQ,EAAGqQ,aACzBL,EAAMiB,EAAKT,UAAYxQ,EAAGsQ,YAC3B,EDLD3I,WACAuJ,IEJU,CAAClR,EAAIqG,KAEXrI,EAAUgC,KAAQmH,EAAanH,KAC/B5B,EAASiI,KAAcxI,EAAWwI,GAE7B,GAGLrI,EAAUgC,GAER5B,EAASiI,GACJ,IAAIU,EAAMV,EAAUrG,GAAI,SADjC,EAIOoH,EAAOpH,EAAIqG,GFTpBD,WGdI+K,GAAwB,CAAC7B,EAAMnL,YACnC,MAAMiN,EAAY9B,EAClB,OAAOvB,KAAKG,IACVkD,EAAUjH,gBAAgBQ,WAC1ByG,EAAU3G,KAAKE,WAChB,ECHG0G,GAAgB,CAACrR,EAAK4H,SACtB5H,IAAOmE,SACFgN,UAGaG,IAAftR,EAAGuR,QAAwBvR,EAAGuR,QAAUvR,EAAG2K,WCP9C6G,GAAuB,CAAClC,EAAMnL,YAClC,MAAMiN,EAAY9B,EAClB,OAAOvB,KAAKG,IAAIkD,EAAUjH,gBAAgBO,UAAW0G,EAAU3G,KAAKC,UAAS,ECAzE+G,GAAe,CAACzR,EAAK4H,SACrB5H,IAAOmE,SACFqN,UAGaF,IAAftR,EAAG0R,QAAwB1R,EAAG0R,QAAU1R,EAAG0K,UCJ9CiH,GAAY,CAAC3R,EAAK4H,UACf,CACLgJ,IAAKa,GAAazR,GAClByQ,KAAMY,GAAcrR,KCHlB4R,GAAqB5R,IACzB,IAAI2P,EAAa,EACbD,EAAc,EAYlB,OAVK1P,EAIChC,EAAUgC,KACZ2P,EAAa3P,EAAGqQ,YAChBX,EAAc1P,EAAG0P,cALnBC,EAAa/H,OAAO+H,WACpBD,EAAcvL,SAASgG,gBAAgBuF,aAQlCC,EAAaD,GCnBhBmC,GAAoB,IACjB9D,KAAKG,IAAI/J,SAASgG,gBAAgB2H,aAAclK,OAAOmK,aCD1DC,GAAmB,IAChBjE,KAAKG,IAAI/J,SAASgG,gBAAgBuF,YAAa9H,OAAO+H,YCAzDvK,GAAM,CACVyK,yBACAoC,gBCMuBjS,IACvB,MAAMkO,EAAMH,KAAKG,IACX9K,EAAO8G,GAAYlK,GACnBkS,EAASP,GAAU3R,GACnByK,EAAOzK,EAAGmI,eAAesC,KAEzB8F,EAAQrC,EACZ9K,EAAK+O,YACL/O,EAAKsM,YACLjF,EAAOA,EAAK0H,YAAc,EAC1B1H,EAAOA,EAAKiF,YAAc,GAEtBc,EAAStC,EACb9K,EAAKgP,aACLhP,EAAK0O,aACLrH,EAAOA,EAAK2H,aAAe,EAC3B3H,EAAOA,EAAKqH,aAAe,GAG7B,IAAIjP,GAAKqP,EAAOzB,KAAOmB,GAAkB5R,GACzC,MAAM2Q,GAAKuB,EAAOtB,IAMlB,MAJyD,QAArDrI,GAAUkC,GAAQrH,EAAM,CAAC,cAAciP,YACzCxP,GAAKqL,EAAI9K,EAAKsM,YAAajF,EAAOA,EAAKiF,YAAc,GAAKa,GAGrD,CACLA,QACAC,SACA3N,IACA8N,IACD,EDpCD2B,gBEIsB,CAACtS,EAAIuS,KAC3B,MAAMnP,EAAO8G,GAAYlK,GACnB6K,EAAiBD,GAAkB5K,GAEzC,IAAIuQ,EAAQnN,EAAKsM,YACbc,EAASpN,EAAK0O,aACdjP,EAAI,EACJ8N,EAAI,EAER,GAAI9F,EAAgB,CAClB0F,EAAQ1F,EAAe0F,MACvBC,EAAS3F,EAAe2F,OAExB,MAAMgC,EAAiB/C,MAEnB+C,IAAoBA,GAA+B,UAAbD,KACxC1P,EAAIgI,EAAe6F,WACnBC,EAAI9F,EAAegG,UAEtB,CAED,MAAO,CACLN,QACAC,SACA3N,IACA8N,IACD,EF7BD8B,WGAiB,CAAC7N,EAAOyI,KACzB,IAAIqF,EACAC,EAEJ,SAAK3U,EAAU4G,KAAW5G,EAAUqP,MAIpCqF,EAAarF,EAAOwC,wBACpB8C,EAAY/N,EAAMiL,wBAGhB8C,EAAU/B,KAAO8B,EAAW9B,KAC5B+B,EAAU7B,OAAS4B,EAAW5B,OAC9B6B,EAAU5B,QAAU2B,EAAW3B,QAC/B4B,EAAUlC,MAAQiC,EAAWjC,KAC9B,EHfDmC,WIAkB5S,IAClB,IAAIiR,EACA4B,EACAC,EAEJ,QAAK9U,EAAUgC,KAIfiR,EAAOjR,EAAG6P,wBACVgD,EAAKhB,KACLiB,EAAKd,KAGHf,EAAKL,KAAO,GAAKK,EAAKR,MAAQ,GAAKQ,EAAKF,QAAU8B,GAAM5B,EAAKH,OAASgC,EACvE,GCZGC,GAAc,CAAC/S,EAAIgT,KACvB,IAAIxI,EACAyI,EAEJ,OAAKhP,EAAMjE,IAIXwK,EAAUwI,EAAUtM,WAEf8D,GAILyI,EAAe7H,GAAe4H,GAE1BC,EACKzI,EAAQ0I,aAAalT,EAAIiT,GAEzBzI,EAAQzF,YAAY/E,IARpB,MANA,IAeR,ECrBGkT,GAAe,CAAClT,EAAIgT,KACxB,IAAIxI,EAEJ,OAAKvG,EAAMjE,IAIXwK,EAAUwI,EAAUtM,WAEf8D,EAIEA,EAAQ0I,aAAalT,EAAIgT,GAHvB,MANA,IASgC,ECArCG,GAAsB,CAC1BnT,EACAoT,EACA/U,EACAgV,GAA2B,KAG3B,IACI3O,EACA8F,EAFA8I,EAAajV,EAIjB,OAAK2B,IAAuC,IAL1B,CAAC,cAAe,aAAc,YAAa,YAKxCK,QAAQ+S,IAAqBjQ,EAAOmQ,IAIzD5O,EAAM1G,EAAUgC,GAAMA,EAAK+G,EAAM/G,GAE5B0E,IAMY,gBAAb0O,GAA2C,aAAbA,IAChC5I,EAAU9F,EAAIgC,WAGT8D,IAKH6I,GACFC,EAAa1P,EAAa0P,GAC1B5O,EAAI6O,mBAAmBH,EAAUE,GAC1BlQ,EAAKkQ,KAEZA,ECzDe,CAACjV,IAClB,MAAMmV,EAAS,CACb,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,QACL,IAAK,UAGP,OAAOnV,EAAImE,QAAQ,YAAaiB,GACvB+P,EAAO/P,IAAQA,GACvB,ED8CcgQ,CAAWH,GACxB5O,EAAIgP,mBAAmBN,EAAUE,GAC1BpP,EAAKoP,IArBL,MANA,IA4BR,EEtDGK,GAAqB,CAAC3T,EAAI3B,EAAKgV,GAA2B,IACvDF,GAAoBnT,EAAI,WAAY3B,EAAKgV,GCF5CO,GAAwB,CAAC5T,EAAI3B,EAAKgV,GAA2B,IAC1DF,GAAoBnT,EAAI,cAAe3B,EAAKgV,GCA/CQ,GAAsB,CAAC7T,EAAI3B,EAAKgV,GAA2B,IACxDF,GAAoBnT,EAAI,YAAa3B,EAAKgV,GCC7CS,GAAS,CAAC9T,EAAIgT,IACbhV,EAAUgV,KAAgB/O,EAAMjE,IAAQmD,EAAOnD,IAIhDiE,EAAMjE,GACDkT,GAAalT,EAAIgT,GAEjBY,GAAsBZ,EAAWhT,GANjC,KCHL+T,GAAW,CAAC/T,EAAIC,EAAMxC,KAC1B,IAAI+D,EAEJ,IAAKxD,EAAUgC,KAAQ5B,EAAS6B,IAAS0C,EAAY1C,GACnD,OAAO,EAGTuB,EAAOoB,EAAQ3C,GAEF,UAATuB,IACFA,EAAO,YAGTxB,EAAGG,MAAMqB,GAAQ/D,CAAG,EChBhBuW,GAAQhU,IACZ,IAAKhC,EAAUgC,IAAmC,SAA5BgD,EAAShD,EAAI,WACjC,OAAO,EAGT+T,GAAS/T,EAAI,UAAW,OAAO,ECG3BwC,GAAU,CAACxC,EAAIgT,KACnB,IAAIiB,EACAzJ,EAGJ,OAAKxM,EAAUgV,KAAgB/O,EAAMjE,IAAQmD,EAAOnD,KAIpDwK,EAAUwI,EAAUtM,WAEf8D,GAILwJ,GAAKhB,GAGHiB,EADEhQ,EAAMjE,GACG+S,GAAY/S,EAAIgT,GAEhBW,GAAmBX,EAAWhT,GAGvCnC,EAAWmV,EAAUkB,aACvBlB,EAAUkB,YAAYD,GAEtBjB,EAAUtQ,SAGLuR,GAjBE,MANA,IAuBFA,ECjCHvR,GAAU1C,IACd,IAAI0E,EAEJ,IAAK1G,EAAUgC,KAAQ5B,EAAS4B,GAC9B,OAAO,EAGLhC,EAAUgC,GACRnC,EAAWmC,EAAG0C,QAChB1C,EAAG0C,SAEH1C,EAAG0G,WAAWyN,YAAYnU,IAG5B0E,EAAMqC,EAAM/G,GAERhC,EAAU0G,IACZhC,GAAOgC,GAEV,ECvBG0P,GAAQpU,IACZ,IAAKhC,EAAUgC,IAAmC,UAA5BgD,EAAShD,EAAI,WACjC,OAAO,EAGT+T,GAAS/T,EAAI,UAAW,QAAQ,ECE5BoF,GAAM,CACV2N,eACAG,gBACAmB,qBCR2B,CAACrU,EAAI3B,EAAKgV,GAA2B,IACzDF,GAAoBnT,EAAI,aAAc3B,EAAKgV,GDQlDM,sBACAC,yBACAC,uBACAhP,OEJa,CAAC7E,EAAIgT,KAClB,IAAIsB,EAEJ,OAAKtW,EAAUgV,KAAgB7P,EAAOnD,IAAQ5B,EAAS4B,IAAQiE,EAAMjE,IAIjEnC,EAAWmV,EAAUnO,SAErByP,EADErQ,EAAMjE,GACEA,EACDmD,EAAOnD,GACNoD,EAAKpD,GAELkE,EAAKlE,GAGjBgT,EAAUnO,OAAOyP,GAEVA,IAEPA,EAAUtB,EAAUuB,UAGlBtQ,EAAMjE,GACD+S,GAAY/S,EAAIsU,GACdnR,EAAOnD,GACT6T,GAAoBS,EAAStU,GAE7B+S,GAAY7O,EAAKlE,GAAKsU,IAxBtB,IAyBR,EFxBDE,QGLc,CAACxU,EAAIgT,KACnB,IAAIsB,EAEJ,OAAKtW,EAAUgV,KAAgB7P,EAAOnD,IAAQ5B,EAAS4B,IAAQiE,EAAMjE,IAIjEnC,EAAWmV,EAAUwB,UAErBF,EADErQ,EAAMjE,GACEA,EACDmD,EAAOnD,GACNoD,EAAKpD,GAELkE,EAAKlE,GAGjBgT,EAAUwB,QAAQF,GAEXA,IAEPA,EAAUtB,EAAUyB,WAGlBxQ,EAAMjE,GACDkT,GAAalT,EAAIsU,GACfnR,EAAOnD,GACT4T,GAAsBU,EAAStU,GAE/BkT,GAAahP,EAAKlE,GAAKsU,IAxBvB,IAyBR,EHvBDI,MIZY,CAAC1U,EAAIgT,IAEZhV,EAAUgV,KAAgB/O,EAAMjE,IAAQmD,EAAOnD,IAIhDiE,EAAMjE,GACD+S,GAAY/S,EAAIgT,GAEhBW,GAAmBX,EAAWhT,GAN9B,KJUT8T,UACAtR,WACAE,UACAiS,OKjBa,CAACtN,EAAYhB,KAC1B,IAAIuO,EAAc,GAElB,SAAKzN,EAAaE,KAAgBjJ,EAASiI,MAI3CuO,EAAc,IAAIvN,KAEduN,EAAY1T,OAAS,SAIzB0T,EAAYxT,SAAQ,CAACyT,EAAOpN,KAC1B,MAAM+C,EAAUqK,EAAMnO,WAGlBkJ,GAAUpF,EAASnE,IACrB7D,GAAQqS,EAAOrK,EAChB,IACD,ELFFsK,KMbW,CAACzN,EAAY0N,KACxB,IACIC,EACA/P,EACAgQ,EAHAL,EAAc,GAMlB,SACGzN,EAAaE,MACZlE,EAAO4R,IACN3W,EAAS2W,IACT/W,EAAU+W,IACVlX,EAAWkX,OAKhBH,EAAc,IAAIvN,KAEduN,EAAY1T,OAAS,SAIzB0T,EAAYxT,SAAQ,CAACyT,EAAOpN,KACtBtE,EAAO4R,GAET9P,EAAUc,EAAMgP,GAAaG,UACpB9W,EAAS2W,IAAgB/W,EAAU+I,EAAMgO,IAElD9P,EAAUgB,EAAMc,EAAMgO,IAAc,GAAMG,UACjClX,EAAU+W,GAEnB9P,EAAUgB,EAAM8O,GAAa,GAAMG,WAEnCD,EAAUF,EAAYF,EAAOpN,GAG3BxC,EADEjH,EAAUiX,GACFhP,EAAMgP,GAAS,GAAMC,UAGrBnP,EAAMgP,EAAYF,EAAOpN,IAAIyN,WAI3CjQ,EAAUA,EAAQzC,QAChB,cACA,IAAIyD,EAAM4O,GAAO,GAAMK,eAEzBF,EAAQjP,EAAMd,GAGV+P,GACFxS,GAAQwS,EAAOH,EAChB,IACD,ENxCFM,QOZc,CAAC9N,EAAY0N,KAC3B,IAGIC,EACAI,EACAH,EALAL,EAAc,GACdS,EAAW,GACXpQ,EAAU,GAMd,SACGkC,EAAaE,MACZlE,EAAO4R,IACN3W,EAAS2W,IACT/W,EAAU+W,IACVlX,EAAWkX,OAKhBH,EAAc,IAAIvN,KAEduN,EAAY1T,OAAS,KAIzBkU,EAASR,EAAY,GAEjBzR,EAAO4R,GACTM,EAAWN,EACF3W,EAAS2W,IAAgB/W,EAAU+I,EAAMgO,IAClDM,EAAWpP,EAAMc,EAAMgO,IAAc,GAAMG,UAClClX,EAAU+W,GACnBM,EAAWpP,EAAM8O,GAAa,GAAMG,WAEpCD,EAAUF,IAGRM,EADErX,EAAUiX,GACDhP,EAAMgP,GAAS,GAAMC,UAErBnP,EAAMkP,GAASC,WAI9BF,EAAQjP,EAAMsP,GACdrB,GAAKgB,GACLlB,GAAOkB,EAAOI,GAEdR,EAAYxT,SAAQ,CAACyT,EAAOpN,KAC1BxC,GAAW4P,EAAMK,UACjBlB,GAAKa,GACLA,EAAMnS,QAAQ,IAGhBuC,EAAUoQ,EAAS7S,QAAQ,cAAe,IAAIyC,OAC9C+P,EAAME,UAAYjQ,OAElBmP,GAAKY,IAAM,EP3CXM,UQhBgB,CAACjO,EAAY0N,KAC7B,IAGIE,EAHAL,EAAc,GACd3P,EAAU,GACVsQ,EAAW,GAIf,SACGpO,EAAaE,MACZlE,EAAO4R,IACN3W,EAAS2W,IACT/W,EAAU+W,IACVlX,EAAWkX,OAKhBH,EAAc,IAAIvN,KAEduN,EAAY1T,OAAS,SAIzB0T,EAAYxT,SAAQ,CAACyT,EAAOpN,KAC1BxC,EAAU4P,EAAMnU,UAGZyC,EAAO4R,GACTQ,EAAWxP,EAAMgP,GAAaG,UACrB9W,EAAS2W,IAAgB/W,EAAU+I,EAAMgO,IAElDQ,EAAWtP,EAAMc,EAAMgO,IAAc,GAAMG,UAClClX,EAAU+W,GAEnBQ,EAAWtP,EAAM8O,GAAa,GAAMG,WAEpCD,EAAUF,EAAYF,EAAOpN,GAI3B8N,EADEvX,EAAUiX,GACDhP,EAAMgP,GAAS,GAAMC,UAGrBnP,EAAMkP,GAASC,WAI9BjQ,EAAUsQ,EAAS/S,QAAQ,cAAe,IAAIyC,OAC9C4P,EAAMnU,UAAYuE,CAAO,IACzB,GCzDEuQ,GAAS,CAACC,EAAQC,KACThY,OAAOuD,KAAKyU,GAEpBtU,SAASI,IACRF,EAAOoU,EAAQlU,KACjBiU,EAAOjU,GAAQkU,EAAOlU,GACvB,GACD,ECGEmU,GAAW,CAACC,EAAIC,EAAK,OACzB,IAAIC,EAEJ,OAAO,YAAaC,GACdD,GACFE,aAAaF,GAGfA,EAAQG,YAAW,KACjBL,EAAGhY,MAAMsY,KAAMH,EAAK,GACnBF,EACJ,GC1BGzQ,GAAM,CACV+Q,qBCgB2B,CAACnW,EAAI4V,EAAI7U,EAAQ,CAAA,KAC5C,MAAMqV,EAAOpW,GAAM,KACbqG,EAAWtF,EAAMsF,UAAY,oBAC7B0F,EAAUhL,EAAMgL,SAAW,KAC3BsK,EAAatV,EAAMsV,YAAc,CAAC,GAClCC,EAAoBvV,EAAMuV,mBAAqB,EAE/CC,EAAU,CACdC,WAFiBzV,EAAMyV,YAAc,mBAGrCH,cAEII,EAAW,IAAIC,sBAAsBC,IACzCA,EAAQvV,SAASwV,IACf,MAAM1J,EAAS0J,EAAM1J,OACjB0J,EAAMN,kBAAoBA,GACxBzY,EAAW+X,IACbA,EAAGlU,KAAKqK,GAAWmB,EAAQA,EAE9B,GACD,GACDqJ,GACGhM,EAAQvM,EAAUoY,GAAQA,EAAOjS,SAUvC,OARIiS,IACFG,EAAQH,KAAOA,GAGjB7L,EAAMrD,iBAAiBb,GAAUjF,SAASyV,IACxCJ,EAASK,QAAQD,EAAQ,IAGpBJ,GD9CPM,iBEcuB,CAAC/W,EAAI4V,EAAI7U,EAAQ,CAAA,KACxC,MAAM0V,EAAW,IAAIO,kBAAkBC,GACrCA,EAAU7V,SAAS8V,IACbrZ,EAAW+X,IACbA,EAAGsB,EACJ,MAGCX,EAAU,CACdY,WAAW,EACXC,YAAY,EACZC,mBAAmB,EACnBC,eAAe,EACfC,uBAAuB,EACvBC,SAAS,GAMX,OAHAhC,GAAOe,EAASxV,GAChB0V,EAASK,QAAQ9W,EAAIuW,GAEdE,GFjCPgB,cGUoB,CAACzX,EAAIsH,EAAUoQ,EAAQ,OAC3C,IAAIjB,EACAb,EAEJ,SAAK5X,EAAUgC,KAAQnC,EAAWyJ,MAIlCsO,EAAKD,GAASrO,EAAUoQ,GACxBjB,EAAW,IAAIkB,gBAAgBhB,IAC7B,IAAK,MAAMC,KAASD,EAClBf,EAAGgB,EACJ,IAGHH,EAASK,QAAQ9W,GAEVyW,KC1BHrR,GAAM,CACVwS,UCHgB,KACR,QAAQhQ,cAAezD,UAAU2F,SAAS,aDGlD+N,OEJa,KACb,IACE,MAAsB,cAAfC,MAAMC,IACd,CAAC,MAAOC,GACP,OAAO,CACR,GFADC,SGLe,IAEM,oBAAZC,WACLA,QAAQC,YACRD,QAAQC,SAASlQ,KHErBmQ,SINe,KACf,MAAM1P,EAAKC,UAAUC,UAErB,MAAO,wDAAwDjF,KAAK+E,EAAE,EJItE2P,SKPe,KACf,MAAM3P,EAAKC,UAAUC,UACfxC,EAAUsC,EAAG4P,MAAM,sBAEzB,QAAI,QAAQ3U,KAAK+E,IAIVtC,GAAWA,EAAQ,EAAC,ELA3BqC,WACA8P,GMRS,KACT,MA2GM7P,EAAKC,UAAUC,UACrB,IAEI0P,EAFAxP,EAAO,UACPE,EAAU,KAcd,OAXAsP,EAhHkB,CAChB,CACExP,KAAM,aACN/G,QAAS,wBAEX,CACE+G,KAAM,cACN/G,QAAS,gCAEX,CACE+G,KAAM,YACN/G,QAAS,8BAEX,CACE+G,KAAM,YACN/G,QAAS,8BAEX,CACE+G,KAAM,gBACN/G,QAAS,kBAEX,CACE+G,KAAM,sBACN/G,QAAS,kBAEX,CACE+G,KAAM,aACN/G,QAAS,+BAEX,CACE+G,KAAM,eACN/G,QAAS,iCAEX,CACE+G,KAAM,aACN/G,QAAS,4BAEX,CACE+G,KAAM,aACN/G,QAAS,sBAEX,CACE+G,KAAM,aACN/G,QAAS,iCAEX,CACE+G,KAAM,iBACN/G,QAAS,sCAEX,CACE+G,KAAM,aACN/G,QAAS,cAEX,CACE+G,KAAM,eACN/G,QAAS,SAEX,CACE+G,KAAM,UACN/G,QAAS,WAEX,CACE+G,KAAM,WACN/G,QAAS,WAEX,CACE+G,KAAM,SACN/G,QAAS,SAEX,CACE+G,KAAM,QACN/G,QAAS,eAEX,CACE+G,KAAM,MACN/G,QAAS,sBAEX,CACE+G,KAAM,WACN/G,QAAS,YAEX,CACE+G,KAAM,SACN/G,QAAS,2CAEX,CACE+G,KAAM,MACN/G,QAAS,OAEX,CACE+G,KAAM,OACN/G,QAAS,QAEX,CACE+G,KAAM,OACN/G,QAAS,QAEX,CACE+G,KAAM,OACN/G,QAAS,SAEX,CACE+G,KAAM,aACN/G,QACE,iFAQYmK,MAAMsM,GAAaA,EAASzW,QAAQ4B,KAAK+E,KAEvD4P,IACFxP,EAAOwP,EAAMxP,MAGX,UAAUnF,KAAKmF,KACjBE,EAAU,eAAe5G,KAAK0G,GAAM,GACpCA,EAAO,WAGDA,GACN,IAAK,WACHE,EAAU,wBAAwB5G,KAAKsG,GAAI,GAC3C,MAEF,IAAK,UACHM,EAAU,oBAAoB5G,KAAKsG,GAAI,GACvC,MAEF,IAAK,MACHM,EAAU,yBAAyB5G,KAAKuG,UAAUY,YAClDP,EAAUA,EAAQ,GAAK,IAAMA,EAAQ,GAAK,KAAoB,EAAbA,EAAQ,IAI7D,MAAO,CACLF,OACAE,UACD,GC5IGyP,GAAiBzY,IACrB,IAAIyQ,EAAO,EAEX,OAAKzS,EAAUgC,IAIfyQ,EAAOzQ,EAAG0Q,WAGc,OAApB1Q,EAAGqK,eACLoG,GAAQgI,GAAczY,EAAGqK,eAGpBoG,GAVEA,CAUFA,ECdHiI,GAAgB1Y,IACpB,IAAI4Q,EAAM,EAEV,OAAK5S,EAAUgC,IAIf4Q,EAAM5Q,EAAG6Q,UAGe,OAApB7Q,EAAGqK,eACLuG,GAAO8H,GAAa1Y,EAAGqK,eAGlBuG,GAVEA,CAUFA,ECZH+H,GAAa3Y,IACjB,IAAI4Q,EACAH,EACAF,EACAC,EAEJ,OAAKxS,EAAUgC,IAIf4Q,EAAM8H,GAAa1Y,GACnByQ,EAAOgI,GAAczY,GACrBuQ,EAAQvQ,EAAGqQ,YACXG,EAASxQ,EAAGsQ,aAEL,CACLC,QACAC,SACAI,MACAH,SAZO,IAaR,ECnBGmI,GAAY5Y,IAChB,MAAM6Y,EAAQ9K,KAAK8K,MACnB,IAAIlO,EACAmO,EACAxJ,EACAyJ,EAGJ,SAAK/a,EAAUgC,KAAQwP,GAAYxP,MAInC8Y,EAAM9Y,EAAG6P,wBACTP,EAAMtP,EAAGmI,cACTwC,EAAawG,GAAsB7B,GAEnCyJ,EAAQF,EAAMC,EAAIrI,MAEd9F,IACFoO,GAASpO,GAGJoO,ICtBHC,GAAYhZ,IAChB,MAAM6Y,EAAQ9K,KAAK8K,MACnB,IAAInO,EACAoO,EACAxJ,EACA2J,EAEJ,SAAKjb,EAAUgC,KAAQwP,GAAYxP,MAInC8Y,EAAM9Y,EAAG6P,wBACTP,EAAMtP,EAAGmI,cACTuC,EAAY8G,GAAqBlC,GAEjC2J,EAAQJ,EAAMC,EAAIrI,MAEd/F,IACFuO,GAASvO,GAGJuO,ICpBHC,GAAalZ,MACZhC,EAAUgC,KAAQwP,GAAYxP,KAI5B,CACL6C,EAAGmW,GAAShZ,GACZ2Q,EAAGiI,GAAS5Y,ICVVmZ,GAAqB,MACzB,MAAM5O,EAAQ3C,OACd,IAAI2J,EAAU,GAEd,OAAQvR,IACN,IAAIwK,EAEJ,IAAKxM,EAAUgC,GACb,OAAOuR,EAKT,GAFA/G,EAAUxK,EAAG0G,YAER8D,EACH,OAAO+G,EAGT,GAAI/G,IAAYD,EAAMpG,SAAU,CAC9B,MAAMiV,EAAQjV,SAASsG,MAAQtG,SAASgG,gBAClCiJ,EAAW/B,GAAc+H,GACzBvW,EAAI,IAAI0O,GAMd,OAJA1O,EAAEsI,KAAKiI,EAASvQ,GAEhB0O,EAAU,GAEH1O,CACR,CAED,IACiE,IAA/D,CAAC,SAAU,QAAQxC,QAAQ2C,EAASwH,EAAS,eACoB,IAAjE,CAAC,SAAU,QAAQnK,QAAQ2C,EAASwH,EAAS,eAC7C,CACA,MAAM4I,EAAW/B,GAAc7G,GAE/B+G,EAAQpG,KAAKiI,EAASvQ,EACvB,CAED,OAAOsW,GAAmB3O,EAAO,CAEpC,EAxC0B,GCArB6O,GAAoB,MACxB,MAAM9O,EAAQ3C,OACd,IAAI8J,EAAU,GAEd,OAAQ1R,IACN,IAAIwK,EAEJ,IAAKxM,EAAUgC,GACb,OAAO0R,EAKT,GAFAlH,EAAUxK,EAAG0G,YAER8D,EACH,OAAOkH,EAGT,GAAIlH,IAAYD,EAAMpG,SAAU,CAC9B,MAAMiV,EAAQjV,SAASsG,MAAQtG,SAASgG,gBAClCiJ,EAAW3B,GAAa2H,GACxBzI,EAAI,IAAIe,GAMd,OAJAf,EAAExF,KAAKiI,EAASzC,GAEhBe,EAAU,GAEHf,CACR,CAED,IACiE,IAA/D,CAAC,SAAU,QAAQtQ,QAAQ2C,EAASwH,EAAS,eACoB,IAAjE,CAAC,SAAU,QAAQnK,QAAQ2C,EAASwH,EAAS,eAC7C,CACA,MAAM4I,EAAW3B,GAAajH,GAE9BkH,EAAQvG,KAAKiI,EAASzC,EACvB,CAED,OAAO0I,GAAkB7O,EAAO,CAEnC,EAxCyB,GCCpB8O,GAAUtZ,GACThC,EAAUgC,GAIR2Y,GAAU3Y,GAHR,KCNLuZ,GAAc1W,GACXA,EAAIA,ECUPuC,GAAM,CACVuT,aACAF,iBACAC,gBACAQ,aACAN,YACAI,YACA7H,yBACAK,wBACAG,aACAN,iBACAI,gBACA+H,eCpBqB,CAACxZ,EAAK4H,UACpB,CACLgJ,IAAKyI,GAAkBrZ,GACvByQ,KAAM0I,GAAmBnZ,KDkB3BmZ,sBACAE,qBACAC,UACAG,UEtBiBzZ,IACjB,IAAIsZ,EAEJ,SAAKtb,EAAUgC,KAAQwP,GAAYxP,MAInCsZ,EAASX,GAAU3Y,GAEZ,CACL4Q,IAAK0I,EAAO1I,IACZH,KAAM6I,EAAO7I,QACVyI,GAAUlZ,IACd,EFUD0Z,SGrBe,CAAC1Z,EAAIoT,EAAUf,EAAY,WAAYsH,EAAY,QAClE,MAAMjV,EAAM1G,EAAUgC,GAAMA,EAAK+G,EAAM/G,GACvC,IAAI4Z,EAA4B,aAAdvH,EAA2B3N,EAAIgG,UAAYhG,EAAIiG,WAC7DkP,EAAO,EACX,MAAMC,EAAW1G,EAAWwG,EACtBG,EACU,aAAd1H,EAA2B3N,EAAI0N,aAAe1N,EAAIyN,YAC9C6H,EAAe5G,EAAW2G,GAAa,EAAI3G,EAAW2G,EACtDE,EAAQC,IACRrc,EAAWwU,GACbA,EAAU6H,GACDrc,EAAW8b,IACpBA,EAAUO,IAGL,GAEHC,EAAO,KAGX,GAFAN,GAAQ,EAEJC,EAAW,GAIb,GAHAF,GAAeL,GAAWM,GAC1BnV,EAAIgG,UAAYkP,EAEZA,GAAexG,EAEjB,OADA1O,EAAIgG,UAAY0I,EACT6G,EAAK7G,QAMd,GAHAwG,GAAeL,GAAWM,GAC1BnV,EAAIgG,UAAYkP,EAEZA,GAAeI,EAEjB,OADAtV,EAAIgG,UAAYsP,EACTC,EAAKD,GAIhBI,sBAAsBD,EAAK,EAG7BC,sBAAsBD,EAAK,GChDvB/U,GAAM,CACViV,UCIgB,CAACC,EAAUC,EAAOC,KAClC,MAAMxZ,EAAQ,CACZ8E,KAAM,YAER,IAAI2U,EAgBJ,OAdIF,IACFvZ,EAAMuZ,MAAQA,GAGZC,IACFF,EAAW,aAAaE,MAAcF,GAGxCtZ,EAAMP,UAAY6Z,EAElBG,EAASnW,EAAc,QAAStD,GAEhCmD,SAASuW,KAAK3V,YAAY0V,GAEnBA,GDvBPE,QEEc,CAACC,EAAQL,KACvB,MAAMvZ,EAAQ,CACZ8E,KAAM,WACN+U,IAAK,aACLC,KAAMF,EAAS,YAAa,IAAIG,MAAOC,WAOzC,OAJIT,IACFvZ,EAAMuZ,MAAQA,GAGT,IAAIU,SAAQ,CAACC,EAASC,KAC3B,MAAMC,EAAQ9W,EAAc,OAAQtD,GAEpCoa,EAAMC,OAAS,KACbH,EAAQE,EAAM,EAEhBA,EAAME,QAAUH,EAEhBhX,SAASuW,KAAK7V,OAAOuW,EAAM,GAC5B,EFrBDG,WGAkBC,GACX,IAAIP,SAAQ,CAACC,EAASC,KAC3B,MAAMM,EAAUnX,EAAc,SAAU,CACtCwB,KAAM,kBACN4V,IAAKF,EAAQ,YAAa,IAAIT,MAAOC,YAGvCS,EAAQJ,OAAS,KACfH,EAAQO,EAAQ,EAElBA,EAAQH,QAAUH,EAElBhX,SAASsG,KAAK5F,OAAO4W,EAAQ,IHX/BE,YIDmBC,IACnB,IAAKA,EACH,OAAO,EAGTzX,SAASuW,KAAK3V,YACZT,EAAc,OAAQ,CACpBuW,IAAK,0BACLC,KAAMc,IAET,EJRDC,SKFe,CAACC,EAAM,MACtB,IAAKA,EACH,OAAO,EAGT3X,SAASuW,KAAK7V,OACZP,EAAc,OAAQ,CACpBwW,KAAMgB,EACNjB,IAAK,aAER,ELPDkB,QMGc,CAACD,EAAKvF,EAAU,MAC9B,MAAMvV,EAAQ,CACZ8Z,KAAMgB,GAAO,GACbjB,IAAK,WAGP,IAAKiB,EACH,OAAO,EAGTtG,GAAOxU,EAAOuV,GAEdpS,SAASuW,KAAK7V,OAAOP,EAAc,OAAQtD,GAAO,GChB9Cgb,GAAmB,CAAChc,EAAIoH,KAC5B,IAAI1C,EAAM1G,EAAUgC,GAAMA,EAAK,KAE/B,KAAO0E,GAGL,GAFAA,EAAM0G,GAAe1G,GAEjBkL,GAAUlL,EAAK0C,GACjB,OAAO1C,EAIX,OAAO,MCXHuX,GAAuB,CAACjc,EAAIoH,KAChC,IAAI1C,EAAM1G,EAAUgC,GAAMA,EAAK,KAE/B,KAAO0E,GAGL,GAFAA,EAAMoG,GAAmBpG,GAErBkL,GAAUlL,EAAK0C,GACjB,OAAO1C,EAIX,OAAO,MCRHU,GAAM,CACVgG,kBACAN,sBACAkR,oBACAC,wBACA3Q,mBACAN,uBACAQ,eACAD,KCZYvL,GACLoL,GAAepL,GDYtBiL,KEbYjL,GACL8K,GAAmB9K,GFa1Bkc,OGba,CAAClc,EAAIoH,IACX4U,GAAiBhc,EAAIoH,GHa5B+U,OIda,CAACnc,EAAIoH,IACX6U,GAAqBjc,EAAIoH,GJchCgV,QKjBepc,GACRsL,GAAgBtL,GLiBvBqc,QMlBerc,GACRgL,GAAoBhL,GNkB3B2L,aOtBI2Q,GAAYve,GACI,iBAANA,ECGVwe,GAAS9e,MAWRW,EAASX,KAAS6e,GAAS7e,MAI5BW,EAASX,GACPA,EAAI4C,QAAQ,MAAQ,EACf5C,EAAI+e,MAAM,KAAKhZ,KAAKgE,GAAS+U,GAAM/U,KAhBhC,CAACnJ,IACb,MAAMiC,EAAQjC,EAAImE,QAAQ,QAAS,IAEnC,OAAIlC,EAAMD,QAAQ,MAAQ,EACjB0N,KAAK0O,KAAK/N,OAAOpO,IAEjBoO,OAAOpO,EACf,EAWQoc,CAAMjf,GAGR,GAAGA,OCpBRkf,GAAoB3c,IACxB,IAAI4c,EACAC,EACAC,EACAC,EAEAC,EACAC,EACAC,EACAC,EAEAC,EACAC,EACAC,EACAC,EAEAC,EACAlN,EACAD,EAEAY,EAEJ,OAAKjT,EAAUgC,IAIf4c,EAAYL,GAAMvZ,EAAShD,EAAI,eAC/B6c,EAAeN,GAAMvZ,EAAShD,EAAI,kBAClC8c,EAAaP,GAAMvZ,EAAShD,EAAI,gBAChC+c,EAAcR,GAAMvZ,EAAShD,EAAI,iBAEjCgd,EAAYT,GAAMvZ,EAAShD,EAAI,qBAC/Bid,EAAeV,GAAMvZ,EAAShD,EAAI,wBAClCkd,EAAaX,GAAMvZ,EAAShD,EAAI,sBAChCmd,EAAcZ,GAAMvZ,EAAShD,EAAI,uBAEjCod,EAAab,GAAMvZ,EAAShD,EAAI,gBAChCqd,EAAgBd,GAAMvZ,EAAShD,EAAI,mBACnCsd,EAAcf,GAAMvZ,EAAShD,EAAI,iBACjCud,EAAehB,GAAMvZ,EAAShD,EAAI,kBAElCwd,EAAalE,GAAOtZ,GACpBsQ,EAAekN,EAAWhN,OAC1BH,EAAcmN,EAAWjN,MAEzBU,EAAOjR,EAAG6P,wBAEH,CACL+M,YACAC,eACAC,aACAC,cACAC,YACAC,eACAC,aACAC,cACAC,aACAC,gBACAC,cACAC,eACAjN,eACAD,cACAY,SAvCO,IAwCR,EC5DGc,GAAc,CAAC/R,EAAIvC,KACvB,IAAI+S,EAEJ,IAAKxS,EAAUgC,GACb,OAAO,EAGT,MAAMgd,UAAEA,EAASC,aAAEA,EAAYG,WAAEA,EAAUC,cAAEA,EAAa/M,aAAEA,GAC1DqM,GAAiB3c,GAEnB,OAAInC,EAAWJ,GACNA,EAAIuC,EAAI,CACbgd,YACAC,eACAG,aACAC,gBACA/M,iBAIC3N,EAAYlF,GAQR6S,GAAgB0M,EAAYC,IAPnCzM,EAASF,GAAgB0M,EAAYC,QAGjCzM,IAAW/S,GACbsW,GAAS/T,EAAI,SAAUuc,GAAM9e,GAAO2f,EAAaC,MAIpD,EC7BG1N,GAAa,CAAC3P,EAAIvC,KACtB,IAAI8S,EAEJ,IAAKvS,EAAUgC,GACb,OAAO,EAGT,MAAMkd,WAAEA,EAAUC,YAAEA,EAAWG,YAAEA,EAAWC,aAAEA,EAAYlN,YAAEA,GAC1DsM,GAAiB3c,GAEnB,OAAInC,EAAWJ,GACNA,EAAIuC,EAAI,CACbkd,aACAC,cACAG,cACAC,eACAlN,gBAIC1N,EAAYlF,GAQR4S,GAAe6M,EAAaC,IAPnC5M,EAAQF,GAAe6M,EAAaC,QAGhC5M,IAAU9S,GACZsW,GAAS/T,EAAI,QAASuc,GAAM9e,GAAO6f,EAAcC,MAIpD,EC5BGE,GAAc,CAACzd,EAAIvC,EAAKigB,GAAgB,KAC5C,IAAIlN,EAEJ,IAAKxS,EAAUgC,GACb,OAAO,EAGT,MAAM4c,UACJA,EAASC,aACTA,EAAYG,UACZA,EAASC,aACTA,EAAYG,WACZA,EAAUC,cACVA,EAAa/M,aACbA,GACEqM,GAAiB3c,GAGrB,OAAInC,EAAWJ,GACNA,EAAIuC,EAAI,CACb4c,YACAC,eACAG,YACAC,eACAG,aACAC,gBACA/M,iBAKC3N,EAAYlF,GA4BR6S,GA3BPE,EAASF,EAGLxJ,EAAUrJ,KACZigB,EAAgBjgB,KAId+S,GAAUoM,EAAYC,GAGjBrM,QAILA,IAAW/S,IACb+S,EAAS/S,GAAOuf,EAAYC,EAAeG,EAAaC,GAIpDK,IACFlN,GAAUoM,EAAYC,GAGxB9I,GAAS/T,EAAI,SAAUuc,GAAM/L,MAIhC,EC5DGmN,GAAa,CAAC3d,EAAIvC,EAAKigB,GAAgB,KAC3C,IAAInN,EAEJ,IAAKvS,EAAUgC,GACb,OAAO,EAGT,MAAM8c,WACJA,EAAUC,YACVA,EAAWG,WACXA,EAAUC,YACVA,EAAWG,YACXA,EAAWC,aACXA,EAAYlN,YACZA,GACEsM,GAAiB3c,GAGrB,OAAInC,EAAWJ,GACNA,EAAIuC,EAAI,CACb8c,aACAC,cACAG,aACAC,cACAG,cACAC,eACAlN,gBAKC1N,EAAYlF,GA2BR4S,GA1BPE,EAAQF,EAGJvJ,EAAUrJ,KACZigB,EAAgBjgB,KAId8S,GAASuM,EAAaC,GAGjBxM,QAILA,IAAU9S,IACZ8S,EAAQ9S,GAAOyf,EAAaC,EAAcG,EAAcC,GAGpDG,IACFnN,GAASuM,EAAaC,GAGxBhJ,GAAS/T,EAAI,QAASuc,GAAMhM,MAI/B,EC7DGnL,GAAM,CACVyM,qBACAG,oBACA4L,kBCVwB,KACxB,MAAMxL,EACJjO,SAASgG,gBAAgBiI,cAAgBjO,SAASsG,KAAK2H,aACzD,OAAOrE,KAAKG,IAAIkE,EAAcP,KAAmB,EDQjDgM,iBEZuB,KACvB,MAAM1L,EACJhO,SAASgG,gBAAgBgI,aAAehO,SAASsG,KAAK0H,YACxD,OAAOpE,KAAKG,IAAIiE,EAAaH,KAAkB,EFU/C8L,gBGbsB,IACflW,OAAOmW,OAAOvN,OHarBwN,eIdqB,IACdpW,OAAOmW,OAAOxN,MJcrBqB,qBACAG,eACApC,cACA8N,eACAE,cACAnN,OKZa,CAACxQ,EAAIvC,KAClB,IAAI6C,EAEJ,SACGtC,EAAUgC,MACT2C,EAAYlF,IAAS6e,GAAS7e,IAASW,EAASX,OAKhDkF,EAAYlF,GACP6b,GAAOtZ,GAAIwQ,QAGhBlQ,EADEgc,GAAS7e,GACH,GAAGA,MAEH,GAAGA,EAAI+E,QAAQ,OAAQ,aAGjCuR,GAAS/T,EAAI,SAAUM,IACxB,ELPDiQ,MMbY,CAACvQ,EAAIvC,KACjB,IAAI6C,EAGJ,SACGtC,EAAUgC,MACT2C,EAAYlF,IAAS6e,GAAS7e,IAASW,EAASX,OAKhDkF,EAAYlF,GACP6b,GAAOtZ,GAAIuQ,OAGhBjQ,EADEgc,GAAS7e,GACH,GAAGA,MAEH,GAAGA,EAAI+E,QAAQ,OAAQ,aAGjCuR,GAAS/T,EAAI,QAASM,IACvB,ENPD2d,MOhBaje,IACb,MAAMke,EAAUvB,GAAiB3c,GAEjC,QAAKke,GAIE,CACL5N,aAAc4N,EAAQ5N,aACtBD,YAAa6N,EAAQ7N,YACrB0B,YAAaA,GAAY/R,GACzB2P,WAAYA,GAAW3P,GACvByd,YAAaA,GAAYzd,GACzB2d,WAAYA,GAAW3d,GACvBme,OAAQ,CACNvN,IAAKsN,EAAQtB,UACb9L,MAAOoN,EAAQnB,YACfhM,OAAQmN,EAAQrB,aAChBpM,KAAMyN,EAAQpB,YAEhBsB,OAAQ,CACNxN,IAAKsN,EAAQlB,UACblM,MAAOoN,EAAQf,YACfpM,OAAQmN,EAAQjB,aAChBxM,KAAMyN,EAAQhB,YAEhBmB,QAAS,CACPzN,IAAKsN,EAAQd,WACbtM,MAAOoN,EAAQX,aACfxM,OAAQmN,EAAQb,cAChB5M,KAAMyN,EAAQZ,aAEhBrM,KAAMiN,EAAQjN,KACf,GClCGqN,GAAY,CAACte,EAAIwI,KACrB,IAAI+V,EAAQ,GAEZ,IAAKvgB,EAAUgC,KAASlC,EAAS0K,KAAYpK,EAASoK,GACpD,OAAO,EAGL1K,EAAS0K,GACX9K,OAAOuD,KAAKuH,GAAQpH,SAASI,IAC3B,MAAM/D,EAAM+K,EAAOhH,GACnB+c,GAAS,GAAG/c,KAAQ/D,IAAM,IAG5B8gB,EAAQ/V,EAGVxI,EAAGG,MAAMC,SAAWme,CAAK,ECpBrBC,GAAehd,GACK2C,SAASgG,gBACVhK,MAAMse,iBAAiBjd,GCA1Ckd,GAAc,CAACld,EAAMlB,KACzB,MAAM6J,EAAkBhG,SAASgG,gBAEjC,IAAK/L,EAASoD,KAAUpD,EAASkC,GAC/B,OAAO,EAGT6J,EAAgBhK,MAAMue,YAAYld,EAAMlB,EAAM,ECL1C8E,GAAM,CACVpC,WACA+Q,YACAxL,aACA+V,aACAE,eACAE,eACAhV,ICAU,CAAC1J,EAAIC,EAAMK,KACrB,IACGtC,EAAUgC,KACT5B,EAAS6B,KAAUnC,EAASmC,KAAUW,EAAQX,GAEhD,OAAO,EAGT,GAAI7B,EAAS6B,GAAO,CAClB,GAAK0C,EAAYrC,GAGf,OAAO0C,EAAShD,EAAIC,GAFpB8T,GAAS/T,EAAIC,EAAMK,EAIzB,KAAS,IAAIM,EAAQX,GACjB,OAAOsI,GAAUvI,EAAIC,GAErBqe,GAAUte,EAAIC,EACf,GDjBDuB,KERW,CAACA,EAAMlB,KAClB,GAAKqC,EAAYrC,GAGf,OAAOke,GAAYhd,GAFnBkd,GAAYld,EAAMlB,EAGnB,EFID8T,QACAJ,QACAtO,OGZc1F,IACd,IAAKhC,EAAUgC,GACb,OAAO,EAGuB,SAA5BgD,EAAShD,EAAI,WACfgU,GAAKhU,GAELoU,GAAKpU,EACN,GCbG2e,GAAqB,CAAC7C,EAAMjU,SAAS+W,UAEjC9C,EAAIxD,MADI,yBACc,IAAIuG,QAAO,CAAC/Q,EAAGgR,KAC3C,MAAMjW,EAAQiW,EAAEze,QAAQ,KAClBgB,EAAMyd,EAAEvb,MAAM,EAAGsF,GACjBvI,EAAQwe,EAAEvb,MAAMsF,EAAQ,GAC9B,OAAQiF,EAAEzM,GAAOf,EAAMkC,QAAQ,MAAO,KAAOsL,IAC5C,ICLCiR,GAAqBhhB,IACzB,MAAMihB,EAAS,GACT/d,EAAOvD,OAAOuD,KAAKlD,GAEzB,OAAKD,EAASC,GAIVkhB,gBACK,IAAIA,gBAAgBlhB,GAAGP,YAGhCyD,EAAKG,SAASC,IACZ2d,EAAO7T,KAAK,GAAG9J,KAAOtD,EAAEsD,KAAO,IAG1B6d,mBAAmBF,EAAOtb,KAAK,OAX7B,EAWiC,ECTtC0B,GAAM,CACV+Z,gBCRuB9gB,IACvB,MAAM2B,EAAKsE,EAAc,WAAY,CACnChE,MAAOjC,EACPwH,SAAU,mCACV1F,MAAO,KAEHiZ,EAAQjV,SAASsG,KACvB,IAAI2U,EAEJhG,EAAMrU,YAAY/E,GAClBof,EACEjb,SAASkb,eAAeC,WAAa,GACjCnb,SAASkb,eAAeE,WAAW,GAEzCvf,EAAGwf,SACHrb,SAASsb,YAAY,QACrBrG,EAAMjF,YAAYnU,GAEdof,IACFjb,SAASkb,eAAeK,kBACxBvb,SAASkb,eAAeM,SAASP,GAClC,EDZDQ,sBEL4B,CAACC,EAAUC,KACvC,MAAMC,EAAQ,IAAIC,KAAK,CAACF,IACRxb,EAAc,IAAK,CACjC2b,SAAUJ,EACV/E,KAAMoF,IAAIC,gBAAgBJ,KAGpBK,QACRF,IAAIG,gBAAgBN,EAAM,EFF1BO,WGRiB,CAACC,GAAO,EAAMvgB,EAAK,UACpC,MAAM0E,EAAMqC,EAAM/G,GAClBugB,EAAO7b,EAAI8b,oBAAsBrc,SAASsc,gBAAgB,EHO1DC,gBIZsB,IACf9Y,OAAOyX,eAAe7hB,WJY7BmjB,YKZkB,CAAC7E,EAAMjU,SAASiT,QAClC,MACM1U,ECKC,IAAIlE,OAFK,2MAEW,KDLHE,KAAK0Z,GACvB8E,EAAWxa,EAAQ,GAAKA,EAAQ,GAAG5D,QAAQ,IAAK,IAAM,GACtDiE,EAAOL,EAAQ,GAErB,MAAO,CACLwa,WACAC,SAAUza,EAAQ,IAAM,GACxB0a,SAAU1a,EAAQ,IAAM,GACxB2a,SAAU3a,EAAQ,GAClB4a,KAAM5a,EAAQ,IAAMA,EAAQ,IAAI5D,QAAQ,IAAK,IAAM,GACnDiE,KAAML,EAAQ,GACd6a,SAAU7a,EAAQ,IAClBwY,OAAQxY,EAAQ,KAAO,GACvB8a,KAAM9a,EAAQ,IACd+a,KAAM/a,EAAQ,KAAO,GACrB0U,KAAMgB,EACNrG,OAAQmL,EAAW,MAAQna,EAC5B,ELNDkY,sBACAyC,wBOb+B5f,IAC/B,MAAMwd,EAASL,KAEf,OAAOrd,EAAO0d,EAAQxd,GAAQwd,EAAOxd,GAAQ,IPW7C6f,QQfc,CAACvF,EAAK5O,EAAS,YAC7B,MAEMoU,EAAUhd,EAAc,IAAK,CACjCwW,KAAMgB,EACN5O,SACA/M,MAJA,+EAMIiZ,EAAQjV,SAASsG,KAEvB2O,EAAMrU,YAAYuc,GAClBA,EAAQlB,QACRhH,EAAMjF,YAAYmN,EAAQ,ERI1B/E,SACAgF,eSbqB,CAACvhB,EAAIsH,KAC1B,IAAKtJ,EAAUgC,GACb,OAAO,EAGTmE,SAASqd,iBAAiB,SAAUC,KAG7Btf,GAASnC,EAFEyhB,GAAKvU,QAAU,OAEDrP,EAAWyJ,IACvCA,GACD,GACD,ETGFoa,SUlBe,CAAC5F,EAAK6F,GAAS,KAC9BA,EAAU/Z,OAAOC,SAASiT,KAAOgB,EAAOlU,OAAOC,SAASrF,QAAQsZ,EAAI,EVkBpE8F,UWjBgB,CAACC,EAAaC,GAAW,KACzC,IACIC,EADAC,EAAa,CAAE,EAGnB,IAAKhkB,EAAU6jB,IAAsD,SAAtCA,EAAY3jB,QAAQgC,cACjD,OAAO,EAKT,GAFA6hB,EAAO,IAAIE,SAASJ,GAEhBC,EACFE,EAAajD,GAAkBgD,QAE/B,IAAK,MAAO1gB,EAAKf,KAAUyhB,EACzBC,EAAW3gB,GAAOf,EAItB,OAAO0hB,GXAPE,MYnBY,CAACC,EAAQC,EAAS,KAC9B,MAAMC,EAAO/Y,WAAWtG,EAASmB,SAASgG,gBAAiB,cACrDmY,EAAOlkB,EAAS+jB,GAAU7Y,WAAW6Y,EAAO3f,QAAQ,MAAO,KAAO2f,EAExE,OAAO7F,GAASgG,GAAQ,IAAK,EAAID,EAAQC,GAAMC,QAAQH,QAAe,IZgBtEI,SanBe,CAACC,EAAKL,EAAS,KAC9B,MAAMC,EAAO/Y,WAAWtG,EAASmB,SAASgG,gBAAiB,cACrDmY,EAAOlkB,EAASqkB,GAAOnZ,WAAWmZ,EAAIjgB,QAAQ,OAAQ,KAAOigB,EAEnE,OAAOnG,GAASgG,GAAQ,IAAIA,EAAOD,GAAME,QAAQH,OAAc,IbgB/DrD,4BcfU,IACP2D,KACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MCnBO,CACVnc,eACAlD,QACAjG,YACA8F,aACAkG,UACAuZ,kBCJyBvjB,IACzB,IAAKhC,EAAUgC,GACb,OAAO,EAGT,MAAMwjB,SAAEA,EAAQC,UAAEA,EAASC,UAAEA,GAAcnb,GAAUvI,GAErD,MAAO,6BAA6B2D,KAAK6f,EAAWE,EAAYD,EAAS,EDFzEpb,gBACAsb,eEPsB3jB,GAEpBhC,EAAUgC,IACV,CAAC,QAAS,QAAS,QAAS,QAAS,KAAM,KAAM,MAAM8J,SAAS9J,EAAG9B,SFKrEwJ,aDYGkc"}
JavaScript
1
https://gitee.com/yaohaixiao/dom.js.git
git@gitee.com:yaohaixiao/dom.js.git
yaohaixiao
dom.js
dom.js
main

搜索帮助