{"version":3,"file":"mdui.min.js","sources":["../../node_modules/mdn-polyfills/CustomEvent.js","../../node_modules/promise-polyfill/src/finally.js","../../node_modules/promise-polyfill/src/allSettled.js","../../node_modules/mdn-polyfills/MouseEvent.js","../../node_modules/promise-polyfill/src/index.js","../../node_modules/promise-polyfill/src/polyfill.js","../../node_modules/mdui.jq/es/utils.js","../../node_modules/mdui.jq/es/functions/each.js","../../node_modules/mdui.jq/es/JQ.js","../../node_modules/mdui.jq/es/$.js","../../src/mdui.ts","../../node_modules/mdui.jq/es/functions/contains.js","../../node_modules/mdui.jq/es/functions/merge.js","../../node_modules/mdui.jq/es/methods/each.js","../../node_modules/mdui.jq/es/methods/get.js","../../node_modules/mdui.jq/es/methods/find.js","../../node_modules/mdui.jq/es/methods/utils/event.js","../../node_modules/mdui.jq/es/functions/extend.js","../../node_modules/mdui.jq/es/functions/param.js","../../node_modules/mdui.jq/es/methods/trigger.js","../../node_modules/mdui.jq/es/functions/utils/ajax.js","../../node_modules/mdui.jq/es/functions/ajax.js","../../node_modules/mdui.jq/es/static/ajax.js","../../node_modules/mdui.jq/es/static/ajaxSetup.js","../../node_modules/mdui.jq/es/functions/ajaxSetup.js","../../node_modules/mdui.jq/es/static/contains.js","../../node_modules/mdui.jq/es/functions/utils/data.js","../../node_modules/mdui.jq/es/functions/data.js","../../node_modules/mdui.jq/es/functions/map.js","../../node_modules/mdui.jq/es/functions/removeData.js","../../node_modules/mdui.jq/es/functions/unique.js","../../node_modules/mdui.jq/es/methods/utils/dir.js","../../node_modules/mdui.jq/es/static/data.js","../../node_modules/mdui.jq/es/static/each.js","../../node_modules/mdui.jq/es/static/extend.js","../../node_modules/mdui.jq/es/static/map.js","../../node_modules/mdui.jq/es/static/merge.js","../../node_modules/mdui.jq/es/static/param.js","../../node_modules/mdui.jq/es/static/removeData.js","../../node_modules/mdui.jq/es/static/unique.js","../../node_modules/mdui.jq/es/methods/add.js","../../node_modules/mdui.jq/es/methods/addClass.js","../../node_modules/mdui.jq/es/methods/insertBefore.js","../../node_modules/mdui.jq/es/methods/before.js","../../node_modules/mdui.jq/es/methods/off.js","../../node_modules/mdui.jq/es/methods/on.js","../../node_modules/mdui.jq/es/methods/ajaxStart.js","../../node_modules/mdui.jq/es/methods/map.js","../../node_modules/mdui.jq/es/methods/clone.js","../../node_modules/mdui.jq/es/methods/is.js","../../node_modules/mdui.jq/es/methods/remove.js","../../node_modules/mdui.jq/es/methods/append.js","../../node_modules/mdui.jq/es/methods/appendTo.js","../../node_modules/mdui.jq/es/methods/attr.js","../../node_modules/mdui.jq/es/methods/children.js","../../node_modules/mdui.jq/es/methods/slice.js","../../node_modules/mdui.jq/es/methods/eq.js","../../node_modules/mdui.jq/es/methods/parent.js","../../node_modules/mdui.jq/es/methods/closest.js","../../node_modules/mdui.jq/es/methods/data.js","../../node_modules/mdui.jq/es/methods/width.js","../../node_modules/mdui.jq/es/methods/position.js","../../node_modules/mdui.jq/es/methods/offset.js","../../node_modules/mdui.jq/es/methods/empty.js","../../node_modules/mdui.jq/es/methods/extend.js","../../node_modules/mdui.jq/es/methods/filter.js","../../node_modules/mdui.jq/es/methods/first.js","../../node_modules/mdui.jq/es/methods/has.js","../../node_modules/mdui.jq/es/methods/hasClass.js","../../node_modules/mdui.jq/es/methods/hide.js","../../node_modules/mdui.jq/es/methods/val.js","../../node_modules/mdui.jq/es/methods/index.js","../../node_modules/mdui.jq/es/methods/last.js","../../node_modules/mdui.jq/es/methods/next.js","../../node_modules/mdui.jq/es/methods/not.js","../../node_modules/mdui.jq/es/methods/offsetParent.js","../../node_modules/mdui.jq/es/methods/one.js","../../node_modules/mdui.jq/es/methods/prev.js","../../node_modules/mdui.jq/es/methods/removeAttr.js","../../node_modules/mdui.jq/es/methods/removeData.js","../../node_modules/mdui.jq/es/methods/removeProp.js","../../node_modules/mdui.jq/es/methods/replaceWith.js","../../node_modules/mdui.jq/es/methods/replaceAll.js","../../node_modules/mdui.jq/es/methods/serializeArray.js","../../node_modules/mdui.jq/es/methods/serialize.js","../../node_modules/mdui.jq/es/methods/show.js","../../node_modules/mdui.jq/es/methods/siblings.js","../../node_modules/mdui.jq/es/methods/toggle.js","../../src/jq_extends/methods/reflow.ts","../../src/jq_extends/methods/transition.ts","../../src/jq_extends/methods/transitionEnd.ts","../../src/jq_extends/methods/transformOrigin.ts","../../src/jq_extends/methods/transform.ts","../../src/utils/mutation.ts","../../src/jq_extends/methods/mutation.ts","../../src/jq_extends/static/showOverlay.ts","../../src/jq_extends/static/hideOverlay.ts","../../src/jq_extends/static/lockScreen.ts","../../src/jq_extends/static/unlockScreen.ts","../../src/jq_extends/static/throttle.ts","../../src/jq_extends/static/guid.ts","../../src/utils/componentEvent.ts","../../src/global/mutation.ts","../../src/components/headroom/index.ts","../../src/utils/dom.ts","../../src/utils/parseOptions.ts","../../src/components/headroom/customAttr.ts","../../src/components/collapse/collapseAbstract.ts","../../src/components/collapse/index.ts","../../src/components/collapse/customAttr.ts","../../src/components/panel/index.ts","../../src/components/panel/customAttr.ts","../../src/components/table/index.ts","../../src/utils/touchHandler.ts","../../src/components/ripple/index.ts","../../src/components/textfield/index.ts","../../src/components/slider/index.ts","../../src/components/fab/index.ts","../../src/components/fab/customAttr.ts","../../src/components/select/index.ts","../../src/components/select/customAttr.ts","../../src/components/appbar/index.ts","../../src/components/tab/index.ts","../../src/components/tab/customAttr.ts","../../src/components/drawer/index.ts","../../src/components/drawer/customAttr.ts","../../src/utils/queue.ts","../../src/components/dialog/class.ts","../../src/components/dialog/index.ts","../../src/components/dialog/customAttr.ts","../../src/components/dialog/dialog.ts","../../src/components/dialog/alert.ts","../../src/components/dialog/confirm.ts","../../src/components/dialog/prompt.ts","../../src/components/tooltip/index.ts","../../src/components/tooltip/customAttr.ts","../../src/components/snackbar/index.ts","../../src/components/progress/spinner.ts","../../src/components/bottom_nav/index.ts","../../src/components/menu/index.ts","../../src/components/menu/customAttr.ts"],"sourcesContent":["!function(){function t(t,e){e=e||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent(\"CustomEvent\");return n.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),n}\"function\"!=typeof window.CustomEvent&&(t.prototype=window.Event.prototype,window.CustomEvent=t)}();\n","/**\n * @this {Promise}\n */\nfunction finallyConstructor(callback) {\n  var constructor = this.constructor;\n  return this.then(\n    function(value) {\n      // @ts-ignore\n      return constructor.resolve(callback()).then(function() {\n        return value;\n      });\n    },\n    function(reason) {\n      // @ts-ignore\n      return constructor.resolve(callback()).then(function() {\n        // @ts-ignore\n        return constructor.reject(reason);\n      });\n    }\n  );\n}\n\nexport default finallyConstructor;\n","function allSettled(arr) {\n  var P = this;\n  return new P(function(resolve, reject) {\n    if (!(arr && typeof arr.length !== 'undefined')) {\n      return reject(\n        new TypeError(\n          typeof arr +\n            ' ' +\n            arr +\n            ' is not iterable(cannot read property Symbol(Symbol.iterator))'\n        )\n      );\n    }\n    var args = Array.prototype.slice.call(arr);\n    if (args.length === 0) return resolve([]);\n    var remaining = args.length;\n\n    function res(i, val) {\n      if (val && (typeof val === 'object' || typeof val === 'function')) {\n        var then = val.then;\n        if (typeof then === 'function') {\n          then.call(\n            val,\n            function(val) {\n              res(i, val);\n            },\n            function(e) {\n              args[i] = { status: 'rejected', reason: e };\n              if (--remaining === 0) {\n                resolve(args);\n              }\n            }\n          );\n          return;\n        }\n      }\n      args[i] = { status: 'fulfilled', value: val };\n      if (--remaining === 0) {\n        resolve(args);\n      }\n    }\n\n    for (var i = 0; i < args.length; i++) {\n      res(i, args[i]);\n    }\n  });\n}\n\nexport default allSettled;\n","!function(){try{return new MouseEvent(\"test\")}catch(e){}var e=function(e,t){t=t||{bubbles:!1,cancelable:!1};var n=document.createEvent(\"MouseEvent\");return n.initMouseEvent(e,t.bubbles,t.cancelable,window,0,t.screenX||0,t.screenY||0,t.clientX||0,t.clientY||0,t.ctrlKey||!1,t.altKey||!1,t.shiftKey||!1,t.metaKey||!1,t.button||0,t.relatedTarget||null),n};e.prototype=Event.prototype,window.MouseEvent=e}();\n","import promiseFinally from './finally';\nimport allSettled from './allSettled';\n\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\nvar setTimeoutFunc = setTimeout;\n\nfunction isArray(x) {\n  return Boolean(x && typeof x.length !== 'undefined');\n}\n\nfunction noop() {}\n\n// Polyfill for Function.prototype.bind\nfunction bind(fn, thisArg) {\n  return function() {\n    fn.apply(thisArg, arguments);\n  };\n}\n\n/**\n * @constructor\n * @param {Function} fn\n */\nfunction Promise(fn) {\n  if (!(this instanceof Promise))\n    throw new TypeError('Promises must be constructed via new');\n  if (typeof fn !== 'function') throw new TypeError('not a function');\n  /** @type {!number} */\n  this._state = 0;\n  /** @type {!boolean} */\n  this._handled = false;\n  /** @type {Promise|undefined} */\n  this._value = undefined;\n  /** @type {!Array<!Function>} */\n  this._deferreds = [];\n\n  doResolve(fn, this);\n}\n\nfunction handle(self, deferred) {\n  while (self._state === 3) {\n    self = self._value;\n  }\n  if (self._state === 0) {\n    self._deferreds.push(deferred);\n    return;\n  }\n  self._handled = true;\n  Promise._immediateFn(function() {\n    var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n    if (cb === null) {\n      (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n      return;\n    }\n    var ret;\n    try {\n      ret = cb(self._value);\n    } catch (e) {\n      reject(deferred.promise, e);\n      return;\n    }\n    resolve(deferred.promise, ret);\n  });\n}\n\nfunction resolve(self, newValue) {\n  try {\n    // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n    if (newValue === self)\n      throw new TypeError('A promise cannot be resolved with itself.');\n    if (\n      newValue &&\n      (typeof newValue === 'object' || typeof newValue === 'function')\n    ) {\n      var then = newValue.then;\n      if (newValue instanceof Promise) {\n        self._state = 3;\n        self._value = newValue;\n        finale(self);\n        return;\n      } else if (typeof then === 'function') {\n        doResolve(bind(then, newValue), self);\n        return;\n      }\n    }\n    self._state = 1;\n    self._value = newValue;\n    finale(self);\n  } catch (e) {\n    reject(self, e);\n  }\n}\n\nfunction reject(self, newValue) {\n  self._state = 2;\n  self._value = newValue;\n  finale(self);\n}\n\nfunction finale(self) {\n  if (self._state === 2 && self._deferreds.length === 0) {\n    Promise._immediateFn(function() {\n      if (!self._handled) {\n        Promise._unhandledRejectionFn(self._value);\n      }\n    });\n  }\n\n  for (var i = 0, len = self._deferreds.length; i < len; i++) {\n    handle(self, self._deferreds[i]);\n  }\n  self._deferreds = null;\n}\n\n/**\n * @constructor\n */\nfunction Handler(onFulfilled, onRejected, promise) {\n  this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n  this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n  this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, self) {\n  var done = false;\n  try {\n    fn(\n      function(value) {\n        if (done) return;\n        done = true;\n        resolve(self, value);\n      },\n      function(reason) {\n        if (done) return;\n        done = true;\n        reject(self, reason);\n      }\n    );\n  } catch (ex) {\n    if (done) return;\n    done = true;\n    reject(self, ex);\n  }\n}\n\nPromise.prototype['catch'] = function(onRejected) {\n  return this.then(null, onRejected);\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n  // @ts-ignore\n  var prom = new this.constructor(noop);\n\n  handle(this, new Handler(onFulfilled, onRejected, prom));\n  return prom;\n};\n\nPromise.prototype['finally'] = promiseFinally;\n\nPromise.all = function(arr) {\n  return new Promise(function(resolve, reject) {\n    if (!isArray(arr)) {\n      return reject(new TypeError('Promise.all accepts an array'));\n    }\n\n    var args = Array.prototype.slice.call(arr);\n    if (args.length === 0) return resolve([]);\n    var remaining = args.length;\n\n    function res(i, val) {\n      try {\n        if (val && (typeof val === 'object' || typeof val === 'function')) {\n          var then = val.then;\n          if (typeof then === 'function') {\n            then.call(\n              val,\n              function(val) {\n                res(i, val);\n              },\n              reject\n            );\n            return;\n          }\n        }\n        args[i] = val;\n        if (--remaining === 0) {\n          resolve(args);\n        }\n      } catch (ex) {\n        reject(ex);\n      }\n    }\n\n    for (var i = 0; i < args.length; i++) {\n      res(i, args[i]);\n    }\n  });\n};\n\nPromise.allSettled = allSettled;\n\nPromise.resolve = function(value) {\n  if (value && typeof value === 'object' && value.constructor === Promise) {\n    return value;\n  }\n\n  return new Promise(function(resolve) {\n    resolve(value);\n  });\n};\n\nPromise.reject = function(value) {\n  return new Promise(function(resolve, reject) {\n    reject(value);\n  });\n};\n\nPromise.race = function(arr) {\n  return new Promise(function(resolve, reject) {\n    if (!isArray(arr)) {\n      return reject(new TypeError('Promise.race accepts an array'));\n    }\n\n    for (var i = 0, len = arr.length; i < len; i++) {\n      Promise.resolve(arr[i]).then(resolve, reject);\n    }\n  });\n};\n\n// Use polyfill for setImmediate for performance gains\nPromise._immediateFn =\n  // @ts-ignore\n  (typeof setImmediate === 'function' &&\n    function(fn) {\n      // @ts-ignore\n      setImmediate(fn);\n    }) ||\n  function(fn) {\n    setTimeoutFunc(fn, 0);\n  };\n\nPromise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n  if (typeof console !== 'undefined' && console) {\n    console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n  }\n};\n\nexport default Promise;\n","import Promise from './index';\nimport promiseFinally from './finally';\nimport allSettled from './allSettled';\n\n/** @suppress {undefinedVars} */\nvar globalNS = (function() {\n  // the only reliable means to get the global object is\n  // `Function('return this')()`\n  // However, this causes CSP violations in Chrome apps.\n  if (typeof self !== 'undefined') {\n    return self;\n  }\n  if (typeof window !== 'undefined') {\n    return window;\n  }\n  if (typeof global !== 'undefined') {\n    return global;\n  }\n  throw new Error('unable to locate global object');\n})();\n\n// Expose the polyfill if Promise is undefined or set to a\n// non-function value. The latter can be due to a named HTMLElement\n// being exposed by browsers for legacy reasons.\n// https://github.com/taylorhakes/promise-polyfill/issues/114\nif (typeof globalNS['Promise'] !== 'function') {\n  globalNS['Promise'] = Promise;\n} else if (!globalNS.Promise.prototype['finally']) {\n  globalNS.Promise.prototype['finally'] = promiseFinally;\n} else if (!globalNS.Promise.allSettled) {\n  globalNS.Promise.allSettled = allSettled;\n}\n","function isNodeName(element, name) {\n    return element.nodeName.toLowerCase() === name.toLowerCase();\n}\nfunction isFunction(target) {\n    return typeof target === 'function';\n}\nfunction isString(target) {\n    return typeof target === 'string';\n}\nfunction isNumber(target) {\n    return typeof target === 'number';\n}\nfunction isBoolean(target) {\n    return typeof target === 'boolean';\n}\nfunction isUndefined(target) {\n    return typeof target === 'undefined';\n}\nfunction isNull(target) {\n    return target === null;\n}\nfunction isWindow(target) {\n    return target instanceof Window;\n}\nfunction isDocument(target) {\n    return target instanceof Document;\n}\nfunction isElement(target) {\n    return target instanceof Element;\n}\nfunction isNode(target) {\n    return target instanceof Node;\n}\n/**\n * 是否是 IE 浏览器\n */\nfunction isIE() {\n    // @ts-ignore\n    return !!window.document.documentMode;\n}\nfunction isArrayLike(target) {\n    if (isFunction(target) || isWindow(target)) {\n        return false;\n    }\n    return isNumber(target.length);\n}\nfunction isObjectLike(target) {\n    return typeof target === 'object' && target !== null;\n}\nfunction toElement(target) {\n    return isDocument(target) ? target.documentElement : target;\n}\n/**\n * 把用 - 分隔的字符串转为驼峰(如 box-sizing 转换为 boxSizing)\n * @param string\n */\nfunction toCamelCase(string) {\n    return string\n        .replace(/^-ms-/, 'ms-')\n        .replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n/**\n * 把驼峰法转为用 - 分隔的字符串(如 boxSizing 转换为 box-sizing)\n * @param string\n */\nfunction toKebabCase(string) {\n    return string.replace(/[A-Z]/g, (replacer) => '-' + replacer.toLowerCase());\n}\n/**\n * 获取元素的样式值\n * @param element\n * @param name\n */\nfunction getComputedStyleValue(element, name) {\n    return window.getComputedStyle(element).getPropertyValue(toKebabCase(name));\n}\n/**\n * 检查元素的 box-sizing 是否是 border-box\n * @param element\n */\nfunction isBorderBox(element) {\n    return getComputedStyleValue(element, 'box-sizing') === 'border-box';\n}\n/**\n * 获取元素的 padding, border, margin 宽度(两侧宽度的和,单位为px)\n * @param element\n * @param direction\n * @param extra\n */\nfunction getExtraWidth(element, direction, extra) {\n    const position = direction === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n    return [0, 1].reduce((prev, _, index) => {\n        let prop = extra + position[index];\n        if (extra === 'border') {\n            prop += 'Width';\n        }\n        return prev + parseFloat(getComputedStyleValue(element, prop) || '0');\n    }, 0);\n}\n/**\n * 获取元素的样式值,对 width 和 height 进行过处理\n * @param element\n * @param name\n */\nfunction getStyle(element, name) {\n    // width、height 属性使用 getComputedStyle 得到的值不准确,需要使用 getBoundingClientRect 获取\n    if (name === 'width' || name === 'height') {\n        const valueNumber = element.getBoundingClientRect()[name];\n        if (isBorderBox(element)) {\n            return `${valueNumber}px`;\n        }\n        return `${valueNumber -\n            getExtraWidth(element, name, 'border') -\n            getExtraWidth(element, name, 'padding')}px`;\n    }\n    return getComputedStyleValue(element, name);\n}\n/**\n * 获取子节点组成的数组\n * @param target\n * @param parent\n */\nfunction getChildNodesArray(target, parent) {\n    const tempParent = document.createElement(parent);\n    tempParent.innerHTML = target;\n    return [].slice.call(tempParent.childNodes);\n}\n/**\n * 始终返回 false 的函数\n */\nfunction returnFalse() {\n    return false;\n}\n/**\n * 数值单位的 CSS 属性\n */\nconst cssNumber = [\n    'animationIterationCount',\n    'columnCount',\n    'fillOpacity',\n    'flexGrow',\n    'flexShrink',\n    'fontWeight',\n    'gridArea',\n    'gridColumn',\n    'gridColumnEnd',\n    'gridColumnStart',\n    'gridRow',\n    'gridRowEnd',\n    'gridRowStart',\n    'lineHeight',\n    'opacity',\n    'order',\n    'orphans',\n    'widows',\n    'zIndex',\n    'zoom',\n];\nexport { isNodeName, isArrayLike, isObjectLike, isFunction, isString, isNumber, isBoolean, isUndefined, isNull, isWindow, isDocument, isElement, isNode, isIE, toElement, toCamelCase, toKebabCase, getComputedStyleValue, isBorderBox, getExtraWidth, getStyle, getChildNodesArray, returnFalse, cssNumber, };\n","import { isArrayLike } from '../utils';\nfunction each(target, callback) {\n    if (isArrayLike(target)) {\n        for (let i = 0; i < target.length; i += 1) {\n            if (callback.call(target[i], i, target[i]) === false) {\n                return target;\n            }\n        }\n    }\n    else {\n        const keys = Object.keys(target);\n        for (let i = 0; i < keys.length; i += 1) {\n            if (callback.call(target[keys[i]], keys[i], target[keys[i]]) === false) {\n                return target;\n            }\n        }\n    }\n    return target;\n}\nexport default each;\n","import each from './functions/each';\n/**\n * 为了使用模块扩充,这里不能使用默认导出\n */\nexport class JQ {\n    constructor(arr) {\n        this.length = 0;\n        if (!arr) {\n            return this;\n        }\n        each(arr, (i, item) => {\n            // @ts-ignore\n            this[i] = item;\n        });\n        this.length = arr.length;\n        return this;\n    }\n}\n","import each from './functions/each';\nimport { JQ } from './JQ';\nimport { getChildNodesArray, isArrayLike, isFunction, isNode, isString, } from './utils';\nfunction get$() {\n    const $ = function (selector) {\n        if (!selector) {\n            return new JQ();\n        }\n        // JQ\n        if (selector instanceof JQ) {\n            return selector;\n        }\n        // function\n        if (isFunction(selector)) {\n            if (/complete|loaded|interactive/.test(document.readyState) &&\n                document.body) {\n                selector.call(document, $);\n            }\n            else {\n                document.addEventListener('DOMContentLoaded', () => selector.call(document, $), false);\n            }\n            return new JQ([document]);\n        }\n        // String\n        if (isString(selector)) {\n            const html = selector.trim();\n            // 根据 HTML 字符串创建 JQ 对象\n            if (html[0] === '<' && html[html.length - 1] === '>') {\n                let toCreate = 'div';\n                const tags = {\n                    li: 'ul',\n                    tr: 'tbody',\n                    td: 'tr',\n                    th: 'tr',\n                    tbody: 'table',\n                    option: 'select',\n                };\n                each(tags, (childTag, parentTag) => {\n                    if (html.indexOf(`<${childTag}`) === 0) {\n                        toCreate = parentTag;\n                        return false;\n                    }\n                    return;\n                });\n                return new JQ(getChildNodesArray(html, toCreate));\n            }\n            // 根据 CSS 选择器创建 JQ 对象\n            const isIdSelector = selector[0] === '#' && !selector.match(/[ .<>:~]/);\n            if (!isIdSelector) {\n                return new JQ(document.querySelectorAll(selector));\n            }\n            const element = document.getElementById(selector.slice(1));\n            if (element) {\n                return new JQ([element]);\n            }\n            return new JQ();\n        }\n        if (isArrayLike(selector) && !isNode(selector)) {\n            return new JQ(selector);\n        }\n        return new JQ([selector]);\n    };\n    $.fn = JQ.prototype;\n    return $;\n}\nconst $ = get$();\nexport default $;\n","import { MduiStatic } from './interfaces/MduiStatic';\nimport $ from 'mdui.jq/es/$';\n\n// 避免页面加载完后直接执行css动画\n// https://css-tricks.com/transitions-only-after-page-load/\nsetTimeout(() => $('body').addClass('mdui-loaded'));\n\nconst mdui = {\n  $: $,\n} as MduiStatic;\n\nexport default mdui;\n","import { toElement } from '../utils';\n/**\n * 检查 container 元素内是否包含 contains 元素\n * @param container 父元素\n * @param contains 子元素\n * @example\n```js\ncontains( document, document.body ); // true\ncontains( document.getElementById('test'), document ); // false\ncontains( $('.container').get(0), $('.contains').get(0) ); // false\n```\n */\nfunction contains(container, contains) {\n    return container !== contains && toElement(container).contains(contains);\n}\nexport default contains;\n","import each from './each';\n/**\n * 把第二个数组的元素追加到第一个数组中,并返回合并后的数组\n * @param first 第一个数组\n * @param second 该数组的元素将被追加到第一个数组中\n * @example\n```js\nmerge( [ 0, 1, 2 ], [ 2, 3, 4 ] )\n// [ 0, 1, 2, 2, 3, 4 ]\n```\n */\nfunction merge(first, second) {\n    each(second, (_, value) => {\n        first.push(value);\n    });\n    return first;\n}\nexport default merge;\n","import $ from '../$';\nimport each from '../functions/each';\n$.fn.each = function (callback) {\n    return each(this, callback);\n};\n","import $ from '../$';\n$.fn.get = function (index) {\n    return index === undefined\n        ? [].slice.call(this)\n        : this[index >= 0 ? index : index + this.length];\n};\n","import $ from '../$';\nimport merge from '../functions/merge';\nimport { JQ } from '../JQ';\nimport './each';\nimport './get';\n$.fn.find = function (selector) {\n    const foundElements = [];\n    this.each((_, element) => {\n        merge(foundElements, $(element.querySelectorAll(selector)).get());\n    });\n    return new JQ(foundElements);\n};\n","import $ from '../../$';\nimport contains from '../../functions/contains';\nimport { isObjectLike } from '../../utils';\nimport '../find';\n// 存储事件\nconst handlers = {};\n// 元素ID\nlet mduiElementId = 1;\n/**\n * 为元素赋予一个唯一的ID\n */\nfunction getElementId(element) {\n    const key = '_mduiEventId';\n    // @ts-ignore\n    if (!element[key]) {\n        // @ts-ignore\n        element[key] = ++mduiElementId;\n    }\n    // @ts-ignore\n    return element[key];\n}\n/**\n * 解析事件名中的命名空间\n */\nfunction parse(type) {\n    const parts = type.split('.');\n    return {\n        type: parts[0],\n        ns: parts.slice(1).sort().join(' '),\n    };\n}\n/**\n * 命名空间匹配规则\n */\nfunction matcherFor(ns) {\n    return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)');\n}\n/**\n * 获取匹配的事件\n * @param element\n * @param type\n * @param func\n * @param selector\n */\nfunction getHandlers(element, type, func, selector) {\n    const event = parse(type);\n    return (handlers[getElementId(element)] || []).filter((handler) => handler &&\n        (!event.type || handler.type === event.type) &&\n        (!event.ns || matcherFor(event.ns).test(handler.ns)) &&\n        (!func || getElementId(handler.func) === getElementId(func)) &&\n        (!selector || handler.selector === selector));\n}\n/**\n * 添加事件监听\n * @param element\n * @param types\n * @param func\n * @param data\n * @param selector\n */\nfunction add(element, types, func, data, selector) {\n    const elementId = getElementId(element);\n    if (!handlers[elementId]) {\n        handlers[elementId] = [];\n    }\n    // 传入 data.useCapture 来设置 useCapture: true\n    let useCapture = false;\n    if (isObjectLike(data) && data.useCapture) {\n        useCapture = true;\n    }\n    types.split(' ').forEach((type) => {\n        if (!type) {\n            return;\n        }\n        const event = parse(type);\n        function callFn(e, elem) {\n            // 因为鼠标事件模拟事件的 detail 属性是只读的,因此在 e._detail 中存储参数\n            const result = func.apply(elem, \n            // @ts-ignore\n            e._detail === undefined ? [e] : [e].concat(e._detail));\n            if (result === false) {\n                e.preventDefault();\n                e.stopPropagation();\n            }\n        }\n        function proxyFn(e) {\n            // @ts-ignore\n            if (e._ns && !matcherFor(e._ns).test(event.ns)) {\n                return;\n            }\n            // @ts-ignore\n            e._data = data;\n            if (selector) {\n                // 事件代理\n                $(element)\n                    .find(selector)\n                    .get()\n                    .reverse()\n                    .forEach((elem) => {\n                    if (elem === e.target ||\n                        contains(elem, e.target)) {\n                        callFn(e, elem);\n                    }\n                });\n            }\n            else {\n                // 不使用事件代理\n                callFn(e, element);\n            }\n        }\n        const handler = {\n            type: event.type,\n            ns: event.ns,\n            func,\n            selector,\n            id: handlers[elementId].length,\n            proxy: proxyFn,\n        };\n        handlers[elementId].push(handler);\n        element.addEventListener(handler.type, proxyFn, useCapture);\n    });\n}\n/**\n * 移除事件监听\n * @param element\n * @param types\n * @param func\n * @param selector\n */\nfunction remove(element, types, func, selector) {\n    const handlersInElement = handlers[getElementId(element)] || [];\n    const removeEvent = (handler) => {\n        delete handlersInElement[handler.id];\n        element.removeEventListener(handler.type, handler.proxy, false);\n    };\n    if (!types) {\n        handlersInElement.forEach((handler) => removeEvent(handler));\n    }\n    else {\n        types.split(' ').forEach((type) => {\n            if (type) {\n                getHandlers(element, type, func, selector).forEach((handler) => removeEvent(handler));\n            }\n        });\n    }\n}\nexport { parse, add, remove };\n","import each from '../functions/each';\nimport { isUndefined } from '../utils';\nfunction extend(target, object1, ...objectN) {\n    objectN.unshift(object1);\n    each(objectN, (_, object) => {\n        each(object, (prop, value) => {\n            if (!isUndefined(value)) {\n                target[prop] = value;\n            }\n        });\n    });\n    return target;\n}\nexport default extend;\n","import { isObjectLike } from '../utils';\nimport each from './each';\n/**\n * 将数组或对象序列化,序列化后的字符串可作为 URL 查询字符串使用\n *\n * 若传入数组,则格式必须和 serializeArray 方法的返回值一样\n * @param obj 对象或数组\n * @example\n```js\nparam({ width: 1680, height: 1050 });\n// width=1680&height=1050\n```\n * @example\n```js\nparam({ foo: { one: 1, two: 2 }})\n// foo[one]=1&foo[two]=2\n```\n * @example\n```js\nparam({ids: [1, 2, 3]})\n// ids[]=1&ids[]=2&ids[]=3\n```\n * @example\n```js\nparam([\n  {\"name\":\"name\",\"value\":\"mdui\"},\n  {\"name\":\"password\",\"value\":\"123456\"}\n])\n// name=mdui&password=123456\n```\n */\nfunction param(obj) {\n    if (!isObjectLike(obj) && !Array.isArray(obj)) {\n        return '';\n    }\n    const args = [];\n    function destructure(key, value) {\n        let keyTmp;\n        if (isObjectLike(value)) {\n            each(value, (i, v) => {\n                if (Array.isArray(value) && !isObjectLike(v)) {\n                    keyTmp = '';\n                }\n                else {\n                    keyTmp = i;\n                }\n                destructure(`${key}[${keyTmp}]`, v);\n            });\n        }\n        else {\n            if (value == null || value === '') {\n                keyTmp = '=';\n            }\n            else {\n                keyTmp = `=${encodeURIComponent(value)}`;\n            }\n            args.push(encodeURIComponent(key) + keyTmp);\n        }\n    }\n    if (Array.isArray(obj)) {\n        each(obj, function () {\n            destructure(this.name, this.value);\n        });\n    }\n    else {\n        each(obj, destructure);\n    }\n    return args.join('&');\n}\nexport default param;\n","import $ from '../$';\nimport './each';\nimport { parse } from './utils/event';\n$.fn.trigger = function (type, extraParameters) {\n    const event = parse(type);\n    let eventObject;\n    const eventParams = {\n        bubbles: true,\n        cancelable: true,\n    };\n    const isMouseEvent = ['click', 'mousedown', 'mouseup', 'mousemove'].indexOf(event.type) > -1;\n    if (isMouseEvent) {\n        // Note: MouseEvent 无法传入 detail 参数\n        eventObject = new MouseEvent(event.type, eventParams);\n    }\n    else {\n        eventParams.detail = extraParameters;\n        eventObject = new CustomEvent(event.type, eventParams);\n    }\n    // @ts-ignore\n    eventObject._detail = extraParameters;\n    // @ts-ignore\n    eventObject._ns = event.ns;\n    return this.each(function () {\n        this.dispatchEvent(eventObject);\n    });\n};\n","// 全局配置参数\nconst globalOptions = {};\n// 全局事件名\nconst ajaxEvents = {\n    ajaxStart: 'start.mdui.ajax',\n    ajaxSuccess: 'success.mdui.ajax',\n    ajaxError: 'error.mdui.ajax',\n    ajaxComplete: 'complete.mdui.ajax',\n};\nexport { globalOptions, ajaxEvents };\n","import $ from '../$';\nimport '../methods/trigger';\nimport { isString, isUndefined } from '../utils';\nimport each from './each';\nimport extend from './extend';\nimport param from './param';\nimport { ajaxEvents, globalOptions } from './utils/ajax';\n/**\n * 判断此请求方法是否通过查询字符串提交参数\n * @param method 请求方法,大写\n */\nfunction isQueryStringData(method) {\n    return ['GET', 'HEAD'].indexOf(method) >= 0;\n}\n/**\n * 添加参数到 URL 上,且 URL 中不存在 ? 时,自动把第一个 & 替换为 ?\n * @param url\n * @param query\n */\nfunction appendQuery(url, query) {\n    return `${url}&${query}`.replace(/[&?]{1,2}/, '?');\n}\n/**\n * 合并请求参数,参数优先级:options > globalOptions > defaults\n * @param options\n */\nfunction mergeOptions(options) {\n    // 默认参数\n    const defaults = {\n        url: '',\n        method: 'GET',\n        data: '',\n        processData: true,\n        async: true,\n        cache: true,\n        username: '',\n        password: '',\n        headers: {},\n        xhrFields: {},\n        statusCode: {},\n        dataType: 'text',\n        contentType: 'application/x-www-form-urlencoded',\n        timeout: 0,\n        global: true,\n    };\n    // globalOptions 中的回调函数不合并\n    each(globalOptions, (key, value) => {\n        const callbacks = [\n            'beforeSend',\n            'success',\n            'error',\n            'complete',\n            'statusCode',\n        ];\n        // @ts-ignore\n        if (callbacks.indexOf(key) < 0 && !isUndefined(value)) {\n            defaults[key] = value;\n        }\n    });\n    return extend({}, defaults, options);\n}\n/**\n * 发送 ajax 请求\n * @param options\n * @example\n```js\najax({\n  method: \"POST\",\n  url: \"some.php\",\n  data: { name: \"John\", location: \"Boston\" }\n}).then(function( msg ) {\n  alert( \"Data Saved: \" + msg );\n});\n```\n */\nfunction ajax(options) {\n    // 是否已取消请求\n    let isCanceled = false;\n    // 事件参数\n    const eventParams = {};\n    // 参数合并\n    const mergedOptions = mergeOptions(options);\n    let url = mergedOptions.url || window.location.toString();\n    const method = mergedOptions.method.toUpperCase();\n    let data = mergedOptions.data;\n    const processData = mergedOptions.processData;\n    const async = mergedOptions.async;\n    const cache = mergedOptions.cache;\n    const username = mergedOptions.username;\n    const password = mergedOptions.password;\n    const headers = mergedOptions.headers;\n    const xhrFields = mergedOptions.xhrFields;\n    const statusCode = mergedOptions.statusCode;\n    const dataType = mergedOptions.dataType;\n    const contentType = mergedOptions.contentType;\n    const timeout = mergedOptions.timeout;\n    const global = mergedOptions.global;\n    // 需要发送的数据\n    // GET/HEAD 请求和 processData 为 true 时,转换为查询字符串格式,特殊格式不转换\n    if (data &&\n        (isQueryStringData(method) || processData) &&\n        !isString(data) &&\n        !(data instanceof ArrayBuffer) &&\n        !(data instanceof Blob) &&\n        !(data instanceof Document) &&\n        !(data instanceof FormData)) {\n        data = param(data);\n    }\n    // 对于 GET、HEAD 类型的请求,把 data 数据添加到 URL 中\n    if (data && isQueryStringData(method)) {\n        // 查询字符串拼接到 URL 中\n        url = appendQuery(url, data);\n        data = null;\n    }\n    /**\n     * 触发事件和回调函数\n     * @param event\n     * @param params\n     * @param callback\n     * @param args\n     */\n    function trigger(event, params, callback, ...args) {\n        // 触发全局事件\n        if (global) {\n            $(document).trigger(event, params);\n        }\n        // 触发 ajax 回调和事件\n        let result1;\n        let result2;\n        if (callback) {\n            // 全局回调\n            if (callback in globalOptions) {\n                // @ts-ignore\n                result1 = globalOptions[callback](...args);\n            }\n            // 自定义回调\n            if (mergedOptions[callback]) {\n                // @ts-ignore\n                result2 = mergedOptions[callback](...args);\n            }\n            // beforeSend 回调返回 false 时取消 ajax 请求\n            if (callback === 'beforeSend' &&\n                (result1 === false || result2 === false)) {\n                isCanceled = true;\n            }\n        }\n    }\n    // XMLHttpRequest 请求\n    function XHR() {\n        let textStatus;\n        return new Promise((resolve, reject) => {\n            // GET/HEAD 请求的缓存处理\n            if (isQueryStringData(method) && !cache) {\n                url = appendQuery(url, `_=${Date.now()}`);\n            }\n            // 创建 XHR\n            const xhr = new XMLHttpRequest();\n            xhr.open(method, url, async, username, password);\n            if (contentType ||\n                (data && !isQueryStringData(method) && contentType !== false)) {\n                xhr.setRequestHeader('Content-Type', contentType);\n            }\n            // 设置 Accept\n            if (dataType === 'json') {\n                xhr.setRequestHeader('Accept', 'application/json, text/javascript');\n            }\n            // 添加 headers\n            if (headers) {\n                each(headers, (key, value) => {\n                    // undefined 值不发送,string 和 null 需要发送\n                    if (!isUndefined(value)) {\n                        xhr.setRequestHeader(key, value + ''); // 把 null 转换成字符串\n                    }\n                });\n            }\n            // 检查是否是跨域请求,跨域请求时不添加 X-Requested-With\n            const crossDomain = /^([\\w-]+:)?\\/\\/([^/]+)/.test(url) &&\n                RegExp.$2 !== window.location.host;\n            if (!crossDomain) {\n                xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n            }\n            if (xhrFields) {\n                each(xhrFields, (key, value) => {\n                    // @ts-ignore\n                    xhr[key] = value;\n                });\n            }\n            eventParams.xhr = xhr;\n            eventParams.options = mergedOptions;\n            let xhrTimeout;\n            xhr.onload = function () {\n                if (xhrTimeout) {\n                    clearTimeout(xhrTimeout);\n                }\n                // AJAX 返回的 HTTP 响应码是否表示成功\n                const isHttpStatusSuccess = (xhr.status >= 200 && xhr.status < 300) ||\n                    xhr.status === 304 ||\n                    xhr.status === 0;\n                let responseData;\n                if (isHttpStatusSuccess) {\n                    if (xhr.status === 204 || method === 'HEAD') {\n                        textStatus = 'nocontent';\n                    }\n                    else if (xhr.status === 304) {\n                        textStatus = 'notmodified';\n                    }\n                    else {\n                        textStatus = 'success';\n                    }\n                    if (dataType === 'json') {\n                        try {\n                            responseData =\n                                method === 'HEAD' ? undefined : JSON.parse(xhr.responseText);\n                            eventParams.data = responseData;\n                        }\n                        catch (err) {\n                            textStatus = 'parsererror';\n                            trigger(ajaxEvents.ajaxError, eventParams, 'error', xhr, textStatus);\n                            reject(new Error(textStatus));\n                        }\n                        if (textStatus !== 'parsererror') {\n                            trigger(ajaxEvents.ajaxSuccess, eventParams, 'success', responseData, textStatus, xhr);\n                            resolve(responseData);\n                        }\n                    }\n                    else {\n                        responseData =\n                            method === 'HEAD'\n                                ? undefined\n                                : xhr.responseType === 'text' || xhr.responseType === ''\n                                    ? xhr.responseText\n                                    : xhr.response;\n                        eventParams.data = responseData;\n                        trigger(ajaxEvents.ajaxSuccess, eventParams, 'success', responseData, textStatus, xhr);\n                        resolve(responseData);\n                    }\n                }\n                else {\n                    textStatus = 'error';\n                    trigger(ajaxEvents.ajaxError, eventParams, 'error', xhr, textStatus);\n                    reject(new Error(textStatus));\n                }\n                // statusCode\n                each([globalOptions.statusCode, statusCode], (_, func) => {\n                    if (func && func[xhr.status]) {\n                        if (isHttpStatusSuccess) {\n                            func[xhr.status](responseData, textStatus, xhr);\n                        }\n                        else {\n                            func[xhr.status](xhr, textStatus);\n                        }\n                    }\n                });\n                trigger(ajaxEvents.ajaxComplete, eventParams, 'complete', xhr, textStatus);\n            };\n            xhr.onerror = function () {\n                if (xhrTimeout) {\n                    clearTimeout(xhrTimeout);\n                }\n                trigger(ajaxEvents.ajaxError, eventParams, 'error', xhr, xhr.statusText);\n                trigger(ajaxEvents.ajaxComplete, eventParams, 'complete', xhr, 'error');\n                reject(new Error(xhr.statusText));\n            };\n            xhr.onabort = function () {\n                let statusText = 'abort';\n                if (xhrTimeout) {\n                    statusText = 'timeout';\n                    clearTimeout(xhrTimeout);\n                }\n                trigger(ajaxEvents.ajaxError, eventParams, 'error', xhr, statusText);\n                trigger(ajaxEvents.ajaxComplete, eventParams, 'complete', xhr, statusText);\n                reject(new Error(statusText));\n            };\n            // ajax start 回调\n            trigger(ajaxEvents.ajaxStart, eventParams, 'beforeSend', xhr);\n            if (isCanceled) {\n                reject(new Error('cancel'));\n                return;\n            }\n            // Timeout\n            if (timeout > 0) {\n                xhrTimeout = setTimeout(() => {\n                    xhr.abort();\n                }, timeout);\n            }\n            // 发送 XHR\n            xhr.send(data);\n        });\n    }\n    return XHR();\n}\nexport default ajax;\n","import $ from '../$';\nimport ajax from '../functions/ajax';\n$.ajax = ajax;\n","import $ from '../$';\nimport ajaxSetup from '../functions/ajaxSetup';\n$.ajaxSetup = ajaxSetup;\n","import extend from '../functions/extend';\nimport { globalOptions } from './utils/ajax';\n/**\n * 为 Ajax 请求设置全局配置参数\n * @param options 键值对参数\n * @example\n```js\najaxSetup({\n  dataType: 'json',\n  method: 'POST',\n});\n```\n */\nfunction ajaxSetup(options) {\n    return extend(globalOptions, options);\n}\nexport default ajaxSetup;\n","import $ from '../$';\nimport contains from '../functions/contains';\n$.contains = contains;\n","const dataNS = '_mduiElementDataStorage';\nexport default dataNS;\n","import { isObjectLike, isUndefined, toCamelCase } from '../utils';\nimport each from './each';\nimport dataNS from './utils/data';\n/**\n * 在元素上设置键值对数据\n * @param element\n * @param object\n */\nfunction setObjectToElement(element, object) {\n    // @ts-ignore\n    if (!element[dataNS]) {\n        // @ts-ignore\n        element[dataNS] = {};\n    }\n    each(object, (key, value) => {\n        // @ts-ignore\n        element[dataNS][toCamelCase(key)] = value;\n    });\n}\nfunction data(element, key, value) {\n    // 根据键值对设置值\n    // data(element, { 'key' : 'value' })\n    if (isObjectLike(key)) {\n        setObjectToElement(element, key);\n        return key;\n    }\n    // 根据 key、value 设置值\n    // data(element, 'key', 'value')\n    if (!isUndefined(value)) {\n        setObjectToElement(element, { [key]: value });\n        return value;\n    }\n    // 获取所有值\n    // data(element)\n    if (isUndefined(key)) {\n        // @ts-ignore\n        return element[dataNS] ? element[dataNS] : {};\n    }\n    // 从 dataNS 中获取指定值\n    // data(element, 'key')\n    key = toCamelCase(key);\n    // @ts-ignore\n    if (element[dataNS] && key in element[dataNS]) {\n        // @ts-ignore\n        return element[dataNS][key];\n    }\n    return undefined;\n}\nexport default data;\n","import each from './each';\nfunction map(elements, callback) {\n    let value;\n    const ret = [];\n    each(elements, (i, element) => {\n        value = callback.call(window, element, i);\n        if (value != null) {\n            ret.push(value);\n        }\n    });\n    return [].concat(...ret);\n}\nexport default map;\n","import each from '../functions/each';\nimport { isUndefined, isString, toCamelCase } from '../utils';\nimport dataNS from './utils/data';\n/**\n * 移除指定元素上存放的数据\n * @param element 存放数据的元素\n * @param name\n * 数据键名\n *\n * 若未指定键名,将移除元素上所有数据\n *\n * 多个键名可以用空格分隔,或者用数组表示多个键名\n  @example\n```js\n// 移除元素上键名为 name 的数据\nremoveData(document.body, 'name');\n```\n * @example\n```js\n// 移除元素上键名为 name1 和 name2 的数据\nremoveData(document.body, 'name1 name2');\n```\n * @example\n```js\n// 移除元素上键名为 name1 和 name2 的数据\nremoveData(document.body, ['name1', 'name2']);\n```\n * @example\n```js\n// 移除元素上所有数据\nremoveData(document.body);\n```\n */\nfunction removeData(element, name) {\n    // @ts-ignore\n    if (!element[dataNS]) {\n        return;\n    }\n    const remove = (nameItem) => {\n        nameItem = toCamelCase(nameItem);\n        // @ts-ignore\n        if (element[dataNS][nameItem]) {\n            // @ts-ignore\n            element[dataNS][nameItem] = null;\n            // @ts-ignore\n            delete element[dataNS][nameItem];\n        }\n    };\n    if (isUndefined(name)) {\n        // @ts-ignore\n        element[dataNS] = null;\n        // @ts-ignore\n        delete element[dataNS];\n        // @ts-ignore\n    }\n    else if (isString(name)) {\n        name\n            .split(' ')\n            .filter((nameItem) => nameItem)\n            .forEach((nameItem) => remove(nameItem));\n    }\n    else {\n        each(name, (_, nameItem) => remove(nameItem));\n    }\n}\nexport default removeData;\n","import each from './each';\n/**\n * 过滤掉数组中的重复元素\n * @param arr 数组\n * @example\n```js\nunique([1, 2, 12, 3, 2, 1, 2, 1, 1]);\n// [1, 2, 12, 3]\n```\n */\nfunction unique(arr) {\n    const result = [];\n    each(arr, (_, val) => {\n        if (result.indexOf(val) === -1) {\n            result.push(val);\n        }\n    });\n    return result;\n}\nexport default unique;\n","import $ from '../../$';\nimport unique from '../../functions/unique';\nimport { JQ } from '../../JQ';\nimport { isElement } from '../../utils';\nimport '../each';\nimport '../is';\nexport default function dir($elements, nameIndex, node, selector, filter) {\n    const ret = [];\n    let target;\n    $elements.each((_, element) => {\n        target = element[node];\n        // 不能包含最顶层的 document 元素\n        while (target && isElement(target)) {\n            // prevUntil, nextUntil, parentsUntil\n            if (nameIndex === 2) {\n                if (selector && $(target).is(selector)) {\n                    break;\n                }\n                if (!filter || $(target).is(filter)) {\n                    ret.push(target);\n                }\n            }\n            // prev, next, parent\n            else if (nameIndex === 0) {\n                if (!selector || $(target).is(selector)) {\n                    ret.push(target);\n                }\n                break;\n            }\n            // prevAll, nextAll, parents\n            else {\n                if (!selector || $(target).is(selector)) {\n                    ret.push(target);\n                }\n            }\n            // @ts-ignore\n            target = target[node];\n        }\n    });\n    return new JQ(unique(ret));\n}\n","import $ from '../$';\nimport data from '../functions/data';\n$.data = data;\n","import $ from '../$';\nimport each from '../functions/each';\n$.each = each;\n","import $ from '../$';\nimport each from '../functions/each';\nimport extend from '../functions/extend';\n$.extend = function (...objectN) {\n    if (objectN.length === 1) {\n        each(objectN[0], (prop, value) => {\n            this[prop] = value;\n        });\n        return this;\n    }\n    return extend(objectN.shift(), objectN.shift(), ...objectN);\n};\n","import $ from '../$';\nimport map from '../functions/map';\n$.map = map;\n","import $ from '../$';\nimport merge from '../functions/merge';\n$.merge = merge;\n","import $ from '../$';\nimport param from '../functions/param';\n$.param = param;\n","import $ from '../$';\nimport removeData from '../functions/removeData';\n$.removeData = removeData;\n","import $ from '../$';\nimport unique from '../functions/unique';\n$.unique = unique;\n","import $ from '../$';\nimport merge from '../functions/merge';\nimport unique from '../functions/unique';\nimport { JQ } from '../JQ';\nimport './get';\n$.fn.add = function (selector) {\n    return new JQ(unique(merge(this.get(), $(selector).get())));\n};\n","import $ from '../$';\nimport each from '../functions/each';\nimport { isElement, isFunction } from '../utils';\nimport './each';\neach(['add', 'remove', 'toggle'], (_, name) => {\n    $.fn[`${name}Class`] = function (className) {\n        if (name === 'remove' && !arguments.length) {\n            return this.each((_, element) => {\n                element.setAttribute('class', '');\n            });\n        }\n        return this.each((i, element) => {\n            if (!isElement(element)) {\n                return;\n            }\n            const classes = (isFunction(className)\n                ? className.call(element, i, element.getAttribute('class') || '')\n                : className)\n                .split(' ')\n                .filter((name) => name);\n            each(classes, (_, cls) => {\n                element.classList[name](cls);\n            });\n        });\n    };\n});\n","import $ from '../$';\nimport each from '../functions/each';\nimport './each';\neach(['insertBefore', 'insertAfter'], (nameIndex, name) => {\n    $.fn[name] = function (target) {\n        const $element = nameIndex ? $(this.get().reverse()) : this; // 顺序和 jQuery 保持一致\n        const $target = $(target);\n        const result = [];\n        $target.each((index, target) => {\n            if (!target.parentNode) {\n                return;\n            }\n            $element.each((_, element) => {\n                const newItem = index\n                    ? element.cloneNode(true)\n                    : element;\n                const existingItem = nameIndex ? target.nextSibling : target;\n                result.push(newItem);\n                target.parentNode.insertBefore(newItem, existingItem);\n            });\n        });\n        return $(nameIndex ? result.reverse() : result);\n    };\n});\n","import $ from '../$';\nimport each from '../functions/each';\nimport { getChildNodesArray, isFunction, isString, isElement } from '../utils';\nimport './each';\nimport './insertAfter';\nimport './insertBefore';\n/**\n * 是否不是 HTML 字符串(包裹在 <> 中)\n * @param target\n */\nfunction isPlainText(target) {\n    return (isString(target) && (target[0] !== '<' || target[target.length - 1] !== '>'));\n}\neach(['before', 'after'], (nameIndex, name) => {\n    $.fn[name] = function (...args) {\n        // after 方法,多个参数需要按参数顺序添加到元素后面,所以需要将参数顺序反向处理\n        if (nameIndex === 1) {\n            args = args.reverse();\n        }\n        return this.each((index, element) => {\n            const targets = isFunction(args[0])\n                ? [args[0].call(element, index, element.innerHTML)]\n                : args;\n            each(targets, (_, target) => {\n                let $target;\n                if (isPlainText(target)) {\n                    $target = $(getChildNodesArray(target, 'div'));\n                }\n                else if (index && isElement(target)) {\n                    $target = $(target.cloneNode(true));\n                }\n                else {\n                    $target = $(target);\n                }\n                $target[nameIndex ? 'insertAfter' : 'insertBefore'](element);\n            });\n        });\n    };\n});\n","import $ from '../$';\nimport each from '../functions/each';\nimport { isFunction, isObjectLike, returnFalse } from '../utils';\nimport './each';\nimport { remove } from './utils/event';\n$.fn.off = function (types, selector, callback) {\n    // types 是对象\n    if (isObjectLike(types)) {\n        each(types, (type, fn) => {\n            // this.off('click', undefined, function () {})\n            // this.off('click', '.box', function () {})\n            this.off(type, selector, fn);\n        });\n        return this;\n    }\n    // selector 不存在\n    if (selector === false || isFunction(selector)) {\n        callback = selector;\n        selector = undefined;\n        // this.off('click', undefined, function () {})\n    }\n    // callback 传入 `false`,相当于 `return false`\n    if (callback === false) {\n        callback = returnFalse;\n    }\n    return this.each(function () {\n        remove(this, types, callback, selector);\n    });\n};\n","import $ from '../$';\nimport each from '../functions/each';\nimport { isObjectLike, isString, returnFalse } from '../utils';\nimport './each';\nimport './off';\nimport { add } from './utils/event';\n$.fn.on = function (types, selector, data, callback, one) {\n    // types 可以是 type/func 对象\n    if (isObjectLike(types)) {\n        // (types-Object, selector, data)\n        if (!isString(selector)) {\n            // (types-Object, data)\n            data = data || selector;\n            selector = undefined;\n        }\n        each(types, (type, fn) => {\n            // selector 和 data 都可能是 undefined\n            // @ts-ignore\n            this.on(type, selector, data, fn, one);\n        });\n        return this;\n    }\n    if (data == null && callback == null) {\n        // (types, fn)\n        callback = selector;\n        data = selector = undefined;\n    }\n    else if (callback == null) {\n        if (isString(selector)) {\n            // (types, selector, fn)\n            callback = data;\n            data = undefined;\n        }\n        else {\n            // (types, data, fn)\n            callback = data;\n            data = selector;\n            selector = undefined;\n        }\n    }\n    if (callback === false) {\n        callback = returnFalse;\n    }\n    else if (!callback) {\n        return this;\n    }\n    // $().one()\n    if (one) {\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        const _this = this;\n        const origCallback = callback;\n        callback = function (event) {\n            _this.off(event.type, selector, callback);\n            // eslint-disable-next-line prefer-rest-params\n            return origCallback.apply(this, arguments);\n        };\n    }\n    return this.each(function () {\n        add(this, types, callback, data, selector);\n    });\n};\n","import $ from '../$';\nimport each from '../functions/each';\nimport { ajaxEvents } from '../functions/utils/ajax';\nimport './on';\neach(ajaxEvents, (name, eventName) => {\n    $.fn[name] = function (fn) {\n        return this.on(eventName, (e, params) => {\n            fn(e, params.xhr, params.options, params.data);\n        });\n    };\n});\n","import $ from '../$';\nimport map from '../functions/map';\nimport { JQ } from '../JQ';\n$.fn.map = function (callback) {\n    return new JQ(map(this, (element, i) => callback.call(element, i, element)));\n};\n","import $ from '../$';\nimport './map';\n$.fn.clone = function () {\n    return this.map(function () {\n        return this.cloneNode(true);\n    });\n};\n","import $ from '../$';\nimport { isDocument, isFunction, isString, isWindow } from '../utils';\nimport './each';\n$.fn.is = function (selector) {\n    let isMatched = false;\n    if (isFunction(selector)) {\n        this.each((index, element) => {\n            if (selector.call(element, index, element)) {\n                isMatched = true;\n            }\n        });\n        return isMatched;\n    }\n    if (isString(selector)) {\n        this.each((_, element) => {\n            if (isDocument(element) || isWindow(element)) {\n                return;\n            }\n            // @ts-ignore\n            const matches = element.matches || element.msMatchesSelector;\n            if (matches.call(element, selector)) {\n                isMatched = true;\n            }\n        });\n        return isMatched;\n    }\n    const $compareWith = $(selector);\n    this.each((_, element) => {\n        $compareWith.each((_, compare) => {\n            if (element === compare) {\n                isMatched = true;\n            }\n        });\n    });\n    return isMatched;\n};\n","import $ from '../$';\nimport './each';\nimport './is';\n$.fn.remove = function (selector) {\n    return this.each((_, element) => {\n        if (element.parentNode && (!selector || $(element).is(selector))) {\n            element.parentNode.removeChild(element);\n        }\n    });\n};\n","import $ from '../$';\nimport each from '../functions/each';\nimport { isFunction, isString } from '../utils';\nimport './after';\nimport './before';\nimport './clone';\nimport './each';\nimport './map';\nimport './remove';\neach(['prepend', 'append'], (nameIndex, name) => {\n    $.fn[name] = function (...args) {\n        return this.each((index, element) => {\n            const childNodes = element.childNodes;\n            const childLength = childNodes.length;\n            const child = childLength\n                ? childNodes[nameIndex ? childLength - 1 : 0]\n                : document.createElement('div');\n            if (!childLength) {\n                element.appendChild(child);\n            }\n            let contents = isFunction(args[0])\n                ? [args[0].call(element, index, element.innerHTML)]\n                : args;\n            // 如果不是字符串,则仅第一个元素使用原始元素,其他的都克隆自第一个元素\n            if (index) {\n                contents = contents.map((content) => {\n                    return isString(content) ? content : $(content).clone();\n                });\n            }\n            $(child)[nameIndex ? 'after' : 'before'](...contents);\n            if (!childLength) {\n                element.removeChild(child);\n            }\n        });\n    };\n});\n","import $ from '../$';\nimport each from '../functions/each';\nimport './insertAfter';\nimport './insertBefore';\nimport './map';\nimport './remove';\neach(['appendTo', 'prependTo'], (nameIndex, name) => {\n    $.fn[name] = function (target) {\n        const extraChilds = [];\n        const $target = $(target).map((_, element) => {\n            const childNodes = element.childNodes;\n            const childLength = childNodes.length;\n            if (childLength) {\n                return childNodes[nameIndex ? 0 : childLength - 1];\n            }\n            const child = document.createElement('div');\n            element.appendChild(child);\n            extraChilds.push(child);\n            return child;\n        });\n        const $result = this[nameIndex ? 'insertBefore' : 'insertAfter']($target);\n        $(extraChilds).remove();\n        return $result;\n    };\n});\n","import $ from '../$';\nimport each from '../functions/each';\nimport { cssNumber, getStyle, isElement, isFunction, isNull, isNumber, isObjectLike, isUndefined, toCamelCase, } from '../utils';\nimport './each';\neach(['attr', 'prop', 'css'], (nameIndex, name) => {\n    function set(element, key, value) {\n        // 值为 undefined 时,不修改\n        if (isUndefined(value)) {\n            return;\n        }\n        switch (nameIndex) {\n            // attr\n            case 0:\n                if (isNull(value)) {\n                    element.removeAttribute(key);\n                }\n                else {\n                    element.setAttribute(key, value);\n                }\n                break;\n            // prop\n            case 1:\n                // @ts-ignore\n                element[key] = value;\n                break;\n            // css\n            default:\n                key = toCamelCase(key);\n                // @ts-ignore\n                element.style[key] = isNumber(value)\n                    ? `${value}${cssNumber.indexOf(key) > -1 ? '' : 'px'}`\n                    : value;\n                break;\n        }\n    }\n    function get(element, key) {\n        switch (nameIndex) {\n            // attr\n            case 0:\n                // 属性不存在时,原生 getAttribute 方法返回 null,而 jquery 返回 undefined。这里和 jquery 保持一致\n                const value = element.getAttribute(key);\n                return isNull(value) ? undefined : value;\n            // prop\n            case 1:\n                // @ts-ignore\n                return element[key];\n            // css\n            default:\n                return getStyle(element, key);\n        }\n    }\n    $.fn[name] = function (key, value) {\n        if (isObjectLike(key)) {\n            each(key, (k, v) => {\n                // @ts-ignore\n                this[name](k, v);\n            });\n            return this;\n        }\n        if (arguments.length === 1) {\n            const element = this[0];\n            return isElement(element) ? get(element, key) : undefined;\n        }\n        return this.each((i, element) => {\n            set(element, key, isFunction(value) ? value.call(element, i, get(element, key)) : value);\n        });\n    };\n});\n","import $ from '../$';\nimport each from '../functions/each';\nimport unique from '../functions/unique';\nimport { JQ } from '../JQ';\nimport { isElement } from '../utils';\nimport './each';\nimport './is';\n$.fn.children = function (selector) {\n    const children = [];\n    this.each((_, element) => {\n        each(element.childNodes, (__, childNode) => {\n            if (!isElement(childNode)) {\n                return;\n            }\n            if (!selector || $(childNode).is(selector)) {\n                children.push(childNode);\n            }\n        });\n    });\n    return new JQ(unique(children));\n};\n","import $ from '../$';\nimport { JQ } from '../JQ';\n$.fn.slice = function (...args) {\n    return new JQ([].slice.apply(this, args));\n};\n","import $ from '../$';\nimport { JQ } from '../JQ';\nimport './slice';\n$.fn.eq = function (index) {\n    const ret = index === -1 ? this.slice(index) : this.slice(index, +index + 1);\n    return new JQ(ret);\n};\n","import $ from '../$';\nimport each from '../functions/each';\nimport './get';\nimport dir from './utils/dir';\neach(['', 's', 'sUntil'], (nameIndex, name) => {\n    $.fn[`parent${name}`] = function (selector, filter) {\n        // parents、parentsUntil 需要把元素的顺序反向处理,以便和 jQuery 的结果一致\n        const $nodes = !nameIndex ? this : $(this.get().reverse());\n        return dir($nodes, nameIndex, 'parentNode', selector, filter);\n    };\n});\n","import $ from '../$';\nimport { JQ } from '../JQ';\nimport './eq';\nimport './is';\nimport './parents';\n$.fn.closest = function (selector) {\n    if (this.is(selector)) {\n        return this;\n    }\n    const matched = [];\n    this.parents().each((_, element) => {\n        if ($(element).is(selector)) {\n            matched.push(element);\n            return false;\n        }\n    });\n    return new JQ(matched);\n};\n","import $ from '../$';\nimport data from '../functions/data';\nimport { isObjectLike, isString, isUndefined, toCamelCase, toKebabCase, } from '../utils';\nimport './each';\nconst rbrace = /^(?:{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/;\n// 从 `data-*` 中获取的值,需要经过该函数转换\nfunction getData(value) {\n    if (value === 'true') {\n        return true;\n    }\n    if (value === 'false') {\n        return false;\n    }\n    if (value === 'null') {\n        return null;\n    }\n    if (value === +value + '') {\n        return +value;\n    }\n    if (rbrace.test(value)) {\n        return JSON.parse(value);\n    }\n    return value;\n}\n// 若 value 不存在,则从 `data-*` 中获取值\nfunction dataAttr(element, key, value) {\n    if (isUndefined(value) && element.nodeType === 1) {\n        const name = 'data-' + toKebabCase(key);\n        value = element.getAttribute(name);\n        if (isString(value)) {\n            try {\n                value = getData(value);\n            }\n            catch (e) { }\n        }\n        else {\n            value = undefined;\n        }\n    }\n    return value;\n}\n$.fn.data = function (key, value) {\n    // 获取所有值\n    if (isUndefined(key)) {\n        if (!this.length) {\n            return undefined;\n        }\n        const element = this[0];\n        const resultData = data(element);\n        // window, document 上不存在 `data-*` 属性\n        if (element.nodeType !== 1) {\n            return resultData;\n        }\n        // 从 `data-*` 中获取值\n        const attrs = element.attributes;\n        let i = attrs.length;\n        while (i--) {\n            if (attrs[i]) {\n                let name = attrs[i].name;\n                if (name.indexOf('data-') === 0) {\n                    name = toCamelCase(name.slice(5));\n                    resultData[name] = dataAttr(element, name, resultData[name]);\n                }\n            }\n        }\n        return resultData;\n    }\n    // 同时设置多个值\n    if (isObjectLike(key)) {\n        return this.each(function () {\n            data(this, key);\n        });\n    }\n    // value 传入了 undefined\n    if (arguments.length === 2 && isUndefined(value)) {\n        return this;\n    }\n    // 设置值\n    if (!isUndefined(value)) {\n        return this.each(function () {\n            data(this, key, value);\n        });\n    }\n    // 获取值\n    if (!this.length) {\n        return undefined;\n    }\n    return dataAttr(this[0], key, data(this[0], key));\n};\n","import $ from '../$';\nimport each from '../functions/each';\nimport { isBoolean, isDocument, isFunction, isWindow, toElement, isBorderBox, getExtraWidth, getComputedStyleValue, isIE, } from '../utils';\nimport './css';\nimport './each';\n/**\n * 值上面的 padding、border、margin 处理\n * @param element\n * @param name\n * @param value\n * @param funcIndex\n * @param includeMargin\n * @param multiply\n */\nfunction handleExtraWidth(element, name, value, funcIndex, includeMargin, multiply) {\n    // 获取元素的 padding, border, margin 宽度(两侧宽度的和)\n    const getExtraWidthValue = (extra) => {\n        return (getExtraWidth(element, name.toLowerCase(), extra) *\n            multiply);\n    };\n    if (funcIndex === 2 && includeMargin) {\n        value += getExtraWidthValue('margin');\n    }\n    if (isBorderBox(element)) {\n        // IE 为 box-sizing: border-box 时,得到的值不含 border 和 padding,这里先修复\n        // 仅获取时需要处理,multiply === 1 为 get\n        if (isIE() && multiply === 1) {\n            value += getExtraWidthValue('border');\n            value += getExtraWidthValue('padding');\n        }\n        if (funcIndex === 0) {\n            value -= getExtraWidthValue('border');\n        }\n        if (funcIndex === 1) {\n            value -= getExtraWidthValue('border');\n            value -= getExtraWidthValue('padding');\n        }\n    }\n    else {\n        if (funcIndex === 0) {\n            value += getExtraWidthValue('padding');\n        }\n        if (funcIndex === 2) {\n            value += getExtraWidthValue('border');\n            value += getExtraWidthValue('padding');\n        }\n    }\n    return value;\n}\n/**\n * 获取元素的样式值\n * @param element\n * @param name\n * @param funcIndex 0: innerWidth, innerHeight; 1: width, height; 2: outerWidth, outerHeight\n * @param includeMargin\n */\nfunction get(element, name, funcIndex, includeMargin) {\n    const clientProp = `client${name}`;\n    const scrollProp = `scroll${name}`;\n    const offsetProp = `offset${name}`;\n    const innerProp = `inner${name}`;\n    // $(window).width()\n    if (isWindow(element)) {\n        // outerWidth, outerHeight 需要包含滚动条的宽度\n        return funcIndex === 2\n            ? element[innerProp]\n            : toElement(document)[clientProp];\n    }\n    // $(document).width()\n    if (isDocument(element)) {\n        const doc = toElement(element);\n        return Math.max(\n        // @ts-ignore\n        element.body[scrollProp], doc[scrollProp], \n        // @ts-ignore\n        element.body[offsetProp], doc[offsetProp], doc[clientProp]);\n    }\n    const value = parseFloat(getComputedStyleValue(element, name.toLowerCase()) || '0');\n    return handleExtraWidth(element, name, value, funcIndex, includeMargin, 1);\n}\n/**\n * 设置元素的样式值\n * @param element\n * @param elementIndex\n * @param name\n * @param funcIndex 0: innerWidth, innerHeight; 1: width, height; 2: outerWidth, outerHeight\n * @param includeMargin\n * @param value\n */\nfunction set(element, elementIndex, name, funcIndex, includeMargin, value) {\n    let computedValue = isFunction(value)\n        ? value.call(element, elementIndex, get(element, name, funcIndex, includeMargin))\n        : value;\n    if (computedValue == null) {\n        return;\n    }\n    const $element = $(element);\n    const dimension = name.toLowerCase();\n    // 特殊的值,不需要计算 padding、border、margin\n    if (['auto', 'inherit', ''].indexOf(computedValue) > -1) {\n        $element.css(dimension, computedValue);\n        return;\n    }\n    // 其他值保留原始单位。注意:如果不使用 px 作为单位,则算出的值一般是不准确的\n    const suffix = computedValue.toString().replace(/\\b[0-9.]*/, '');\n    const numerical = parseFloat(computedValue);\n    computedValue =\n        handleExtraWidth(element, name, numerical, funcIndex, includeMargin, -1) +\n            (suffix || 'px');\n    $element.css(dimension, computedValue);\n}\neach(['Width', 'Height'], (_, name) => {\n    each([`inner${name}`, name.toLowerCase(), `outer${name}`], (funcIndex, funcName) => {\n        $.fn[funcName] = function (margin, value) {\n            // 是否是赋值操作\n            const isSet = arguments.length && (funcIndex < 2 || !isBoolean(margin));\n            const includeMargin = margin === true || value === true;\n            // 获取第一个元素的值\n            if (!isSet) {\n                return this.length\n                    ? get(this[0], name, funcIndex, includeMargin)\n                    : undefined;\n            }\n            // 设置每个元素的值\n            return this.each((index, element) => set(element, index, name, funcIndex, includeMargin, margin));\n        };\n    });\n});\n","import $ from '../$';\nimport './css';\nimport './eq';\nimport './offset';\nimport './offsetParent';\nfunction floatStyle($element, name) {\n    return parseFloat($element.css(name));\n}\n$.fn.position = function () {\n    if (!this.length) {\n        return undefined;\n    }\n    const $element = this.eq(0);\n    let currentOffset;\n    let parentOffset = {\n        left: 0,\n        top: 0,\n    };\n    if ($element.css('position') === 'fixed') {\n        currentOffset = $element[0].getBoundingClientRect();\n    }\n    else {\n        currentOffset = $element.offset();\n        const $offsetParent = $element.offsetParent();\n        parentOffset = $offsetParent.offset();\n        parentOffset.top += floatStyle($offsetParent, 'border-top-width');\n        parentOffset.left += floatStyle($offsetParent, 'border-left-width');\n    }\n    return {\n        top: currentOffset.top - parentOffset.top - floatStyle($element, 'margin-top'),\n        left: currentOffset.left -\n            parentOffset.left -\n            floatStyle($element, 'margin-left'),\n    };\n};\n","import $ from '../$';\nimport extend from '../functions/extend';\nimport { isFunction } from '../utils';\nimport './css';\nimport './each';\nimport './position';\nfunction get(element) {\n    if (!element.getClientRects().length) {\n        return { top: 0, left: 0 };\n    }\n    const rect = element.getBoundingClientRect();\n    const win = element.ownerDocument.defaultView;\n    return {\n        top: rect.top + win.pageYOffset,\n        left: rect.left + win.pageXOffset,\n    };\n}\nfunction set(element, value, index) {\n    const $element = $(element);\n    const position = $element.css('position');\n    if (position === 'static') {\n        $element.css('position', 'relative');\n    }\n    const currentOffset = get(element);\n    const currentTopString = $element.css('top');\n    const currentLeftString = $element.css('left');\n    let currentTop;\n    let currentLeft;\n    const calculatePosition = (position === 'absolute' || position === 'fixed') &&\n        (currentTopString + currentLeftString).indexOf('auto') > -1;\n    if (calculatePosition) {\n        const currentPosition = $element.position();\n        currentTop = currentPosition.top;\n        currentLeft = currentPosition.left;\n    }\n    else {\n        currentTop = parseFloat(currentTopString);\n        currentLeft = parseFloat(currentLeftString);\n    }\n    const computedValue = isFunction(value)\n        ? value.call(element, index, extend({}, currentOffset))\n        : value;\n    $element.css({\n        top: computedValue.top != null\n            ? computedValue.top - currentOffset.top + currentTop\n            : undefined,\n        left: computedValue.left != null\n            ? computedValue.left - currentOffset.left + currentLeft\n            : undefined,\n    });\n}\n$.fn.offset = function (value) {\n    // 获取坐标\n    if (!arguments.length) {\n        if (!this.length) {\n            return undefined;\n        }\n        return get(this[0]);\n    }\n    // 设置坐标\n    return this.each(function (index) {\n        set(this, value, index);\n    });\n};\n","import $ from '../$';\nimport './each';\n$.fn.empty = function () {\n    return this.each(function () {\n        this.innerHTML = '';\n    });\n};\n","import $ from '../$';\nimport each from '../functions/each';\n$.fn.extend = function (obj) {\n    each(obj, (prop, value) => {\n        // 在 JQ 对象上扩展方法时,需要自己添加 typescript 的类型定义\n        $.fn[prop] = value;\n    });\n    return this;\n};\n","import $ from '../$';\nimport { isFunction, isString } from '../utils';\nimport './is';\nimport './map';\n$.fn.filter = function (selector) {\n    if (isFunction(selector)) {\n        return this.map((index, element) => selector.call(element, index, element) ? element : undefined);\n    }\n    if (isString(selector)) {\n        return this.map((_, element) => $(element).is(selector) ? element : undefined);\n    }\n    const $selector = $(selector);\n    return this.map((_, element) => $selector.get().indexOf(element) > -1 ? element : undefined);\n};\n","import $ from '../$';\nimport './eq';\n$.fn.first = function () {\n    return this.eq(0);\n};\n","import $ from '../$';\nimport contains from '../functions/contains';\nimport { isString } from '../utils';\nimport './find';\n$.fn.has = function (selector) {\n    const $targets = isString(selector) ? this.find(selector) : $(selector);\n    const { length } = $targets;\n    return this.map(function () {\n        for (let i = 0; i < length; i += 1) {\n            if (contains(this, $targets[i])) {\n                return this;\n            }\n        }\n        return;\n    });\n};\n","import $ from '../$';\n$.fn.hasClass = function (className) {\n    return this[0].classList.contains(className);\n};\n","import $ from '../$';\nimport './each';\n$.fn.hide = function () {\n    return this.each(function () {\n        this.style.display = 'none';\n    });\n};\n","import $ from '../$';\nimport each from '../functions/each';\nimport map from '../functions/map';\nimport { isElement, isFunction, isUndefined, toElement } from '../utils';\nimport './each';\nimport './is';\neach(['val', 'html', 'text'], (nameIndex, name) => {\n    const props = {\n        0: 'value',\n        1: 'innerHTML',\n        2: 'textContent',\n    };\n    const propName = props[nameIndex];\n    function get($elements) {\n        // text() 获取所有元素的文本\n        if (nameIndex === 2) {\n            // @ts-ignore\n            return map($elements, (element) => toElement(element)[propName]).join('');\n        }\n        // 空集合时,val() 和 html() 返回 undefined\n        if (!$elements.length) {\n            return undefined;\n        }\n        // val() 和 html() 仅获取第一个元素的内容\n        const firstElement = $elements[0];\n        // select multiple 返回数组\n        if (nameIndex === 0 && $(firstElement).is('select[multiple]')) {\n            return map($(firstElement).find('option:checked'), (element) => element.value);\n        }\n        // @ts-ignore\n        return firstElement[propName];\n    }\n    function set(element, value) {\n        // text() 和 html() 赋值为 undefined,则保持原内容不变\n        // val() 赋值为 undefined 则赋值为空\n        if (isUndefined(value)) {\n            if (nameIndex !== 0) {\n                return;\n            }\n            value = '';\n        }\n        if (nameIndex === 1 && isElement(value)) {\n            value = value.outerHTML;\n        }\n        // @ts-ignore\n        element[propName] = value;\n    }\n    $.fn[name] = function (value) {\n        // 获取值\n        if (!arguments.length) {\n            return get(this);\n        }\n        // 设置值\n        return this.each((i, element) => {\n            const computedValue = isFunction(value)\n                ? value.call(element, i, get($(element)))\n                : value;\n            // value 是数组,则选中数组中的元素,反选不在数组中的元素\n            if (nameIndex === 0 && Array.isArray(computedValue)) {\n                // select[multiple]\n                if ($(element).is('select[multiple]')) {\n                    map($(element).find('option'), (option) => (option.selected =\n                        computedValue.indexOf(option.value) >\n                            -1));\n                }\n                // 其他 checkbox, radio 等元素\n                else {\n                    element.checked =\n                        computedValue.indexOf(element.value) > -1;\n                }\n            }\n            else {\n                set(element, computedValue);\n            }\n        });\n    };\n});\n","import $ from '../$';\nimport { isString } from '../utils';\nimport './children';\nimport './eq';\nimport './get';\nimport './parent';\n$.fn.index = function (selector) {\n    if (!arguments.length) {\n        return this.eq(0).parent().children().get().indexOf(this[0]);\n    }\n    if (isString(selector)) {\n        return $(selector).get().indexOf(this[0]);\n    }\n    return this.get().indexOf($(selector)[0]);\n};\n","import $ from '../$';\nimport './eq';\n$.fn.last = function () {\n    return this.eq(-1);\n};\n","import $ from '../$';\nimport each from '../functions/each';\nimport dir from './utils/dir';\neach(['', 'All', 'Until'], (nameIndex, name) => {\n    $.fn[`next${name}`] = function (selector, filter) {\n        return dir(this, nameIndex, 'nextElementSibling', selector, filter);\n    };\n});\n","import $ from '../$';\nimport './filter';\nimport './map';\n$.fn.not = function (selector) {\n    const $excludes = this.filter(selector);\n    return this.map((_, element) => $excludes.index(element) > -1 ? undefined : element);\n};\n","import $ from '../$';\nimport './css';\nimport './map';\n/**\n * 返回最近的用于定位的父元素\n */\n$.fn.offsetParent = function () {\n    return this.map(function () {\n        let offsetParent = this.offsetParent;\n        while (offsetParent && $(offsetParent).css('position') === 'static') {\n            offsetParent = offsetParent.offsetParent;\n        }\n        return offsetParent || document.documentElement;\n    });\n};\n","import $ from '../$';\nimport './on';\n$.fn.one = function (types, selector, data, callback) {\n    // @ts-ignore\n    return this.on(types, selector, data, callback, true);\n};\n","import $ from '../$';\nimport each from '../functions/each';\nimport './get';\nimport dir from './utils/dir';\neach(['', 'All', 'Until'], (nameIndex, name) => {\n    $.fn[`prev${name}`] = function (selector, filter) {\n        // prevAll、prevUntil 需要把元素的顺序倒序处理,以便和 jQuery 的结果一致\n        const $nodes = !nameIndex ? this : $(this.get().reverse());\n        return dir($nodes, nameIndex, 'previousElementSibling', selector, filter);\n    };\n});\n","import $ from '../$';\nimport each from '../functions/each';\nimport './each';\n$.fn.removeAttr = function (attributeName) {\n    const names = attributeName.split(' ').filter((name) => name);\n    return this.each(function () {\n        each(names, (_, name) => {\n            this.removeAttribute(name);\n        });\n    });\n};\n","import $ from '../$';\nimport removeData from '../functions/removeData';\nimport './each';\n$.fn.removeData = function (name) {\n    return this.each(function () {\n        removeData(this, name);\n    });\n};\n","import $ from '../$';\nimport './each';\n$.fn.removeProp = function (name) {\n    return this.each(function () {\n        try {\n            // @ts-ignore\n            delete this[name];\n        }\n        catch (e) { }\n    });\n};\n","import $ from '../$';\nimport './before';\nimport './clone';\nimport './each';\nimport './remove';\nimport { isFunction, isString } from '../utils';\n$.fn.replaceWith = function (newContent) {\n    this.each((index, element) => {\n        let content = newContent;\n        if (isFunction(content)) {\n            content = content.call(element, index, element.innerHTML);\n        }\n        else if (index && !isString(content)) {\n            content = $(content).clone();\n        }\n        $(element).before(content);\n    });\n    return this.remove();\n};\n","import $ from '../$';\nimport './clone';\nimport './get';\nimport './map';\nimport './replaceWith';\n$.fn.replaceAll = function (target) {\n    return $(target).map((index, element) => {\n        $(element).replaceWith(index ? this.clone() : this);\n        return this.get();\n    });\n};\n","import $ from '../$';\nimport './each';\nimport './val';\n/**\n * 将表单元素的值组合成键值对数组\n * @returns {Array}\n */\n$.fn.serializeArray = function () {\n    const result = [];\n    this.each((_, element) => {\n        const elements = element instanceof HTMLFormElement ? element.elements : [element];\n        $(elements).each((_, element) => {\n            const $element = $(element);\n            const type = element.type;\n            const nodeName = element.nodeName.toLowerCase();\n            if (nodeName !== 'fieldset' &&\n                element.name &&\n                !element.disabled &&\n                ['input', 'select', 'textarea', 'keygen'].indexOf(nodeName) > -1 &&\n                ['submit', 'button', 'image', 'reset', 'file'].indexOf(type) === -1 &&\n                (['radio', 'checkbox'].indexOf(type) === -1 ||\n                    element.checked)) {\n                const value = $element.val();\n                const valueArr = Array.isArray(value) ? value : [value];\n                valueArr.forEach((value) => {\n                    result.push({\n                        name: element.name,\n                        value,\n                    });\n                });\n            }\n        });\n    });\n    return result;\n};\n","import $ from '../$';\nimport param from '../functions/param';\nimport './serializeArray';\n$.fn.serialize = function () {\n    return param(this.serializeArray());\n};\n","import $ from '../$';\nimport { getStyle } from '../utils';\nimport './each';\nconst elementDisplay = {};\n/**\n * 获取元素的初始 display 值,用于 .show() 方法\n * @param nodeName\n */\nfunction defaultDisplay(nodeName) {\n    let element;\n    let display;\n    if (!elementDisplay[nodeName]) {\n        element = document.createElement(nodeName);\n        document.body.appendChild(element);\n        display = getStyle(element, 'display');\n        element.parentNode.removeChild(element);\n        if (display === 'none') {\n            display = 'block';\n        }\n        elementDisplay[nodeName] = display;\n    }\n    return elementDisplay[nodeName];\n}\n/**\n * 显示指定元素\n * @returns {JQ}\n */\n$.fn.show = function () {\n    return this.each(function () {\n        if (this.style.display === 'none') {\n            this.style.display = '';\n        }\n        if (getStyle(this, 'display') === 'none') {\n            this.style.display = defaultDisplay(this.nodeName);\n        }\n    });\n};\n","import $ from '../$';\nimport './add';\nimport './nextAll';\nimport './prevAll';\n/**\n * 取得同辈元素的集合\n * @param selector {String=}\n * @returns {JQ}\n */\n$.fn.siblings = function (selector) {\n    return this.prevAll(selector).add(this.nextAll(selector));\n};\n","import $ from '../$';\nimport { getStyle } from '../utils';\nimport './each';\nimport './hide';\nimport './show';\n/**\n * 切换元素的显示状态\n */\n$.fn.toggle = function () {\n    return this.each(function () {\n        getStyle(this, 'display') === 'none' ? $(this).show() : $(this).hide();\n    });\n};\n","import $ from 'mdui.jq/es/$';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/each';\n\ndeclare module 'mdui.jq/es/JQ' {\n  interface JQ<T = HTMLElement> {\n    /**\n     * 强制重绘当前元素\n     *\n     * @example\n```js\n$('.box').reflow();\n```\n     */\n    reflow(): this;\n  }\n}\n\n$.fn.reflow = function (this: JQ): JQ {\n  return this.each(function () {\n    return this.clientLeft;\n  });\n};\n","import $ from 'mdui.jq/es/$';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport { isNumber } from 'mdui.jq/es/utils';\nimport 'mdui.jq/es/methods/each';\n\ndeclare module 'mdui.jq/es/JQ' {\n  interface JQ<T = HTMLElement> {\n    /**\n     * 设置当前元素的 transition-duration 属性\n     * @param duration 可以是带单位的值;若不带单位,则自动添加 `ms` 作为单位\n     * @example\n```js\n$('.box').transition('300ms');\n$('.box').transition(300);\n```\n     */\n    transition(duration: string | number): this;\n  }\n}\n\n$.fn.transition = function (this: JQ, duration: string | number): JQ {\n  if (isNumber(duration)) {\n    duration = `${duration}ms`;\n  }\n\n  return this.each(function () {\n    this.style.webkitTransitionDuration = duration as string;\n    this.style.transitionDuration = duration as string;\n  });\n};\n","import $ from 'mdui.jq/es/$';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport each from 'mdui.jq/es/functions/each';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/off';\n\ndeclare module 'mdui.jq/es/JQ' {\n  interface JQ<T = HTMLElement> {\n    /**\n     * 在当前元素上添加 transitionend 事件回调\n     * @param callback 回调函数的参数为 `transitionend` 事件对象;`this` 指向当前元素\n     * @example\n```js\n$('.box').transitionEnd(function() {\n  alert('.box 元素的 transitionend 事件已触发');\n});\n```\n     */\n    transitionEnd(callback: (this: T, e: Event) => void): this;\n  }\n}\n\n$.fn.transitionEnd = function (\n  this: JQ,\n  callback: (this: HTMLElement, e: Event) => void,\n): JQ {\n  // eslint-disable-next-line @typescript-eslint/no-this-alias\n  const that = this;\n  const events = ['webkitTransitionEnd', 'transitionend'];\n\n  function fireCallback(this: Element | Document | Window, e: Event): void {\n    if (e.target !== this) {\n      return;\n    }\n\n    // @ts-ignore\n    callback.call(this, e);\n\n    each(events, (_, event) => {\n      that.off(event, fireCallback);\n    });\n  }\n\n  each(events, (_, event) => {\n    that.on(event, fireCallback);\n  });\n\n  return this;\n};\n","import $ from 'mdui.jq/es/$';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/each';\n\ndeclare module 'mdui.jq/es/JQ' {\n  interface JQ<T = HTMLElement> {\n    /**\n     * 设置当前元素的 transform-origin 属性\n     * @param transformOrigin\n     * @example\n```js\n$('.box').transformOrigin('top center');\n```\n     */\n    transformOrigin(transformOrigin: string): this;\n  }\n}\n\n$.fn.transformOrigin = function (this: JQ, transformOrigin: string): JQ {\n  return this.each(function () {\n    this.style.webkitTransformOrigin = transformOrigin;\n    this.style.transformOrigin = transformOrigin;\n  });\n};\n","import $ from 'mdui.jq/es/$';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/each';\n\ndeclare module 'mdui.jq/es/JQ' {\n  interface JQ<T = HTMLElement> {\n    /**\n     * 设置当前元素的 transform 属性\n     * @param transform\n     * @example\n```js\n$('.box').transform('rotate(90deg)');\n```\n     */\n    transform(transform: string): this;\n  }\n}\n\n$.fn.transform = function (this: JQ, transform: string): JQ {\n  return this.each(function () {\n    this.style.webkitTransform = transform;\n    this.style.transform = transform;\n  });\n};\n","import PlainObject from 'mdui.jq/es/interfaces/PlainObject';\nimport data from 'mdui.jq/es/functions/data';\n\ntype TYPE_API_INIT = (\n  this: HTMLElement,\n  i: number,\n  element: HTMLElement,\n) => void;\n\n/**\n * CSS 选择器和初始化函数组成的对象\n */\nconst entries: PlainObject<TYPE_API_INIT> = {};\n\n/**\n * 注册并执行初始化函数\n * @param selector CSS 选择器\n * @param apiInit 初始化函数\n * @param i 元素索引\n * @param element 元素\n */\nfunction mutation(\n  selector: string,\n  apiInit: TYPE_API_INIT,\n  i: number,\n  element: HTMLElement,\n): void {\n  let selectors = data(element, '_mdui_mutation');\n\n  if (!selectors) {\n    selectors = [];\n    data(element, '_mdui_mutation', selectors);\n  }\n\n  if (selectors.indexOf(selector) === -1) {\n    selectors.push(selector);\n    apiInit.call(element, i, element);\n  }\n}\n\nexport { TYPE_API_INIT, entries, mutation };\n","import $ from 'mdui.jq/es/$';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport each from 'mdui.jq/es/functions/each';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/is';\nimport { entries, mutation } from '../../utils/mutation';\n\ndeclare module 'mdui.jq/es/JQ' {\n  interface JQ<T = HTMLElement> {\n    /**\n     * 执行在当前元素及其子元素内注册的初始化函数\n     */\n    mutation(): this;\n  }\n}\n\n$.fn.mutation = function (this: JQ): JQ {\n  return this.each((i, element) => {\n    const $this = $(element);\n\n    each(entries, (selector: string, apiInit) => {\n      if ($this.is(selector)) {\n        mutation(selector, apiInit, i, element);\n      }\n\n      $this.find(selector).each((i, element) => {\n        mutation(selector, apiInit, i, element);\n      });\n    });\n  });\n};\n","import $ from 'mdui.jq/es/$';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport { isUndefined } from 'mdui.jq/es/utils';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/css';\nimport 'mdui.jq/es/methods/appendTo';\nimport 'mdui.jq/es/methods/addClass';\nimport '../methods/reflow';\n\ndeclare module 'mdui.jq/es/interfaces/JQStatic' {\n  interface JQStatic {\n    /**\n     * 创建并显示遮罩,返回遮罩层的 JQ 对象\n     * @param zIndex 遮罩层的 `z-index` 值,默认为 `2000`\n     * @example\n```js\n$.showOverlay();\n```\n     * @example\n```js\n$.showOverlay(3000);\n```\n     */\n    showOverlay(zIndex?: number): JQ;\n  }\n}\n\n$.showOverlay = function (zIndex?: number): JQ {\n  let $overlay = $('.mdui-overlay');\n\n  if ($overlay.length) {\n    $overlay.data('_overlay_is_deleted', false);\n\n    if (!isUndefined(zIndex)) {\n      $overlay.css('z-index', zIndex);\n    }\n  } else {\n    if (isUndefined(zIndex)) {\n      zIndex = 2000;\n    }\n\n    $overlay = $('<div class=\"mdui-overlay\">')\n      .appendTo(document.body)\n      .reflow()\n      .css('z-index', zIndex);\n  }\n\n  let level = $overlay.data('_overlay_level') || 0;\n\n  return $overlay.data('_overlay_level', ++level).addClass('mdui-overlay-show');\n};\n","import $ from 'mdui.jq/es/$';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/removeClass';\nimport 'mdui.jq/es/methods/remove';\nimport '../methods/transitionEnd';\n\ndeclare module 'mdui.jq/es/interfaces/JQStatic' {\n  interface JQStatic {\n    /**\n     * 隐藏遮罩层\n     *\n     * 如果调用了多次 $.showOverlay() 来显示遮罩层,则也需要调用相同次数的 $.hideOverlay() 才能隐藏遮罩层。可以通过传入参数 true 来强制隐藏遮罩层。\n     * @param force 是否强制隐藏遮罩\n     * @example\n```js\n$.hideOverlay();\n```\n     * @example\n```js\n$.hideOverlay(true);\n```\n     */\n    hideOverlay(force?: boolean): void;\n  }\n}\n\n$.hideOverlay = function (force = false): void {\n  const $overlay = $('.mdui-overlay');\n\n  if (!$overlay.length) {\n    return;\n  }\n\n  let level = force ? 1 : $overlay.data('_overlay_level');\n\n  if (level > 1) {\n    $overlay.data('_overlay_level', --level);\n    return;\n  }\n\n  $overlay\n    .data('_overlay_level', 0)\n    .removeClass('mdui-overlay-show')\n    .data('_overlay_is_deleted', true)\n    .transitionEnd(() => {\n      if ($overlay.data('_overlay_is_deleted')) {\n        $overlay.remove();\n      }\n    });\n};\n","import $ from 'mdui.jq/es/$';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/width';\n\ndeclare module 'mdui.jq/es/interfaces/JQStatic' {\n  interface JQStatic {\n    /**\n     * 锁定屏页面,禁止页面滚动\n     * @example\n```js\n$.lockScreen();\n```\n     */\n    lockScreen(): void;\n  }\n}\n\n$.lockScreen = function (): void {\n  const $body = $('body');\n\n  // 不直接把 body 设为 box-sizing: border-box,避免污染全局样式\n  const newBodyWidth = $body.width();\n  let level = $body.data('_lockscreen_level') || 0;\n\n  $body\n    .addClass('mdui-locked')\n    .width(newBodyWidth)\n    .data('_lockscreen_level', ++level);\n};\n","import $ from 'mdui.jq/es/$';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/removeClass';\nimport 'mdui.jq/es/methods/width';\n\ndeclare module 'mdui.jq/es/interfaces/JQStatic' {\n  interface JQStatic {\n    /**\n     * 解除页面锁定\n     *\n     * 如果调用了多次 $.lockScreen() 来显示遮罩层,则也需要调用相同次数的 $.unlockScreen() 才能隐藏遮罩层。可以通过传入参数 true 来强制隐藏遮罩层。\n     * @param force 是否强制解除锁定\n     * @example\n```js\n$.unlockScreen();\n```\n     * @example\n```js\n$.unlockScreen(true);\n```\n     */\n    unlockScreen(force?: boolean): void;\n  }\n}\n\n$.unlockScreen = function (force = false): void {\n  const $body = $('body');\n  let level = force ? 1 : $body.data('_lockscreen_level');\n\n  if (level > 1) {\n    $body.data('_lockscreen_level', --level);\n    return;\n  }\n\n  $body.data('_lockscreen_level', 0).removeClass('mdui-locked').width('');\n};\n","import $ from 'mdui.jq/es/$';\nimport { isNull } from 'mdui.jq/es/utils';\n\ndeclare module 'mdui.jq/es/interfaces/JQStatic' {\n  interface JQStatic {\n    /**\n     * 函数节流\n     * @param fn 执行的函数\n     * @param delay 最多多少毫秒执行一次\n     * @example\n```js\n$.throttle(function () {\n  console.log('这个函数最多 100ms 执行一次');\n}, 100)\n```\n     */\n    throttle(fn: () => void, delay: number): () => void;\n  }\n}\n\n$.throttle = function (fn: () => void, delay = 16): () => void {\n  let timer: any = null;\n\n  return function (this: any, ...args: any): void {\n    if (isNull(timer)) {\n      timer = setTimeout(() => {\n        fn.apply(this, args);\n        timer = null;\n      }, delay);\n    }\n  };\n};\n","import $ from 'mdui.jq/es/$';\nimport { isUndefined } from 'mdui.jq/es/utils';\nimport PlainObject from 'mdui.jq/es/interfaces/PlainObject';\n\ndeclare module 'mdui.jq/es/interfaces/JQStatic' {\n  interface JQStatic {\n    /**\n     * 生成一个全局唯一的 ID\n     * @param name 当该参数值对应的 guid 不存在时,会生成一个新的 guid,并返回;当该参数对应的 guid 已存在,则直接返回已有 guid\n     * @example\n```js\n$.guid();\n```\n     * @example\n```js\n$.guid('test');\n```\n     */\n    guid(name?: string): string;\n  }\n}\n\nconst GUID: PlainObject<string> = {};\n\n$.guid = function (name?: string): string {\n  if (!isUndefined(name) && !isUndefined(GUID[name])) {\n    return GUID[name];\n  }\n\n  function s4(): string {\n    return Math.floor((1 + Math.random()) * 0x10000)\n      .toString(16)\n      .substring(1);\n  }\n\n  const guid =\n    '_' +\n    s4() +\n    s4() +\n    '-' +\n    s4() +\n    '-' +\n    s4() +\n    '-' +\n    s4() +\n    '-' +\n    s4() +\n    s4() +\n    s4();\n\n  if (!isUndefined(name)) {\n    GUID[name] = guid;\n  }\n\n  return guid;\n};\n","import $ from 'mdui.jq/es/$';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport PlainObject from 'mdui.jq/es/interfaces/PlainObject';\nimport 'mdui.jq/es/methods/trigger';\n\n/**\n * 触发组件上的事件\n * @param eventName 事件名\n * @param componentName 组件名\n * @param target 在该元素上触发事件\n * @param instance 组件实例\n * @param parameters 事件参数\n */\nfunction componentEvent(\n  eventName: string,\n  componentName: string,\n  target: HTMLElement | HTMLElement[] | JQ,\n  instance?: any,\n  parameters?: PlainObject,\n): void {\n  if (!parameters) {\n    parameters = {};\n  }\n\n  // @ts-ignore\n  parameters.inst = instance;\n\n  const fullEventName = `${eventName}.mdui.${componentName}`;\n\n  // jQuery 事件\n  // @ts-ignore\n  if (typeof jQuery !== 'undefined') {\n    // @ts-ignore\n    jQuery(target).trigger(fullEventName, parameters);\n  }\n\n  const $target = $(target);\n\n  // mdui.jq 事件\n  $target.trigger(fullEventName, parameters);\n\n  // 原生事件,供使用 addEventListener 监听\n  type EventParams = {\n    detail?: any;\n    bubbles: boolean;\n    cancelable: boolean;\n  };\n\n  const eventParams: EventParams = {\n    bubbles: true,\n    cancelable: true,\n    detail: parameters,\n  };\n\n  const eventObject: CustomEvent = new CustomEvent(fullEventName, eventParams);\n\n  // @ts-ignore\n  eventObject._detail = parameters;\n\n  $target[0].dispatchEvent(eventObject);\n}\n\nexport { componentEvent };\n","import $ from 'mdui.jq/es/$';\nimport 'mdui.jq/es/methods/each';\nimport mdui from '../mdui';\nimport '../jq_extends/methods/mutation';\nimport { isUndefined } from 'mdui.jq/es/utils';\nimport { TYPE_API_INIT, entries, mutation } from '../utils/mutation';\n\ndeclare module '../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 传入了两个参数时,注册并执行初始化函数\n     *\n     * 没有传入参数时,执行初始化\n     * @param selector CSS 选择器\n     * @param apiInit 初始化函数\n     * @example\n```js\nmdui.mutation();\n```\n     * @example\n```js\nmdui.mutation();\n```\n     */\n    mutation(selector?: string, apiInit?: TYPE_API_INIT): void;\n  }\n}\n\nmdui.mutation = function (selector?: string, apiInit?: TYPE_API_INIT): void {\n  if (isUndefined(selector) || isUndefined(apiInit)) {\n    $(document).mutation();\n    return;\n  }\n\n  entries[selector] = apiInit!;\n  $(selector).each((i, element) => mutation(selector, apiInit, i, element));\n};\n","import $ from 'mdui.jq/es/$';\nimport extend from 'mdui.jq/es/functions/extend';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/removeClass';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport { isNumber } from 'mdui.jq/es/utils';\nimport mdui from '../../mdui';\nimport '../../jq_extends/methods/transitionEnd';\nimport { componentEvent } from '../../utils/componentEvent';\nimport { $window } from '../../utils/dom';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * Headroom 插件\n     *\n     * 请通过 `new mdui.Headroom()` 调用\n     */\n    Headroom: {\n      /**\n       * 实例化 Headroom 组件\n       * @param selector CSS 选择器、或 DOM 元素、或 JQ 对象\n       * @param options 配置参数\n       */\n      new (\n        selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n        options?: OPTIONS,\n      ): Headroom;\n    };\n  }\n}\n\ntype TOLERANCE = {\n  /**\n   * 滚动条向下滚动多少距离开始隐藏或显示元素\n   */\n  down: number;\n\n  /**\n   * 滚动条向上滚动多少距离开始隐藏或显示元素\n   */\n  up: number;\n};\n\ntype OPTIONS = {\n  /**\n   * 滚动条滚动多少距离开始隐藏或显示元素\n   */\n  tolerance?: TOLERANCE | number;\n\n  /**\n   * 在页面顶部多少距离内滚动不会隐藏元素\n   */\n  offset?: number;\n\n  /**\n   * 初始化时添加的类\n   */\n  initialClass?: string;\n\n  /**\n   * 元素固定时添加的类\n   */\n  pinnedClass?: string;\n\n  /**\n   * 元素隐藏时添加的类\n   */\n  unpinnedClass?: string;\n};\n\ntype STATE = 'pinning' | 'pinned' | 'unpinning' | 'unpinned';\ntype EVENT = 'pin' | 'pinned' | 'unpin' | 'unpinned';\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  tolerance: 5,\n  offset: 0,\n  initialClass: 'mdui-headroom',\n  pinnedClass: 'mdui-headroom-pinned-top',\n  unpinnedClass: 'mdui-headroom-unpinned-top',\n};\n\nclass Headroom {\n  /**\n   * headroom 元素的 JQ 对象\n   */\n  public $element: JQ;\n\n  /**\n   * 配置参数\n   */\n  public options: OPTIONS = extend({}, DEFAULT_OPTIONS);\n\n  /**\n   * 当前 headroom 的状态\n   */\n  private state: STATE = 'pinned';\n\n  /**\n   * 当前是否启用\n   */\n  private isEnable = false;\n\n  /**\n   * 上次滚动后,垂直方向的距离\n   */\n  private lastScrollY = 0;\n\n  /**\n   * AnimationFrame ID\n   */\n  private rafId = 0;\n\n  public constructor(\n    selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    options: OPTIONS = {},\n  ) {\n    this.$element = $(selector).first();\n\n    extend(this.options, options);\n\n    // tolerance 参数若为数值,转换为对象\n    const tolerance = this.options.tolerance;\n    if (isNumber(tolerance)) {\n      this.options.tolerance = {\n        down: tolerance,\n        up: tolerance,\n      };\n    }\n\n    this.enable();\n  }\n\n  /**\n   * 滚动时的处理\n   */\n  private onScroll(): void {\n    this.rafId = window.requestAnimationFrame(() => {\n      const currentScrollY = window.pageYOffset;\n      const direction = currentScrollY > this.lastScrollY ? 'down' : 'up';\n      const tolerance = (this.options.tolerance as TOLERANCE)[direction];\n      const scrolled = Math.abs(currentScrollY - this.lastScrollY);\n      const toleranceExceeded = scrolled >= tolerance;\n\n      if (\n        currentScrollY > this.lastScrollY &&\n        currentScrollY >= this.options.offset! &&\n        toleranceExceeded\n      ) {\n        this.unpin();\n      } else if (\n        (currentScrollY < this.lastScrollY && toleranceExceeded) ||\n        currentScrollY <= this.options.offset!\n      ) {\n        this.pin();\n      }\n\n      this.lastScrollY = currentScrollY;\n    });\n  }\n\n  /**\n   * 触发组件事件\n   * @param name\n   */\n  private triggerEvent(name: EVENT): void {\n    componentEvent(name, 'headroom', this.$element, this);\n  }\n\n  /**\n   * 动画结束的回调\n   */\n  private transitionEnd(): void {\n    if (this.state === 'pinning') {\n      this.state = 'pinned';\n      this.triggerEvent('pinned');\n    }\n\n    if (this.state === 'unpinning') {\n      this.state = 'unpinned';\n      this.triggerEvent('unpinned');\n    }\n  }\n\n  /**\n   * 使元素固定住\n   */\n  public pin(): void {\n    if (\n      this.state === 'pinning' ||\n      this.state === 'pinned' ||\n      !this.$element.hasClass(this.options.initialClass!)\n    ) {\n      return;\n    }\n\n    this.triggerEvent('pin');\n    this.state = 'pinning';\n    this.$element\n      .removeClass(this.options.unpinnedClass)\n      .addClass(this.options.pinnedClass!)\n      .transitionEnd(() => this.transitionEnd());\n  }\n\n  /**\n   * 使元素隐藏\n   */\n  public unpin(): void {\n    if (\n      this.state === 'unpinning' ||\n      this.state === 'unpinned' ||\n      !this.$element.hasClass(this.options.initialClass!)\n    ) {\n      return;\n    }\n\n    this.triggerEvent('unpin');\n    this.state = 'unpinning';\n    this.$element\n      .removeClass(this.options.pinnedClass)\n      .addClass(this.options.unpinnedClass!)\n      .transitionEnd(() => this.transitionEnd());\n  }\n\n  /**\n   * 启用 headroom 插件\n   */\n  public enable(): void {\n    if (this.isEnable) {\n      return;\n    }\n\n    this.isEnable = true;\n    this.state = 'pinned';\n    this.$element\n      .addClass(this.options.initialClass!)\n      .removeClass(this.options.pinnedClass)\n      .removeClass(this.options.unpinnedClass);\n    this.lastScrollY = window.pageYOffset;\n\n    $window.on('scroll', () => this.onScroll());\n  }\n\n  /**\n   * 禁用 headroom 插件\n   */\n  public disable(): void {\n    if (!this.isEnable) {\n      return;\n    }\n\n    this.isEnable = false;\n    this.$element\n      .removeClass(this.options.initialClass)\n      .removeClass(this.options.pinnedClass)\n      .removeClass(this.options.unpinnedClass);\n\n    $window.off('scroll', () => this.onScroll());\n    window.cancelAnimationFrame(this.rafId);\n  }\n\n  /**\n   * 获取当前状态。共包含四种状态:`pinning`、`pinned`、`unpinning`、`unpinned`\n   */\n  public getState(): STATE {\n    return this.state;\n  }\n}\n\nmdui.Headroom = Headroom;\n","import $ from 'mdui.jq/es/$';\n\nconst $document = $(document);\nconst $window = $(window);\nconst $body = $('body');\n\nexport { $document, $window, $body };\n","import $ from 'mdui.jq/es/$';\nimport 'mdui.jq/es/methods/attr';\nimport PlainObject from 'mdui.jq/es/interfaces/PlainObject';\n\n/**\n * 解析 DATA API 参数\n * @param element 元素\n * @param name 属性名\n */\nfunction parseOptions(element: HTMLElement, name: string): PlainObject {\n  const attr = $(element).attr(name);\n\n  if (!attr) {\n    return {};\n  }\n\n  return new Function(\n    '',\n    `var json = ${attr}; return JSON.parse(JSON.stringify(json));`,\n  )();\n}\n\nexport { parseOptions };\n","import $ from 'mdui.jq/es/$';\nimport mdui from '../../mdui';\nimport '../../global/mutation';\nimport { parseOptions } from '../../utils/parseOptions';\nimport './index';\n\nconst customAttr = 'mdui-headroom';\n\n$(() => {\n  mdui.mutation(`[${customAttr}]`, function () {\n    new mdui.Headroom(this, parseOptions(this, customAttr));\n  });\n});\n","import $ from 'mdui.jq/es/$';\nimport extend from 'mdui.jq/es/functions/extend';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/children';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/eq';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/height';\nimport 'mdui.jq/es/methods/is';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/parent';\nimport 'mdui.jq/es/methods/parents';\nimport 'mdui.jq/es/methods/removeClass';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport { isNumber } from 'mdui.jq/es/utils';\nimport '../../jq_extends/methods/reflow';\nimport '../../jq_extends/methods/transition';\nimport '../../jq_extends/methods/transitionEnd';\nimport { componentEvent } from '../../utils/componentEvent';\n\ntype OPTIONS = {\n  /**\n   * 是否启用手风琴效果\n   * 为 `true` 时,最多只能有一个面板项处于打开状态,打开一个面板项时会关闭其他面板项\n   * 为 `false` 时,可同时打开多个面板项\n   */\n  accordion?: boolean;\n};\n\ntype EVENT = 'open' | 'opened' | 'close' | 'closed';\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  accordion: false,\n};\n\nabstract class CollapseAbstract {\n  /**\n   * collapse 元素的 JQ 对象\n   */\n  public $element: JQ;\n\n  /**\n   * 配置参数\n   */\n  public options: OPTIONS = extend({}, DEFAULT_OPTIONS);\n\n  /**\n   * item 的 class 名\n   */\n  private classItem: string;\n\n  /**\n   * 打开状态的 item 的 class 名\n   */\n  private classItemOpen: string;\n\n  /**\n   * item-header 的 class 名\n   */\n  private classHeader: string;\n\n  /**\n   * item-body 的 class 名\n   */\n  private classBody: string;\n\n  /**\n   * 获取继承的组件名称\n   */\n  protected abstract getNamespace(): string;\n\n  public constructor(\n    selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    options: OPTIONS = {},\n  ) {\n    // CSS 类名\n    const classPrefix = `mdui-${this.getNamespace()}-item`;\n    this.classItem = classPrefix;\n    this.classItemOpen = `${classPrefix}-open`;\n    this.classHeader = `${classPrefix}-header`;\n    this.classBody = `${classPrefix}-body`;\n\n    this.$element = $(selector).first();\n\n    extend(this.options, options);\n\n    this.bindEvent();\n  }\n\n  /**\n   * 绑定事件\n   */\n  private bindEvent(): void {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const that = this;\n\n    // 点击 header 时,打开/关闭 item\n    this.$element.on('click', `.${this.classHeader}`, function () {\n      const $header = $(this as HTMLElement);\n      const $item = $header.parent();\n      const $items = that.getItems();\n\n      $items.each((_, item) => {\n        if ($item.is(item)) {\n          that.toggle(item);\n        }\n      });\n    });\n\n    // 点击关闭按钮时,关闭 item\n    this.$element.on(\n      'click',\n      `[mdui-${this.getNamespace()}-item-close]`,\n      function () {\n        const $target = $(this as HTMLElement);\n        const $item = $target.parents(`.${that.classItem}`).first();\n\n        that.close($item);\n      },\n    );\n  }\n\n  /**\n   * 指定 item 是否处于打开状态\n   * @param $item\n   */\n  private isOpen($item: JQ): boolean {\n    return $item.hasClass(this.classItemOpen);\n  }\n\n  /**\n   * 获取所有 item\n   */\n  private getItems(): JQ {\n    return this.$element.children(`.${this.classItem}`);\n  }\n\n  /**\n   * 获取指定 item\n   * @param item\n   */\n  private getItem(\n    item: number | Selector | HTMLElement | ArrayLike<HTMLElement>,\n  ): JQ {\n    if (isNumber(item)) {\n      return this.getItems().eq(item);\n    }\n\n    return $(item).first();\n  }\n\n  /**\n   * 触发组件事件\n   * @param name 事件名\n   * @param $item 事件触发的目标 item\n   */\n  private triggerEvent(name: EVENT, $item: JQ): void {\n    componentEvent(name, this.getNamespace(), $item, this);\n  }\n\n  /**\n   * 动画结束回调\n   * @param $content body 元素\n   * @param $item item 元素\n   */\n  private transitionEnd($content: JQ, $item: JQ): void {\n    if (this.isOpen($item)) {\n      $content.transition(0).height('auto').reflow().transition('');\n\n      this.triggerEvent('opened', $item);\n    } else {\n      $content.height('');\n\n      this.triggerEvent('closed', $item);\n    }\n  }\n\n  /**\n   * 打开指定面板项\n   * @param item 面板项的索引号、或 CSS 选择器、或 DOM 元素、或 JQ 对象\n   */\n  public open(\n    item: number | Selector | HTMLElement | ArrayLike<HTMLElement>,\n  ): void {\n    const $item = this.getItem(item);\n\n    if (this.isOpen($item)) {\n      return;\n    }\n\n    // 关闭其他项\n    if (this.options.accordion) {\n      this.$element.children(`.${this.classItemOpen}`).each((_, element) => {\n        const $element = $(element);\n\n        if (!$element.is($item)) {\n          this.close($element);\n        }\n      });\n    }\n\n    const $content = $item.children(`.${this.classBody}`);\n\n    $content\n      .height($content[0].scrollHeight)\n      .transitionEnd(() => this.transitionEnd($content, $item));\n\n    this.triggerEvent('open', $item);\n\n    $item.addClass(this.classItemOpen);\n  }\n\n  /**\n   * 关闭指定面板项\n   * @param item 面板项的索引号、或 CSS 选择器、或 DOM 元素、或 JQ 对象\n   */\n  public close(\n    item: number | Selector | HTMLElement | ArrayLike<HTMLElement>,\n  ): void {\n    const $item = this.getItem(item);\n\n    if (!this.isOpen($item)) {\n      return;\n    }\n\n    const $content = $item.children(`.${this.classBody}`);\n\n    this.triggerEvent('close', $item);\n\n    $item.removeClass(this.classItemOpen);\n\n    $content\n      .transition(0)\n      .height($content[0].scrollHeight)\n      .reflow()\n      .transition('')\n      .height('')\n      .transitionEnd(() => this.transitionEnd($content, $item));\n  }\n\n  /**\n   * 切换指定面板项的打开状态\n   * @param item 面板项的索引号、或 CSS 选择器、或 DOM 元素、或 JQ 对象\n   */\n  public toggle(\n    item: number | Selector | HTMLElement | ArrayLike<HTMLElement>,\n  ): void {\n    const $item = this.getItem(item);\n\n    this.isOpen($item) ? this.close($item) : this.open($item);\n  }\n\n  /**\n   * 打开所有面板项\n   */\n  public openAll(): void {\n    this.getItems().each((_, element) => this.open(element));\n  }\n\n  /**\n   * 关闭所有面板项\n   */\n  public closeAll(): void {\n    this.getItems().each((_, element) => this.close(element));\n  }\n}\n\nexport { OPTIONS, CollapseAbstract };\n","import Selector from 'mdui.jq/es/types/Selector';\nimport mdui from '../../mdui';\nimport { CollapseAbstract, OPTIONS } from './collapseAbstract';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 折叠内容块组件\n     *\n     * 请通过 `new mdui.Collapse()` 调用\n     */\n    Collapse: {\n      /**\n       * 实例化 Collapse 组件\n       * @param selector CSS 选择器或 DOM 元素\n       * @param options 配置参数\n       */\n      new (\n        selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n        options?: OPTIONS,\n      ): Collapse;\n    };\n  }\n}\n\nclass Collapse extends CollapseAbstract {\n  protected getNamespace(): string {\n    return 'collapse';\n  }\n}\n\nmdui.Collapse = Collapse;\n","import $ from 'mdui.jq/es/$';\nimport mdui from '../../mdui';\nimport '../../global/mutation';\nimport { parseOptions } from '../../utils/parseOptions';\nimport './index';\n\nconst customAttr = 'mdui-collapse';\n\n$(() => {\n  mdui.mutation(`[${customAttr}]`, function () {\n    new mdui.Collapse(this, parseOptions(this, customAttr));\n  });\n});\n","import Selector from 'mdui.jq/es/types/Selector';\nimport mdui from '../../mdui';\nimport { CollapseAbstract, OPTIONS } from '../collapse/collapseAbstract';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 可扩展面板组件\n     *\n     * 请通过 `new mdui.Panel()` 调用\n     */\n    Panel: {\n      /**\n       * 实例化 Panel 组件\n       * @param selector CSS 选择器或 DOM 元素\n       * @param options 配置参数\n       */\n      new (\n        selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n        options?: OPTIONS,\n      ): Panel;\n    };\n  }\n}\n\nclass Panel extends CollapseAbstract {\n  protected getNamespace(): string {\n    return 'panel';\n  }\n}\n\nmdui.Panel = Panel;\n","import $ from 'mdui.jq/es/$';\nimport mdui from '../../mdui';\nimport '../../global/mutation';\nimport { parseOptions } from '../../utils/parseOptions';\nimport './index';\n\nconst customAttr = 'mdui-panel';\n\n$(() => {\n  mdui.mutation(`[${customAttr}]`, function () {\n    new mdui.Panel(this, parseOptions(this, customAttr));\n  });\n});\n","import $ from 'mdui.jq/es/$';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/add';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/eq';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/prependTo';\nimport 'mdui.jq/es/methods/remove';\nimport 'mdui.jq/es/methods/removeClass';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport { isUndefined } from 'mdui.jq/es/utils';\nimport mdui from '../../mdui';\nimport '../../global/mutation';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 动态修改了表格后,需要调用该方法重新初始化表格。\n     *\n     * 若传入了参数,则只初始化该参数对应的表格。若没有传入参数,则重新初始化所有表格。\n     * @param selector CSS 选择器、或 DOM 元素、或 DOM 元素组成的数组、或 JQ 对象\n     */\n    updateTables(\n      selector?: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    ): void;\n  }\n}\n\nclass Table {\n  /**\n   * table 元素的 JQ 对象\n   */\n  public $element: JQ;\n\n  /**\n   * 表头 tr 元素\n   */\n  private $thRow: JQ = $();\n\n  /**\n   * 表格 body 中的 tr 元素\n   */\n  private $tdRows: JQ = $();\n\n  /**\n   * 表头的 checkbox 元素\n   */\n  private $thCheckbox: JQ<HTMLInputElement> = $();\n\n  /**\n   * 表格 body 中的 checkbox 元素\n   */\n  private $tdCheckboxs: JQ<HTMLInputElement> = $();\n\n  /**\n   * 表格行是否可选择\n   */\n  private selectable = false;\n\n  /**\n   * 已选中的行数\n   */\n  private selectedRow = 0;\n\n  public constructor(\n    selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n  ) {\n    this.$element = $(selector).first();\n    this.init();\n  }\n\n  /**\n   * 初始化表格\n   */\n  public init(): void {\n    this.$thRow = this.$element.find('thead tr');\n    this.$tdRows = this.$element.find('tbody tr');\n    this.selectable = this.$element.hasClass('mdui-table-selectable');\n\n    this.updateThCheckbox();\n    this.updateTdCheckbox();\n    this.updateNumericCol();\n  }\n\n  /**\n   * 生成 checkbox 的 HTML 结构\n   * @param tag 标签名\n   */\n  private createCheckboxHTML(tag: string): string {\n    return (\n      `<${tag} class=\"mdui-table-cell-checkbox\">` +\n      '<label class=\"mdui-checkbox\">' +\n      '<input type=\"checkbox\"/>' +\n      '<i class=\"mdui-checkbox-icon\"></i>' +\n      '</label>' +\n      `</${tag}>`\n    );\n  }\n\n  /**\n   * 更新表头 checkbox 的状态\n   */\n  private updateThCheckboxStatus(): void {\n    const checkbox = this.$thCheckbox[0];\n    const selectedRow = this.selectedRow;\n    const tdRowsLength = this.$tdRows.length;\n\n    checkbox.checked = selectedRow === tdRowsLength;\n    checkbox.indeterminate = !!selectedRow && selectedRow !== tdRowsLength;\n  }\n\n  /**\n   * 更新表格行的 checkbox\n   */\n  private updateTdCheckbox(): void {\n    const rowSelectedClass = 'mdui-table-row-selected';\n\n    this.$tdRows.each((_, row) => {\n      const $row = $(row);\n\n      // 移除旧的 checkbox\n      $row.find('.mdui-table-cell-checkbox').remove();\n\n      if (!this.selectable) {\n        return;\n      }\n\n      // 创建 DOM\n      const $checkbox = $(this.createCheckboxHTML('td'))\n        .prependTo($row)\n        .find('input[type=\"checkbox\"]') as JQ<HTMLInputElement>;\n\n      // 默认选中的行\n      if ($row.hasClass(rowSelectedClass)) {\n        $checkbox[0].checked = true;\n        this.selectedRow++;\n      }\n\n      this.updateThCheckboxStatus();\n\n      // 绑定事件\n      $checkbox.on('change', () => {\n        if ($checkbox[0].checked) {\n          $row.addClass(rowSelectedClass);\n          this.selectedRow++;\n        } else {\n          $row.removeClass(rowSelectedClass);\n          this.selectedRow--;\n        }\n\n        this.updateThCheckboxStatus();\n      });\n\n      this.$tdCheckboxs = this.$tdCheckboxs.add($checkbox);\n    });\n  }\n\n  /**\n   * 更新表头的 checkbox\n   */\n  private updateThCheckbox(): void {\n    // 移除旧的 checkbox\n    this.$thRow.find('.mdui-table-cell-checkbox').remove();\n\n    if (!this.selectable) {\n      return;\n    }\n\n    this.$thCheckbox = $(this.createCheckboxHTML('th'))\n      .prependTo(this.$thRow)\n      .find('input[type=\"checkbox\"]')\n      .on('change', () => {\n        const isCheckedAll = this.$thCheckbox[0].checked;\n        this.selectedRow = isCheckedAll ? this.$tdRows.length : 0;\n\n        this.$tdCheckboxs.each((_, checkbox) => {\n          checkbox.checked = isCheckedAll;\n        });\n\n        this.$tdRows.each((_, row) => {\n          isCheckedAll\n            ? $(row).addClass('mdui-table-row-selected')\n            : $(row).removeClass('mdui-table-row-selected');\n        });\n      }) as JQ<HTMLInputElement>;\n  }\n\n  /**\n   * 更新数值列\n   */\n  private updateNumericCol(): void {\n    const numericClass = 'mdui-table-col-numeric';\n\n    this.$thRow.find('th').each((i, th) => {\n      const isNumericCol = $(th).hasClass(numericClass);\n\n      this.$tdRows.each((_, row) => {\n        const $td = $(row).find('td').eq(i);\n\n        isNumericCol\n          ? $td.addClass(numericClass)\n          : $td.removeClass(numericClass);\n      });\n    });\n  }\n}\n\nconst dataName = '_mdui_table';\n\n$(() => {\n  mdui.mutation('.mdui-table', function () {\n    const $element = $(this);\n\n    if (!$element.data(dataName)) {\n      $element.data(dataName, new Table($element));\n    }\n  });\n});\n\nmdui.updateTables = function (\n  selector?: Selector | HTMLElement | ArrayLike<HTMLElement>,\n): void {\n  const $elements = isUndefined(selector) ? $('.mdui-table') : $(selector);\n\n  $elements.each((_, element) => {\n    const $element = $(element);\n    const instance = $element.data(dataName);\n\n    if (instance) {\n      instance.init();\n    } else {\n      $element.data(dataName, new Table($element));\n    }\n  });\n};\n","/**\n * touch 事件后的 500ms 内禁用 mousedown 事件\n *\n * 不支持触控的屏幕上事件顺序为 mousedown -> mouseup -> click\n * 支持触控的屏幕上事件顺序为 touchstart -> touchend -> mousedown -> mouseup -> click\n *\n * 在每一个事件中都使用 TouchHandler.isAllow(event) 判断事件是否可执行\n * 在 touchstart 和 touchmove、touchend、touchcancel\n *\n * (function () {\n *   $document\n *     .on(start, function (e) {\n *       if (!isAllow(e)) {\n *         return;\n *       }\n *       register(e);\n *       console.log(e.type);\n *     })\n *     .on(move, function (e) {\n *       if (!isAllow(e)) {\n *         return;\n *       }\n *       console.log(e.type);\n *     })\n *     .on(end, function (e) {\n *       if (!isAllow(e)) {\n *         return;\n *       }\n *       console.log(e.type);\n *     })\n *     .on(unlock, register);\n * })();\n */\n\nconst startEvent = 'touchstart mousedown';\nconst moveEvent = 'touchmove mousemove';\nconst endEvent = 'touchend mouseup';\nconst cancelEvent = 'touchcancel mouseleave';\nconst unlockEvent = 'touchend touchmove touchcancel';\n\nlet touches = 0;\n\n/**\n * 该事件是否被允许,在执行事件前调用该方法判断事件是否可以执行\n * 若已触发 touch 事件,则阻止之后的鼠标事件\n * @param event\n */\nfunction isAllow(event: Event): boolean {\n  return !(\n    touches &&\n    [\n      'mousedown',\n      'mouseup',\n      'mousemove',\n      'click',\n      'mouseover',\n      'mouseout',\n      'mouseenter',\n      'mouseleave',\n    ].indexOf(event.type) > -1\n  );\n}\n\n/**\n * 在 touchstart 和 touchmove、touchend、touchcancel 事件中调用该方法注册事件\n * @param event\n */\nfunction register(event: Event): void {\n  if (event.type === 'touchstart') {\n    // 触发了 touch 事件\n    touches += 1;\n  } else if (\n    ['touchmove', 'touchend', 'touchcancel'].indexOf(event.type) > -1\n  ) {\n    // touch 事件结束 500ms 后解除对鼠标事件的阻止\n    setTimeout(function () {\n      if (touches) {\n        touches -= 1;\n      }\n    }, 500);\n  }\n}\n\nexport {\n  startEvent,\n  moveEvent,\n  endEvent,\n  cancelEvent,\n  unlockEvent,\n  isAllow,\n  register,\n};\n","/**\n * Inspired by https://github.com/nolimits4web/Framework7/blob/master/src/js/fast-clicks.js\n * https://github.com/nolimits4web/Framework7/blob/master/LICENSE\n *\n * Inspired by https://github.com/fians/Waves\n */\n\nimport $ from 'mdui.jq/es/$';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/attr';\nimport 'mdui.jq/es/methods/children';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/innerHeight';\nimport 'mdui.jq/es/methods/innerWidth';\nimport 'mdui.jq/es/methods/off';\nimport 'mdui.jq/es/methods/offset';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/parents';\nimport 'mdui.jq/es/methods/prependTo';\nimport 'mdui.jq/es/methods/prop';\nimport 'mdui.jq/es/methods/remove';\nimport { isUndefined } from 'mdui.jq/es/utils';\nimport '../../jq_extends/methods/reflow';\nimport '../../jq_extends/methods/transform';\nimport '../../jq_extends/methods/transitionEnd';\nimport { $document } from '../../utils/dom';\nimport {\n  cancelEvent,\n  endEvent,\n  isAllow,\n  moveEvent,\n  register,\n  startEvent,\n  unlockEvent,\n} from '../../utils/touchHandler';\n\n/**\n * 显示涟漪动画\n * @param event\n * @param $ripple\n */\nfunction show(event: Event, $ripple: JQ): void {\n  // 鼠标右键不产生涟漪\n  if (event instanceof MouseEvent && event.button === 2) {\n    return;\n  }\n\n  // 点击位置坐标\n  const touchPosition =\n    typeof TouchEvent !== 'undefined' &&\n    event instanceof TouchEvent &&\n    event.touches.length\n      ? event.touches[0]\n      : (event as MouseEvent);\n\n  const touchStartX = touchPosition.pageX;\n  const touchStartY = touchPosition.pageY;\n\n  // 涟漪位置\n  const offset = $ripple.offset();\n  const height = $ripple.innerHeight();\n  const width = $ripple.innerWidth();\n  const center = {\n    x: touchStartX - offset.left,\n    y: touchStartY - offset.top,\n  };\n  const diameter = Math.max(\n    Math.pow(Math.pow(height, 2) + Math.pow(width, 2), 0.5),\n    48,\n  );\n\n  // 涟漪扩散动画\n  const translate =\n    `translate3d(${-center.x + width / 2}px,` +\n    `${-center.y + height / 2}px, 0) scale(1)`;\n\n  // 涟漪的 DOM 结构,并缓存动画效果\n  $(\n    `<div class=\"mdui-ripple-wave\" ` +\n      `style=\"width:${diameter}px;height:${diameter}px;` +\n      `margin-top:-${diameter / 2}px;margin-left:-${diameter / 2}px;` +\n      `left:${center.x}px;top:${center.y}px;\"></div>`,\n  )\n    .data('_ripple_wave_translate', translate)\n    .prependTo($ripple)\n    .reflow()\n    .transform(translate);\n}\n\n/**\n * 隐藏并移除涟漪\n * @param $wave\n */\nfunction removeRipple($wave: JQ): void {\n  if (!$wave.length || $wave.data('_ripple_wave_removed')) {\n    return;\n  }\n\n  $wave.data('_ripple_wave_removed', true);\n\n  let removeTimer = setTimeout(() => $wave.remove(), 400);\n  const translate = $wave.data('_ripple_wave_translate');\n\n  $wave\n    .addClass('mdui-ripple-wave-fill')\n    .transform(translate.replace('scale(1)', 'scale(1.01)'))\n    .transitionEnd(() => {\n      clearTimeout(removeTimer);\n\n      $wave\n        .addClass('mdui-ripple-wave-out')\n        .transform(translate.replace('scale(1)', 'scale(1.01)'));\n\n      removeTimer = setTimeout(() => $wave.remove(), 700);\n\n      setTimeout(() => {\n        $wave.transitionEnd(() => {\n          clearTimeout(removeTimer);\n          $wave.remove();\n        });\n      }, 0);\n    });\n}\n\n/**\n * 隐藏涟漪动画\n * @param this\n */\nfunction hide(this: any): void {\n  const $ripple = $(this as HTMLElement);\n\n  $ripple.children('.mdui-ripple-wave').each((_, wave) => {\n    removeRipple($(wave));\n  });\n\n  $ripple.off(`${moveEvent} ${endEvent} ${cancelEvent}`, hide);\n}\n\n/**\n * 显示涟漪,并绑定 touchend 等事件\n * @param event\n */\nfunction showRipple(event: Event): void {\n  if (!isAllow(event)) {\n    return;\n  }\n\n  register(event);\n\n  // Chrome 59 点击滚动条时,会在 document 上触发事件\n  if (event.target === document) {\n    return;\n  }\n\n  const $target = $(event.target as HTMLElement);\n\n  // 获取含 .mdui-ripple 类的元素\n  const $ripple = $target.hasClass('mdui-ripple')\n    ? $target\n    : $target.parents('.mdui-ripple').first();\n\n  if (!$ripple.length) {\n    return;\n  }\n\n  // 禁用状态的元素上不产生涟漪效果\n  if ($ripple.prop('disabled') || !isUndefined($ripple.attr('disabled'))) {\n    return;\n  }\n\n  if (event.type === 'touchstart') {\n    let hidden = false;\n\n    // touchstart 触发指定时间后开始涟漪动画,避免手指滑动时也触发涟漪\n    let timer = setTimeout(() => {\n      timer = 0;\n      show(event, $ripple);\n    }, 200);\n\n    const hideRipple = (): void => {\n      // 如果手指没有移动,且涟漪动画还没有开始,则开始涟漪动画\n      if (timer) {\n        clearTimeout(timer);\n        timer = 0;\n        show(event, $ripple);\n      }\n\n      if (!hidden) {\n        hidden = true;\n        hide.call($ripple);\n      }\n    };\n\n    // 手指移动后,移除涟漪动画\n    const touchMove = (): void => {\n      if (timer) {\n        clearTimeout(timer);\n        timer = 0;\n      }\n\n      hideRipple();\n    };\n\n    $ripple.on('touchmove', touchMove).on('touchend touchcancel', hideRipple);\n  } else {\n    show(event, $ripple);\n    $ripple.on(`${moveEvent} ${endEvent} ${cancelEvent}`, hide);\n  }\n}\n\n$(() => {\n  $document.on(startEvent, showRipple).on(unlockEvent, register);\n});\n","import $ from 'mdui.jq/es/$';\nimport extend from 'mdui.jq/es/functions/extend';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/appendTo';\nimport 'mdui.jq/es/methods/attr';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/is';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/outerHeight';\nimport 'mdui.jq/es/methods/parent';\nimport 'mdui.jq/es/methods/parents';\nimport 'mdui.jq/es/methods/remove';\nimport 'mdui.jq/es/methods/removeClass';\nimport 'mdui.jq/es/methods/text';\nimport 'mdui.jq/es/methods/trigger';\nimport 'mdui.jq/es/methods/val';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport { isUndefined } from 'mdui.jq/es/utils';\nimport mdui from '../../mdui';\nimport '../../global/mutation';\nimport { $document } from '../../utils/dom';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 动态修改了文本框后,需要调用该方法重新初始化文本框。\n     *\n     * 若传入了参数,则只初始化该参数对应的文本框。若没有传入参数,则重新初始化所有文本框。\n     * @param selector CSS 选择器、或 DOM 元素、或 DOM 元素组成的数组、或 JQ 对象\n     */\n    updateTextFields(\n      selector?: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    ): void;\n  }\n}\n\ntype INPUT_EVENT_DATA = {\n  reInit?: boolean;\n  domLoadedEvent?: boolean;\n};\n\nconst defaultData: INPUT_EVENT_DATA = {\n  reInit: false,\n  domLoadedEvent: false,\n};\n\n/**\n * 输入框事件\n * @param event\n * @param data\n */\nfunction inputEvent(event: Event, data: INPUT_EVENT_DATA = {}): void {\n  data = extend({}, defaultData, data);\n\n  const input = event.target as HTMLInputElement;\n  const $input = $(input);\n  const eventType = event.type;\n  const value = $input.val() as string;\n\n  // 文本框类型\n  const inputType = $input.attr('type') || '';\n  if (\n    ['checkbox', 'button', 'submit', 'range', 'radio', 'image'].indexOf(\n      inputType,\n    ) > -1\n  ) {\n    return;\n  }\n\n  const $textfield = $input.parent('.mdui-textfield');\n\n  // 输入框是否聚焦\n  if (eventType === 'focus') {\n    $textfield.addClass('mdui-textfield-focus');\n  }\n\n  if (eventType === 'blur') {\n    $textfield.removeClass('mdui-textfield-focus');\n  }\n\n  // 输入框是否为空\n  if (eventType === 'blur' || eventType === 'input') {\n    value\n      ? $textfield.addClass('mdui-textfield-not-empty')\n      : $textfield.removeClass('mdui-textfield-not-empty');\n  }\n\n  // 输入框是否禁用\n  input.disabled\n    ? $textfield.addClass('mdui-textfield-disabled')\n    : $textfield.removeClass('mdui-textfield-disabled');\n\n  // 表单验证\n  if (\n    (eventType === 'input' || eventType === 'blur') &&\n    !data.domLoadedEvent &&\n    input.validity\n  ) {\n    input.validity.valid\n      ? $textfield.removeClass('mdui-textfield-invalid-html5')\n      : $textfield.addClass('mdui-textfield-invalid-html5');\n  }\n\n  // textarea 高度自动调整\n  if ($input.is('textarea')) {\n    // IE bug:textarea 的值仅为多个换行,不含其他内容时,textarea 的高度不准确\n    //         此时,在计算高度前,在值的开头加入一个空格,计算完后,移除空格\n    const inputValue = value;\n    let hasExtraSpace = false;\n\n    if (inputValue.replace(/[\\r\\n]/g, '') === '') {\n      $input.val(' ' + inputValue);\n      hasExtraSpace = true;\n    }\n\n    // 设置 textarea 高度\n    $input.outerHeight('');\n    const height = $input.outerHeight();\n    const scrollHeight = input.scrollHeight;\n\n    if (scrollHeight > height) {\n      $input.outerHeight(scrollHeight);\n    }\n\n    // 计算完,还原 textarea 的值\n    if (hasExtraSpace) {\n      $input.val(inputValue);\n    }\n  }\n\n  // 实时字数统计\n  if (data.reInit) {\n    $textfield.find('.mdui-textfield-counter').remove();\n  }\n\n  const maxLength = $input.attr('maxlength');\n  if (maxLength) {\n    if (data.reInit || data.domLoadedEvent) {\n      $(\n        '<div class=\"mdui-textfield-counter\">' +\n          `<span class=\"mdui-textfield-counter-inputed\"></span> / ${maxLength}` +\n          '</div>',\n      ).appendTo($textfield);\n    }\n\n    $textfield\n      .find('.mdui-textfield-counter-inputed')\n      .text(value.length.toString());\n  }\n\n  // 含 帮助文本、错误提示、字数统计 时,增加文本框底部内边距\n  if (\n    $textfield.find('.mdui-textfield-helper').length ||\n    $textfield.find('.mdui-textfield-error').length ||\n    maxLength\n  ) {\n    $textfield.addClass('mdui-textfield-has-bottom');\n  }\n}\n\n$(() => {\n  // 绑定事件\n  $document.on(\n    'input focus blur',\n    '.mdui-textfield-input',\n    { useCapture: true },\n    inputEvent,\n  );\n\n  // 可展开文本框展开\n  $document.on(\n    'click',\n    '.mdui-textfield-expandable .mdui-textfield-icon',\n    function () {\n      $(this as HTMLElement)\n        .parents('.mdui-textfield')\n        .addClass('mdui-textfield-expanded')\n        .find('.mdui-textfield-input')[0]\n        .focus();\n    },\n  );\n\n  // 可展开文本框关闭\n  $document.on(\n    'click',\n    '.mdui-textfield-expanded .mdui-textfield-close',\n    function () {\n      $(this)\n        .parents('.mdui-textfield')\n        .removeClass('mdui-textfield-expanded')\n        .find('.mdui-textfield-input')\n        .val('');\n    },\n  );\n\n  /**\n   * 初始化文本框\n   */\n  mdui.mutation('.mdui-textfield', function () {\n    $(this).find('.mdui-textfield-input').trigger('input', {\n      domLoadedEvent: true,\n    });\n  });\n});\n\nmdui.updateTextFields = function (\n  selector?: Selector | HTMLElement | ArrayLike<HTMLElement>,\n): void {\n  const $elements = isUndefined(selector) ? $('.mdui-textfield') : $(selector);\n\n  $elements.each((_, element) => {\n    $(element).find('.mdui-textfield-input').trigger('input', {\n      reInit: true,\n    });\n  });\n};\n","import $ from 'mdui.jq/es/$';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/append';\nimport 'mdui.jq/es/methods/attr';\nimport 'mdui.jq/es/methods/css';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/empty';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/parent';\nimport 'mdui.jq/es/methods/remove';\nimport 'mdui.jq/es/methods/removeClass';\nimport 'mdui.jq/es/methods/text';\nimport 'mdui.jq/es/methods/val';\nimport 'mdui.jq/es/methods/width';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport { isUndefined } from 'mdui.jq/es/utils';\nimport mdui from '../../mdui';\nimport { $document } from '../../utils/dom';\nimport {\n  endEvent,\n  isAllow,\n  register,\n  startEvent,\n  unlockEvent,\n} from '../../utils/touchHandler';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 动态修改了滑块后,需要调用该方法重新初始化滑块\n     *\n     * 若传入了参数,则只初始化该参数对应的滑块。若没有传入参数,则重新初始化所有滑块。\n     * @param selector CSS 选择器、或 DOM 元素、或 DOM 元素组成的数组、或 JQ 对象\n     */\n    updateSliders(\n      selector?: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    ): void;\n  }\n}\n\n/**\n * 滑块的值改变后修改滑块样式\n * @param $slider\n */\nfunction updateValueStyle($slider: JQ): void {\n  const data = $slider.data();\n\n  const $track = data._slider_$track;\n  const $fill = data._slider_$fill;\n  const $thumb = data._slider_$thumb;\n  const $input = data._slider_$input;\n  const min = data._slider_min;\n  const max = data._slider_max;\n  const isDisabled = data._slider_disabled;\n  const isDiscrete = data._slider_discrete;\n  const $thumbText = data._slider_$thumbText;\n  const value = $input.val();\n  const percent = ((value - min) / (max - min)) * 100;\n\n  $fill.width(`${percent}%`);\n  $track.width(`${100 - percent}%`);\n\n  if (isDisabled) {\n    $fill.css('padding-right', '6px');\n    $track.css('padding-left', '6px');\n  }\n\n  $thumb.css('left', `${percent}%`);\n\n  if (isDiscrete) {\n    $thumbText.text(value);\n  }\n\n  percent === 0\n    ? $slider.addClass('mdui-slider-zero')\n    : $slider.removeClass('mdui-slider-zero');\n}\n\n/**\n * 重新初始化滑块\n * @param $slider\n */\nfunction reInit($slider: JQ): void {\n  const $track = $('<div class=\"mdui-slider-track\"></div>');\n  const $fill = $('<div class=\"mdui-slider-fill\"></div>');\n  const $thumb = $('<div class=\"mdui-slider-thumb\"></div>');\n  const $input = $slider.find('input[type=\"range\"]') as JQ<HTMLInputElement>;\n  const isDisabled = $input[0].disabled;\n  const isDiscrete = $slider.hasClass('mdui-slider-discrete');\n\n  // 禁用状态\n  isDisabled\n    ? $slider.addClass('mdui-slider-disabled')\n    : $slider.removeClass('mdui-slider-disabled');\n\n  // 重新填充 HTML\n  $slider.find('.mdui-slider-track').remove();\n  $slider.find('.mdui-slider-fill').remove();\n  $slider.find('.mdui-slider-thumb').remove();\n  $slider.append($track).append($fill).append($thumb);\n\n  // 间续型滑块\n  let $thumbText = $();\n  if (isDiscrete) {\n    $thumbText = $('<span></span>');\n    $thumb.empty().append($thumbText);\n  }\n\n  $slider.data('_slider_$track', $track);\n  $slider.data('_slider_$fill', $fill);\n  $slider.data('_slider_$thumb', $thumb);\n  $slider.data('_slider_$input', $input);\n  $slider.data('_slider_min', $input.attr('min'));\n  $slider.data('_slider_max', $input.attr('max'));\n  $slider.data('_slider_disabled', isDisabled);\n  $slider.data('_slider_discrete', isDiscrete);\n  $slider.data('_slider_$thumbText', $thumbText);\n\n  // 设置默认值\n  updateValueStyle($slider);\n}\n\nconst rangeSelector = '.mdui-slider input[type=\"range\"]';\n\n$(() => {\n  // 滑块滑动事件\n  $document.on('input change', rangeSelector, function () {\n    const $slider = $(this).parent() as JQ<HTMLElement>;\n\n    updateValueStyle($slider);\n  });\n\n  // 开始触摸滑块事件\n  $document.on(startEvent, rangeSelector, function (event: Event) {\n    if (!isAllow(event)) {\n      return;\n    }\n\n    register(event);\n\n    if ((this as HTMLInputElement).disabled) {\n      return;\n    }\n\n    const $slider = $(this).parent() as JQ<HTMLElement>;\n\n    $slider.addClass('mdui-slider-focus');\n  });\n\n  // 结束触摸滑块事件\n  $document.on(endEvent, rangeSelector, function (event: Event) {\n    if (!isAllow(event)) {\n      return;\n    }\n\n    if ((this as HTMLInputElement).disabled) {\n      return;\n    }\n\n    const $slider = $(this).parent() as JQ<HTMLElement>;\n\n    $slider.removeClass('mdui-slider-focus');\n  });\n\n  $document.on(unlockEvent, rangeSelector, register);\n\n  /**\n   * 初始化滑块\n   */\n  mdui.mutation('.mdui-slider', function () {\n    reInit($(this));\n  });\n});\n\nmdui.updateSliders = function (\n  selector?: Selector | HTMLElement | ArrayLike<HTMLElement>,\n): void {\n  const $elements = isUndefined(selector) ? $('.mdui-slider') : $(selector);\n\n  $elements.each((_, element) => {\n    reInit($(element));\n  });\n};\n","import $ from 'mdui.jq/es/$';\nimport extend from 'mdui.jq/es/functions/extend';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/css';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/last';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/parents';\nimport 'mdui.jq/es/methods/removeClass';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport mdui from '../../mdui';\nimport '../../jq_extends/methods/transitionEnd';\nimport { componentEvent } from '../../utils/componentEvent';\nimport { $document } from '../../utils/dom';\nimport { startEvent } from '../../utils/touchHandler';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 浮动操作按钮组件\n     *\n     * 请通过 `new mdui.Fab()` 调用\n     */\n    Fab: {\n      /**\n       * 实例化 Fab 组件\n       * @param selector CSS 选择器、或 DOM 元素、或 JQ 对象\n       * @param options 配置参数\n       */\n      new (\n        selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n        options?: OPTIONS,\n      ): Fab;\n    };\n  }\n}\n\ntype OPTIONS = {\n  /**\n   * 触发方式。`hover`: 鼠标悬浮触发;`click`: 点击触发\n   *\n   * 默认为 `hover`\n   */\n  trigger?: 'click' | 'hover';\n};\n\ntype STATE = 'opening' | 'opened' | 'closing' | 'closed';\ntype EVENT = 'open' | 'opened' | 'close' | 'closed';\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  trigger: 'hover',\n};\n\nclass Fab {\n  /**\n   * Fab 元素的 JQ 对象\n   */\n  public $element: JQ;\n\n  /**\n   * 配置参数\n   */\n  public options: OPTIONS = extend({}, DEFAULT_OPTIONS);\n\n  /**\n   * 当前 fab 的状态\n   */\n  private state: STATE = 'closed';\n\n  /**\n   * 按钮元素\n   */\n  private $btn: JQ;\n\n  /**\n   * 拨号菜单元素\n   */\n  private $dial: JQ;\n\n  /**\n   * 拨号菜单内的按钮\n   */\n  private $dialBtns: JQ;\n\n  public constructor(\n    selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    options: OPTIONS = {},\n  ) {\n    this.$element = $(selector).first();\n\n    extend(this.options, options);\n\n    this.$btn = this.$element.find('.mdui-fab');\n    this.$dial = this.$element.find('.mdui-fab-dial');\n    this.$dialBtns = this.$dial.find('.mdui-fab');\n\n    if (this.options.trigger === 'hover') {\n      this.$btn.on('touchstart mouseenter', () => this.open());\n      this.$element.on('mouseleave', () => this.close());\n    }\n\n    if (this.options.trigger === 'click') {\n      this.$btn.on(startEvent, () => this.open());\n    }\n\n    // 触摸屏幕其他地方关闭快速拨号\n    $document.on(startEvent, (event) => {\n      if ($(event.target as HTMLElement).parents('.mdui-fab-wrapper').length) {\n        return;\n      }\n\n      this.close();\n    });\n  }\n\n  /**\n   * 触发组件事件\n   * @param name\n   */\n  private triggerEvent(name: EVENT): void {\n    componentEvent(name, 'fab', this.$element, this);\n  }\n\n  /**\n   * 当前是否为打开状态\n   */\n  private isOpen(): boolean {\n    return this.state === 'opening' || this.state === 'opened';\n  }\n\n  /**\n   * 打开快速拨号菜单\n   */\n  public open(): void {\n    if (this.isOpen()) {\n      return;\n    }\n\n    // 为菜单中的按钮添加不同的 transition-delay\n    this.$dialBtns.each((index, btn) => {\n      const delay = `${15 * (this.$dialBtns.length - index)}ms`;\n\n      btn.style.transitionDelay = delay;\n      btn.style.webkitTransitionDelay = delay;\n    });\n\n    this.$dial.css('height', 'auto').addClass('mdui-fab-dial-show');\n\n    // 如果按钮中存在 .mdui-fab-opened 的图标,则进行图标切换\n    if (this.$btn.find('.mdui-fab-opened').length) {\n      this.$btn.addClass('mdui-fab-opened');\n    }\n\n    this.state = 'opening';\n    this.triggerEvent('open');\n\n    // 打开顺序为从下到上逐个打开,最上面的打开后才表示动画完成\n    this.$dialBtns.first().transitionEnd(() => {\n      if (this.$btn.hasClass('mdui-fab-opened')) {\n        this.state = 'opened';\n        this.triggerEvent('opened');\n      }\n    });\n  }\n\n  /**\n   * 关闭快速拨号菜单\n   */\n  public close(): void {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    // 为菜单中的按钮添加不同的 transition-delay\n    this.$dialBtns.each((index, btn) => {\n      const delay = `${15 * index}ms`;\n\n      btn.style.transitionDelay = delay;\n      btn.style.webkitTransitionDelay = delay;\n    });\n\n    this.$dial.removeClass('mdui-fab-dial-show');\n    this.$btn.removeClass('mdui-fab-opened');\n    this.state = 'closing';\n    this.triggerEvent('close');\n\n    // 从上往下依次关闭,最后一个关闭后才表示动画完成\n    this.$dialBtns.last().transitionEnd(() => {\n      if (this.$btn.hasClass('mdui-fab-opened')) {\n        return;\n      }\n\n      this.state = 'closed';\n      this.triggerEvent('closed');\n      this.$dial.css('height', 0);\n    });\n  }\n\n  /**\n   * 切换快速拨号菜单的打开状态\n   */\n  public toggle(): void {\n    this.isOpen() ? this.close() : this.open();\n  }\n\n  /**\n   * 以动画的形式显示整个浮动操作按钮\n   */\n  public show(): void {\n    this.$element.removeClass('mdui-fab-hide');\n  }\n\n  /**\n   * 以动画的形式隐藏整个浮动操作按钮\n   */\n  public hide(): void {\n    this.$element.addClass('mdui-fab-hide');\n  }\n\n  /**\n   * 返回当前快速拨号菜单的打开状态。共包含四种状态:`opening`、`opened`、`closing`、`closed`\n   */\n  public getState(): STATE {\n    return this.state;\n  }\n}\n\nmdui.Fab = Fab;\n","import $ from 'mdui.jq/es/$';\nimport mdui from '../../mdui';\nimport { $document } from '../../utils/dom';\nimport { parseOptions } from '../../utils/parseOptions';\nimport './index';\n\nconst customAttr = 'mdui-fab';\n\n$(() => {\n  // mouseenter 不冒泡,无法进行事件委托,这里用 mouseover 代替。\n  // 不管是 click 、 mouseover 还是 touchstart ,都先初始化。\n\n  $document.on(\n    'touchstart mousedown mouseover',\n    `[${customAttr}]`,\n    function () {\n      new mdui.Fab(\n        this as HTMLElement,\n        parseOptions(this as HTMLElement, customAttr),\n      );\n    },\n  );\n});\n","/**\n * 最终生成的元素结构为:\n *  <select class=\"mdui-select\" mdui-select=\"{position: 'top'}\" style=\"display: none;\"> // $native\n *    <option value=\"1\">State 1</option>\n *    <option value=\"2\">State 2</option>\n *    <option value=\"3\" disabled=\"\">State 3</option>\n *  </select>\n *  <div class=\"mdui-select mdui-select-position-top\" style=\"\" id=\"88dec0e4-d4a2-c6d0-0e7f-1ba4501e0553\"> // $element\n *    <span class=\"mdui-select-selected\">State 1</span> // $selected\n *    <div class=\"mdui-select-menu\" style=\"transform-origin: center 100% 0px;\"> // $menu\n *      <div class=\"mdui-select-menu-item mdui-ripple\" selected=\"\">State 1</div> // $items\n *      <div class=\"mdui-select-menu-item mdui-ripple\">State 2</div>\n *      <div class=\"mdui-select-menu-item mdui-ripple\" disabled=\"\">State 3</div>\n *    </div>\n *  </div>\n */\n\nimport $ from 'mdui.jq/es/$';\nimport contains from 'mdui.jq/es/functions/contains';\nimport extend from 'mdui.jq/es/functions/extend';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/add';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/after';\nimport 'mdui.jq/es/methods/append';\nimport 'mdui.jq/es/methods/appendTo';\nimport 'mdui.jq/es/methods/attr';\nimport 'mdui.jq/es/methods/css';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/height';\nimport 'mdui.jq/es/methods/hide';\nimport 'mdui.jq/es/methods/index';\nimport 'mdui.jq/es/methods/innerWidth';\nimport 'mdui.jq/es/methods/is';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/remove';\nimport 'mdui.jq/es/methods/removeAttr';\nimport 'mdui.jq/es/methods/removeClass';\nimport 'mdui.jq/es/methods/show';\nimport 'mdui.jq/es/methods/text';\nimport 'mdui.jq/es/methods/trigger';\nimport 'mdui.jq/es/methods/val';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport mdui from '../../mdui';\nimport '../../jq_extends/methods/transitionEnd';\nimport '../../jq_extends/static/guid';\nimport { componentEvent } from '../../utils/componentEvent';\nimport { $document, $window } from '../../utils/dom';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 下拉选择组件\n     *\n     * 请通过 `new mdui.Select()` 调用\n     */\n    Select: {\n      /**\n       * 实例化 Select 组件\n       * @param selector CSS 选择器、或 DOM 元素、或 JQ 对象\n       * @param options 配置参数\n       */\n      new (\n        selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n        options?: OPTIONS,\n      ): Select;\n    };\n  }\n}\n\ntype OPTIONS = {\n  /**\n   * 下拉框位置:`auto`、`top`、`bottom`\n   */\n  position?: 'auto' | 'top' | 'bottom';\n\n  /**\n   * 菜单与窗口上下边框至少保持多少间距\n   */\n  gutter?: number;\n};\n\ntype STATE = 'closing' | 'closed' | 'opening' | 'opened';\ntype EVENT = 'open' | 'opened' | 'close' | 'closed';\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  position: 'auto',\n  gutter: 16,\n};\n\nclass Select {\n  /**\n   * 原生 `<select>` 元素的 JQ 对象\n   */\n  public $native: JQ<HTMLSelectElement>;\n\n  /**\n   * 生成的 `<div class=\"mdui-select\">` 元素的 JQ 对象\n   */\n  public $element: JQ = $();\n\n  /**\n   * 配置参数\n   */\n  public options: OPTIONS = extend({}, DEFAULT_OPTIONS);\n\n  /**\n   * select 的 size 属性的值,根据该值设置 select 的高度\n   */\n  private size = 0;\n\n  /**\n   * 占位元素,显示已选中菜单项的文本\n   */\n  private $selected: JQ = $();\n\n  /**\n   * 菜单项的外层元素的 JQ 对象\n   */\n  private $menu: JQ = $();\n\n  /**\n   * 菜单项数组的 JQ 对象\n   */\n  private $items: JQ = $();\n\n  /**\n   * 当前选中的菜单项的索引号\n   */\n  private selectedIndex = 0;\n\n  /**\n   * 当前选中菜单项的文本\n   */\n  private selectedText = '';\n\n  /**\n   * 当前选中菜单项的值\n   */\n  private selectedValue = '';\n\n  /**\n   * 唯一 ID\n   */\n  private uniqueID: string;\n\n  /**\n   * 当前 select 的状态\n   */\n  private state: STATE = 'closed';\n\n  public constructor(\n    selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    options: OPTIONS = {},\n  ) {\n    this.$native = $(selector).first() as JQ<HTMLSelectElement>;\n    this.$native.hide();\n\n    extend(this.options, options);\n\n    // 为当前 select 生成唯一 ID\n    this.uniqueID = $.guid();\n\n    // 生成 select\n    this.handleUpdate();\n\n    // 点击 select 外面区域关闭\n    $document.on('click touchstart', (event: Event) => {\n      const $target = $(event.target as HTMLElement);\n\n      if (\n        this.isOpen() &&\n        !$target.is(this.$element) &&\n        !contains(this.$element[0], $target[0])\n      ) {\n        this.close();\n      }\n    });\n  }\n\n  /**\n   * 调整菜单位置\n   */\n  private readjustMenu(): void {\n    const windowHeight = $window.height();\n\n    // mdui-select 高度\n    const elementHeight = this.$element.height();\n\n    // 菜单项高度\n    const $itemFirst = this.$items.first();\n    const itemHeight = $itemFirst.height();\n    const itemMargin = parseInt($itemFirst.css('margin-top'));\n\n    // 菜单高度\n    const menuWidth = this.$element.innerWidth() + 0.01; // 必须比真实宽度多一点,不然会出现省略号\n    let menuHeight = itemHeight * this.size + itemMargin * 2;\n\n    // mdui-select 在窗口中的位置\n    const elementTop = this.$element[0].getBoundingClientRect().top;\n\n    let transformOriginY: string;\n    let menuMarginTop: number;\n\n    if (this.options.position === 'bottom') {\n      menuMarginTop = elementHeight;\n      transformOriginY = '0px';\n    } else if (this.options.position === 'top') {\n      menuMarginTop = -menuHeight - 1;\n      transformOriginY = '100%';\n    } else {\n      // 菜单高度不能超过窗口高度\n      const menuMaxHeight = windowHeight - this.options.gutter! * 2;\n      if (menuHeight > menuMaxHeight) {\n        menuHeight = menuMaxHeight;\n      }\n\n      // 菜单的 margin-top\n      menuMarginTop = -(\n        itemMargin +\n        this.selectedIndex * itemHeight +\n        (itemHeight - elementHeight) / 2\n      );\n\n      const menuMaxMarginTop = -(\n        itemMargin +\n        (this.size - 1) * itemHeight +\n        (itemHeight - elementHeight) / 2\n      );\n      if (menuMarginTop < menuMaxMarginTop) {\n        menuMarginTop = menuMaxMarginTop;\n      }\n\n      // 菜单不能超出窗口\n      const menuTop = elementTop + menuMarginTop;\n      if (menuTop < this.options.gutter!) {\n        // 不能超出窗口上方\n        menuMarginTop = -(elementTop - this.options.gutter!);\n      } else if (menuTop + menuHeight + this.options.gutter! > windowHeight) {\n        // 不能超出窗口下方\n        menuMarginTop = -(\n          elementTop +\n          menuHeight +\n          this.options.gutter! -\n          windowHeight\n        );\n      }\n\n      // transform 的 Y 轴坐标\n      transformOriginY = `${\n        this.selectedIndex * itemHeight + itemHeight / 2 + itemMargin\n      }px`;\n    }\n\n    // 设置样式\n    this.$element.innerWidth(menuWidth);\n    this.$menu\n      .innerWidth(menuWidth)\n      .height(menuHeight)\n      .css({\n        'margin-top': menuMarginTop + 'px',\n        'transform-origin': 'center ' + transformOriginY + ' 0',\n      });\n  }\n\n  /**\n   * select 是否为打开状态\n   */\n  private isOpen(): boolean {\n    return this.state === 'opening' || this.state === 'opened';\n  }\n\n  /**\n   * 对原生 select 组件进行了修改后,需要调用该方法\n   */\n  public handleUpdate(): void {\n    if (this.isOpen()) {\n      this.close();\n    }\n\n    this.selectedValue = this.$native.val() as string;\n\n    // 保存菜单项数据的数组\n    type typeItemsData = {\n      value: string;\n      text: string;\n      disabled: boolean;\n      selected: boolean;\n      index: number;\n    };\n    const itemsData: typeItemsData[] = [];\n    this.$items = $();\n\n    // 生成 HTML\n    this.$native.find('option').each((index, option) => {\n      const text = option.textContent || '';\n      const value = option.value;\n      const disabled = option.disabled;\n      const selected = this.selectedValue === value;\n\n      itemsData.push({\n        value,\n        text,\n        disabled,\n        selected,\n        index,\n      });\n\n      if (selected) {\n        this.selectedText = text;\n        this.selectedIndex = index;\n      }\n\n      this.$items = this.$items.add(\n        '<div class=\"mdui-select-menu-item mdui-ripple\"' +\n          (disabled ? ' disabled' : '') +\n          (selected ? ' selected' : '') +\n          `>${text}</div>`,\n      );\n    });\n\n    this.$selected = $(\n      `<span class=\"mdui-select-selected\">${this.selectedText}</span>`,\n    );\n\n    this.$element = $(\n      `<div class=\"mdui-select mdui-select-position-${this.options.position}\" ` +\n        `style=\"${this.$native.attr('style')}\" ` +\n        `id=\"${this.uniqueID}\"></div>`,\n    )\n      .show()\n      .append(this.$selected);\n\n    this.$menu = $('<div class=\"mdui-select-menu\"></div>')\n      .appendTo(this.$element)\n      .append(this.$items);\n\n    $(`#${this.uniqueID}`).remove();\n    this.$native.after(this.$element);\n\n    // 根据 select 的 size 属性设置高度\n    this.size = parseInt(this.$native.attr('size') || '0');\n\n    if (this.size <= 0) {\n      this.size = this.$items.length;\n\n      if (this.size > 8) {\n        this.size = 8;\n      }\n    }\n\n    // 点击选项时关闭下拉菜单\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const that = this;\n    this.$items.on('click', function () {\n      if (that.state === 'closing') {\n        return;\n      }\n\n      const $item = $(this);\n      const index = $item.index();\n      const data = itemsData[index];\n\n      if (data.disabled) {\n        return;\n      }\n\n      that.$selected.text(data.text);\n      that.$native.val(data.value);\n      that.$items.removeAttr('selected');\n      $item.attr('selected', '');\n      that.selectedIndex = data.index;\n      that.selectedValue = data.value;\n      that.selectedText = data.text;\n      that.$native.trigger('change');\n      that.close();\n    });\n\n    // 点击 $element 时打开下拉菜单\n    this.$element.on('click', (event: Event) => {\n      const $target = $(event.target as HTMLElement);\n\n      // 在菜单上点击时不打开\n      if (\n        $target.is('.mdui-select-menu') ||\n        $target.is('.mdui-select-menu-item')\n      ) {\n        return;\n      }\n\n      this.toggle();\n    });\n  }\n\n  /**\n   * 动画结束的回调\n   */\n  private transitionEnd(): void {\n    this.$element.removeClass('mdui-select-closing');\n\n    if (this.state === 'opening') {\n      this.state = 'opened';\n      this.triggerEvent('opened');\n      this.$menu.css('overflow-y', 'auto');\n    }\n\n    if (this.state === 'closing') {\n      this.state = 'closed';\n      this.triggerEvent('closed');\n\n      // 恢复样式\n      this.$element.innerWidth('');\n      this.$menu.css({\n        'margin-top': '',\n        height: '',\n        width: '',\n      });\n    }\n  }\n\n  /**\n   * 触发组件事件\n   * @param name\n   */\n  private triggerEvent(name: EVENT): void {\n    componentEvent(name, 'select', this.$native, this);\n  }\n\n  /**\n   * 切换下拉菜单的打开状态\n   */\n  public toggle(): void {\n    this.isOpen() ? this.close() : this.open();\n  }\n\n  /**\n   * 打开下拉菜单\n   */\n  public open(): void {\n    if (this.isOpen()) {\n      return;\n    }\n\n    this.state = 'opening';\n    this.triggerEvent('open');\n    this.readjustMenu();\n    this.$element.addClass('mdui-select-open');\n    this.$menu.transitionEnd(() => this.transitionEnd());\n  }\n\n  /**\n   * 关闭下拉菜单\n   */\n  public close(): void {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this.state = 'closing';\n    this.triggerEvent('close');\n    this.$menu.css('overflow-y', '');\n    this.$element\n      .removeClass('mdui-select-open')\n      .addClass('mdui-select-closing');\n    this.$menu.transitionEnd(() => this.transitionEnd());\n  }\n\n  /**\n   * 获取当前菜单的状态。共包含四种状态:`opening`、`opened`、`closing`、`closed`\n   */\n  public getState(): STATE {\n    return this.state;\n  }\n}\n\nmdui.Select = Select;\n","import $ from 'mdui.jq/es/$';\nimport mdui from '../../mdui';\nimport '../../global/mutation';\nimport { parseOptions } from '../../utils/parseOptions';\nimport './index';\n\nconst customAttr = 'mdui-select';\n\n$(() => {\n  mdui.mutation(`[${customAttr}]`, function () {\n    new mdui.Select(this, parseOptions(this, customAttr));\n  });\n});\n","import $ from 'mdui.jq/es/$';\nimport mdui from '../../mdui';\nimport '../../global/mutation';\nimport '../headroom';\n\n$(() => {\n  // 滚动时隐藏应用栏\n  mdui.mutation('.mdui-appbar-scroll-hide', function () {\n    new mdui.Headroom(this);\n  });\n\n  // 滚动时只隐藏应用栏中的工具栏\n  mdui.mutation('.mdui-appbar-scroll-toolbar-hide', function () {\n    new mdui.Headroom(this, {\n      pinnedClass: 'mdui-headroom-pinned-toolbar',\n      unpinnedClass: 'mdui-headroom-unpinned-toolbar',\n    });\n  });\n});\n","import $ from 'mdui.jq/es/$';\nimport extend from 'mdui.jq/es/functions/extend';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/appendTo';\nimport 'mdui.jq/es/methods/attr';\nimport 'mdui.jq/es/methods/children';\nimport 'mdui.jq/es/methods/css';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/eq';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/get';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/hide';\nimport 'mdui.jq/es/methods/index';\nimport 'mdui.jq/es/methods/innerWidth';\nimport 'mdui.jq/es/methods/offset';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/removeClass';\nimport 'mdui.jq/es/methods/show';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport { isNumber } from 'mdui.jq/es/utils';\nimport mdui from '../../mdui';\nimport '../../jq_extends/static/throttle';\nimport { componentEvent } from '../../utils/componentEvent';\nimport { $window } from '../../utils/dom';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * Tab 选项卡组件\n     *\n     * 请通过 `new mdui.Tab()` 调用\n     */\n    Tab: {\n      /**\n       * 实例化 Tab 组件\n       * @param selector CSS 选择器、或 DOM 元素、或 JQ 对象\n       * @param options 配置参数\n       */\n      new (\n        selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n        options?: OPTIONS,\n      ): Tab;\n    };\n  }\n}\n\ntype OPTIONS = {\n  /**\n   * 切换选项卡的触发方式。`click`: 点击切换;`hover`: 鼠标悬浮切换\n   */\n  trigger?: 'click' | 'hover';\n\n  /**\n   * 是否启用循环切换,若为 `true`,则最后一个选项激活时调用 `next` 方法将回到第一个选项,第一个选项激活时调用 `prev` 方法将回到最后一个选项。\n   */\n  loop?: boolean;\n};\n\ntype EVENT = 'change' | 'show';\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  trigger: 'click',\n  loop: false,\n};\n\nclass Tab {\n  /**\n   * tab 元素的 JQ 对象\n   */\n  public $element: JQ;\n\n  /**\n   * 配置参数\n   */\n  public options: OPTIONS = extend({}, DEFAULT_OPTIONS);\n\n  /**\n   * 当前激活的 tab 的索引号。为 -1 时表示没有激活的选项卡,或不存在选项卡\n   */\n  public activeIndex = -1;\n\n  /**\n   * 选项数组 JQ 对象\n   */\n  private $tabs: JQ;\n\n  /**\n   * 激活状态的 tab 底部的指示符\n   */\n  private $indicator: JQ;\n\n  public constructor(\n    selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    options: OPTIONS = {},\n  ) {\n    this.$element = $(selector).first();\n\n    extend(this.options, options);\n\n    this.$tabs = this.$element.children('a');\n    this.$indicator = $('<div class=\"mdui-tab-indicator\"></div>').appendTo(\n      this.$element,\n    );\n\n    // 根据 url hash 获取默认激活的选项卡\n    const hash = window.location.hash;\n    if (hash) {\n      this.$tabs.each((index, tab) => {\n        if ($(tab).attr('href') === hash) {\n          this.activeIndex = index;\n          return false;\n        }\n\n        return true;\n      });\n    }\n\n    // 含 .mdui-tab-active 的元素默认激活\n    if (this.activeIndex === -1) {\n      this.$tabs.each((index, tab) => {\n        if ($(tab).hasClass('mdui-tab-active')) {\n          this.activeIndex = index;\n          return false;\n        }\n\n        return true;\n      });\n    }\n\n    // 存在选项卡时,默认激活第一个选项卡\n    if (this.$tabs.length && this.activeIndex === -1) {\n      this.activeIndex = 0;\n    }\n\n    // 设置激活状态选项卡\n    this.setActive();\n\n    // 监听窗口大小变化事件,调整指示器位置\n    $window.on(\n      'resize',\n      $.throttle(() => this.setIndicatorPosition(), 100),\n    );\n\n    // 监听点击选项卡事件\n    this.$tabs.each((_, tab) => {\n      this.bindTabEvent(tab);\n    });\n  }\n\n  /**\n   * 指定选项卡是否已禁用\n   * @param $tab\n   */\n  private isDisabled($tab: JQ): boolean {\n    return $tab.attr('disabled') !== undefined;\n  }\n\n  /**\n   * 绑定在 Tab 上点击或悬浮的事件\n   * @param tab\n   */\n  private bindTabEvent(tab: HTMLElement): void {\n    const $tab = $(tab);\n\n    // 点击或鼠标移入触发的事件\n    const clickEvent = (): void | false => {\n      // 禁用状态的选项卡无法选中\n      if (this.isDisabled($tab)) {\n        return false;\n      }\n\n      this.activeIndex = this.$tabs.index(tab);\n      this.setActive();\n    };\n\n    // 无论 trigger 是 click 还是 hover,都会响应 click 事件\n    $tab.on('click', clickEvent);\n\n    // trigger 为 hover 时,额外响应 mouseenter 事件\n    if (this.options.trigger === 'hover') {\n      $tab.on('mouseenter', clickEvent);\n    }\n\n    // 阻止链接的默认点击动作\n    $tab.on('click', (): void | false => {\n      if (($tab.attr('href') || '').indexOf('#') === 0) {\n        return false;\n      }\n    });\n  }\n\n  /**\n   * 触发组件事件\n   * @param name\n   * @param $element\n   * @param parameters\n   */\n  private triggerEvent(name: EVENT, $element: JQ, parameters = {}): void {\n    componentEvent(name, 'tab', $element, this, parameters);\n  }\n\n  /**\n   * 设置激活状态的选项卡\n   */\n  private setActive(): void {\n    this.$tabs.each((index, tab) => {\n      const $tab = $(tab);\n      const targetId = $tab.attr('href') || '';\n\n      // 设置选项卡激活状态\n      if (index === this.activeIndex && !this.isDisabled($tab)) {\n        if (!$tab.hasClass('mdui-tab-active')) {\n          this.triggerEvent('change', this.$element, {\n            index: this.activeIndex,\n            id: targetId.substr(1),\n          });\n          this.triggerEvent('show', $tab);\n\n          $tab.addClass('mdui-tab-active');\n        }\n\n        $(targetId).show();\n        this.setIndicatorPosition();\n      } else {\n        $tab.removeClass('mdui-tab-active');\n        $(targetId).hide();\n      }\n    });\n  }\n\n  /**\n   * 设置选项卡指示器的位置\n   */\n  private setIndicatorPosition(): void {\n    // 选项卡数量为 0 时,不显示指示器\n    if (this.activeIndex === -1) {\n      this.$indicator.css({\n        left: 0,\n        width: 0,\n      });\n\n      return;\n    }\n\n    const $activeTab = this.$tabs.eq(this.activeIndex);\n\n    if (this.isDisabled($activeTab)) {\n      return;\n    }\n\n    const activeTabOffset = $activeTab.offset();\n\n    this.$indicator.css({\n      left: `${\n        activeTabOffset.left +\n        this.$element[0].scrollLeft -\n        this.$element[0].getBoundingClientRect().left\n      }px`,\n      width: `${$activeTab.innerWidth()}px`,\n    });\n  }\n\n  /**\n   * 切换到下一个选项卡\n   */\n  public next(): void {\n    if (this.activeIndex === -1) {\n      return;\n    }\n\n    if (this.$tabs.length > this.activeIndex + 1) {\n      this.activeIndex++;\n    } else if (this.options.loop) {\n      this.activeIndex = 0;\n    }\n\n    this.setActive();\n  }\n\n  /**\n   * 切换到上一个选项卡\n   */\n  public prev(): void {\n    if (this.activeIndex === -1) {\n      return;\n    }\n\n    if (this.activeIndex > 0) {\n      this.activeIndex--;\n    } else if (this.options.loop) {\n      this.activeIndex = this.$tabs.length - 1;\n    }\n\n    this.setActive();\n  }\n\n  /**\n   * 显示指定索引号、或指定id的选项卡\n   * @param index 索引号、或id\n   */\n  public show(index: number | string): void {\n    if (this.activeIndex === -1) {\n      return;\n    }\n\n    if (isNumber(index)) {\n      this.activeIndex = index;\n    } else {\n      this.$tabs.each((i, tab): void | false => {\n        if (tab.id === index) {\n          this.activeIndex === i;\n          return false;\n        }\n      });\n    }\n\n    this.setActive();\n  }\n\n  /**\n   * 在父元素的宽度变化时,需要调用该方法重新调整指示器位置\n   * 在添加或删除选项卡时,需要调用该方法\n   */\n  public handleUpdate(): void {\n    const $oldTabs = this.$tabs; // 旧的 tabs JQ对象\n    const $newTabs = this.$element.children('a'); // 新的 tabs JQ对象\n    const oldTabsElement = $oldTabs.get(); // 旧的 tabs 元素数组\n    const newTabsElement = $newTabs.get(); // 新的 tabs 元素数组\n\n    if (!$newTabs.length) {\n      this.activeIndex = -1;\n      this.$tabs = $newTabs;\n      this.setIndicatorPosition();\n\n      return;\n    }\n\n    // 重新遍历选项卡,找出新增的选项卡\n    $newTabs.each((index, tab) => {\n      // 有新增的选项卡\n      if (oldTabsElement.indexOf(tab) < 0) {\n        this.bindTabEvent(tab);\n\n        if (this.activeIndex === -1) {\n          this.activeIndex = 0;\n        } else if (index <= this.activeIndex) {\n          this.activeIndex++;\n        }\n      }\n    });\n\n    // 找出被移除的选项卡\n    $oldTabs.each((index, tab) => {\n      // 有被移除的选项卡\n      if (newTabsElement.indexOf(tab) < 0) {\n        if (index < this.activeIndex) {\n          this.activeIndex--;\n        } else if (index === this.activeIndex) {\n          this.activeIndex = 0;\n        }\n      }\n    });\n\n    this.$tabs = $newTabs;\n\n    this.setActive();\n  }\n}\n\nmdui.Tab = Tab;\n","import $ from 'mdui.jq/es/$';\nimport mdui from '../../mdui';\nimport '../../global/mutation';\nimport { parseOptions } from '../../utils/parseOptions';\nimport './index';\n\nconst customAttr = 'mdui-tab';\n\n$(() => {\n  mdui.mutation(`[${customAttr}]`, function () {\n    new mdui.Tab(this, parseOptions(this, customAttr));\n  });\n});\n","/**\n * 在桌面设备上默认显示抽屉栏,不显示遮罩层\n * 在手机和平板设备上默认不显示抽屉栏,始终显示遮罩层,且覆盖导航栏\n */\n\nimport $ from 'mdui.jq/es/$';\nimport extend from 'mdui.jq/es/functions/extend';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/off';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/one';\nimport 'mdui.jq/es/methods/removeClass';\nimport 'mdui.jq/es/methods/width';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport mdui from '../../mdui';\nimport '../../jq_extends/methods/transitionEnd';\nimport '../../jq_extends/static/hideOverlay';\nimport '../../jq_extends/static/lockScreen';\nimport '../../jq_extends/static/showOverlay';\nimport '../../jq_extends/static/throttle';\nimport '../../jq_extends/static/unlockScreen';\nimport { componentEvent } from '../../utils/componentEvent';\nimport { $window } from '../../utils/dom';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * Drawer 组件\n     *\n     * 请通过 `new mdui.Drawer()` 调用\n     */\n    Drawer: {\n      /**\n       * 实例化 Drawer 组件\n       * @param selector CSS 选择器、或 DOM 元素、或 JQ 对象\n       * @param options 配置参数\n       */\n      new (\n        selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n        options?: OPTIONS,\n      ): Drawer;\n    };\n  }\n}\n\ntype OPTIONS = {\n  /**\n   * 打开抽屉栏时是否显示遮罩层。该参数只对中等屏幕及以上的设备有效,在超小屏和小屏设备上始终会显示遮罩层。\n   */\n  overlay?: boolean;\n\n  /**\n   * 是否启用滑动手势。\n   */\n  swipe?: boolean;\n};\n\ntype STATE = 'opening' | 'opened' | 'closing' | 'closed';\ntype EVENT = 'open' | 'opened' | 'close' | 'closed';\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  overlay: false,\n  swipe: false,\n};\n\nclass Drawer {\n  /**\n   * drawer 元素的 JQ 对象\n   */\n  public $element: JQ;\n\n  /**\n   * 配置参数\n   */\n  public options: OPTIONS = extend({}, DEFAULT_OPTIONS);\n\n  /**\n   * 当前是否显示着遮罩层\n   */\n  private overlay = false;\n\n  /**\n   * 抽屉栏的位置\n   */\n  private position: 'left' | 'right';\n\n  /**\n   * 当前抽屉栏状态\n   */\n  private state: STATE;\n\n  public constructor(\n    selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    options: OPTIONS = {},\n  ) {\n    this.$element = $(selector).first();\n\n    extend(this.options, options);\n\n    this.position = this.$element.hasClass('mdui-drawer-right')\n      ? 'right'\n      : 'left';\n\n    if (this.$element.hasClass('mdui-drawer-close')) {\n      this.state = 'closed';\n    } else if (this.$element.hasClass('mdui-drawer-open')) {\n      this.state = 'opened';\n    } else if (this.isDesktop()) {\n      this.state = 'opened';\n    } else {\n      this.state = 'closed';\n    }\n\n    // 浏览器窗口大小调整时\n    $window.on(\n      'resize',\n      $.throttle(() => {\n        if (this.isDesktop()) {\n          // 由手机平板切换到桌面时\n          // 如果显示着遮罩,则隐藏遮罩\n          if (this.overlay && !this.options.overlay) {\n            $.hideOverlay();\n            this.overlay = false;\n            $.unlockScreen();\n          }\n\n          // 没有强制关闭,则状态为打开状态\n          if (!this.$element.hasClass('mdui-drawer-close')) {\n            this.state = 'opened';\n          }\n        } else if (!this.overlay && this.state === 'opened') {\n          // 由桌面切换到手机平板时。如果抽屉栏是打开着的且没有遮罩层,则关闭抽屉栏\n          if (this.$element.hasClass('mdui-drawer-open')) {\n            $.showOverlay();\n            this.overlay = true;\n            $.lockScreen();\n\n            $('.mdui-overlay').one('click', () => this.close());\n          } else {\n            this.state = 'closed';\n          }\n        }\n      }, 100),\n    );\n\n    // 绑定关闭按钮事件\n    this.$element.find('[mdui-drawer-close]').each((_, close) => {\n      $(close).on('click', () => this.close());\n    });\n\n    this.swipeSupport();\n  }\n\n  /**\n   * 是否是桌面设备\n   */\n  private isDesktop(): boolean {\n    return $window.width() >= 1024;\n  }\n\n  /**\n   * 滑动手势支持\n   */\n  private swipeSupport(): void {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const that = this;\n\n    // 抽屉栏滑动手势控制\n    let openNavEventHandler: (event: Event) => void;\n    let touchStartX: number;\n    let touchStartY: number;\n    let swipeStartX: number;\n    let swiping: null | 'opening' | 'closing' = null;\n    let maybeSwiping = false;\n    const $body = $('body');\n\n    // 手势触发的范围\n    const swipeAreaWidth = 24;\n\n    function setPosition(translateX: number): void {\n      const rtlTranslateMultiplier = that.position === 'right' ? -1 : 1;\n      const transformCSS = `translate(${\n        -1 * rtlTranslateMultiplier * translateX\n      }px, 0) !important;`;\n      const transitionCSS = 'initial !important;';\n\n      that.$element.css(\n        'cssText',\n        `transform: ${transformCSS}; transition: ${transitionCSS};`,\n      );\n    }\n\n    function cleanPosition(): void {\n      that.$element[0].style.transform = '';\n      that.$element[0].style.webkitTransform = '';\n      that.$element[0].style.transition = '';\n      that.$element[0].style.webkitTransition = '';\n    }\n\n    function getMaxTranslateX(): number {\n      return that.$element.width() + 10;\n    }\n\n    function getTranslateX(currentX: number): number {\n      return Math.min(\n        Math.max(\n          swiping === 'closing'\n            ? swipeStartX - currentX\n            : getMaxTranslateX() + swipeStartX - currentX,\n          0,\n        ),\n        getMaxTranslateX(),\n      );\n    }\n\n    function onBodyTouchEnd(event?: Event): void {\n      if (swiping) {\n        let touchX = (event as TouchEvent).changedTouches[0].pageX;\n        if (that.position === 'right') {\n          touchX = $body.width() - touchX;\n        }\n\n        const translateRatio = getTranslateX(touchX) / getMaxTranslateX();\n\n        maybeSwiping = false;\n        const swipingState = swiping;\n        swiping = null;\n\n        if (swipingState === 'opening') {\n          if (translateRatio < 0.92) {\n            cleanPosition();\n            that.open();\n          } else {\n            cleanPosition();\n          }\n        } else {\n          if (translateRatio > 0.08) {\n            cleanPosition();\n            that.close();\n          } else {\n            cleanPosition();\n          }\n        }\n\n        $.unlockScreen();\n      } else {\n        maybeSwiping = false;\n      }\n\n      $body.off({\n        // eslint-disable-next-line @typescript-eslint/no-use-before-define\n        touchmove: onBodyTouchMove,\n        touchend: onBodyTouchEnd,\n        // eslint-disable-next-line @typescript-eslint/no-use-before-define\n        touchcancel: onBodyTouchMove,\n      });\n    }\n\n    function onBodyTouchMove(event: Event): void {\n      let touchX = (event as TouchEvent).touches[0].pageX;\n      if (that.position === 'right') {\n        touchX = $body.width() - touchX;\n      }\n\n      const touchY = (event as TouchEvent).touches[0].pageY;\n\n      if (swiping) {\n        setPosition(getTranslateX(touchX));\n      } else if (maybeSwiping) {\n        const dXAbs = Math.abs(touchX - touchStartX);\n        const dYAbs = Math.abs(touchY - touchStartY);\n        const threshold = 8;\n\n        if (dXAbs > threshold && dYAbs <= threshold) {\n          swipeStartX = touchX;\n          swiping = that.state === 'opened' ? 'closing' : 'opening';\n          $.lockScreen();\n          setPosition(getTranslateX(touchX));\n        } else if (dXAbs <= threshold && dYAbs > threshold) {\n          onBodyTouchEnd();\n        }\n      }\n    }\n\n    function onBodyTouchStart(event: Event): void {\n      touchStartX = (event as TouchEvent).touches[0].pageX;\n      if (that.position === 'right') {\n        touchStartX = $body.width() - touchStartX;\n      }\n\n      touchStartY = (event as TouchEvent).touches[0].pageY;\n\n      if (that.state !== 'opened') {\n        if (\n          touchStartX > swipeAreaWidth ||\n          openNavEventHandler !== onBodyTouchStart\n        ) {\n          return;\n        }\n      }\n\n      maybeSwiping = true;\n\n      $body.on({\n        touchmove: onBodyTouchMove,\n        touchend: onBodyTouchEnd,\n        touchcancel: onBodyTouchMove,\n      });\n    }\n\n    function enableSwipeHandling(): void {\n      if (!openNavEventHandler) {\n        $body.on('touchstart', onBodyTouchStart);\n        openNavEventHandler = onBodyTouchStart;\n      }\n    }\n\n    if (this.options.swipe) {\n      enableSwipeHandling();\n    }\n  }\n\n  /**\n   * 触发组件事件\n   * @param name\n   */\n  private triggerEvent(name: EVENT): void {\n    componentEvent(name, 'drawer', this.$element, this);\n  }\n\n  /**\n   * 动画结束回调\n   */\n  private transitionEnd(): void {\n    if (this.$element.hasClass('mdui-drawer-open')) {\n      this.state = 'opened';\n      this.triggerEvent('opened');\n    } else {\n      this.state = 'closed';\n      this.triggerEvent('closed');\n    }\n  }\n\n  /**\n   * 是否处于打开状态\n   */\n  private isOpen(): boolean {\n    return this.state === 'opening' || this.state === 'opened';\n  }\n\n  /**\n   * 打开抽屉栏\n   */\n  public open(): void {\n    if (this.isOpen()) {\n      return;\n    }\n\n    this.state = 'opening';\n    this.triggerEvent('open');\n\n    if (!this.options.overlay) {\n      $('body').addClass(`mdui-drawer-body-${this.position}`);\n    }\n\n    this.$element\n      .removeClass('mdui-drawer-close')\n      .addClass('mdui-drawer-open')\n      .transitionEnd(() => this.transitionEnd());\n\n    if (!this.isDesktop() || this.options.overlay) {\n      this.overlay = true;\n      $.showOverlay().one('click', () => this.close());\n      $.lockScreen();\n    }\n  }\n\n  /**\n   * 关闭抽屉栏\n   */\n  public close(): void {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this.state = 'closing';\n    this.triggerEvent('close');\n\n    if (!this.options.overlay) {\n      $('body').removeClass(`mdui-drawer-body-${this.position}`);\n    }\n\n    this.$element\n      .addClass('mdui-drawer-close')\n      .removeClass('mdui-drawer-open')\n      .transitionEnd(() => this.transitionEnd());\n\n    if (this.overlay) {\n      $.hideOverlay();\n      this.overlay = false;\n      $.unlockScreen();\n    }\n  }\n\n  /**\n   * 切换抽屉栏打开/关闭状态\n   */\n  public toggle(): void {\n    this.isOpen() ? this.close() : this.open();\n  }\n\n  /**\n   * 返回当前抽屉栏的状态。共包含四种状态:`opening`、`opened`、`closing`、`closed`\n   */\n  public getState(): STATE {\n    return this.state;\n  }\n}\n\nmdui.Drawer = Drawer;\n","import $ from 'mdui.jq/es/$';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/on';\nimport mdui from '../../mdui';\nimport '../../global/mutation';\nimport { parseOptions } from '../../utils/parseOptions';\nimport './index';\n\nconst customAttr = 'mdui-drawer';\n\ntype OPTIONS = {\n  target: string;\n  overlay?: boolean;\n  swipe?: boolean;\n};\n\n$(() => {\n  mdui.mutation(`[${customAttr}]`, function () {\n    const $element = $(this);\n    const options = parseOptions(this, customAttr) as OPTIONS;\n    const selector = options.target;\n    // @ts-ignore\n    delete options.target;\n\n    const $drawer = $(selector).first();\n    const instance = new mdui.Drawer($drawer, options);\n\n    $element.on('click', () => instance.toggle());\n  });\n});\n","import { isUndefined } from 'mdui.jq/es/utils';\nimport PlainObject from 'mdui.jq/es/interfaces/PlainObject';\n\ntype Func = () => any;\n\nconst container: PlainObject<Func[]> = {};\n\n/**\n * 根据队列名,获取队列中所有函数\n * @param name 队列名\n */\nfunction queue(name: string): Func[];\n\n/**\n * 写入队列\n * @param name 队列名\n * @param func 函数\n */\nfunction queue(name: string, func: Func): void;\n\nfunction queue(name: string, func?: Func): void | Func[] {\n  if (isUndefined(container[name])) {\n    container[name] = [];\n  }\n\n  if (isUndefined(func)) {\n    return container[name];\n  }\n\n  container[name].push(func);\n}\n\n/**\n * 从队列中移除第一个函数,并执行该函数\n * @param name 队列满\n */\nfunction dequeue(name: string): void {\n  if (isUndefined(container[name])) {\n    return;\n  }\n\n  if (!container[name].length) {\n    return;\n  }\n\n  const func = container[name].shift()!;\n\n  func();\n}\n\nexport { queue, dequeue };\n","import $ from 'mdui.jq/es/$';\nimport contains from 'mdui.jq/es/functions/contains';\nimport extend from 'mdui.jq/es/functions/extend';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/append';\nimport 'mdui.jq/es/methods/children';\nimport 'mdui.jq/es/methods/css';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/height';\nimport 'mdui.jq/es/methods/hide';\nimport 'mdui.jq/es/methods/innerHeight';\nimport 'mdui.jq/es/methods/off';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/remove';\nimport 'mdui.jq/es/methods/removeClass';\nimport 'mdui.jq/es/methods/show';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport '../../jq_extends/methods/transitionEnd';\nimport '../../jq_extends/static/hideOverlay';\nimport '../../jq_extends/static/lockScreen';\nimport '../../jq_extends/static/showOverlay';\nimport '../../jq_extends/static/throttle';\nimport '../../jq_extends/static/unlockScreen';\nimport { componentEvent } from '../../utils/componentEvent';\nimport { $window } from '../../utils/dom';\nimport { dequeue, queue } from '../../utils/queue';\n\ntype OPTIONS = {\n  /**\n   * 打开对话框时是否添加 url hash,若为 `true`,则打开对话框后可用过浏览器的后退按钮或 Android 的返回键关闭对话框。\n   */\n  history?: boolean;\n\n  /**\n   * 打开对话框时是否显示遮罩。\n   */\n  overlay?: boolean;\n\n  /**\n   * 是否模态化对话框。为 `false` 时点击对话框外面的区域时关闭对话框,否则不关闭。\n   */\n  modal?: boolean;\n\n  /**\n   * 按下 Esc 键时是否关闭对话框。\n   */\n  closeOnEsc?: boolean;\n\n  /**\n   * 按下取消按钮时是否关闭对话框。\n   */\n  closeOnCancel?: boolean;\n\n  /**\n   * 按下确认按钮时是否关闭对话框。\n   */\n  closeOnConfirm?: boolean;\n\n  /**\n   * 关闭对话框后是否自动销毁对话框。\n   */\n  destroyOnClosed?: boolean;\n};\n\ntype STATE = 'opening' | 'opened' | 'closing' | 'closed';\ntype EVENT = 'open' | 'opened' | 'close' | 'closed' | 'cancel' | 'confirm';\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  history: true,\n  overlay: true,\n  modal: false,\n  closeOnEsc: true,\n  closeOnCancel: true,\n  closeOnConfirm: true,\n  destroyOnClosed: false,\n};\n\n/**\n * 当前显示的对话框实例\n */\nlet currentInst: null | Dialog = null;\n\n/**\n * 队列名\n */\nconst queueName = '_mdui_dialog';\n\n/**\n * 窗口是否已锁定\n */\nlet isLockScreen = false;\n\n/**\n * 遮罩层元素\n */\nlet $overlay: null | JQ;\n\nclass Dialog {\n  /**\n   * dialog 元素的 JQ 对象\n   */\n  public $element: JQ;\n\n  /**\n   * 配置参数\n   */\n  public options: OPTIONS = extend({}, DEFAULT_OPTIONS);\n\n  /**\n   * 当前 dialog 的状态\n   */\n  public state: STATE = 'closed';\n\n  /**\n   * dialog 元素是否是动态添加的\n   */\n  private append = false;\n\n  public constructor(\n    selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    options: OPTIONS = {},\n  ) {\n    this.$element = $(selector).first();\n\n    // 如果对话框元素没有在当前文档中,则需要添加\n    if (!contains(document.body, this.$element[0])) {\n      this.append = true;\n      $('body').append(this.$element);\n    }\n\n    extend(this.options, options);\n\n    // 绑定取消按钮事件\n    this.$element.find('[mdui-dialog-cancel]').each((_, cancel) => {\n      $(cancel).on('click', () => {\n        this.triggerEvent('cancel');\n\n        if (this.options.closeOnCancel) {\n          this.close();\n        }\n      });\n    });\n\n    // 绑定确认按钮事件\n    this.$element.find('[mdui-dialog-confirm]').each((_, confirm) => {\n      $(confirm).on('click', () => {\n        this.triggerEvent('confirm');\n\n        if (this.options.closeOnConfirm) {\n          this.close();\n        }\n      });\n    });\n\n    // 绑定关闭按钮事件\n    this.$element.find('[mdui-dialog-close]').each((_, close) => {\n      $(close).on('click', () => this.close());\n    });\n  }\n\n  /**\n   * 触发组件事件\n   * @param name\n   */\n  private triggerEvent(name: EVENT): void {\n    componentEvent(name, 'dialog', this.$element, this);\n  }\n\n  /**\n   * 窗口宽度变化,或对话框内容变化时,调整对话框位置和对话框内的滚动条\n   */\n  private readjust(): void {\n    if (!currentInst) {\n      return;\n    }\n\n    const $element = currentInst.$element;\n    const $title = $element.children('.mdui-dialog-title');\n    const $content = $element.children('.mdui-dialog-content');\n    const $actions = $element.children('.mdui-dialog-actions');\n\n    // 调整 dialog 的 top 和 height 值\n    $element.height('');\n    $content.height('');\n\n    const elementHeight = $element.height();\n    $element.css({\n      top: `${($window.height() - elementHeight) / 2}px`,\n      height: `${elementHeight}px`,\n    });\n\n    // 调整 mdui-dialog-content 的高度\n    $content.innerHeight(\n      elementHeight -\n        ($title.innerHeight() || 0) -\n        ($actions.innerHeight() || 0),\n    );\n  }\n\n  /**\n   * hashchange 事件触发时关闭对话框\n   */\n  private hashchangeEvent(): void {\n    if (window.location.hash.substring(1).indexOf('mdui-dialog') < 0) {\n      currentInst!.close(true);\n    }\n  }\n\n  /**\n   * 点击遮罩层关闭对话框\n   * @param event\n   */\n  private overlayClick(event: Event): void {\n    if (\n      $(event.target as HTMLElement).hasClass('mdui-overlay') &&\n      currentInst\n    ) {\n      currentInst.close();\n    }\n  }\n\n  /**\n   * 动画结束回调\n   */\n  private transitionEnd(): void {\n    if (this.$element.hasClass('mdui-dialog-open')) {\n      this.state = 'opened';\n      this.triggerEvent('opened');\n    } else {\n      this.state = 'closed';\n      this.triggerEvent('closed');\n      this.$element.hide();\n\n      // 所有对话框都关闭,且当前没有打开的对话框时,解锁屏幕\n      if (!queue(queueName).length && !currentInst && isLockScreen) {\n        $.unlockScreen();\n        isLockScreen = false;\n      }\n\n      $window.off('resize', $.throttle(this.readjust, 100));\n\n      if (this.options.destroyOnClosed) {\n        this.destroy();\n      }\n    }\n  }\n\n  /**\n   * 打开指定对话框\n   */\n  private doOpen(): void {\n    currentInst = this;\n\n    if (!isLockScreen) {\n      $.lockScreen();\n      isLockScreen = true;\n    }\n\n    this.$element.show();\n    this.readjust();\n\n    $window.on('resize', $.throttle(this.readjust, 100));\n\n    // 打开消息框\n    this.state = 'opening';\n    this.triggerEvent('open');\n    this.$element\n      .addClass('mdui-dialog-open')\n      .transitionEnd(() => this.transitionEnd());\n\n    // 不存在遮罩层元素时,添加遮罩层\n    if (!$overlay) {\n      $overlay = $.showOverlay(5100);\n    }\n\n    // 点击遮罩层时是否关闭对话框\n    if (this.options.modal) {\n      $overlay.off('click', this.overlayClick);\n    } else {\n      $overlay.on('click', this.overlayClick);\n    }\n\n    // 是否显示遮罩层,不显示时,把遮罩层背景透明\n    $overlay.css('opacity', this.options.overlay ? '' : 0);\n\n    if (this.options.history) {\n      // 如果 hash 中原来就有 mdui-dialog,先删除,避免后退历史纪录后仍然有 mdui-dialog 导致无法关闭\n      // 包括 mdui-dialog 和 &mdui-dialog 和 ?mdui-dialog\n      let hash = window.location.hash.substring(1);\n      if (hash.indexOf('mdui-dialog') > -1) {\n        hash = hash.replace(/[&?]?mdui-dialog/g, '');\n      }\n\n      // 后退按钮关闭对话框\n      if (hash) {\n        window.location.hash = `${hash}${\n          hash.indexOf('?') > -1 ? '&' : '?'\n        }mdui-dialog`;\n      } else {\n        window.location.hash = 'mdui-dialog';\n      }\n\n      $window.on('hashchange', this.hashchangeEvent);\n    }\n  }\n\n  /**\n   * 当前对话框是否为打开状态\n   */\n  private isOpen(): boolean {\n    return this.state === 'opening' || this.state === 'opened';\n  }\n\n  /**\n   * 打开对话框\n   */\n  public open(): void {\n    if (this.isOpen()) {\n      return;\n    }\n\n    // 如果当前有正在打开或已经打开的对话框,或队列不为空,则先加入队列,等旧对话框开始关闭时再打开\n    if (\n      (currentInst &&\n        (currentInst.state === 'opening' || currentInst.state === 'opened')) ||\n      queue(queueName).length\n    ) {\n      queue(queueName, () => this.doOpen());\n\n      return;\n    }\n\n    this.doOpen();\n  }\n\n  /**\n   * 关闭对话框\n   */\n  public close(historyBack = false): void {\n    // historyBack 是否需要后退历史纪录,默认为 `false`。该参数仅内部使用\n    // 为 `false` 时是通过 js 关闭,需要后退一个历史记录\n    // 为 `true` 时是通过后退按钮关闭,不需要后退历史记录\n\n    // setTimeout 的作用是:\n    // 当同时关闭一个对话框,并打开另一个对话框时,使打开对话框的操作先执行,以使需要打开的对话框先加入队列\n    setTimeout(() => {\n      if (!this.isOpen()) {\n        return;\n      }\n\n      currentInst = null;\n\n      this.state = 'closing';\n      this.triggerEvent('close');\n\n      // 所有对话框都关闭,且当前没有打开的对话框时,隐藏遮罩\n      if (!queue(queueName).length && $overlay) {\n        $.hideOverlay();\n        $overlay = null;\n\n        // 若仍存在遮罩,恢复遮罩的 z-index\n        $('.mdui-overlay').css('z-index', 2000);\n      }\n\n      this.$element\n        .removeClass('mdui-dialog-open')\n        .transitionEnd(() => this.transitionEnd());\n\n      if (this.options.history && !queue(queueName).length) {\n        if (!historyBack) {\n          window.history.back();\n        }\n\n        $window.off('hashchange', this.hashchangeEvent);\n      }\n\n      // 关闭旧对话框,打开新对话框。\n      // 加一点延迟,仅仅为了视觉效果更好。不加延时也不影响功能\n      setTimeout(() => {\n        dequeue(queueName);\n      }, 100);\n    });\n  }\n\n  /**\n   * 切换对话框打开/关闭状态\n   */\n  public toggle(): void {\n    this.isOpen() ? this.close() : this.open();\n  }\n\n  /**\n   * 获取对话框状态。共包含四种状态:`opening`、`opened`、`closing`、`closed`\n   */\n  public getState(): STATE {\n    return this.state;\n  }\n\n  /**\n   * 销毁对话框\n   */\n  public destroy(): void {\n    if (this.append) {\n      this.$element.remove();\n    }\n\n    if (!queue(queueName).length && !currentInst) {\n      if ($overlay) {\n        $.hideOverlay();\n        $overlay = null;\n      }\n\n      if (isLockScreen) {\n        $.unlockScreen();\n        isLockScreen = false;\n      }\n    }\n  }\n\n  /**\n   * 对话框内容变化时,需要调用该方法来调整对话框位置和滚动条高度\n   */\n  public handleUpdate(): void {\n    this.readjust();\n  }\n}\n\nexport { currentInst, OPTIONS, Dialog };\n","import Selector from 'mdui.jq/es/types/Selector';\nimport mdui from '../../mdui';\nimport 'mdui.jq/es/methods/on';\nimport { $document } from '../../utils/dom';\nimport { currentInst, OPTIONS, Dialog } from './class';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * Dialog 组件\n     *\n     * 请通过 `new mdui.Dialog()` 调用\n     */\n    Dialog: {\n      /**\n       * 实例化 Dialog 组件\n       * @param selector CSS 选择器、或 DOM 元素、或 JQ 对象\n       * @param options 配置参数\n       */\n      new (\n        selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n        options?: OPTIONS,\n      ): Dialog;\n    };\n  }\n}\n\n// esc 按下时关闭对话框\n$document.on('keydown', (event: Event) => {\n  if (\n    currentInst &&\n    currentInst.options.closeOnEsc &&\n    currentInst.state === 'opened' &&\n    (event as KeyboardEvent).keyCode === 27\n  ) {\n    currentInst.close();\n  }\n});\n\nmdui.Dialog = Dialog;\n","import $ from 'mdui.jq/es/$';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/on';\nimport mdui from '../../mdui';\nimport { $document } from '../../utils/dom';\nimport { parseOptions } from '../../utils/parseOptions';\nimport './index';\n\nconst customAttr = 'mdui-dialog';\nconst dataName = '_mdui_dialog';\n\ntype OPTIONS = {\n  target: string;\n  history?: boolean;\n  overlay?: boolean;\n  modal?: boolean;\n  closeOnEsc?: boolean;\n  closeOnCancel?: boolean;\n  closeOnConfirm?: boolean;\n  destroyOnClosed?: boolean;\n};\n\n$(() => {\n  $document.on('click', `[${customAttr}]`, function () {\n    const options = parseOptions(this as HTMLElement, customAttr) as OPTIONS;\n    const selector = options.target;\n    // @ts-ignore\n    delete options.target;\n\n    const $dialog = $(selector).first();\n    let instance = $dialog.data(dataName);\n\n    if (!instance) {\n      instance = new mdui.Dialog($dialog, options);\n      $dialog.data(dataName, instance);\n    }\n\n    instance.open();\n  });\n});\n","import $ from 'mdui.jq/es/$';\nimport each from 'mdui.jq/es/functions/each';\nimport extend from 'mdui.jq/es/functions/extend';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/on';\nimport mdui from '../../mdui';\nimport { Dialog } from './class';\nimport './index';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 打开一个对话框,标题、内容、按钮等都可以自定义\n     * @param options 配置参数\n     */\n    dialog(options: OPTIONS): Dialog;\n  }\n}\n\ntype BUTTON = {\n  /**\n   * 按钮文本\n   */\n  text?: string;\n\n  /**\n   * 按钮文本是否加粗,默认为 `false`\n   */\n  bold?: boolean;\n\n  /**\n   * 点击按钮后是否关闭对话框,默认为 `true`\n   */\n  close?: boolean;\n\n  /**\n   * 点击按钮的回调函数,参数为对话框的实例\n   */\n  onClick?: (dialog: Dialog) => void;\n};\n\ntype OPTIONS = {\n  /**\n   * 对话框的标题\n   */\n  title?: string;\n\n  /**\n   * 对话框的内容\n   */\n  content?: string;\n\n  /**\n   * 按钮数组,每个按钮都是一个带按钮参数的对象\n   */\n  buttons?: BUTTON[];\n\n  /**\n   * 按钮是否垂直排列,默认为 `false`\n   */\n  stackedButtons?: boolean;\n\n  /**\n   * 添加到 `.mdui-dialog` 上的 CSS 类\n   */\n  cssClass?: string;\n\n  /**\n   * 是否监听 `hashchange` 事件,为 `true` 时可以通过 Android 的返回键或浏览器后退按钮关闭对话框,默认为 `true`\n   */\n  history?: boolean;\n\n  /**\n   * 打开对话框后是否显示遮罩层,默认为 `true`\n   */\n  overlay?: boolean;\n\n  /**\n   * 是否模态化对话框。为 `false` 时点击对话框外面的区域时关闭对话框,否则不关闭\n   */\n  modal?: boolean;\n\n  /**\n   * 按下 Esc 键时是否关闭对话框,默认为 `true`\n   */\n  closeOnEsc?: boolean;\n\n  /**\n   * 关闭对话框后是否自动销毁对话框,默认为 `true`\n   */\n  destroyOnClosed?: boolean;\n\n  /**\n   * 打开动画开始时的回调,参数为对话框实例\n   */\n  onOpen?: (dialog: Dialog) => void;\n\n  /**\n   * 打开动画结束时的回调,参数为对话框实例\n   */\n  onOpened?: (dialog: Dialog) => void;\n\n  /**\n   * 关闭动画开始时的回调,参数为对话框实例\n   */\n  onClose?: (dialog: Dialog) => void;\n\n  /**\n   * 关闭动画结束时的回调,参数为对话框实例\n   */\n  onClosed?: (dialog: Dialog) => void;\n};\n\nconst DEFAULT_BUTTON: BUTTON = {\n  text: '',\n  bold: false,\n  close: true,\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onClick: () => {},\n};\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  title: '',\n  content: '',\n  buttons: [],\n  stackedButtons: false,\n  cssClass: '',\n  history: true,\n  overlay: true,\n  modal: false,\n  closeOnEsc: true,\n  destroyOnClosed: true,\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onOpen: () => {},\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onOpened: () => {},\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onClose: () => {},\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onClosed: () => {},\n};\n\nmdui.dialog = function (options: OPTIONS): Dialog {\n  // 合并配置参数\n  options = extend({}, DEFAULT_OPTIONS, options);\n\n  each(options.buttons!, (i, button) => {\n    options.buttons![i] = extend({}, DEFAULT_BUTTON, button);\n  });\n\n  // 按钮的 HTML\n  let buttonsHTML = '';\n  if (options.buttons?.length) {\n    buttonsHTML = `<div class=\"mdui-dialog-actions${\n      options.stackedButtons ? ' mdui-dialog-actions-stacked' : ''\n    }\">`;\n\n    each(options.buttons, (_, button) => {\n      buttonsHTML +=\n        '<a href=\"javascript:void(0)\" ' +\n        `class=\"mdui-btn mdui-ripple mdui-text-color-primary ${\n          button.bold ? 'mdui-btn-bold' : ''\n        }\">${button.text}</a>`;\n    });\n\n    buttonsHTML += '</div>';\n  }\n\n  // Dialog 的 HTML\n  const HTML =\n    `<div class=\"mdui-dialog ${options.cssClass}\">` +\n    (options.title\n      ? `<div class=\"mdui-dialog-title\">${options.title}</div>`\n      : '') +\n    (options.content\n      ? `<div class=\"mdui-dialog-content\">${options.content}</div>`\n      : '') +\n    buttonsHTML +\n    '</div>';\n\n  // 实例化 Dialog\n  const instance = new mdui.Dialog(HTML, {\n    history: options.history,\n    overlay: options.overlay,\n    modal: options.modal,\n    closeOnEsc: options.closeOnEsc,\n    destroyOnClosed: options.destroyOnClosed,\n  });\n\n  // 绑定按钮事件\n  if (options.buttons?.length) {\n    instance.$element\n      .find('.mdui-dialog-actions .mdui-btn')\n      .each((index, button) => {\n        $(button).on('click', () => {\n          options.buttons![index].onClick!(instance);\n\n          if (options.buttons![index].close) {\n            instance.close();\n          }\n        });\n      });\n  }\n\n  // 绑定打开关闭事件\n  instance.$element\n    .on('open.mdui.dialog', () => {\n      options.onOpen!(instance);\n    })\n    .on('opened.mdui.dialog', () => {\n      options.onOpened!(instance);\n    })\n    .on('close.mdui.dialog', () => {\n      options.onClose!(instance);\n    })\n    .on('closed.mdui.dialog', () => {\n      options.onClosed!(instance);\n    });\n\n  instance.open();\n\n  return instance;\n};\n","import extend from 'mdui.jq/es/functions/extend';\nimport { isFunction, isUndefined } from 'mdui.jq/es/utils';\nimport mdui from '../../mdui';\nimport { Dialog } from './class';\nimport './dialog';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 打开一个警告框,可以包含标题、内容和一个确认按钮\n     * @param text 警告框内容\n     * @param title 警告框标题\n     * @param onConfirm 点击确认按钮的回调函数,参数为对话框实例\n     * @param options 配置参数\n     */\n    alert(\n      text: string,\n      title: string,\n      onConfirm?: (dialog: Dialog) => void,\n      options?: OPTIONS,\n    ): Dialog;\n\n    /**\n     * 打开一个警告框,可以包含内容,和一个确认按钮\n     * @param text 警告框内容\n     * @param onConfirm 点击确认按钮的回调函数,参数为对话框实例\n     * @param options 配置参数\n     */\n    alert(\n      text: string,\n      onConfirm?: (dialog: Dialog) => void,\n      options?: OPTIONS,\n    ): Dialog;\n  }\n}\n\ntype OPTIONS = {\n  /**\n   * 确认按钮的文本\n   */\n  confirmText?: string;\n\n  /**\n   * 是否监听 hashchange 事件,为 `true` 时可以通过 Android 的返回键或浏览器后退按钮关闭对话框,默认为 `true`\n   */\n  history?: boolean;\n\n  /**\n   * 是否模态化对话框。为 `false` 时点击对话框外面的区域时关闭对话框,否则不关闭,默认为 `false`\n   */\n  modal?: boolean;\n\n  /**\n   * 按下 Esc 键时是否关闭对话框,默认为 `true`\n   */\n  closeOnEsc?: boolean;\n\n  /**\n   * 是否在按下确认按钮时是否关闭对话框\n   */\n  closeOnConfirm?: boolean;\n};\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  confirmText: 'ok',\n  history: true,\n  modal: false,\n  closeOnEsc: true,\n  closeOnConfirm: true,\n};\n\nmdui.alert = function (\n  text: string,\n  title?: any,\n  onConfirm?: any,\n  options?: any,\n): Dialog {\n  if (isFunction(title)) {\n    options = onConfirm;\n    onConfirm = title;\n    title = '';\n  }\n\n  if (isUndefined(onConfirm)) {\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    onConfirm = (): void => {};\n  }\n\n  if (isUndefined(options)) {\n    options = {};\n  }\n\n  options = extend({}, DEFAULT_OPTIONS, options);\n\n  return mdui.dialog({\n    title: title,\n    content: text,\n    buttons: [\n      {\n        text: options.confirmText,\n        bold: false,\n        close: options.closeOnConfirm,\n        onClick: onConfirm,\n      },\n    ],\n    cssClass: 'mdui-dialog-alert',\n    history: options.history,\n    modal: options.modal,\n    closeOnEsc: options.closeOnEsc,\n  });\n};\n","import extend from 'mdui.jq/es/functions/extend';\nimport { isFunction, isUndefined } from 'mdui.jq/es/utils';\nimport mdui from '../../mdui';\nimport { Dialog } from './class';\nimport './dialog';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 打开一个确认框,可以包含标题、内容、一个确认按钮和一个取消按钮\n     * @param text 确认框内容\n     * @param title 确认框标题\n     * @param onConfirm 点击确认按钮的回调函数,参数为对话框实例\n     * @param onCancel 点击取消按钮的回调函数,参数为对话框实例\n     * @param options 配置参数\n     */\n    confirm(\n      text: string,\n      title: string,\n      onConfirm?: (dialog: Dialog) => void,\n      onCancel?: (dialog: Dialog) => void,\n      options?: OPTIONS,\n    ): Dialog;\n\n    /**\n     * 打开一个确认框,可以包含内容、一个确认按钮和一个取消按钮\n     * @param text 确认框内容\n     * @param onConfirm 点击确认按钮的回调函数,参数为对话框实例\n     * @param onCancel 点击取消按钮的回调函数,参数为对话框实例\n     * @param options 配置参数\n     */\n    confirm(\n      text: string,\n      onConfirm?: (dialog: Dialog) => void,\n      onCancel?: (dialog: Dialog) => void,\n      options?: OPTIONS,\n    ): Dialog;\n  }\n}\n\ntype OPTIONS = {\n  /**\n   * 确认按钮的文本\n   */\n  confirmText?: string;\n\n  /**\n   * 取消按钮的文本\n   */\n  cancelText?: string;\n\n  /**\n   * 是否监听 hashchange 事件,为 `true` 时可以通过 Android 的返回键或浏览器后退按钮关闭对话框,默认为 `true`\n   */\n  history?: boolean;\n\n  /**\n   * 是否模态化对话框。为 `false` 时点击对话框外面的区域时关闭对话框,否则不关闭,默认为 `false`\n   */\n  modal?: boolean;\n\n  /**\n   * 按下 Esc 键时是否关闭对话框,默认为 `true`\n   */\n  closeOnEsc?: boolean;\n\n  /**\n   * 是否在按下取消按钮时是否关闭对话框\n   */\n  closeOnCancel?: boolean;\n\n  /**\n   * 是否在按下确认按钮时是否关闭对话框\n   */\n  closeOnConfirm?: boolean;\n};\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  confirmText: 'ok',\n  cancelText: 'cancel',\n  history: true,\n  modal: false,\n  closeOnEsc: true,\n  closeOnCancel: true,\n  closeOnConfirm: true,\n};\n\nmdui.confirm = function (\n  text: string,\n  title?: any,\n  onConfirm?: any,\n  onCancel?: any,\n  options?: any,\n): Dialog {\n  if (isFunction(title)) {\n    options = onCancel;\n    onCancel = onConfirm;\n    onConfirm = title;\n    title = '';\n  }\n\n  if (isUndefined(onConfirm)) {\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    onConfirm = (): void => {};\n  }\n\n  if (isUndefined(onCancel)) {\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    onCancel = (): void => {};\n  }\n\n  if (isUndefined(options)) {\n    options = {};\n  }\n\n  options = extend({}, DEFAULT_OPTIONS, options);\n\n  return mdui.dialog({\n    title: title,\n    content: text,\n    buttons: [\n      {\n        text: options.cancelText,\n        bold: false,\n        close: options.closeOnCancel,\n        onClick: onCancel,\n      },\n      {\n        text: options.confirmText,\n        bold: false,\n        close: options.closeOnConfirm,\n        onClick: onConfirm,\n      },\n    ],\n    cssClass: 'mdui-dialog-confirm',\n    history: options.history,\n    modal: options.modal,\n    closeOnEsc: options.closeOnEsc,\n  });\n};\n","import extend from 'mdui.jq/es/functions/extend';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/val';\nimport { isFunction, isUndefined } from 'mdui.jq/es/utils';\nimport mdui from '../../mdui';\nimport '../textfield';\nimport { Dialog } from './class';\nimport './dialog';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 打开一个提示用户输入的对话框,可以包含标题、文本框标签、文本框、一个确认按钮和一个取消按钮\n     * @param label 文本框浮动标签的文本\n     * @param title 标题\n     * @param onConfirm 点击确认按钮的回调。含两个参数,分别为文本框的值和对话框实例\n     * @param onCancel 点击取消按钮的回调。含两个参数,分别为文本框的值和对话框实例\n     * @param options 配置参数\n     */\n    prompt(\n      label: string,\n      title: string,\n      onConfirm?: (value: string, dialog: Dialog) => void,\n      onCancel?: (value: string, dialog: Dialog) => void,\n      options?: OPTIONS,\n    ): Dialog;\n\n    /**\n     * 打开一个提示用户输入的对话框,可以包含文本框标签、文本框、一个确认按钮和一个取消按钮\n     * @param label 文本框浮动标签的文本\n     * @param onConfirm 点击确认按钮的回调。含两个参数,分别为文本框的值和对话框实例\n     * @param onCancel 点击取消按钮的回调,含两个参数,分别为文本框的值和对话框实例\n     * @param options 配置参数\n     */\n    prompt(\n      label: string,\n      onConfirm?: (value: string, dialog: Dialog) => void,\n      onCancel?: (value: string, dialog: Dialog) => void,\n      options?: OPTIONS,\n    ): Dialog;\n  }\n}\n\ntype OPTIONS = {\n  /**\n   * 确认按钮的文本\n   */\n  confirmText?: string;\n\n  /**\n   * 取消按钮的文本\n   */\n  cancelText?: string;\n\n  /**\n   * 是否监听 hashchange 事件,为 `true` 时可以通过 Android 的返回键或浏览器后退按钮关闭对话框,默认为 `true`\n   */\n  history?: boolean;\n\n  /**\n   * 是否模态化对话框。为 `false` 时点击对话框外面的区域时关闭对话框,否则不关闭,默认为 `false`\n   */\n  modal?: boolean;\n\n  /**\n   * 是否在按下 Esc 键时是否关闭对话框,默认为 `true`\n   */\n  closeOnEsc?: boolean;\n\n  /**\n   * 是否在按下取消按钮时是否关闭对话框\n   */\n  closeOnCancel?: boolean;\n\n  /**\n   * 是否在按下确认按钮时是否关闭对话框\n   */\n  closeOnConfirm?: boolean;\n\n  /**\n   * 是否在按下 Enter 键时触发 `onConfirm` 回调函数,默认为 `false`\n   */\n  confirmOnEnter?: boolean;\n\n  /**\n   * 文本框的类型。`text`: 单行文本框; `textarea`: 多行文本框\n   */\n  type?: 'text' | 'textarea';\n\n  /**\n   * 最大输入字符数量,为 0 时表示不限制\n   */\n  maxlength?: number;\n\n  /**\n   * 文本框的默认值\n   */\n  defaultValue?: string;\n};\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  confirmText: 'ok',\n  cancelText: 'cancel',\n  history: true,\n  modal: false,\n  closeOnEsc: true,\n  closeOnCancel: true,\n  closeOnConfirm: true,\n  type: 'text',\n  maxlength: 0,\n  defaultValue: '',\n  confirmOnEnter: false,\n};\n\nmdui.prompt = function (\n  label: string,\n  title?: any,\n  onConfirm?: any,\n  onCancel?: any,\n  options?: any,\n): Dialog {\n  if (isFunction(title)) {\n    options = onCancel;\n    onCancel = onConfirm;\n    onConfirm = title;\n    title = '';\n  }\n\n  if (isUndefined(onConfirm)) {\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    onConfirm = (): void => {};\n  }\n\n  if (isUndefined(onCancel)) {\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    onCancel = (): void => {};\n  }\n\n  if (isUndefined(options)) {\n    options = {};\n  }\n\n  options = extend({}, DEFAULT_OPTIONS, options);\n\n  const content =\n    '<div class=\"mdui-textfield\">' +\n    (label ? `<label class=\"mdui-textfield-label\">${label}</label>` : '') +\n    (options.type === 'text'\n      ? `<input class=\"mdui-textfield-input\" type=\"text\" value=\"${\n          options.defaultValue\n        }\" ${\n          options.maxlength ? 'maxlength=\"' + options.maxlength + '\"' : ''\n        }/>`\n      : '') +\n    (options.type === 'textarea'\n      ? `<textarea class=\"mdui-textfield-input\" ${\n          options.maxlength ? 'maxlength=\"' + options.maxlength + '\"' : ''\n        }>${options.defaultValue}</textarea>`\n      : '') +\n    '</div>';\n\n  const onCancelClick = (dialog: Dialog): void => {\n    const value = dialog.$element.find('.mdui-textfield-input').val();\n    onCancel(value, dialog);\n  };\n\n  const onConfirmClick = (dialog: Dialog): void => {\n    const value = dialog.$element.find('.mdui-textfield-input').val();\n    onConfirm(value, dialog);\n  };\n\n  return mdui.dialog({\n    title,\n    content,\n    buttons: [\n      {\n        text: options.cancelText,\n        bold: false,\n        close: options.closeOnCancel,\n        onClick: onCancelClick,\n      },\n      {\n        text: options.confirmText,\n        bold: false,\n        close: options.closeOnConfirm,\n        onClick: onConfirmClick,\n      },\n    ],\n    cssClass: 'mdui-dialog-prompt',\n    history: options.history,\n    modal: options.modal,\n    closeOnEsc: options.closeOnEsc,\n    onOpen: (dialog) => {\n      // 初始化输入框\n      const $input = dialog.$element.find('.mdui-textfield-input');\n      mdui.updateTextFields($input);\n\n      // 聚焦到输入框\n      $input[0].focus();\n\n      // 捕捉文本框回车键,在单行文本框的情况下触发回调\n      if (options.type !== 'textarea' && options.confirmOnEnter === true) {\n        $input.on('keydown', (event) => {\n          if ((event as KeyboardEvent).keyCode === 13) {\n            const value = dialog.$element.find('.mdui-textfield-input').val();\n            onConfirm(value, dialog);\n\n            if (options.closeOnConfirm) {\n              dialog.close();\n            }\n\n            return false;\n          }\n\n          return;\n        });\n      }\n\n      // 如果是多行输入框,监听输入框的 input 事件,更新对话框高度\n      if (options.type === 'textarea') {\n        $input.on('input', () => dialog.handleUpdate());\n      }\n\n      // 有字符数限制时,加载完文本框后 DOM 会变化,需要更新对话框高度\n      if (options.maxlength) {\n        dialog.handleUpdate();\n      }\n    },\n  });\n};\n","import $ from 'mdui.jq/es/$';\nimport extend from 'mdui.jq/es/functions/extend';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/appendTo';\nimport 'mdui.jq/es/methods/attr';\nimport 'mdui.jq/es/methods/css';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/height';\nimport 'mdui.jq/es/methods/html';\nimport 'mdui.jq/es/methods/offset';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/removeClass';\nimport 'mdui.jq/es/methods/width';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport mdui from '../../mdui';\nimport '../../jq_extends/methods/transformOrigin';\nimport '../../jq_extends/methods/transitionEnd';\nimport '../../jq_extends/static/guid';\nimport { componentEvent } from '../../utils/componentEvent';\nimport { $window } from '../../utils/dom';\nimport { isAllow, register, unlockEvent } from '../../utils/touchHandler';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * Tooltip 组件\n     *\n     * 请通过 `new mdui.Tooltip()` 调用\n     */\n    Tooltip: {\n      /**\n       * 实例化 Tooltip 组件\n       * @param selector CSS 选择器、或 DOM 元素、或 JQ 对象\n       * @param options 配置参数\n       */\n      new (\n        selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n        options?: OPTIONS,\n      ): Tooltip;\n    };\n  }\n}\n\ntype POSITION = 'auto' | 'bottom' | 'top' | 'left' | 'right';\n\ntype OPTIONS = {\n  /**\n   * Tooltip 的位置。取值范围包括 `auto`、`bottom`、`top`、`left`、`right`。\n   * 为 `auto` 时,会自动判断位置。默认在下方。优先级为 `bottom` > `top` > `left` > `right`。\n   * 默认为 `auto`\n   */\n  position?: POSITION;\n\n  /**\n   * 延时触发,单位毫秒。默认为 `0`,即没有延时。\n   */\n  delay?: number;\n\n  /**\n   * Tooltip 的内容\n   */\n  content?: string;\n};\n\ntype STATE = 'opening' | 'opened' | 'closing' | 'closed';\ntype EVENT = 'open' | 'opened' | 'close' | 'closed';\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  position: 'auto',\n  delay: 0,\n  content: '',\n};\n\nclass Tooltip {\n  /**\n   * 触发 tooltip 元素的 JQ 对象\n   */\n  public $target: JQ;\n\n  /**\n   * tooltip 元素的 JQ 对象\n   */\n  public $element: JQ;\n\n  /**\n   * 配置参数\n   */\n  public options: OPTIONS = extend({}, DEFAULT_OPTIONS);\n\n  /**\n   * 当前 tooltip 的状态\n   */\n  private state: STATE = 'closed';\n\n  /**\n   * setTimeout 的返回值\n   */\n  private timeoutId: any = null;\n\n  public constructor(\n    selector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    options: OPTIONS = {},\n  ) {\n    this.$target = $(selector).first();\n\n    extend(this.options, options);\n\n    // 创建 Tooltip HTML\n    this.$element = $(\n      `<div class=\"mdui-tooltip\" id=\"${$.guid()}\">${\n        this.options.content\n      }</div>`,\n    ).appendTo(document.body);\n\n    // 绑定事件。元素处于 disabled 状态时无法触发鼠标事件,为了统一,把 touch 事件也禁用\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const that = this;\n    this.$target\n      .on('touchstart mouseenter', function (event) {\n        if (that.isDisabled(this as HTMLElement)) {\n          return;\n        }\n\n        if (!isAllow(event)) {\n          return;\n        }\n\n        register(event);\n\n        that.open();\n      })\n      .on('touchend mouseleave', function (event) {\n        if (that.isDisabled(this as HTMLElement)) {\n          return;\n        }\n\n        if (!isAllow(event)) {\n          return;\n        }\n\n        that.close();\n      })\n      .on(unlockEvent, function (event) {\n        if (that.isDisabled(this as HTMLElement)) {\n          return;\n        }\n\n        register(event);\n      });\n  }\n\n  /**\n   * 元素是否已禁用\n   * @param element\n   */\n  private isDisabled(element: HTMLElement): boolean {\n    return (\n      (element as HTMLInputElement).disabled ||\n      $(element).attr('disabled') !== undefined\n    );\n  }\n\n  /**\n   * 是否是桌面设备\n   */\n  private isDesktop(): boolean {\n    return $window.width() > 1024;\n  }\n\n  /**\n   * 设置 Tooltip 的位置\n   */\n  private setPosition(): void {\n    let marginLeft: number;\n    let marginTop: number;\n\n    // 触发的元素\n    const targetProps = this.$target[0].getBoundingClientRect();\n\n    // 触发的元素和 Tooltip 之间的距离\n    const targetMargin = this.isDesktop() ? 14 : 24;\n\n    // Tooltip 的宽度和高度\n    const tooltipWidth = this.$element[0].offsetWidth;\n    const tooltipHeight = this.$element[0].offsetHeight;\n\n    // Tooltip 的方向\n    let position: POSITION = this.options.position!;\n\n    // 自动判断位置,加 2px,使 Tooltip 距离窗口边框至少有 2px 的间距\n    if (position === 'auto') {\n      if (\n        targetProps.top +\n          targetProps.height +\n          targetMargin +\n          tooltipHeight +\n          2 <\n        $window.height()\n      ) {\n        position = 'bottom';\n      } else if (targetMargin + tooltipHeight + 2 < targetProps.top) {\n        position = 'top';\n      } else if (targetMargin + tooltipWidth + 2 < targetProps.left) {\n        position = 'left';\n      } else if (\n        targetProps.width + targetMargin + tooltipWidth + 2 <\n        $window.width() - targetProps.left\n      ) {\n        position = 'right';\n      } else {\n        position = 'bottom';\n      }\n    }\n\n    // 设置位置\n    switch (position) {\n      case 'bottom':\n        marginLeft = -1 * (tooltipWidth / 2);\n        marginTop = targetProps.height / 2 + targetMargin;\n        this.$element.transformOrigin('top center');\n        break;\n\n      case 'top':\n        marginLeft = -1 * (tooltipWidth / 2);\n        marginTop =\n          -1 * (tooltipHeight + targetProps.height / 2 + targetMargin);\n        this.$element.transformOrigin('bottom center');\n        break;\n\n      case 'left':\n        marginLeft = -1 * (tooltipWidth + targetProps.width / 2 + targetMargin);\n        marginTop = -1 * (tooltipHeight / 2);\n        this.$element.transformOrigin('center right');\n        break;\n\n      case 'right':\n        marginLeft = targetProps.width / 2 + targetMargin;\n        marginTop = -1 * (tooltipHeight / 2);\n        this.$element.transformOrigin('center left');\n        break;\n    }\n\n    const targetOffset = this.$target.offset();\n\n    this.$element.css({\n      top: `${targetOffset.top + targetProps.height / 2}px`,\n      left: `${targetOffset.left + targetProps.width / 2}px`,\n      'margin-left': `${marginLeft}px`,\n      'margin-top': `${marginTop}px`,\n    });\n  }\n\n  /**\n   * 触发组件事件\n   * @param name\n   */\n  private triggerEvent(name: EVENT): void {\n    componentEvent(name, 'tooltip', this.$target, this);\n  }\n\n  /**\n   * 动画结束回调\n   */\n  private transitionEnd(): void {\n    if (this.$element.hasClass('mdui-tooltip-open')) {\n      this.state = 'opened';\n      this.triggerEvent('opened');\n    } else {\n      this.state = 'closed';\n      this.triggerEvent('closed');\n    }\n  }\n\n  /**\n   * 当前 tooltip 是否为打开状态\n   */\n  private isOpen(): boolean {\n    return this.state === 'opening' || this.state === 'opened';\n  }\n\n  /**\n   * 执行打开 tooltip\n   */\n  private doOpen(): void {\n    this.state = 'opening';\n    this.triggerEvent('open');\n\n    this.$element\n      .addClass('mdui-tooltip-open')\n      .transitionEnd(() => this.transitionEnd());\n  }\n\n  /**\n   * 打开 Tooltip\n   * @param options 允许每次打开时设置不同的参数\n   */\n  public open(options?: OPTIONS): void {\n    if (this.isOpen()) {\n      return;\n    }\n\n    const oldOptions = extend({}, this.options);\n\n    if (options) {\n      extend(this.options, options);\n    }\n\n    // tooltip 的内容有更新\n    if (oldOptions.content !== this.options.content) {\n      this.$element.html(this.options.content);\n    }\n\n    this.setPosition();\n\n    if (this.options.delay) {\n      this.timeoutId = setTimeout(() => this.doOpen(), this.options.delay);\n    } else {\n      this.timeoutId = null;\n      this.doOpen();\n    }\n  }\n\n  /**\n   * 关闭 Tooltip\n   */\n  public close(): void {\n    if (this.timeoutId) {\n      clearTimeout(this.timeoutId);\n      this.timeoutId = null;\n    }\n\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this.state = 'closing';\n    this.triggerEvent('close');\n\n    this.$element\n      .removeClass('mdui-tooltip-open')\n      .transitionEnd(() => this.transitionEnd());\n  }\n\n  /**\n   * 切换 Tooltip 的打开状态\n   */\n  public toggle(): void {\n    this.isOpen() ? this.close() : this.open();\n  }\n\n  /**\n   * 获取 Tooltip 状态。共包含四种状态:`opening`、`opened`、`closing`、`closed`\n   */\n  public getState(): STATE {\n    return this.state;\n  }\n}\n\nmdui.Tooltip = Tooltip;\n","import $ from 'mdui.jq/es/$';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/on';\nimport mdui from '../../mdui';\nimport { $document } from '../../utils/dom';\nimport { parseOptions } from '../../utils/parseOptions';\nimport './index';\n\nconst customAttr = 'mdui-tooltip';\nconst dataName = '_mdui_tooltip';\n\n$(() => {\n  // mouseenter 不能冒泡,所以这里用 mouseover 代替\n  $document.on('touchstart mouseover', `[${customAttr}]`, function () {\n    const $target = $(this);\n    let instance = $target.data(dataName);\n\n    if (!instance) {\n      instance = new mdui.Tooltip(\n        this as HTMLElement,\n        parseOptions(this as HTMLElement, customAttr),\n      );\n      $target.data(dataName, instance);\n    }\n  });\n});\n","import $ from 'mdui.jq/es/$';\nimport extend from 'mdui.jq/es/functions/extend';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/appendTo';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/off';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/parents';\nimport 'mdui.jq/es/methods/remove';\nimport { isString } from 'mdui.jq/es/utils';\nimport mdui from '../../mdui';\nimport '../../jq_extends/methods/reflow';\nimport '../../jq_extends/methods/transform';\nimport '../../jq_extends/methods/transitionEnd';\nimport { $document } from '../../utils/dom';\nimport { dequeue, queue } from '../../utils/queue';\nimport { startEvent } from '../../utils/touchHandler';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 打开一个 Snackbar\n     * @param message Snackbar 的文本\n     * @param options 配置参数\n     */\n    snackbar(message: string, options?: OPTIONS): Snackbar;\n\n    /**\n     * 打开一个 Snackbar\n     * @param options 配置参数\n     */\n    snackbar(options: OPTIONS): Snackbar;\n  }\n}\n\ntype OPTIONS = {\n  /**\n   * Snackbar 的文本。通过 `mdui.snackbar(options)` 调用时,该参数不能为空\n   */\n  message?: string;\n\n  /**\n   * 在用户没有操作时多长时间自动隐藏,单位(毫秒)。为 `0` 时表示不自动关闭,默认为 `4000`\n   */\n  timeout?: number;\n\n  /**\n   * Snackbar 的位置,默认为 `bottom`。\n   * 取值范围包括:\n   *   `bottom`: 下方\n   *   `top`: 上方\n   *   `left-top`: 左上角\n   *   `left-bottom`: 左下角\n   *   `right-top`: 右上角\n   *   `right-bottom`: 右下角\n   */\n  position?:\n    | 'bottom'\n    | 'top'\n    | 'left-top'\n    | 'left-bottom'\n    | 'right-top'\n    | 'right-bottom';\n\n  /**\n   * 按钮的文本\n   */\n  buttonText?: string;\n\n  /**\n   * 按钮的文本颜色,可以是颜色名或颜色值,如 `red`、`#ffffff`、`rgba(255, 255, 255, 0.3)` 等。默认为 `#90CAF9`\n   */\n  buttonColor?: string;\n\n  /**\n   * 点击按钮时是否关闭 Snackbar,默认为 `true`\n   */\n  closeOnButtonClick?: boolean;\n\n  /**\n   * 点击或触摸 Snackbar 以外的区域时是否关闭 Snackbar,默认为 `true`\n   */\n  closeOnOutsideClick?: boolean;\n\n  /**\n   * 在 Snackbar 上点击的回调函数,参数为 Snackbar 的实例\n   */\n  onClick?: (snackbar: Snackbar) => void;\n\n  /**\n   * 点击 Snackbar 上的按钮时的回调函数,参数为 Snackbar 的实例\n   */\n  onButtonClick?: (snackbar: Snackbar) => void;\n\n  /**\n   * Snackbar 开始打开时的回调函数,参数为 Snackbar 的实例\n   */\n  onOpen?: (snackbar: Snackbar) => void;\n\n  /**\n   * Snackbar 打开后的回调函数,参数为 Snackbar 的实例\n   */\n  onOpened?: (snackbar: Snackbar) => void;\n\n  /**\n   * Snackbar 开始关闭时的回调函数,参数为 Snackbar 的实例\n   */\n  onClose?: (snackbar: Snackbar) => void;\n\n  /**\n   * Snackbar 关闭后的回调函数,参数为 Snackbar 的实例\n   */\n  onClosed?: (snackbar: Snackbar) => void;\n};\n\ntype STATE = 'opening' | 'opened' | 'closing' | 'closed';\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  message: '',\n  timeout: 4000,\n  position: 'bottom',\n  buttonText: '',\n  buttonColor: '',\n  closeOnButtonClick: true,\n  closeOnOutsideClick: true,\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onClick: () => {},\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onButtonClick: () => {},\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onOpen: () => {},\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onOpened: () => {},\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onClose: () => {},\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onClosed: () => {},\n};\n\n/**\n * 当前打开着的 Snackbar\n */\nlet currentInst: null | Snackbar = null;\n\n/**\n * 队列名\n */\nconst queueName = '_mdui_snackbar';\n\nclass Snackbar {\n  /**\n   * Snackbar 元素\n   */\n  public $element: JQ;\n  /**\n   * 配置参数\n   */\n  public options: OPTIONS = extend({}, DEFAULT_OPTIONS);\n\n  /**\n   * 当前 Snackbar 的状态\n   */\n  private state: STATE = 'closed';\n\n  /**\n   * setTimeout 的 ID\n   */\n  private timeoutId: any = null;\n\n  public constructor(options: OPTIONS) {\n    extend(this.options, options);\n\n    // 按钮颜色\n    let buttonColorStyle = '';\n    let buttonColorClass = '';\n\n    if (\n      this.options.buttonColor!.indexOf('#') === 0 ||\n      this.options.buttonColor!.indexOf('rgb') === 0\n    ) {\n      buttonColorStyle = `style=\"color:${this.options.buttonColor}\"`;\n    } else if (this.options.buttonColor !== '') {\n      buttonColorClass = `mdui-text-color-${this.options.buttonColor}`;\n    }\n\n    // 添加 HTML\n    this.$element = $(\n      '<div class=\"mdui-snackbar\">' +\n        `<div class=\"mdui-snackbar-text\">${this.options.message}</div>` +\n        (this.options.buttonText\n          ? `<a href=\"javascript:void(0)\" class=\"mdui-snackbar-action mdui-btn mdui-ripple mdui-ripple-white ${buttonColorClass}\" ${buttonColorStyle}>${this.options.buttonText}</a>`\n          : '') +\n        '</div>',\n    ).appendTo(document.body);\n\n    // 设置位置\n    this.setPosition('close');\n\n    this.$element.reflow().addClass(`mdui-snackbar-${this.options.position}`);\n  }\n\n  /**\n   * 点击 Snackbar 外面的区域关闭\n   * @param event\n   */\n  private closeOnOutsideClick(event: Event): void {\n    const $target = $(event.target as HTMLElement);\n\n    if (\n      !$target.hasClass('mdui-snackbar') &&\n      !$target.parents('.mdui-snackbar').length\n    ) {\n      currentInst!.close();\n    }\n  }\n\n  /**\n   * 设置 Snackbar 的位置\n   * @param state\n   */\n  private setPosition(state: 'open' | 'close'): void {\n    const snackbarHeight = this.$element[0].clientHeight;\n    const position = this.options.position;\n\n    let translateX;\n    let translateY;\n\n    // translateX\n    if (position === 'bottom' || position === 'top') {\n      translateX = '-50%';\n    } else {\n      translateX = '0';\n    }\n\n    // translateY\n    if (state === 'open') {\n      translateY = '0';\n    } else {\n      if (position === 'bottom') {\n        translateY = snackbarHeight;\n      }\n\n      if (position === 'top') {\n        translateY = -snackbarHeight;\n      }\n\n      if (position === 'left-top' || position === 'right-top') {\n        translateY = -snackbarHeight - 24;\n      }\n\n      if (position === 'left-bottom' || position === 'right-bottom') {\n        translateY = snackbarHeight + 24;\n      }\n    }\n\n    this.$element.transform(`translate(${translateX},${translateY}px`);\n  }\n\n  /**\n   * 打开 Snackbar\n   */\n  public open(): void {\n    if (this.state === 'opening' || this.state === 'opened') {\n      return;\n    }\n\n    // 如果当前有正在显示的 Snackbar,则先加入队列,等旧 Snackbar 关闭后再打开\n    if (currentInst) {\n      queue(queueName, () => this.open());\n      return;\n    }\n\n    currentInst = this;\n\n    // 开始打开\n    this.state = 'opening';\n    this.options.onOpen!(this);\n\n    this.setPosition('open');\n\n    this.$element.transitionEnd(() => {\n      if (this.state !== 'opening') {\n        return;\n      }\n\n      this.state = 'opened';\n      this.options.onOpened!(this);\n\n      // 有按钮时绑定事件\n      if (this.options.buttonText) {\n        this.$element.find('.mdui-snackbar-action').on('click', () => {\n          this.options.onButtonClick!(this);\n          if (this.options.closeOnButtonClick) {\n            this.close();\n          }\n        });\n      }\n\n      // 点击 snackbar 的事件\n      this.$element.on('click', (event) => {\n        if (!$(event.target as HTMLElement).hasClass('mdui-snackbar-action')) {\n          this.options.onClick!(this);\n        }\n      });\n\n      // 点击 Snackbar 外面的区域关闭\n      if (this.options.closeOnOutsideClick) {\n        $document.on(startEvent, this.closeOnOutsideClick);\n      }\n\n      // 超时后自动关闭\n      if (this.options.timeout) {\n        this.timeoutId = setTimeout(() => this.close(), this.options.timeout);\n      }\n    });\n  }\n\n  /**\n   * 关闭 Snackbar\n   */\n  public close(): void {\n    if (this.state === 'closing' || this.state === 'closed') {\n      return;\n    }\n\n    if (this.timeoutId) {\n      clearTimeout(this.timeoutId);\n    }\n\n    if (this.options.closeOnOutsideClick) {\n      $document.off(startEvent, this.closeOnOutsideClick);\n    }\n\n    this.state = 'closing';\n    this.options.onClose!(this);\n\n    this.setPosition('close');\n\n    this.$element.transitionEnd(() => {\n      if (this.state !== 'closing') {\n        return;\n      }\n\n      currentInst = null;\n      this.state = 'closed';\n      this.options.onClosed!(this);\n      this.$element.remove();\n      dequeue(queueName);\n    });\n  }\n}\n\nmdui.snackbar = function (message: any, options: any = {}): Snackbar {\n  if (isString(message)) {\n    options.message = message;\n  } else {\n    options = message;\n  }\n\n  const instance = new Snackbar(options);\n\n  instance.open();\n\n  return instance;\n};\n","import $ from 'mdui.jq/es/$';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/html';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport { isUndefined } from 'mdui.jq/es/utils';\nimport mdui from '../../mdui';\nimport '../../global/mutation';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * 如果需要修改已有的圆形进度条组件,需要调用该方法来重新初始化组件。\n     *\n     * 若传入了参数,则只重新初始化该参数对应的圆形进度条。若没有传入参数,则重新初始化所有圆形进度条。\n     * @param selector CSS 选择器、或 DOM 元素、或 DOM 元素组成的数组、或 JQ 对象\n     */\n    updateSpinners(\n      selector?: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    ): void;\n  }\n}\n\n/**\n * layer 的 HTML 结构\n * @param index\n */\nfunction layerHTML(index: number | false = false): string {\n  return (\n    `<div class=\"mdui-spinner-layer ${\n      index ? `mdui-spinner-layer-${index}` : ''\n    }\">` +\n    '<div class=\"mdui-spinner-circle-clipper mdui-spinner-left\">' +\n    '<div class=\"mdui-spinner-circle\"></div>' +\n    '</div>' +\n    '<div class=\"mdui-spinner-gap-patch\">' +\n    '<div class=\"mdui-spinner-circle\"></div>' +\n    '</div>' +\n    '<div class=\"mdui-spinner-circle-clipper mdui-spinner-right\">' +\n    '<div class=\"mdui-spinner-circle\"></div>' +\n    '</div>' +\n    '</div>'\n  );\n}\n\n/**\n * 填充 HTML\n * @param spinner\n */\nfunction fillHTML(spinner: HTMLElement): void {\n  const $spinner = $(spinner);\n\n  const layer = $spinner.hasClass('mdui-spinner-colorful')\n    ? layerHTML(1) + layerHTML(2) + layerHTML(3) + layerHTML(4)\n    : layerHTML();\n\n  $spinner.html(layer);\n}\n\n$(() => {\n  // 页面加载完后自动填充 HTML 结构\n  mdui.mutation('.mdui-spinner', function () {\n    fillHTML(this);\n  });\n});\n\nmdui.updateSpinners = function (\n  selector?: Selector | HTMLElement | ArrayLike<HTMLElement>,\n): void {\n  const $elements = isUndefined(selector) ? $('.mdui-spinner') : $(selector);\n\n  $elements.each(function () {\n    fillHTML(this);\n  });\n};\n","import $ from 'mdui.jq/es/$';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/children';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/is';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/parent';\nimport 'mdui.jq/es/methods/removeClass';\nimport mdui from '../../mdui';\nimport '../../global/mutation';\nimport { componentEvent } from '../../utils/componentEvent';\nimport { $document } from '../../utils/dom';\nimport '../headroom';\n\n$(() => {\n  // 切换导航项\n  $document.on('click', '.mdui-bottom-nav>a', function () {\n    const $item = $(this as HTMLElement);\n    const $bottomNav = $item.parent();\n\n    $bottomNav.children('a').each((index, item) => {\n      const isThis = $item.is(item);\n\n      if (isThis) {\n        componentEvent('change', 'bottomNav', $bottomNav[0], undefined, {\n          index,\n        });\n      }\n\n      isThis\n        ? $(item).addClass('mdui-bottom-nav-active')\n        : $(item).removeClass('mdui-bottom-nav-active');\n    });\n  });\n\n  // 滚动时隐藏 mdui-bottom-nav-scroll-hide\n  mdui.mutation('.mdui-bottom-nav-scroll-hide', function () {\n    new mdui.Headroom(this, {\n      pinnedClass: 'mdui-headroom-pinned-down',\n      unpinnedClass: 'mdui-headroom-unpinned-down',\n    });\n  });\n});\n","import $ from 'mdui.jq/es/$';\nimport contains from 'mdui.jq/es/functions/contains';\nimport extend from 'mdui.jq/es/functions/extend';\nimport { JQ } from 'mdui.jq/es/JQ';\nimport 'mdui.jq/es/methods/addClass';\nimport 'mdui.jq/es/methods/attr';\nimport 'mdui.jq/es/methods/children';\nimport 'mdui.jq/es/methods/css';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/each';\nimport 'mdui.jq/es/methods/find';\nimport 'mdui.jq/es/methods/first';\nimport 'mdui.jq/es/methods/hasClass';\nimport 'mdui.jq/es/methods/height';\nimport 'mdui.jq/es/methods/is';\nimport 'mdui.jq/es/methods/on';\nimport 'mdui.jq/es/methods/parent';\nimport 'mdui.jq/es/methods/parents';\nimport 'mdui.jq/es/methods/removeClass';\nimport 'mdui.jq/es/methods/width';\nimport Selector from 'mdui.jq/es/types/Selector';\nimport mdui from '../../mdui';\nimport '../../jq_extends/methods/transformOrigin';\nimport '../../jq_extends/methods/transitionEnd';\nimport '../../jq_extends/static/throttle';\nimport { componentEvent } from '../../utils/componentEvent';\nimport { $document, $window } from '../../utils/dom';\n\ndeclare module '../../interfaces/MduiStatic' {\n  interface MduiStatic {\n    /**\n     * Menu 组件\n     *\n     * 请通过 `new mdui.Menu()` 调用\n     */\n    Menu: {\n      /**\n       * 实例化 Menu 组件\n       * @param anchorSelector 触发菜单的元素的 CSS 选择器、或 DOM 元素、或 JQ 对象\n       * @param menuSelector 菜单的 CSS 选择器、或 DOM 元素、或 JQ 对象\n       * @param options 配置参数\n       */\n      new (\n        anchorSelector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n        menuSelector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n        options?: OPTIONS,\n      ): Menu;\n    };\n  }\n}\n\ntype OPTIONS = {\n  /**\n   * 菜单相对于触发它的元素的位置,默认为 `auto`。\n   * 取值范围包括:\n   *   `top`: 菜单在触发它的元素的上方\n   *   `bottom`: 菜单在触发它的元素的下方\n   *   `center`: 菜单在窗口中垂直居中\n   *   `auto`: 自动判断位置。优先级为:`bottom` > `top` > `center`\n   */\n  position?: 'auto' | 'top' | 'bottom' | 'center';\n\n  /**\n   * 菜单与触发它的元素的对其方式,默认为 `auto`。\n   * 取值范围包括:\n   *   `left`: 菜单与触发它的元素左对齐\n   *   `right`: 菜单与触发它的元素右对齐\n   *   `center`: 菜单在窗口中水平居中\n   *   `auto`: 自动判断位置:优先级为:`left` > `right` > `center`\n   */\n  align?: 'auto' | 'left' | 'right' | 'center';\n\n  /**\n   * 菜单与窗口边框至少保持多少间距,单位为 px,默认为 `16`\n   */\n  gutter?: number;\n\n  /**\n   * 菜单的定位方式,默认为 `false`。\n   * 为 `true` 时,菜单使用 fixed 定位。在页面滚动时,菜单将保持在窗口固定位置,不随滚动条滚动。\n   * 为 `false` 时,菜单使用 absolute 定位。在页面滚动时,菜单将随着页面一起滚动。\n   */\n  fixed?: boolean;\n\n  /**\n   * 菜单是否覆盖在触发它的元素的上面,默认为 `auto`\n   * 为 `true` 时,使菜单覆盖在触发它的元素的上面\n   * 为 `false` 时,使菜单不覆盖触发它的元素\n   * 为 `auto` 时,简单菜单覆盖触发它的元素。级联菜单不覆盖触发它的元素\n   */\n  covered?: boolean | 'auto';\n\n  /**\n   * 子菜单的触发方式,默认为 `hover`\n   * 为 `click` 时,点击时触发子菜单\n   * 为 `hover` 时,鼠标悬浮时触发子菜单\n   */\n  subMenuTrigger?: 'click' | 'hover';\n\n  /**\n   * 子菜单的触发延迟时间(单位:毫秒),只有在 `subMenuTrigger: hover` 时,这个参数才有效,默认为 `200`\n   */\n  subMenuDelay?: number;\n};\n\ntype EVENT = 'open' | 'opened' | 'close' | 'closed';\ntype STATE = 'opening' | 'opened' | 'closing' | 'closed';\n\nconst DEFAULT_OPTIONS: OPTIONS = {\n  position: 'auto',\n  align: 'auto',\n  gutter: 16,\n  fixed: false,\n  covered: 'auto',\n  subMenuTrigger: 'hover',\n  subMenuDelay: 200,\n};\n\nclass Menu {\n  /**\n   * 触发菜单的元素的 JQ 对象\n   */\n  public $anchor: JQ;\n\n  /**\n   * 菜单元素的 JQ 对象\n   */\n  public $element: JQ;\n\n  /**\n   * 配置参数\n   */\n  public options: OPTIONS = extend({}, DEFAULT_OPTIONS);\n\n  /**\n   * 当前菜单状态\n   */\n  private state: STATE = 'closed';\n\n  /**\n   * 是否是级联菜单\n   */\n  private isCascade: boolean;\n\n  /**\n   * 菜单是否覆盖在触发它的元素的上面\n   */\n  private isCovered: boolean;\n\n  public constructor(\n    anchorSelector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    menuSelector: Selector | HTMLElement | ArrayLike<HTMLElement>,\n    options: OPTIONS = {},\n  ) {\n    this.$anchor = $(anchorSelector).first();\n    this.$element = $(menuSelector).first();\n\n    // 触发菜单的元素 和 菜单必须是同级的元素,否则菜单可能不能定位\n    if (!this.$anchor.parent().is(this.$element.parent())) {\n      throw new Error('anchorSelector and menuSelector must be siblings');\n    }\n\n    extend(this.options, options);\n\n    // 是否是级联菜单\n    this.isCascade = this.$element.hasClass('mdui-menu-cascade');\n\n    // covered 参数处理\n    this.isCovered =\n      this.options.covered === 'auto' ? !this.isCascade : this.options.covered!;\n\n    // 点击触发菜单切换\n    this.$anchor.on('click', () => this.toggle());\n\n    // 点击菜单外面区域关闭菜单\n    $document.on('click touchstart', (event: Event) => {\n      const $target = $(event.target as HTMLElement);\n\n      if (\n        this.isOpen() &&\n        !$target.is(this.$element) &&\n        !contains(this.$element[0], $target[0]) &&\n        !$target.is(this.$anchor) &&\n        !contains(this.$anchor[0], $target[0])\n      ) {\n        this.close();\n      }\n    });\n\n    // 点击不含子菜单的菜单条目关闭菜单\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const that = this;\n    $document.on('click', '.mdui-menu-item', function () {\n      const $item = $(this);\n\n      if (\n        !$item.find('.mdui-menu').length &&\n        $item.attr('disabled') === undefined\n      ) {\n        that.close();\n      }\n    });\n\n    // 绑定点击或鼠标移入含子菜单的条目的事件\n    this.bindSubMenuEvent();\n\n    // 窗口大小变化时,重新调整菜单位置\n    $window.on(\n      'resize',\n      $.throttle(() => this.readjust(), 100),\n    );\n  }\n\n  /**\n   * 是否为打开状态\n   */\n  private isOpen(): boolean {\n    return this.state === 'opening' || this.state === 'opened';\n  }\n\n  /**\n   * 触发组件事件\n   * @param name\n   */\n  private triggerEvent(name: EVENT): void {\n    componentEvent(name, 'menu', this.$element, this);\n  }\n\n  /**\n   * 调整主菜单位置\n   */\n  private readjust(): void {\n    let menuLeft;\n    let menuTop;\n\n    // 菜单位置和方向\n    let position: 'bottom' | 'top' | 'center';\n    let align: 'left' | 'right' | 'center';\n\n    // window 窗口的宽度和高度\n    const windowHeight = $window.height();\n    const windowWidth = $window.width();\n\n    // 配置参数\n    const gutter = this.options.gutter!;\n    const isCovered = this.isCovered;\n    const isFixed = this.options.fixed;\n\n    // 动画方向参数\n    let transformOriginX;\n    let transformOriginY;\n\n    // 菜单的原始宽度和高度\n    const menuWidth = this.$element.width();\n    const menuHeight = this.$element.height();\n\n    // 触发菜单的元素在窗口中的位置\n    const anchorRect = this.$anchor[0].getBoundingClientRect();\n    const anchorTop = anchorRect.top;\n    const anchorLeft = anchorRect.left;\n    const anchorHeight = anchorRect.height;\n    const anchorWidth = anchorRect.width;\n    const anchorBottom = windowHeight - anchorTop - anchorHeight;\n    const anchorRight = windowWidth - anchorLeft - anchorWidth;\n\n    // 触发元素相对其拥有定位属性的父元素的位置\n    const anchorOffsetTop = this.$anchor[0].offsetTop;\n    const anchorOffsetLeft = this.$anchor[0].offsetLeft;\n\n    // 自动判断菜单位置\n    if (this.options.position === 'auto') {\n      if (anchorBottom + (isCovered ? anchorHeight : 0) > menuHeight + gutter) {\n        // 判断下方是否放得下菜单\n        position = 'bottom';\n      } else if (\n        anchorTop + (isCovered ? anchorHeight : 0) >\n        menuHeight + gutter\n      ) {\n        // 判断上方是否放得下菜单\n        position = 'top';\n      } else {\n        // 上下都放不下,居中显示\n        position = 'center';\n      }\n    } else {\n      position = this.options.position!;\n    }\n\n    // 自动判断菜单对齐方式\n    if (this.options.align === 'auto') {\n      if (anchorRight + anchorWidth > menuWidth + gutter) {\n        // 判断右侧是否放得下菜单\n        align = 'left';\n      } else if (anchorLeft + anchorWidth > menuWidth + gutter) {\n        // 判断左侧是否放得下菜单\n        align = 'right';\n      } else {\n        // 左右都放不下,居中显示\n        align = 'center';\n      }\n    } else {\n      align = this.options.align!;\n    }\n\n    // 设置菜单位置\n    if (position === 'bottom') {\n      transformOriginY = '0';\n      menuTop =\n        (isCovered ? 0 : anchorHeight) +\n        (isFixed ? anchorTop : anchorOffsetTop);\n    } else if (position === 'top') {\n      transformOriginY = '100%';\n      menuTop =\n        (isCovered ? anchorHeight : 0) +\n        (isFixed ? anchorTop - menuHeight : anchorOffsetTop - menuHeight);\n    } else {\n      transformOriginY = '50%';\n\n      // =====================在窗口中居中\n      // 显示的菜单的高度,简单菜单高度不超过窗口高度,若超过了则在菜单内部显示滚动条\n      // 级联菜单内部不允许出现滚动条\n      let menuHeightTemp = menuHeight;\n\n      // 简单菜单比窗口高时,限制菜单高度\n      if (!this.isCascade) {\n        if (menuHeight + gutter * 2 > windowHeight) {\n          menuHeightTemp = windowHeight - gutter * 2;\n          this.$element.height(menuHeightTemp);\n        }\n      }\n\n      menuTop =\n        (windowHeight - menuHeightTemp) / 2 +\n        (isFixed ? 0 : anchorOffsetTop - anchorTop);\n    }\n\n    this.$element.css('top', `${menuTop}px`);\n\n    // 设置菜单对齐方式\n    if (align === 'left') {\n      transformOriginX = '0';\n      menuLeft = isFixed ? anchorLeft : anchorOffsetLeft;\n    } else if (align === 'right') {\n      transformOriginX = '100%';\n      menuLeft = isFixed\n        ? anchorLeft + anchorWidth - menuWidth\n        : anchorOffsetLeft + anchorWidth - menuWidth;\n    } else {\n      transformOriginX = '50%';\n\n      //=======================在窗口中居中\n      // 显示的菜单的宽度,菜单宽度不能超过窗口宽度\n      let menuWidthTemp = menuWidth;\n\n      // 菜单比窗口宽,限制菜单宽度\n      if (menuWidth + gutter * 2 > windowWidth) {\n        menuWidthTemp = windowWidth - gutter * 2;\n        this.$element.width(menuWidthTemp);\n      }\n\n      menuLeft =\n        (windowWidth - menuWidthTemp) / 2 +\n        (isFixed ? 0 : anchorOffsetLeft - anchorLeft);\n    }\n\n    this.$element.css('left', `${menuLeft}px`);\n\n    // 设置菜单动画方向\n    this.$element.transformOrigin(`${transformOriginX} ${transformOriginY}`);\n  }\n\n  /**\n   * 调整子菜单的位置\n   * @param $submenu\n   */\n  private readjustSubmenu($submenu: JQ): void {\n    const $item = $submenu.parent('.mdui-menu-item');\n\n    let submenuTop;\n    let submenuLeft;\n\n    // 子菜单位置和方向\n    let position: 'top' | 'bottom';\n    let align: 'left' | 'right';\n\n    // window 窗口的宽度和高度\n    const windowHeight = $window.height();\n    const windowWidth = $window.width();\n\n    // 动画方向参数\n    let transformOriginX;\n    let transformOriginY;\n\n    // 子菜单的原始宽度和高度\n    const submenuWidth = $submenu.width();\n    const submenuHeight = $submenu.height();\n\n    // 触发子菜单的菜单项的宽度高度\n    const itemRect = $item[0].getBoundingClientRect();\n    const itemWidth = itemRect.width;\n    const itemHeight = itemRect.height;\n    const itemLeft = itemRect.left;\n    const itemTop = itemRect.top;\n\n    // 判断菜单上下位置\n    if (windowHeight - itemTop > submenuHeight) {\n      // 判断下方是否放得下菜单\n      position = 'bottom';\n    } else if (itemTop + itemHeight > submenuHeight) {\n      // 判断上方是否放得下菜单\n      position = 'top';\n    } else {\n      // 默认放在下方\n      position = 'bottom';\n    }\n\n    // 判断菜单左右位置\n    if (windowWidth - itemLeft - itemWidth > submenuWidth) {\n      // 判断右侧是否放得下菜单\n      align = 'left';\n    } else if (itemLeft > submenuWidth) {\n      // 判断左侧是否放得下菜单\n      align = 'right';\n    } else {\n      // 默认放在右侧\n      align = 'left';\n    }\n\n    // 设置菜单位置\n    if (position === 'bottom') {\n      transformOriginY = '0';\n      submenuTop = '0';\n    } else if (position === 'top') {\n      transformOriginY = '100%';\n      submenuTop = -submenuHeight + itemHeight;\n    }\n\n    $submenu.css('top', `${submenuTop}px`);\n\n    // 设置菜单对齐方式\n    if (align === 'left') {\n      transformOriginX = '0';\n      submenuLeft = itemWidth;\n    } else if (align === 'right') {\n      transformOriginX = '100%';\n      submenuLeft = -submenuWidth;\n    }\n\n    $submenu.css('left', `${submenuLeft}px`);\n\n    // 设置菜单动画方向\n    $submenu.transformOrigin(`${transformOriginX} ${transformOriginY}`);\n  }\n\n  /**\n   * 打开子菜单\n   * @param $submenu\n   */\n  private openSubMenu($submenu: JQ): void {\n    this.readjustSubmenu($submenu);\n\n    $submenu\n      .addClass('mdui-menu-open')\n      .parent('.mdui-menu-item')\n      .addClass('mdui-menu-item-active');\n  }\n\n  /**\n   * 关闭子菜单,及其嵌套的子菜单\n   * @param $submenu\n   */\n  private closeSubMenu($submenu: JQ): void {\n    // 关闭子菜单\n    $submenu\n      .removeClass('mdui-menu-open')\n      .addClass('mdui-menu-closing')\n      .transitionEnd(() => $submenu.removeClass('mdui-menu-closing'))\n\n      // 移除激活状态的样式\n      .parent('.mdui-menu-item')\n      .removeClass('mdui-menu-item-active');\n\n    // 循环关闭嵌套的子菜单\n    $submenu.find('.mdui-menu').each((_, menu) => {\n      const $subSubmenu = $(menu);\n\n      $subSubmenu\n        .removeClass('mdui-menu-open')\n        .addClass('mdui-menu-closing')\n        .transitionEnd(() => $subSubmenu.removeClass('mdui-menu-closing'))\n        .parent('.mdui-menu-item')\n        .removeClass('mdui-menu-item-active');\n    });\n  }\n\n  /**\n   * 切换子菜单状态\n   * @param $submenu\n   */\n  private toggleSubMenu($submenu: JQ): void {\n    $submenu.hasClass('mdui-menu-open')\n      ? this.closeSubMenu($submenu)\n      : this.openSubMenu($submenu);\n  }\n\n  /**\n   * 绑定子菜单事件\n   */\n  private bindSubMenuEvent(): void {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const that = this;\n\n    // 点击打开子菜单\n    this.$element.on('click', '.mdui-menu-item', function (event) {\n      const $item = $(this as HTMLElement);\n      const $target = $(event.target as HTMLElement);\n\n      // 禁用状态菜单不操作\n      if ($item.attr('disabled') !== undefined) {\n        return;\n      }\n\n      // 没有点击在子菜单的菜单项上时,不操作(点在了子菜单的空白区域、或分隔线上)\n      if ($target.is('.mdui-menu') || $target.is('.mdui-divider')) {\n        return;\n      }\n\n      // 阻止冒泡,点击菜单项时只在最后一级的 mdui-menu-item 上生效,不向上冒泡\n      if (!$target.parents('.mdui-menu-item').first().is($item)) {\n        return;\n      }\n\n      // 当前菜单的子菜单\n      const $submenu = $item.children('.mdui-menu');\n\n      // 先关闭除当前子菜单外的所有同级子菜单\n      $item\n        .parent('.mdui-menu')\n        .children('.mdui-menu-item')\n        .each((_, item) => {\n          const $tmpSubmenu = $(item).children('.mdui-menu');\n\n          if (\n            $tmpSubmenu.length &&\n            (!$submenu.length || !$tmpSubmenu.is($submenu))\n          ) {\n            that.closeSubMenu($tmpSubmenu);\n          }\n        });\n\n      // 切换当前子菜单\n      if ($submenu.length) {\n        that.toggleSubMenu($submenu);\n      }\n    });\n\n    if (this.options.subMenuTrigger === 'hover') {\n      // 临时存储 setTimeout 对象\n      let timeout: any = null;\n      let timeoutOpen: any = null;\n\n      this.$element.on('mouseover mouseout', '.mdui-menu-item', function (\n        event,\n      ) {\n        const $item = $(this as HTMLElement);\n        const eventType = event.type;\n        const $relatedTarget = $(\n          (event as MouseEvent).relatedTarget as HTMLElement,\n        );\n\n        // 禁用状态的菜单不操作\n        if ($item.attr('disabled') !== undefined) {\n          return;\n        }\n\n        // 用 mouseover 模拟 mouseenter\n        if (eventType === 'mouseover') {\n          if (\n            !$item.is($relatedTarget) &&\n            contains($item[0], $relatedTarget[0])\n          ) {\n            return;\n          }\n        }\n\n        // 用 mouseout 模拟 mouseleave\n        else if (eventType === 'mouseout') {\n          if (\n            $item.is($relatedTarget) ||\n            contains($item[0], $relatedTarget[0])\n          ) {\n            return;\n          }\n        }\n\n        // 当前菜单项下的子菜单,未必存在\n        const $submenu = $item.children('.mdui-menu');\n\n        // 鼠标移入菜单项时,显示菜单项下的子菜单\n        if (eventType === 'mouseover') {\n          if ($submenu.length) {\n            // 当前子菜单准备打开时,如果当前子菜单正准备着关闭,不用再关闭了\n            const tmpClose = $submenu.data('timeoutClose.mdui.menu');\n            if (tmpClose) {\n              clearTimeout(tmpClose);\n            }\n\n            // 如果当前子菜单已经打开,不操作\n            if ($submenu.hasClass('mdui-menu-open')) {\n              return;\n            }\n\n            // 当前子菜单准备打开时,其他准备打开的子菜单不用再打开了\n            clearTimeout(timeoutOpen);\n\n            // 准备打开当前子菜单\n            timeout = timeoutOpen = setTimeout(\n              () => that.openSubMenu($submenu),\n              that.options.subMenuDelay,\n            );\n\n            $submenu.data('timeoutOpen.mdui.menu', timeout);\n          }\n        }\n\n        // 鼠标移出菜单项时,关闭菜单项下的子菜单\n        else if (eventType === 'mouseout') {\n          if ($submenu.length) {\n            // 鼠标移出菜单项时,如果当前菜单项下的子菜单正准备打开,不用再打开了\n            const tmpOpen = $submenu.data('timeoutOpen.mdui.menu');\n            if (tmpOpen) {\n              clearTimeout(tmpOpen);\n            }\n\n            // 准备关闭当前子菜单\n            timeout = setTimeout(\n              () => that.closeSubMenu($submenu),\n              that.options.subMenuDelay,\n            );\n\n            $submenu.data('timeoutClose.mdui.menu', timeout);\n          }\n        }\n      });\n    }\n  }\n\n  /**\n   * 动画结束回调\n   */\n  private transitionEnd(): void {\n    this.$element.removeClass('mdui-menu-closing');\n\n    if (this.state === 'opening') {\n      this.state = 'opened';\n      this.triggerEvent('opened');\n    }\n\n    if (this.state === 'closing') {\n      this.state = 'closed';\n      this.triggerEvent('closed');\n\n      // 关闭后,恢复菜单样式到默认状态,并恢复 fixed 定位\n      this.$element.css({\n        top: '',\n        left: '',\n        width: '',\n        position: 'fixed',\n      });\n    }\n  }\n\n  /**\n   * 切换菜单状态\n   */\n  public toggle(): void {\n    this.isOpen() ? this.close() : this.open();\n  }\n\n  /**\n   * 打开菜单\n   */\n  public open(): void {\n    if (this.isOpen()) {\n      return;\n    }\n\n    this.state = 'opening';\n    this.triggerEvent('open');\n\n    this.readjust();\n\n    this.$element\n      // 菜单隐藏状态使用使用 fixed 定位。\n      .css('position', this.options.fixed ? 'fixed' : 'absolute')\n      .addClass('mdui-menu-open')\n      .transitionEnd(() => this.transitionEnd());\n  }\n\n  /**\n   * 关闭菜单\n   */\n  public close(): void {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this.state = 'closing';\n    this.triggerEvent('close');\n\n    // 菜单开始关闭时,关闭所有子菜单\n    this.$element.find('.mdui-menu').each((_, submenu) => {\n      this.closeSubMenu($(submenu));\n    });\n\n    this.$element\n      .removeClass('mdui-menu-open')\n      .addClass('mdui-menu-closing')\n      .transitionEnd(() => this.transitionEnd());\n  }\n}\n\nmdui.Menu = Menu;\n","import $ from 'mdui.jq/es/$';\nimport 'mdui.jq/es/methods/data';\nimport 'mdui.jq/es/methods/on';\nimport mdui from '../../mdui';\nimport { $document } from '../../utils/dom';\nimport { parseOptions } from '../../utils/parseOptions';\nimport './index';\n\nconst customAttr = 'mdui-menu';\nconst dataName = '_mdui_menu';\n\ntype OPTIONS = {\n  target: string;\n  position?: 'auto' | 'top' | 'bottom' | 'center';\n  align?: 'auto' | 'left' | 'right' | 'center';\n  gutter?: number;\n  fixed?: boolean;\n  covered?: boolean | 'auto';\n  subMenuTrigger?: 'click' | 'hover';\n  subMenuDelay?: number;\n};\n\n$(() => {\n  $document.on('click', `[${customAttr}]`, function () {\n    const $this = $(this as HTMLElement);\n    let instance = $this.data(dataName);\n\n    if (!instance) {\n      const options = parseOptions(this as HTMLElement, customAttr) as OPTIONS;\n      const menuSelector = options.target;\n      // @ts-ignore\n      delete options.target;\n\n      instance = new mdui.Menu($this, menuSelector, options);\n      $this.data(dataName, instance);\n\n      instance.toggle();\n    }\n  });\n});\n"],"names":["t","e","bubbles","cancelable","detail","n","document","createEvent","initCustomEvent","finallyConstructor","callback","constructor","this","then","value","resolve","reason","reject","allSettled","arr","length","TypeError","args","Array","prototype","slice","call","remaining","res","i","val","status","MouseEvent","initMouseEvent","window","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","Event","CustomEvent","setTimeoutFunc","setTimeout","isArray","x","Boolean","noop","Promise","fn","_state","_handled","_value","undefined","_deferreds","doResolve","handle","self","deferred","_immediateFn","cb","onFulfilled","onRejected","ret","promise","push","newValue","finale","thisArg","apply","arguments","_unhandledRejectionFn","len","Handler","done","ex","prom","promiseFinally","all","race","setImmediate","err","console","warn","globalNS","global","Error","isFunction","target","isString","isNumber","isUndefined","isNull","isWindow","Window","isDocument","Document","isElement","Element","isArrayLike","isObjectLike","toElement","documentElement","toCamelCase","string","replace","_","letter","toUpperCase","toKebabCase","replacer","toLowerCase","getComputedStyleValue","element","name","getComputedStyle","getPropertyValue","isBorderBox","getExtraWidth","direction","extra","const","position","reduce","prev","index","let","prop","parseFloat","getStyle","valueNumber","getBoundingClientRect","getChildNodesArray","parent","tempParent","createElement","innerHTML","childNodes","returnFalse","cssNumber","each","keys","Object","JQ","item","$","selector","test","readyState","body","addEventListener","html","trim","toCreate","li","tr","td","th","tbody","option","childTag","parentTag","indexOf","match","querySelectorAll","getElementById","Node","addClass","mdui","contains","container","merge","first","second","get","find","foundElements","handlers","mduiElementId","getElementId","key","parse","type","parts","split","ns","sort","join","matcherFor","RegExp","remove","types","func","removeEvent","handler","handlersInElement","id","removeEventListener","proxy","forEach","event","filter","extend","object1","objectN","unshift","object","param","obj","destructure","keyTmp","v","encodeURIComponent","trigger","extraParameters","eventObject","eventParams","isMouseEvent","_detail","_ns","dispatchEvent","globalOptions","ajaxEvents","ajaxStart","ajaxSuccess","ajaxError","ajaxComplete","isQueryStringData","method","appendQuery","url","query","ajax","options","defaults","textStatus","isCanceled","mergedOptions","data","processData","async","cache","username","password","headers","xhrFields","statusCode","dataType","contentType","timeout","location","toString","params","result1","result2","ArrayBuffer","Blob","FormData","Date","now","xhrTimeout","xhr","XMLHttpRequest","open","setRequestHeader","$2","host","onload","clearTimeout","responseData","isHttpStatusSuccess","JSON","responseText","responseType","response","onerror","statusText","onabort","abort","send","ajaxSetup","dataNS","setObjectToElement","map","elements","concat","removeData","nameItem","unique","result","dir","$elements","nameIndex","node","is","shift","add","className","getAttribute","cls","classList","setAttribute","$element","reverse","$target","parentNode","newItem","cloneNode","existingItem","nextSibling","insertBefore","off","on","one","_this","origCallback","elementId","useCapture","proxyFn","callFn","elem","preventDefault","stopPropagation","_data","eventName","clone","isMatched","matches","msMatchesSelector","$compareWith","compare","removeChild","childLength","child","appendChild","contents","content","extraChilds","$result","k","removeAttribute","style","set","children","__","childNode","eq","closest","matched","parents","rbrace","dataAttr","nodeType","handleExtraWidth","funcIndex","includeMargin","multiply","getExtraWidthValue","documentMode","clientProp","scrollProp","offsetProp","innerProp","doc","Math","max","floatStyle","css","getClientRects","top","left","rect","win","ownerDocument","defaultView","pageYOffset","pageXOffset","resultData","attrs","attributes","empty","$selector","has","$targets","hasClass","funcName","margin","isSet","elementIndex","computedValue","dimension","suffix","hide","display","propName","0","1","2","firstElement","selected","checked","outerHTML","last","not","$excludes","offsetParent","currentOffset","parentOffset","offset","$offsetParent","currentTop","currentLeft","currentTopString","currentLeftString","currentPosition","removeAttr","attributeName","names","removeProp","replaceWith","newContent","before","replaceAll","serializeArray","HTMLFormElement","nodeName","disabled","serialize","elementDisplay","show","siblings","prevAll","nextAll","toggle","reflow","clientLeft","transition","duration","webkitTransitionDuration","transitionDuration","transitionEnd","that","events","fireCallback","transformOrigin","webkitTransformOrigin","transform","webkitTransform","entries","mutation","apiInit","selectors","$this","showOverlay","zIndex","$overlay","appendTo","level","hideOverlay","force","removeClass","lockScreen","$body","newBodyWidth","width","unlockScreen","throttle","delay","timer","GUID","componentEvent","componentName","instance","parameters","inst","fullEventName","jQuery","guid","s4","floor","random","substring","Headroom","DEFAULT_OPTIONS","tolerance","down","up","enable","$document","$window","initialClass","pinnedClass","unpinnedClass","parseOptions","attr","Function","onScroll","rafId","requestAnimationFrame","currentScrollY","lastScrollY","toleranceExceeded","abs","unpin","pin","triggerEvent","state","isEnable","disable","cancelAnimationFrame","getState","customAttr","CollapseAbstract","classPrefix","getNamespace","classItem","classItemOpen","classHeader","classBody","bindEvent","accordion","$item","getItems","close","isOpen","getItem","$content","height","scrollHeight","openAll","closeAll","Collapse","Panel","Table","init","$thRow","$tdRows","selectable","updateThCheckbox","updateTdCheckbox","updateNumericCol","createCheckboxHTML","tag","updateThCheckboxStatus","checkbox","$thCheckbox","selectedRow","tdRowsLength","indeterminate","rowSelectedClass","row","$row","$checkbox","prependTo","$tdCheckboxs","isCheckedAll","numericClass","isNumericCol","$td","dataName","updateTables","startEvent","moveEvent","endEvent","cancelEvent","unlockEvent","touches","isAllow","register","$ripple","touchPosition","TouchEvent","touchStartX","pageX","touchStartY","pageY","innerHeight","innerWidth","center","diameter","pow","translate","wave","$wave","removeTimer","removeRipple","showRipple","hidden","hideRipple","defaultData","reInit","domLoadedEvent","inputEvent","input","$input","eventType","inputType","$textfield","validity","valid","inputValue","hasExtraSpace","outerHeight","maxLength","text","updateValueStyle","$slider","$track","_slider_$track","$fill","_slider_$fill","$thumb","_slider_$thumb","_slider_$input","min","_slider_min","_slider_max","isDisabled","_slider_disabled","isDiscrete","_slider_discrete","$thumbText","_slider_$thumbText","percent","append","focus","updateTextFields","rangeSelector","updateSliders","Fab","$btn","$dial","$dialBtns","btn","transitionDelay","webkitTransitionDelay","Select","$native","uniqueID","handleUpdate","gutter","readjustMenu","transformOriginY","menuMarginTop","windowHeight","elementHeight","$itemFirst","$items","itemHeight","itemMargin","parseInt","menuWidth","menuHeight","size","elementTop","menuMaxHeight","selectedIndex","menuMaxMarginTop","menuTop","$menu","margin-top","transform-origin","selectedValue","itemsData","textContent","selectedText","$selected","after","Tab","$tabs","$indicator","hash","tab","activeIndex","setActive","setIndicatorPosition","bindTabEvent","loop","$tab","clickEvent","targetId","substr","$activeTab","activeTabOffset","scrollLeft","next","$oldTabs","$newTabs","oldTabsElement","newTabsElement","Drawer","isDesktop","overlay","swipeSupport","swipe","openNavEventHandler","swipeStartX","swiping","maybeSwiping","swipeAreaWidth","setPosition","translateX","transformCSS","cleanPosition","webkitTransition","getMaxTranslateX","getTranslateX","currentX","onBodyTouchEnd","touchX","changedTouches","translateRatio","swipingState","touchmove","onBodyTouchMove","touchend","touchcancel","touchY","dXAbs","dYAbs","onBodyTouchStart","$drawer","queue","dequeue","Dialog","cancel","closeOnCancel","confirm","closeOnConfirm","history","modal","closeOnEsc","destroyOnClosed","currentInst","queueName","isLockScreen","readjust","$title","$actions","hashchangeEvent","overlayClick","destroy","doOpen","historyBack","back","keyCode","$dialog","DEFAULT_BUTTON","bold","onClick","title","buttons","stackedButtons","cssClass","onOpen","onOpened","onClose","onClosed","confirmText","dialog","buttonsHTML","HTML","cancelText","alert","onConfirm","onCancel","maxlength","defaultValue","confirmOnEnter","prompt","label","Tooltip","marginLeft","marginTop","targetProps","targetMargin","tooltipWidth","offsetWidth","tooltipHeight","offsetHeight","targetOffset","margin-left","oldOptions","timeoutId","Snackbar","buttonColorStyle","buttonColorClass","buttonColor","buttonText","message","closeOnButtonClick","closeOnOutsideClick","onButtonClick","layerHTML","fillHTML","spinner","$spinner","layer","translateY","snackbarHeight","clientHeight","snackbar","$bottomNav","isThis","Menu","anchorSelector","menuSelector","$anchor","isCascade","isCovered","covered","bindSubMenuEvent","align","fixed","updateSpinners","subMenuTrigger","subMenuDelay","menuLeft","transformOriginX","windowWidth","isFixed","anchorRect","anchorTop","anchorLeft","anchorHeight","anchorWidth","anchorBottom","anchorRight","anchorOffsetTop","offsetTop","anchorOffsetLeft","offsetLeft","menuHeightTemp","menuWidthTemp","readjustSubmenu","$submenu","submenuTop","submenuLeft","submenuWidth","submenuHeight","itemRect","itemWidth","itemLeft","itemTop","openSubMenu","closeSubMenu","menu","$subSubmenu","toggleSubMenu","$tmpSubmenu","timeoutOpen","$relatedTarget","tmpClose","tmpOpen","submenu"],"mappings":"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"}