diff --git a/README.md b/README.md index 6c10f84a..1cc4cecd 100644 --- a/README.md +++ b/README.md @@ -59,14 +59,16 @@ outline.js 的支持的滚动元素可以是 Window 窗口,也可以是某个 * sticky 定位:[https://yaohaixiao.github.io/outline.js/sticky.html](https://yaohaixiao.github.io/outline.js/sticky.html) ![fixed 定位](https://yaohaixiao.github.io/outline.js/img/fixed.png) -* fixed 定位:[https://yaohaixiao.github.io/outline.js/fixed.html](https://yaohaixiao.github.io/outline.js/fixed.html) +* fixed 定位(不显示按钮工具栏):[https://yaohaixiao.github.io/outline.js/fixed.html](https://yaohaixiao.github.io/outline.js/fixed.html) ### DOM 元素滚动 ![flex 布局](https://yaohaixiao.github.io/outline.js/img/flex.png) -* flex 布局:[https://yaohaixiao.github.io/outline.js/flex.html](https://yaohaixiao.github.io/outline.js/flex.html) +* flex 布局(超长文章):[https://yaohaixiao.github.io/outline.js/flex.html](https://yaohaixiao.github.io/outline.js/flex.html) +### Anchors 模块独立调用 +* Anchors 模块(仅给文章的标题添加):[https://yaohaixiao.github.io/outline.js/anchors.html](https://yaohaixiao.github.io/outline.js/anchors.html) ## 浏览器支持 @@ -224,6 +226,8 @@ const outline = new Outline({ // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字 // 如果喜欢更简洁的高亮效果,可以选择设置为 false animationCurrent: true, + // 是否显示侧边的按钮工具栏 + hasToolbar: true, // 标题图标链接的 URL 地址 // (默认)没有设置定制,点击链接页面滚动到标题位置 // 设置了链接地址,则不会滚动定位 @@ -478,6 +482,7 @@ Outline.DEFAULTS = { placement: 'rtl', showCode: true, animationCurrent: true, + hasToolbar: true, anchorURL: '', stickyHeight: 0, homepage: '', diff --git a/api/pug/anchors.pug b/api/pug/anchors.pug new file mode 100644 index 00000000..453a93c7 --- /dev/null +++ b/api/pug/anchors.pug @@ -0,0 +1,21 @@ +doctype html +html(lang='en') + head + include ./meta + title outline.js - 自动生成文章导读(Table of Contents)导航的 JavaScript 工具 + link(href="css/example.min.css" rel="stylesheet") + body + .paper + header#header.header + h1.title Outline.js + article#article.article + main#main.article__main + include ./example + h2 License + p JavaScript Code Licensed under MIT License. + p API Documentation Licensed under CC BY 3.0 + footer.footer + include ./footer + script(src="js/anchors.min.js") + script. + new Anchors(Anchors.DEFAULTS) diff --git a/api/pug/fixed.pug b/api/pug/fixed.pug index 10e2a023..65332ba5 100644 --- a/api/pug/fixed.pug +++ b/api/pug/fixed.pug @@ -32,6 +32,7 @@ html(lang='en') defaults.parentElement = '#aside' defaults.stickyHeight = 86 defaults.homepage = './index.html' + defaults.hasToolbar = false defaults.afterSticky = function(closed, isStickying) { const $nav = this.$el const BORDER_RIGHT = 'utils-border-right' diff --git a/api/pug/options/animationCurrent.pug b/api/pug/options/animationCurrent.pug index a20fb6a3..1f577573 100644 --- a/api/pug/options/animationCurrent.pug +++ b/api/pug/options/animationCurrent.pug @@ -1,6 +1,6 @@ section.section header.section__header - h.section__h3 animationCurrent + h3.section__h3 animationCurrent div.section__content h4.section__h4 Description dl.section__dl diff --git a/api/pug/options/hasToolbar.pug b/api/pug/options/hasToolbar.pug new file mode 100644 index 00000000..df33a462 --- /dev/null +++ b/api/pug/options/hasToolbar.pug @@ -0,0 +1,15 @@ +section.section + header.section__header + h3.section__h3 hasToolbar + div.section__content + h4.section__h4 Description + dl.section__dl + dt.section__dt Type: + dd.section__dd Boolean + dl.section__dl + dt.section__dt Default: + dd.section__dd true + p 可选,是否显示侧边的按钮工具栏: + ul + li true - 显示按钮工具栏(默认值); + li false - 不显示按钮工具栏; diff --git a/api/pug/options/section.pug b/api/pug/options/section.pug index fbd57b5e..e4738fc4 100644 --- a/api/pug/options/section.pug +++ b/api/pug/options/section.pug @@ -3,24 +3,26 @@ section.section h2.section__title Options div.section__content p outline.js 有者丰富的配置选项,以便适应不同的展示方式。 - include articleElement - include title - include scrollElement - include position - include parentElement - include placement - include stickyHeight - include showCode - include animationCurrent - include anchorURL - include homepage - include git - include tags - include issues - include tools - include print - include customClass - include afterScroll - include afterSticky - include afterToggle - include chpaterTextFilter + include ./articleElement + include ./selector + include ./title + include ./scrollElement + include ./position + include ./parentElement + include ./placement + include ./stickyHeight + include ./showCode + include ./animationCurrent + include ./hasToolbar + include ./anchorURL + include ./homepage + include ./git + include ./tags + include ./issues + include ./tools + include ./print + include ./customClass + include ./afterScroll + include ./afterSticky + include ./afterToggle + include ./chpaterTextFilter diff --git a/api/pug/options/showCode.pug b/api/pug/options/showCode.pug index c83f855c..f76498f1 100644 --- a/api/pug/options/showCode.pug +++ b/api/pug/options/showCode.pug @@ -1,6 +1,6 @@ section.section header.section__header - h.section__h3 showCode + h3.section__h3 showCode div.section__content h4.section__h4 Description dl.section__dl diff --git a/api/pug/properties/defaults.pug b/api/pug/properties/defaults.pug index e93291e5..56f4abd9 100644 --- a/api/pug/properties/defaults.pug +++ b/api/pug/properties/defaults.pug @@ -50,6 +50,8 @@ section.section stickyHeight: 0, // 是否显示标题编号 showCode: true, + // 是否显示侧边的按钮工具栏 + hasToolbar: true, // 指定是否采用动画定位高亮当前的章节标题,默认值:true // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字 // 如果喜欢更简洁的高亮效果,可以选择设置为 false diff --git a/build/rollup.config.api.js b/build/rollup.config.api.js index 3352d5a1..1747554c 100644 --- a/build/rollup.config.api.js +++ b/build/rollup.config.api.js @@ -21,5 +21,55 @@ export default [ sourcemap: true }, plugins: PLUGIN_CONFIG + }, + { + input: './anchors.js', + output: { + name: 'Anchors', + file: './docs/js/anchors.min.js', + format: 'umd', + sourcemap: true + }, + plugins: PLUGIN_CONFIG + }, + { + input: './chapters.js', + output: { + name: 'Chapters', + file: './docs/js/chapters.min.js', + format: 'umd', + sourcemap: true + }, + plugins: PLUGIN_CONFIG + }, + { + input: './drawer.js', + output: { + name: 'Drawer', + file: './docs/js/drawer.min.js', + format: 'umd', + sourcemap: true + }, + plugins: PLUGIN_CONFIG + }, + { + input: './toolbar.js', + output: { + name: 'Toolbar', + file: './docs/js/toolbar.min.js', + format: 'umd', + sourcemap: true + }, + plugins: PLUGIN_CONFIG + }, + { + input: './message.js', + output: { + name: 'Message', + file: './docs/js/message.min.js', + format: 'umd', + sourcemap: true + }, + plugins: PLUGIN_CONFIG } ] diff --git a/build/rollup.config.lib.js b/build/rollup.config.lib.js index 03c27696..10ef98c9 100644 --- a/build/rollup.config.lib.js +++ b/build/rollup.config.lib.js @@ -71,16 +71,5 @@ export default [ sourcemap: true }, plugins: PLUGIN_CONFIG - }, - // build for documentation - { - input: './outline.js', - output: { - name: 'Outline', - file: './docs/js/outline.min.js', - format: 'umd', - sourcemap: true - }, - plugins: PLUGIN_CONFIG } ] diff --git a/chapters.min.js.map b/chapters.min.js.map index e94ba72c..15d82e25 100644 --- a/chapters.min.js.map +++ b/chapters.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chapters.min.js","sources":["utils/types/isString.js","utils/lang/hasOwn.js","utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/lang/extend.js","utils/observer/on.js","utils/types/isElement.js","utils/lang/later.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/at.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/types/isArray.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/dom/createElement.js","utils/dom/setAttributes.js","utils/dom/setAttribute.js","utils/lang/easeInQuad.js","utils/dom/_getScrollElement.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/dom/removeClass.js","utils/lang/trim.js","utils/dom/offsetTop.js","utils/dom/getStyle.js","utils/dom/setProperty.js","utils/lang/cloneDeep.js","utils/lang/timeSlice.js","chapters.js","_paintChapters.js","utils/dom/scrollTo.js","utils/dom/intersection.js","utils/event/stop.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n setAttributes($el, attrs)\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n } else if (isDOM(attrs)) {\n append(attrs)\n } else if (isString(attrs)) {\n append(document.createTextNode(attrs))\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n if (!el || !isObject(attrs)) {\n return false\n }\n\n Object.keys(attrs).forEach((attr) => {\n const value = attrs[attr]\n if (hasOwn(attrs, attr)) {\n setAttribute(el, attr, value)\n }\n })\n}\n\nexport default setAttributes\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'htmlFor':\n el.setAttribute('for', value)\n break\n case 'className':\n el.className = value\n break\n case 'innerHTML':\n el.innerHTML = value\n break\n case 'innerText':\n el.innerText = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\n * timeSlice.js 时间切片功能函数\n * ====================================================\n * Created By: Yaohaixiao\n * Update: 2023.09.04\n */\nimport isFunction from '../types/isFunction'\nimport later from './later'\n\nconst queue = []\nlet isHandling\nlet done\n\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\nif (typeof window.requestIdleCallback === 'undefined') {\n window.requestIdleCallback = function (cb) {\n const start = Date.now()\n return later(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start))\n }\n })\n }, 10)\n }\n\n window.cancelIdleCallback = function (id) {\n clearTimeout(id)\n }\n}\n\nfunction runIdle(idleDeadline) {\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\n const fn = queue.shift()\n\n if (!isFunction(fn)) {\n return false\n }\n\n fn()\n }\n\n if (queue.length) {\n isHandling = requestIdleCallback(runIdle)\n } else {\n isHandling = 0\n\n if (isFunction(done)) {\n done()\n done = null\n }\n }\n}\n\n/**\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\n * 多个短时间任务\n * ====================================================\n * @param {Function} fn - 需要在空闲时执行的回调函数\n * @param {Function} afterComplete - queen 的\n * @return {(function(): (boolean|undefined))|*|boolean}\n */\nconst timeSlice = (fn, afterComplete = null) => {\n queue.push(fn)\n\n if (isFunction(afterComplete)) {\n done = afterComplete\n }\n\n if (!isHandling) {\n requestIdleCallback(runIdle)\n }\n}\n\nexport default timeSlice\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport cloneDeep from './utils/lang/cloneDeep'\n\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Chapters.DEFAULTS)\n\n this._reset()\n\n this.offsetWidth = 0\n this.playing = false\n this.scrollTimer = null\n this.resizeTimer = null\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n _reset() {\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.$active = null\n\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.closed = false\n\n return this\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n count() {\n return this.chapters.length\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const animationCurrent = this.attr('animationCurrent')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const children = []\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n title\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement('ul', {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n })\n this.$list = $list\n children.push($list)\n\n if(animationCurrent) {\n $placeholder = createElement('div', {\n className: 'outline-chapters__placeholder'\n })\n this.$placeholder = $placeholder\n children.push($placeholder)\n }\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n children\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n const count = this.count()\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n if (this.isInside()) {\n addClass($parentElement, 'outline-chapters-parent')\n }\n\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n\n later(() => {\n this.highlight(this.active)\n }, 60)\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n if (count < 400) {\n this.onObserver()\n }\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const animationCurrent = this.attr('animationCurrent')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (!animationCurrent) {\n return this\n }\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const animationCurrent = this.attr('animationCurrent')\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const ACTIVE = 'outline-chapters_active'\n const HIGHLIGHT = 'outline-chapters_highlight'\n\n if (!$anchor) {\n return this\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n removeClass(this.$active, ACTIVE)\n }\n\n this.$active = $anchor\n addClass(this.$active, ACTIVE)\n\n if (animationCurrent) {\n this.positionPlaceholder(this.active)\n } else {\n addClass(this.$active, HIGHLIGHT)\n }\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n removeClass($parent, HIDDEN)\n } else {\n removeClass($parent, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n }, 30)\n }\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n addClass($parent, HIDDEN)\n } else {\n addClass($parent, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n })\n }\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)._reset()\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at(window, 'resize', this.onResize, this, true)\n }\n this.$on('anchors:all:paint', this.onObserver, this)\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at(window, 'resize', this.onResize)\n }\n\n this.$off('anchors:all:paint')\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n animationCurrent: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\nimport timeSlice from './utils/lang/timeSlice'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const LIMIT = 400\n const count = chapters.length\n const clones = [...chapters]\n const paint = (parts) => {\n const byId = (id) => $list.querySelector(`#${id}`)\n parts.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const children = []\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n chapter.text\n )\n let $link\n let $code\n let $li\n let $subject\n let $chapter\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n chapter.code\n )\n\n children.push($code)\n }\n\n children.push($text)\n\n $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n children\n )\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n $link\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $chapter = byId(`chapter-${pid}`)\n $subject = byId(`subject-${pid}`)\n\n if (!$subject) {\n $subject = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n $li\n )\n\n $chapter.appendChild($subject)\n } else {\n $subject.appendChild($li)\n }\n }\n })\n }\n\n if (count > LIMIT) {\n // 同步绘制\n paint(clones.splice(0, LIMIT))\n // 剩余的采用 timeSlice 机制绘制\n while (clones.length > 0) {\n const once = clones.splice(0, LIMIT)\n timeSlice(() => {\n paint(once)\n })\n }\n } else {\n paint(clones)\n }\n}\n\nexport default _paintChapters\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","_subscribers","_hasDirectSubscribersFor","topic","length","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","forEach","subscriber","message","indexOf","callback","context","deliver","setTimeout","guid","uuid","prefix","_removeSubscriber","off","token","keys","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","arguments","destroy","removeListeners","reload","$emit","event","publish","$on","handler","push","subscribe","$off","unsubscribe","isElement","nodeName","tagName","nodeType","later","fn","delay","CAPTURE_EVENTS","_off","el","type","capture","_delegateListener","listeners","_listeners","index","listener","i","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","filter","getListeners","$child","at","once","evt","overrideContext","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","className","innerHTML","innerText","setAttributes","every","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","querySelectorAll","scrollTop","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","offsetTop","top","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","cloneDeep","clone","from","assign","key","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","Chapters","super","DEFAULTS","_reset","offsetWidth","playing","scrollTimer","resizeTimer","Observer","$title","$main","$list","$placeholder","$parentElement","$active","chapters","active","closed","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","count","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","showCode","mounted","clones","paint","parts","byId","chapter","pid","rel","$text","text","$link","$code","$li","$subject","$chapter","code","href","_paintChapters","highlight","sticky","onObserver","positionPlaceholder","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","height","offsetHeight","ACTIVE","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","clientHeight","innerHeight","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","show","HIDDEN","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","removeChild","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","$heading","onSelect","stickyHeight","headingId","split","afterScroll","min","stopPropagation","preventDefault","onScroll","onResize","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chapters.min.js","sources":["utils/types/isString.js","utils/lang/hasOwn.js","utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/lang/extend.js","utils/observer/on.js","utils/types/isElement.js","utils/lang/later.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/at.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/types/isArray.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/dom/createElement.js","utils/dom/setAttributes.js","utils/dom/setAttribute.js","utils/lang/easeInQuad.js","utils/dom/_getScrollElement.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/dom/removeClass.js","utils/lang/trim.js","utils/dom/offsetTop.js","utils/dom/getStyle.js","utils/dom/setProperty.js","utils/lang/cloneDeep.js","utils/lang/timeSlice.js","chapters.js","_paintChapters.js","utils/dom/scrollTo.js","utils/dom/intersection.js","utils/event/stop.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n setAttributes($el, attrs)\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n } else if (isDOM(attrs)) {\n append(attrs)\n } else if (isString(attrs)) {\n append(document.createTextNode(attrs))\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n if (!el || !isObject(attrs)) {\n return false\n }\n\n Object.keys(attrs).forEach((attr) => {\n const value = attrs[attr]\n if (hasOwn(attrs, attr)) {\n setAttribute(el, attr, value)\n }\n })\n}\n\nexport default setAttributes\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'htmlFor':\n el.setAttribute('for', value)\n break\n case 'className':\n el.className = value\n break\n case 'innerHTML':\n el.innerHTML = value\n break\n case 'innerText':\n el.innerText = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\n * timeSlice.js 时间切片功能函数\n * ====================================================\n * Created By: Yaohaixiao\n * Update: 2023.09.04\n */\nimport isFunction from '../types/isFunction'\nimport later from './later'\n\nconst queue = []\nlet isHandling\nlet done\n\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\nif (typeof window.requestIdleCallback === 'undefined') {\n window.requestIdleCallback = function (cb) {\n const start = Date.now()\n return later(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start))\n }\n })\n }, 10)\n }\n\n window.cancelIdleCallback = function (id) {\n clearTimeout(id)\n }\n}\n\nfunction runIdle(idleDeadline) {\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\n const fn = queue.shift()\n\n if (!isFunction(fn)) {\n return false\n }\n\n fn()\n }\n\n if (queue.length) {\n isHandling = requestIdleCallback(runIdle)\n } else {\n isHandling = 0\n\n if (isFunction(done)) {\n done()\n done = null\n }\n }\n}\n\n/**\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\n * 多个短时间任务\n * ====================================================\n * @param {Function} fn - 需要在空闲时执行的回调函数\n * @param {Function} afterComplete - queen 的\n * @return {(function(): (boolean|undefined))|*|boolean}\n */\nconst timeSlice = (fn, afterComplete = null) => {\n queue.push(fn)\n\n if (isFunction(afterComplete)) {\n done = afterComplete\n }\n\n if (!isHandling) {\n requestIdleCallback(runIdle)\n }\n}\n\nexport default timeSlice\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport cloneDeep from './utils/lang/cloneDeep'\n\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Chapters.DEFAULTS)\n\n this._reset()\n\n this.offsetWidth = 0\n this.playing = false\n this.scrollTimer = null\n this.resizeTimer = null\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n _reset() {\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.$active = null\n\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.closed = false\n\n return this\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n count() {\n return this.chapters.length\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const animationCurrent = this.attr('animationCurrent')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const children = []\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n title\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement('ul', {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n })\n this.$list = $list\n children.push($list)\n\n if (animationCurrent) {\n $placeholder = createElement('div', {\n className: 'outline-chapters__placeholder'\n })\n this.$placeholder = $placeholder\n children.push($placeholder)\n }\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n children\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n const count = this.count()\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n if (this.isInside()) {\n addClass($parentElement, 'outline-chapters-parent')\n }\n\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n\n later(() => {\n this.highlight(this.active)\n }, 60)\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n if (count < 400) {\n this.onObserver()\n }\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const animationCurrent = this.attr('animationCurrent')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (!animationCurrent) {\n return this\n }\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const animationCurrent = this.attr('animationCurrent')\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const ACTIVE = 'outline-chapters_active'\n const HIGHLIGHT = 'outline-chapters_highlight'\n\n if (!$anchor) {\n return this\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n removeClass(this.$active, ACTIVE)\n }\n\n this.$active = $anchor\n addClass(this.$active, ACTIVE)\n\n if (animationCurrent) {\n this.positionPlaceholder(this.active)\n } else {\n addClass(this.$active, HIGHLIGHT)\n }\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n removeClass($parent, HIDDEN)\n } else {\n removeClass($parent, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n }, 30)\n }\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n addClass($parent, HIDDEN)\n } else {\n addClass($parent, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n })\n }\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)._reset()\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at(window, 'resize', this.onResize, this, true)\n }\n this.$on('anchors:all:paint', this.onObserver, this)\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at(window, 'resize', this.onResize)\n }\n\n this.$off('anchors:all:paint')\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n animationCurrent: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\nimport timeSlice from './utils/lang/timeSlice'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const LIMIT = 400\n const count = chapters.length\n const clones = [...chapters]\n const paint = (parts) => {\n const byId = (id) => $list.querySelector(`#${id}`)\n parts.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const children = []\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n chapter.text\n )\n let $link\n let $code\n let $li\n let $subject\n let $chapter\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n chapter.code\n )\n\n children.push($code)\n }\n\n children.push($text)\n\n $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n children\n )\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n $link\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $chapter = byId(`chapter-${pid}`)\n $subject = byId(`subject-${pid}`)\n\n if (!$subject) {\n $subject = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n $li\n )\n\n $chapter.appendChild($subject)\n } else {\n $subject.appendChild($li)\n }\n }\n })\n }\n\n if (count > LIMIT) {\n // 同步绘制\n paint(clones.splice(0, LIMIT))\n // 剩余的采用 timeSlice 机制绘制\n while (clones.length > 0) {\n const once = clones.splice(0, LIMIT)\n timeSlice(() => {\n paint(once)\n })\n }\n } else {\n paint(clones)\n }\n}\n\nexport default _paintChapters\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","_subscribers","_hasDirectSubscribersFor","topic","length","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","forEach","subscriber","message","indexOf","callback","context","deliver","setTimeout","guid","uuid","prefix","_removeSubscriber","off","token","keys","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","arguments","destroy","removeListeners","reload","$emit","event","publish","$on","handler","push","subscribe","$off","unsubscribe","isElement","nodeName","tagName","nodeType","later","fn","delay","CAPTURE_EVENTS","_off","el","type","capture","_delegateListener","listeners","_listeners","index","listener","i","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","filter","getListeners","$child","at","once","evt","overrideContext","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","className","innerHTML","innerText","setAttributes","every","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","querySelectorAll","scrollTop","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","offsetTop","top","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","cloneDeep","clone","from","assign","key","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","Chapters","super","DEFAULTS","_reset","offsetWidth","playing","scrollTimer","resizeTimer","Observer","$title","$main","$list","$placeholder","$parentElement","$active","chapters","active","closed","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","count","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","showCode","mounted","clones","paint","parts","byId","chapter","pid","rel","$text","text","$link","$code","$li","$subject","$chapter","code","href","_paintChapters","highlight","sticky","onObserver","positionPlaceholder","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","height","offsetHeight","ACTIVE","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","clientHeight","innerHeight","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","show","HIDDEN","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","removeChild","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","$heading","onSelect","stickyHeight","headingId","split","afterScroll","min","stopPropagation","preventDefault","onScroll","onResize","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file diff --git a/docs/anchors.html b/docs/anchors.html new file mode 100644 index 00000000..4729cd2f --- /dev/null +++ b/docs/anchors.html @@ -0,0 +1,60 @@ +outline.js - 自动生成文章导读(Table of Contents)导航的 JavaScript 工具

outline.js - 自动生成文章导读(Table of Contents)导航的 JavaScript 工具。会自动分析文章中的标题( h1~h6 )标签,并生成文章段落层次结构的导读导航菜单。

创作灵感

AnchorJS 是 outline.js 的创作灵感来源。既然 AnchorJS 可创建标题的链接,为什么不直接给文章生成一个文章导读(Table of Contents)导航呢? 于是就有了outline.js。

特点

  • 原生 JavaScript 编写,无需任何依赖;
  • 支持 UMD 规范;
  • 支持 E6 模块,提供功能独立的 ES6 模块;
    • Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级;
    • Drawer 模块:独立的侧滑窗口模块;
    • Chapters 模块:独立的导航菜单模块;
    • Toolbar 模块:独立的固定定位的工具栏模块;
  • 拥有 AnchorJS 基础功能;
  • 支持中文和英文标题文字生成ID;
  • 支持生成独立的侧边栏导航菜单;
  • 支持直接在文章中生成文章导读导航;
  • 自动分析标题关系,生成段落层级索引值;
  • 可以作为 jQuery 插件使用;
  • 界面简洁大方;
  • 配置灵活,丰富,让你随心所欲掌控 outline.js;

安装说明

outline.js 提供多种安装方式的支持: npm 安装、加载 CDN 资源、以及本地资源调用。

npm install

$ npm install -S @yaohaixiao/outline.js

CDN 调用

<script src="https://cdn.jsdelivr.net/gh/yaohaixiao/outline.js/outline.min.js"></script>

调用本地JS文件

<script src="path/to/outline.min.js"></script>

使用说明

outline.js 既支持在 node.js 环境中以 CommonJS 模块调用,也支持 ES6 模块方式加载。

// Node.js 环境中使用
+const Outline = require('@yaohaixiao/outline.js')
+
+// 作为 ES6 模块使用
+import Outline from '@yaohaixiao/outline.js/src/outline'
+// 调用其他独立模块
+import Anchors from '@yaohaixiao/outline.js/src/anchors'
+import Chapters from '@yaohaixiao/outline.js/src/chapters'
+import Drawer from '@yaohaixiao/outline.js/src/drawer'
+import Toolbar from '@yaohaixiao/outline.js/src/toolbar'
+
+// 创建 Outline 实例
+// 2.0.0 调整了配置参数,配置更加简单
+const outline = new Outline({
+  // 文章显示区域的 DOM 元素或者选择器字符串
+  articleElement: '#article',
+  // 要收集的标题选择器
+  selector: 'h2,h3,h4,h5,h6',
+  // 负责文章区域滚动的元素
+  // String 类型 - 选择器字符串,默认值:html,body(window窗口)
+  // HTMLElement 类型 - DOM 元素
+  scrollElement: 'html,body',
+  // 文章导读菜单的位置
+  // relative - (默认值)创建独立的侧滑菜单
+  // sticky - 导航菜单将以 sticky 模式布局(需要确保菜单插入位置支持 sticky 模式布局)
+  // fixed - 导航菜单将以 fixed 模式布局,会自动监听滚动位置,模拟 sticky 布局
+  // sticky 和 fixed 布局时,需要设置 parentElement
+  // 2.0.0 暂时不支持在文章开始位置插入 chapters 导航菜单
+  position: 'sticky',
+  // 设置 position: relative 时,placment 定义侧滑菜单和 toolbar 导航位置:
+  // rtl - 菜单位置在窗口右侧,滑动动画为:right to left
+  // ltr - 菜单位置在窗口左侧,滑动动画为:left to right
+  // ttb - 菜单位置在窗口上方,滑动动画为:top to bottom
+  // btt - 菜单位置在窗口下方,滑动动画为:bottom to top
+  placement: '',
+  // 导航菜单将要插入的位置(DOM 元素)
+  // String 类型 - 选择器字符串
+  // HTMLElement 类型 - 插入的 DOM 元素
+  // 仅在 position 设置为 sticky 和 fixed 布局时有效
+  parentElement: '#aside',
+  // 是否显示段落章节编号
+  showCode: true,
+  // 标题图标链接的 URL 地址
+  // (默认)没有设置定制,点击链接页面滚动到标题位置
+  // 设置了链接地址,则不会滚动定位
+  anchorURL: '',
+  // DIYer的福利
+  // 独立侧滑菜单时,customClass 会追加到 drawer 侧滑窗口组件
+  // 在文章中显示导航菜单时,customClass 会追加到 chapters 导航菜单
+  customClass
+});
+
+// 可以在创建导航后,重置配置信息,重新生成新的导航
+Outline.reload({
+  // 调整位直接在文章内生成导航
+  position: 'sticky',
+  articleElement: '#article'
+})

License

JavaScript Code Licensed under MIT License.

API Documentation Licensed under CC BY 3.0

\ No newline at end of file diff --git a/docs/fixed.html b/docs/fixed.html index f6064de1..c9cab8b2 100644 --- a/docs/fixed.html +++ b/docs/fixed.html @@ -61,6 +61,12 @@ // Customize Selector const outline = new Outline({ articleElement: $('#main') +})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -113,7 +119,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -774,6 +780,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
@@ -1165,6 +1173,7 @@
   defaults.parentElement = '#aside'
   defaults.stickyHeight = 86
   defaults.homepage = './index.html'
+  defaults.hasToolbar = false
   defaults.afterSticky = function(closed, isStickying) {
     const $nav = this.$el
     const BORDER_RIGHT = 'utils-border-right'
diff --git a/docs/flex.html b/docs/flex.html
index c3b0fa61..79ef9cb3 100644
--- a/docs/flex.html
+++ b/docs/flex.html
@@ -67,6 +67,12 @@
 // Customize Selector
 const outline = new Outline({
   articleElement: $('#main')
+})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -119,7 +125,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -780,6 +786,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
@@ -1166,6 +1174,12 @@
 // Customize Selector
 const outline = new Outline({
   articleElement: $('#main')
+})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -1218,7 +1232,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -1879,6 +1893,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
@@ -2265,6 +2281,12 @@
 // Customize Selector
 const outline = new Outline({
   articleElement: $('#main')
+})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -2317,7 +2339,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -2978,6 +3000,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
@@ -3364,6 +3388,12 @@
 // Customize Selector
 const outline = new Outline({
   articleElement: $('#main')
+})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -3416,7 +3446,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -4077,6 +4107,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
@@ -4463,6 +4495,12 @@
 // Customize Selector
 const outline = new Outline({
   articleElement: $('#main')
+})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -4515,7 +4553,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -5176,6 +5214,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
@@ -5562,6 +5602,12 @@
 // Customize Selector
 const outline = new Outline({
   articleElement: $('#main')
+})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -5614,7 +5660,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -6275,6 +6321,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
@@ -6661,6 +6709,12 @@
 // Customize Selector
 const outline = new Outline({
   articleElement: $('#main')
+})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -6713,7 +6767,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -7374,6 +7428,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
@@ -7760,6 +7816,12 @@
 // Customize Selector
 const outline = new Outline({
   articleElement: $('#main')
+})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -7812,7 +7874,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -8473,6 +8535,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
@@ -8859,6 +8923,12 @@
 // Customize Selector
 const outline = new Outline({
   articleElement: $('#main')
+})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -8911,7 +8981,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -9572,6 +9642,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
diff --git a/docs/index.html b/docs/index.html
index b9a9b9fe..fb2b7512 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -4,6 +4,12 @@
 // Customize Selector
 const outline = new Outline({
   articleElement: $('#main')
+})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -56,7 +62,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -717,6 +723,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
diff --git a/docs/js/anchors.min.js b/docs/js/anchors.min.js
new file mode 100644
index 00000000..7be3e599
--- /dev/null
+++ b/docs/js/anchors.min.js
@@ -0,0 +1,2 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Anchors=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),s=t=>"function"==typeof t||"[object Function]"===e(t),r=t=>("[object Object]"===e(t)||"object"==typeof t||s(t))&&null!==t,n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),i=(t,e=300)=>!!s(t)&&setTimeout((()=>{t()}),e),o=[];let l,c;function a(t){for(;t.timeRemaining()>0&&o.length;){const t=o.shift();if(!s(t))return!1;t()}o.length?l=requestIdleCallback(a):(l=0,s(c)&&(c(),c=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return i((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const h=(t,e=null)=>{o.push(t),s(e)&&(c=e),l||requestIdleCallback(a)},d=t=>t*t,u=(e=null)=>{let s,r;return e?t(e)?r=document.querySelector(e):n(e)&&(r=e):(s=document.querySelectorAll("html,body"),r=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),r},p=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=p(t.offsetParent)),e},m=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},f=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,y=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],b=(t,e,s)=>{const r=y.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const r=t._listeners;let n=-1;if(r.length<1)return!1;r.forEach(((t,r)=>{const i=t.fn;e===t.type&&(n=r,i===s&&(n=r))})),n>-1&&r.splice(n,1)}(t,e,s),t.removeEventListener(e,s,r)},g=function(e,s,r=!1){const i=t(e)?document.querySelector(e):e,o=i.childNodes,l=((e,s)=>{let r=e._listeners||[];return t(s)&&s&&(r=r.filter((t=>t.type===s))),r})(i,s);l.forEach((t=>{b(i,t.type,t.fn)})),(r||!0===s||1===arguments.length)&&i&&o&&o.forEach((t=>{n(t)&&g(t,s,r)}))},v=(t,e,r)=>{if(!s(r))return g(t,e);b(t,e,r)},z=(t,e,s,r,n,i,o=!1)=>{const l=y.indexOf(s)>-1,c=function(l){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(l),h=((t,e,s,r)=>{const n=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&m(t,e):m(t,e))||r&&t===n)return t;if(t===n)break}while(t=f(t))})(a,e,t);let d=i||t;l.delegateTarget=h,!0===i&&(d=n),h&&(!0===o&&v(t,s,c),r.call(d,l,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:c,data:n,context:i,capture:l}),r._delegateListener=c,t.addEventListener(s,c,l)},x=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),M=['','','','','','','','','','','','','','','','','','',''],$=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,r=/^(\w+)-/;return M.find((n=>{const i=s.exec(n)[1];return r.exec(i)[1]===e&&i===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...M],L=(e="")=>{const s=document.body;let r=document.querySelector("#outline-icons"),n=[];(e=>{if(!e)return!1;x(e)&&e.length>0?e.forEach((e=>{-1===M.indexOf(e)&&t(e)&&M.push(e)})):t(e)&&M.push(e)})(e),n=$(),r?r.innerHTML=n.join(""):(r=document.createElement("div"),r.innerHTML=``,s.insertBefore(r.firstChild,s.firstChild))},w=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),A=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==e(t)))(t)||(s=t,r(s)&&"[object DocumentFragment]"===e(s))||(t=>!(!r(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var s},T=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},E=(t,e)=>{if(!t||!r(e))return!1;Object.keys(e).forEach((s=>{const r=e[s];T(e,s)&&((t,e,s)=>{let r=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===r||"textarea"===r?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}})(t,s,r)}))},S=(e,s={})=>{const r="outline-icon",n=s.size||0,i=s.color||"",o=s.iconSet||"",l=x(n)?n[0]:n,c=x(n)?n[1]:n,a=n?`width:${l}px;height:${c}px;`:"",h=i?a+`color:${i}`:a,d=s.attrs||{},u=document.createElement("i");let p,m="",f="";return t(e)?((e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)})(e)?f=e:(m=o&&"icon"!==o?`xlink:href="#${o}-icon-${e}"`:`xlink:href="#icon-${e}"`,f=``),u.innerHTML=f,d.className?d.className=`${r} ${d.className}`:d.className=r,E(u,d),p=u.querySelector("svg"),E(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),u):null},C=(e,s,n)=>{const i="outline-heading",o=n.hasAnchor||!0,l=n.isAtStart||!0,c=n.showCode||!1,a=n.chapterCode||"",h=n.anchorURL||"",d=`heading-${s}`,u={id:d,className:l?`${i} ${i}_start`:i,"data-id":s},p=w(e.innerHTML);let m,f;if(c&&(u.innerHTML=a+" "+p),E(e,u),!o)return!1;f=((t,e={})=>S(t,e))("hash",{iconSet:"outline"}),m=((e,s,n)=>{const i=document.createDocumentFragment(),o=document.createElement(e),l=e=>A(e)||t(e),c=e=>{let s;if(!l(e))return!1;A(e)?s=e:t(e)&&(s=document.createTextNode(e)),i.appendChild(s)};return r(s)?E(o,s):x(s)&&s.every((t=>l(t)))?s.forEach((t=>{c(t)})):A(s)?c(s):t(s)&&c(document.createTextNode(s)),x(n)?n.forEach((t=>{c(t)})):c(n),o.appendChild(i),o})("a",{id:`anchor-${s}`,className:`${i}__anchor anchor-${s}`,href:h||`#${d}`,target:h?"_blank":"self","data-id":s},f),e.appendChild(m)},j=(t,e)=>{let s,r=t.className;if(!r||!((t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let r,i;return!!n(t)&&(r=t.className,!!r&&(i=t.classList,i?.contains?t.classList.contains(e):!!s.exec(r)))})(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(r=w(r.replace(e,"")),t.className=r)},k=(e,s=!0,r=!0)=>{const n="outline-heading",i=e.innerHTML;let o;if(e.innerHTML=i.replace(/^\d+(\.?\d+)*\s?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),j(e,n),!s)return!1;var l;o=e.querySelector(`.${n}__anchor`),r&&j(e,`${n}_start`),l=w(e.className),t(l)&&""===l&&e.removeAttribute("class"),e.removeChild(o)},N=(e,r=!0,n=null)=>{let i=1,o=0,l="";const c=[];return e.forEach(((e,r)=>{const a=e.tagName,h=a.replace(/h/i,"");let d=parseInt(h,10),u=-1;var p;d>i?(o+=1,u=1===o?-1:r-1):d===i||do?1===d?(o=1,u=-1):u=c[r-1].pid:d<=o&&(1===d?o=1:(o-=i-d,o<=1&&(o=1)),u=1===o?-1:((t,e,s)=>{let r,n,i=t[s-1];for(n=0;n]+(>|$)/g,""):"",s(n)&&(l=n(l)),c.push({id:r,pid:u,level:o,rel:`heading-${r}`,text:l,tagName:a})})),r?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!x(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(c):c},H={},B=t=>T(H,t)&&H[t].length>0,_=(t,e=!0)=>e?B(t):(t=>{let e=B(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=B(t);return e})(t),q=(t,s,r=!0)=>{const n=t=>{if(!B(t))return!1;H[t].forEach((t=>{const r=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(e(s))>-1?s.toString():s;t.callback.call(t.context||t,r)}))},i=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),n(e);n(t),n("*")};if(!_(t))return!1;r?setTimeout(i,10):i()},O=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),I=t=>{if(!T(H,t))return!1;delete H[t]},F=(t,e)=>{if(!_(t))return!1;e?(t=>{const e=Object.keys(H);if(!t||e.length<1)return!1;e.forEach((e=>{const s=H[e];let r;s.forEach(((e,n)=>{e.callback!==t&&e.token!==t||(r=e.topic,s.splice(-1,n))})),s.length<1&&I(r)}))})(e):I(t)};class U{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,s){const n=this.attrs;return t(e)?s&&T(n,e)?(n[e]=s,this):n[e]:r(e)?(i=n,o=e,Object.keys(o).forEach((t=>{T(o,t)&&(i[t]=o[t])})),this):0===arguments.length?n:this;var i,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}$emit(t,e){return q(t,e),this}$on(t,e){return((t,e,r=null)=>{const n=O();let i="symbol"==typeof t?t.toString():t;s(e)&&(H[i]||(H[i]=[]),H[i].push({topic:i,callback:e,context:r,token:n}))})(t,e,this),this}$off(t,e){return F(t,e),this}addListeners(){return this}removeListeners(){return this}}class D extends U{constructor(t){super(),this.attrs=D.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){const r=this.attr("showCode")||!0;let i,o,l,c,a;return this.attr(e),a=this.attr("articleElement"),o=this.attr("scrollElement"),l=this.attr("selector"),i=this.attr("created"),t(a)?c=document.querySelector(a):n(a)&&(c=a),c?(this.$articleElement=c,this.$scrollElement=u(o),this.$headings=[...c.querySelectorAll(l)],this.$headings.length<1||(this.chapters=N(this.$headings,r,this.attr("chapterTextFilter")),s(i)&&i.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const r={},n=[];return t.forEach(((t,s)=>{r[t[e]]=s,t.children=[]})),t.forEach((e=>{const i=t[r[e[s]]];-1!==e[s]?i.children.push(e):n.push(e)})),n})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=400,e=this.attr("mounted"),r=this.attr("hasAnchor"),n=this.attr("isAtStart"),i=this.attr("showCode"),o=this.attr("anchorURL"),l=this.count(),c=[...this.$headings],a=this.getChapters(),d=(e,s)=>{e.forEach(((e,l)=>{const c=l+s*t,h=a[c].code;C(e,c,{hasAnchor:r,isAtStart:n,showCode:i,chapterCode:h,anchorURL:o})}))};let u=-1;if(L(),l>t)for(u+=1,d(c.splice(0,t),0);c.length>0;){const e=c.splice(0,t);h((()=>{d(e,u+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else d(c,0);return s(e)&&e.call(this),this}scrollTo(t,e){return((t,e,r)=>{const n=u(t);let i=n.scrollTop,o=0;const l=e-i,c=n.scrollHeight,a=e-c<=0?e:c,h=t=>(s(r)&&r(t),!1),p=()=>{if(o+=1,l<0){if(i-=d(o),n.scrollTop=i,i<=e)return n.scrollTop=e,h(e)}else if(i+=d(o),n.scrollTop=i,i>=a)return n.scrollTop=a,h(a);requestAnimationFrame(p)};requestAnimationFrame(p)})(this.$scrollElement,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),r=this.attr("beforeDestroy"),n=this.attr("afterDestroy"),i=this.$headings;return s(r)&&r.call(this),this.removeListeners(),i.forEach((s=>{k(s,t,e)})),this.attr(D.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],s(n)&&n.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),o=t.delegateTarget.parentNode,l=p(o)-(n+10),c=this.$scrollElement,a=c.scrollHeight-c.clientHeight;return this.scrollTo(l,(()=>{s(r)&&r.call(this,"anchor"),i((()=>{this.$emit("toolbar:update",{top:l,min:0,max:a})}))})),e||function(t){t.stopPropagation(),t.preventDefault()}(t),this}addListeners(){const t=this.$articleElement;return z(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return v(t,"click",this.onAnchorTrigger),this}}return D.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null},D}));
+//# sourceMappingURL=anchors.min.js.map
diff --git a/docs/js/anchors.min.js.map b/docs/js/anchors.min.js.map
new file mode 100644
index 00000000..c3b1a4b8
--- /dev/null
+++ b/docs/js/anchors.min.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"anchors.min.js","sources":["../../utils/types/isString.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/types/isElement.js","../../utils/lang/later.js","../../utils/lang/timeSlice.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/offsetTop.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/types/isArray.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/lang/trim.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/lang/hasOwn.js","../../utils/dom/setAttributes.js","../../utils/dom/setAttribute.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../_updateHeading.js","../../utils/icons/icon.js","../../utils/dom/createElement.js","../../utils/dom/removeClass.js","../../utils/dom/hasClass.js","../../_resetHeading.js","../../utils/types/isEmpty.js","../../getChapters.js","../../utils/lang/stripTags.js","../../_getChapterParentIdByDiffer.js","../../_getChaptersWithCode.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/lang/extend.js","../../utils/observer/on.js","../../anchors.js","../../utils/lang/toTree.js","../../utils/dom/scrollTo.js","../../utils/event/stop.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n  return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n  return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n  return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n  return (\n    (toString(o) === '[object Object]' ||\n      typeof o === 'object' ||\n      isFunction(o)) &&\n    o !== null\n  )\n}\n\nexport default isObject\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n  return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n  if (!isFunction(fn)) {\n    return false\n  }\n\n  return setTimeout(() => {\n    fn()\n  }, delay)\n}\n\nexport default later\n","/**\n * timeSlice.js 时间切片功能函数\n * ====================================================\n * Created By: Yaohaixiao\n * Update: 2023.09.04\n */\nimport isFunction from '../types/isFunction'\nimport later from './later'\n\nconst queue = []\nlet isHandling\nlet done\n\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\nif (typeof window.requestIdleCallback === 'undefined') {\n  window.requestIdleCallback = function (cb) {\n    const start = Date.now()\n    return later(function () {\n      cb({\n        didTimeout: false,\n        timeRemaining: function () {\n          return Math.max(0, 50 - (Date.now() - start))\n        }\n      })\n    }, 10)\n  }\n\n  window.cancelIdleCallback = function (id) {\n    clearTimeout(id)\n  }\n}\n\nfunction runIdle(idleDeadline) {\n  while (idleDeadline.timeRemaining() > 0 && queue.length) {\n    const fn = queue.shift()\n\n    if (!isFunction(fn)) {\n      return false\n    }\n\n    fn()\n  }\n\n  if (queue.length) {\n    isHandling = requestIdleCallback(runIdle)\n  } else {\n    isHandling = 0\n\n    if (isFunction(done)) {\n      done()\n      done = null\n    }\n  }\n}\n\n/**\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\n * 多个短时间任务\n * ====================================================\n * @param {Function} fn - 需要在空闲时执行的回调函数\n * @param {Function} afterComplete - queen 的\n * @return {(function(): (boolean|undefined))|*|boolean}\n */\nconst timeSlice = (fn, afterComplete = null) => {\n  queue.push(fn)\n\n  if (isFunction(afterComplete)) {\n    done = afterComplete\n  }\n\n  if (!isHandling) {\n    requestIdleCallback(runIdle)\n  }\n}\n\nexport default timeSlice\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n  return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n  let $rootElements\n  let $scrollElement\n\n  if (!scrollElement) {\n    $rootElements = document.querySelectorAll('html,body')\n    $scrollElement =\n      $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n        ? $rootElements[0]\n        : $rootElements[1]\n  } else {\n    if (isString(scrollElement)) {\n      $scrollElement = document.querySelector(scrollElement)\n    } else if (isElement(scrollElement)) {\n      $scrollElement = scrollElement\n    }\n  }\n\n  return $scrollElement\n}\n\nexport default _getScrollElement\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n  let top = el.offsetTop\n\n  if (el.offsetParent !== null) {\n    top += offsetTop(el.offsetParent)\n  }\n\n  return top\n}\n\nexport default offsetTop\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n  const sel = selector.replace(/^>/i, '')\n\n  if (!selector || !sel || !el) {\n    return false\n  }\n\n  /* istanbul ignore else */\n  if (el.matches) {\n    return el.matches(sel)\n  } else if (el.msMatchesSelector) {\n    return el.msMatchesSelector(sel)\n  } else {\n    return false\n  }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n  return el.host && el !== document && el.host.nodeType\n    ? el.host\n    : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n  'focusout',\n  'blur',\n  'focusin',\n  'focus',\n  'load',\n  'unload',\n  'mouseenter',\n  'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n  /* istanbul ignore else */\n  if (fn._delegateListener) {\n    fn = fn._delegateListener\n    delete fn._delegateListener\n  }\n\n  // 移除缓存的 _listeners 数据\n  _delete(el, type, fn)\n\n  el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n  const listeners = el._listeners\n  let index = -1\n\n  if (listeners.length < 1) {\n    return false\n  }\n\n  // 移除缓存的 _listeners 数据\n  listeners.forEach((listener, i) => {\n    const handler = listener.fn\n\n    if (type === listener.type) {\n      index = i\n\n      if (handler === fn) {\n        index = i\n      }\n    }\n  })\n\n  /* istanbul ignore else */\n  if (index > -1) {\n    listeners.splice(index, 1)\n  }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n  const $element = isString(el) ? document.querySelector(el) : el\n  const $children = $element.childNodes\n  const listeners = getListeners($element, type)\n\n  listeners.forEach((listener) => {\n    _off($element, listener.type, listener.fn)\n  })\n\n  if (\n    (recurse || type === true || arguments.length === 1) &&\n    $element &&\n    $children\n  ) {\n    $children.forEach(($child) => {\n      if (isElement($child)) {\n        purgeElement($child, type, recurse)\n      }\n    })\n  }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n  let listeners = el._listeners || []\n\n  if (isString(type) && type) {\n    listeners = listeners.filter((listener) => {\n      return listener.type === type\n    })\n  }\n\n  return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n  // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n  if (!isFunction(fn)) {\n    return purgeElement(el, type)\n  }\n\n  _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n  // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n  const listener = function (evt) {\n    const target = getTarget(evt)\n    // 通过 Element.matches 方法获得点击的目标元素\n    const delegateTarget = closest(target, selector, el)\n    let overrideContext = context || el\n\n    evt.delegateTarget = delegateTarget\n\n    // 当设置为 true 时,则事件处理器回调函数的\n    // this 上下文指向为 data 对象\n    if (context === true) {\n      overrideContext = data\n    }\n\n    /* istanbul ignore else */\n    if (delegateTarget) {\n      // 仅触发一次\n      /* istanbul ignore else */\n      if (once === true) {\n        off(el, type, listener)\n      }\n\n      fn.call(overrideContext, evt, data)\n    }\n  }\n\n  if (!el._listeners) {\n    el._listeners = []\n  }\n\n  // 缓存 options 元素绑定的事件处理器\n  el._listeners.push({\n    el,\n    selector,\n    type,\n    fn: listener,\n    data,\n    context,\n    capture\n  })\n\n  // 缓存包装后的事件处理器\n  fn._delegateListener = listener\n\n  el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n  const target = evt.target\n\n  return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n  if (el && el.nodeType === 3) {\n    return el.parentNode\n  }\n\n  return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n  const context = ctx || document\n\n  if (!el) {\n    return null\n  }\n\n  do {\n    /* istanbul ignore else */\n    if (\n      (selector != null &&\n        (selector.startsWith('>')\n          ? el.parentNode === context && matches(el, selector)\n          : matches(el, selector))) ||\n      (includeCTX && el === context)\n    ) {\n      return el\n    }\n\n    /* istanbul ignore else */\n    if (el === context) {\n      break\n    }\n\n    /* jshint boss:true */\n  } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n  if (Array.isArray) {\n    return Array.isArray(o)\n  } else {\n    return toString(o) === '[object Array]'\n  }\n}\n\nexport default isArray\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  '',\n  ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n  if (isString(name)) {\n    return getSymbol(name, iconSet)\n  }\n\n  return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n  const patternName = /id=\"(.*?)\"/\n  const patternSet = /^(\\w+)-/\n  const symbols = SYMBOLS\n\n  return symbols.find((symbol) => {\n    const names = patternName.exec(symbol)\n    const fullName = names[1]\n    const sets = patternSet.exec(fullName)\n    const setName = sets[1]\n    const iconName =\n      iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n    return setName === iconSet && fullName === iconName\n  })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n  const $body = document.body\n  let $icons = document.querySelector('#outline-icons')\n  let symbols = []\n\n  add(symbol)\n  symbols = getSymbols()\n\n  if ($icons) {\n    $icons.innerHTML = symbols.join('')\n  } else {\n    $icons = document.createElement('div')\n    $icons.innerHTML =\n      ``\n    $body.insertBefore($icons.firstChild, $body.firstChild)\n  }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n  if (!symbols) {\n    return false\n  }\n\n  if (isArray(symbols) && symbols.length > 0) {\n    symbols.forEach((symbol) => {\n      /* istanbul ignore else */\n      if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n        SYMBOLS.push(symbol)\n      }\n    })\n  } else {\n    /* istanbul ignore else */\n    if (isString(symbols)) {\n      SYMBOLS.push(symbols)\n    }\n  }\n}\n\nexport default add\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n  if (!isString(str)) {\n    return false\n  }\n  return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n  return !!(\r\n    isObject(el) &&\r\n    (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n  )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n  return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n  return !!(\n    isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n  )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n  return !!(\r\n    isObject(el) &&\r\n    (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n  )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n  const hasOwnProperty = Object.prototype.hasOwnProperty\n  return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n  if (!el || !isObject(attrs)) {\n    return false\n  }\n\n  Object.keys(attrs).forEach((attr) => {\n    const value = attrs[attr]\n    if (hasOwn(attrs, attr)) {\n      setAttribute(el, attr, value)\n    }\n  })\n}\n\nexport default setAttributes\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n  let tagName = el.tagName.toLowerCase()\n\n  switch (attr) {\n    case 'style':\n      el.style.cssText = value\n      break\n    case 'value':\n      if (tagName === 'input' || tagName === 'textarea') {\n        el.value = value\n      } else {\n        el.setAttribute(attr, value)\n      }\n      break\n    case 'htmlFor':\n      el.setAttribute('for', value)\n      break\n    case 'className':\n      el.className = value\n      break\n    case 'innerHTML':\n      el.innerHTML = value\n      break\n    case 'innerText':\n      el.innerText = value\n      break\n    default:\n      el.setAttribute(attr, value)\n      break\n  }\n}\n\nexport default setAttribute\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\nimport setAttributes from '../dom/setAttributes'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @param {Object} [options.attrs]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n  const ICON = 'outline-icon'\n  const size = options.size || 0\n  const color = options.color || ''\n  const iconSet = options.iconSet || ''\n  const width = isArray(size) ? size[0] : size\n  const height = isArray(size) ? size[1] : size\n  const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n  const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n  const attrs = options.attrs || {}\n  const $icon = document.createElement('i')\n  let binds = ''\n  let svg = ''\n  let $svg\n\n  if (!isString(name)) {\n    return null\n  }\n\n  if (isSVG(name)) {\n    svg = name\n  } else {\n    binds =\n      iconSet && iconSet !== 'icon'\n        ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n        : `xlink:href=\"#icon-${name}\"`\n    svg = ``\n  }\n\n  $icon.innerHTML = svg\n\n  if (attrs.className) {\n    attrs.className = `${ICON} ${attrs.className}`\n  } else {\n    attrs.className = ICON\n  }\n\n  setAttributes($icon, attrs)\n\n  $svg = $icon.querySelector('svg')\n  setAttributes($svg, {\n    'aria-hidden': true,\n    xmlns: 'http://www.w3.org/2000/svg',\n    class: 'outline-icon__svg',\n    width: 200,\n    height: 200,\n    style: cssRules\n  })\n\n  return $icon\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n  const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n  const doctype =\n    '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n  const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n  const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n  const pattern = new RegExp(svg, 'i')\n\n  return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttributes from './utils/dom/setAttributes'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n  const CLS_HEADING = 'outline-heading'\n  const hasAnchor = options.hasAnchor || true\n  const isAtStart = options.isAtStart || true\n  const showCode = options.showCode || false\n  const chapterCode = options.chapterCode || ''\n  const anchorURL = options.anchorURL || ''\n  const headingId = `heading-${i}`\n  const attrs = {\n    id: headingId,\n    className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n    'data-id': i\n  }\n  const text = trim($heading.innerHTML)\n  let $anchor\n  let $icon\n\n  if (showCode) {\n    attrs.innerHTML = chapterCode + ' ' + text\n  }\n  setAttributes($heading, attrs)\n\n  if (!hasAnchor) {\n    return false\n  }\n\n  $icon = icon('hash', { iconSet: 'outline' })\n  $anchor = createElement(\n    'a',\n    {\n      id: `anchor-${i}`,\n      className: `${CLS_HEADING}__anchor anchor-${i}`,\n      href: anchorURL || `#${headingId}`,\n      target: anchorURL ? '_blank' : 'self',\n      'data-id': i\n    },\n    $icon\n  )\n  $heading.appendChild($anchor)\n}\n\nexport default _updateHeading\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n  return createElement(name, options)\n}\n\nexport default icon\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n  const $fragment = document.createDocumentFragment()\n  const $el = document.createElement(tagName)\n  const isValidChild = (child) => {\n    return isDOM(child) || isString(child)\n  }\n  const append = (child) => {\n    let $child\n\n    if (!isValidChild(child)) {\n      return false\n    }\n\n    if (isDOM(child)) {\n      $child = child\n    } else if (isString(child)) {\n      $child = document.createTextNode(child)\n    }\n\n    $fragment.appendChild($child)\n  }\n\n  if (isObject(attrs)) {\n    setAttributes($el, attrs)\n  } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n    attrs.forEach((child) => {\n      append(child)\n    })\n  } else if (isDOM(attrs)) {\n    append(attrs)\n  } else if (isString(attrs)) {\n    append(document.createTextNode(attrs))\n  }\n\n  if (isArray(children)) {\n    children.forEach((child) => {\n      append(child)\n    })\n  } else {\n    append(children)\n  }\n\n  $el.appendChild($fragment)\n\n  return $el\n}\n\nexport default createElement\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n  let allClass = el.className\n  let classList\n\n  if (!allClass || !hasClass(el, className)) {\n    return false\n  }\n\n  classList = el.classList\n\n  if (classList?.remove) {\n    classList.remove(className)\n  } else {\n    allClass = trim(allClass.replace(className, ''))\n    el.className = allClass\n  }\n}\n\nexport default removeClass\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n  const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n  let allClass\n  let classList\n\n  if (!isElement(el)) {\n    return false\n  }\n\n  allClass = el.className\n\n  if (!allClass) {\n    return false\n  }\n\n  classList = el.classList\n\n  if (classList?.contains) {\n    return el.classList.contains(className)\n  }\n\n  return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n  const CLS_HEADING = 'outline-heading'\n  const text = $heading.innerHTML\n  const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n  let $anchor\n\n  $heading.innerHTML = text.replace(pattern, '')\n  $heading.removeAttribute('id')\n  $heading.removeAttribute('data-id')\n\n  removeClass($heading, CLS_HEADING)\n\n  if (!hasAnchor) {\n    return false\n  }\n\n  $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n  if (isAtStart) {\n    removeClass($heading, `${CLS_HEADING}_start`)\n  }\n\n  if (isEmpty(trim($heading.className))) {\n    $heading.removeAttribute('class')\n  }\n\n  $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n  return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n  let previous = 1\n  let level = 0\n  let text = ''\n  const chapters = []\n\n  headings.forEach((heading, i) => {\n    const tagName = heading.tagName\n    const headingLevel = tagName.replace(/h/i, '')\n    let current = parseInt(headingLevel, 10)\n    let pid = -1\n\n    // 场景1:当前标题是前一个标题的子标题\n    // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n    // h2 (前一个标题)\n    // h3 (当前标题)\n    if (current > previous) {\n      level += 1\n\n      // 第一层级的 pid 是 -1\n      if (level === 1) {\n        pid = -1\n      } else {\n        pid = i - 1\n      }\n    }\n    // 场景2:当前标题和前一个标题层级相同\n    // 当前标题的(标题标签)序号 = 前一个标题的序号\n    // h2 (前一个标题)\n    // h2 (当前标题)\n    // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\n    // h2\n    // h4 (前一个标题)\n    // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n    else if (current === previous || (current < previous && current > level)) {\n      // H1 的层级肯定是 1\n      if (current === 1) {\n        level = 1\n        pid = -1\n      } else {\n        pid = chapters[i - 1].pid\n      }\n    }\n    // 场景3:当前标题比前一个标题层级高\n    else if (current <= level) {\n      // H1 的层级肯定是 1\n      if (current === 1) {\n        level = 1\n      } else {\n        level = level - (previous - current)\n\n        if (level <= 1) {\n          level = 1\n        }\n      }\n\n      // 第一级的标题\n      if (level === 1) {\n        pid = -1\n      } else {\n        // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\n        pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n      }\n    }\n\n    previous = current\n\n    text = stripTags(trim(heading.innerHTML))\n\n    if (isFunction(chapterTextFilter)) {\n      text = chapterTextFilter(text)\n    }\n\n    chapters.push({\n      id: i,\n      pid: pid,\n      level: level,\n      rel: `heading-${i}`,\n      text,\n      tagName\n    })\n  })\n\n  return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n  if (!isString(str)) {\n    return ''\n  }\n  return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n  let previous = chapters[index - 1]\n  let pid\n  let i\n\n  for (i = 0; i < differ; i += 1) {\n    pid = previous.pid\n    previous = chapters[pid]\n  }\n\n  pid = previous.pid\n\n  return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n  const groups = {}\n  const cb = (o) => {\n    return [o.pid]\n  }\n\n  chapters.forEach((o) => {\n    const group = JSON.stringify(cb(o))\n\n    groups[group] = groups[group] || []\n    groups[group].push(o)\n\n    o.index = groups[group].length\n    if (o.pid === -1) {\n      o.code = String(o.index)\n    }\n  })\n\n  Object.keys(groups).forEach((group) => {\n    groups[group].forEach((c) => {\n      const subjects = groups[`[${c.id}]`]\n      if (!subjects || !isArray(subjects)) {\n        return false\n      }\n      subjects.forEach((o) => {\n        o.code = c.code + '.' + o.index\n      })\n    })\n  })\n\n  return chapters\n}\n\nexport default _getChaptersWithCode\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n  return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n  return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n  let found = _hasDirectSubscribersFor(topic)\n  let position = topic.lastIndexOf('.')\n\n  while (!found && position !== -1) {\n    topic = topic.substring(0, position)\n    position = topic.lastIndexOf('.')\n    found = _hasDirectSubscribersFor(topic)\n  }\n\n  return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n  const execute = (topic) => {\n    if (!_hasDirectSubscribersFor(topic)) {\n      return false\n    }\n\n    _subscribers[topic].forEach((subscriber) => {\n      // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n      // 采用 toString() 方法转化为普通(JSON)字符串\n      const message = isTypedArray(data) ? data.toString() : data\n\n      subscriber.callback.call(subscriber.context || subscriber, message)\n    })\n  }\n  const deliver = () => {\n    let subscriber = topic\n    let position = topic.lastIndexOf('.')\n\n    while (position !== -1) {\n      subscriber = subscriber.substring(0, position)\n      position = subscriber.lastIndexOf('.')\n\n      execute(subscriber)\n    }\n\n    // 执行 topic 对应的处理器\n    execute(topic)\n    // 执行特殊 topic:'*'(监听全部消息的发布)\n    execute('*')\n  }\n\n  if (!has(topic)) {\n    return false\n  }\n\n  if (async) {\n    setTimeout(deliver, 10)\n  } else {\n    deliver()\n  }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n  const TYPES = [\n    '[object Int8Array]',\n    '[object Uint8Array]',\n    '[object Uint8ClampedArray]',\n    '[object Int16Array]',\n    '[object Uint16Array]',\n    '[object Int32Array]',\n    '[object Uint32Array]',\n    '[object Float32Array]',\n    '[object Float64Array]',\n    '[object BigInt64Array]',\n    '[object BigUint64Array]'\n  ]\n\n  return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n  let uuid = 0\n\n  return (prefix) => {\n    uuid += 1\n\n    return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n  }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n  if (!hasOwn(_subscribers, topic)) {\n    return false\n  }\n\n  delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n  if (!has(topic)) {\n    return false\n  }\n\n  if (token) {\n    _removeSubscriberByToken(token)\n  } else {\n    _removeSubscriber(topic)\n  }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n  const keys = Object.keys(_subscribers)\n  let index = -1\n\n  if (!token || keys.length < 1) {\n    return false\n  }\n\n  keys.forEach((subject) => {\n    const subscriber = _subscribers[subject]\n    let topic\n\n    subscriber.forEach((execution, j) => {\n      if (execution.callback === token || execution.token === token) {\n        topic = execution.topic\n        subscriber.splice(index, j)\n      }\n    })\n\n    /* istanbul ignore else */\n    if (subscriber.length < 1) {\n      _removeSubscriber(topic)\n    }\n  })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n  constructor(options) {\r\n    this.attrs = {}\r\n\r\n    if (options) {\r\n      this.initialize(options)\r\n    }\r\n  }\r\n\r\n  initialize(options) {\r\n    this.attr(options).render().addListeners()\r\n    return this\r\n  }\r\n\r\n  attr(prop, value) {\r\n    const attrs = this.attrs\r\n\r\n    if (isString(prop)) {\r\n      // 只能扩展 attrs 中已有的属性\r\n      if (value && hasOwn(attrs, prop)) {\r\n        // 更新单个配置信息\r\n        attrs[prop] = value\r\n        return this\r\n      }\r\n\r\n      // 只传递 prop 参数,则返回对应的属性值\r\n      return attrs[prop]\r\n    } else if (isObject(prop)) {\r\n      // 批量更新配置信息\r\n      extend(attrs, prop)\r\n\r\n      return this\r\n    } else if (arguments.length === 0) {\r\n      // 不传递参数,直接返回整个\r\n      return attrs\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  render() {\r\n    return this\r\n  }\r\n\r\n  destroy() {\r\n    this.removeListeners()\r\n    return this\r\n  }\r\n\r\n  reload(options) {\r\n    this.destroy().initialize(this.attr(options))\r\n    return this\r\n  }\r\n\r\n  $emit(event, data) {\r\n    publish(event, data)\r\n    return this\r\n  }\r\n\r\n  $on(event, callback) {\r\n    subscribe(event, callback, this)\r\n    return this\r\n  }\r\n\r\n  $off(event, callback) {\r\n    unsubscribe(event, callback)\r\n    return this\r\n  }\r\n\r\n  addListeners() {\r\n    return this\r\n  }\r\n\r\n  removeListeners() {\r\n    return this\r\n  }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n  const keys = Object.keys(source)\n\n  keys.forEach((prop) => {\n    if (hasOwn(source, prop)) {\n      origin[prop] = source[prop]\n    }\n  })\n}\n\nexport default extend\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n  const token = guid()\n  let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n  if (!isFunction(handler)) {\n    return ''\n  }\n\n  /* istanbul ignore else */\n  if (!_subscribers[subject]) {\n    _subscribers[subject] = []\n  }\n\n  _subscribers[subject].push({\n    topic: subject,\n    callback: handler,\n    context,\n    token\n  })\n\n  return token\n}\n\nexport default on\n","import isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport timeSlice from './utils/lang/timeSlice'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nimport Base from './base'\n\nclass Anchors extends Base {\n  constructor(options) {\n    super()\n\n    this.attrs = Anchors.DEFAULTS\n    this.$articleElement = null\n    this.$scrollElement = null\n    this.$headings = []\n    this.chapters = []\n\n    if (options) {\n      this.initialize(options)\n    }\n  }\n\n  initialize(options) {\n    const showCode = this.attr('showCode') || true\n    let created\n    let scrollElement\n    let selector\n    let $articleElement\n    let articleElement\n\n    this.attr(options)\n    articleElement = this.attr('articleElement')\n    scrollElement = this.attr('scrollElement')\n    selector = this.attr('selector')\n    created = this.attr('created')\n\n    if (isString(articleElement)) {\n      $articleElement = document.querySelector(articleElement)\n    } else if (isElement(articleElement)) {\n      $articleElement = articleElement\n    }\n\n    if (!$articleElement) {\n      return this\n    }\n\n    this.$articleElement = $articleElement\n    this.$scrollElement = _getScrollElement(scrollElement)\n    this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n    if (this.$headings.length < 1) {\n      return this\n    }\n\n    this.chapters = getChapters(\n      this.$headings,\n      showCode,\n      this.attr('chapterTextFilter')\n    )\n\n    if (isFunction(created)) {\n      created.call(this)\n    }\n\n    this.render().addListeners()\n\n    return this\n  }\n\n  getChapters(isTreeStructured = false) {\n    const chapters = this.chapters\n    return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n  }\n\n  count() {\n    return this.chapters.length\n  }\n\n  render() {\n    const LIMIT = 400\n    const mounted = this.attr('mounted')\n    const hasAnchor = this.attr('hasAnchor')\n    const isAtStart = this.attr('isAtStart')\n    const showCode = this.attr('showCode')\n    const anchorURL = this.attr('anchorURL')\n    const count = this.count()\n    const $headings = [...this.$headings]\n    const chapters = this.getChapters()\n    const update = (headings, group) => {\n      headings.forEach(($heading, i) => {\n        const id = i + group * LIMIT\n        const chapterCode = chapters[id].code\n        _updateHeading($heading, id, {\n          hasAnchor,\n          isAtStart,\n          showCode,\n          chapterCode,\n          anchorURL\n        })\n      })\n    }\n    let groupIndex = -1\n\n    paint()\n\n    // 针对超长的文章,进行 timeSlice 处理\n    if (count > LIMIT) {\n      groupIndex += 1\n      // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\n      update($headings.splice(0, LIMIT), 0)\n      // 采用 timeSlice 处理机制绘制剩余的标题\n      while ($headings.length > 0) {\n        const once = $headings.splice(0, LIMIT)\n        timeSlice(\n          () => {\n            update(once, (groupIndex += 1))\n          },\n          () => {\n            this.$emit('anchors:all:paint')\n          }\n        )\n      }\n    } else {\n      update($headings, 0)\n    }\n\n    if (isFunction(mounted)) {\n      mounted.call(this)\n    }\n\n    return this\n  }\n\n  scrollTo(top, after) {\n    const el = this.$scrollElement\n\n    scrollTo(el, top, after)\n\n    return this\n  }\n\n  destroy() {\n    const hasAnchor = this.attr('hasAnchor')\n    const isAtStart = this.attr('isAtStart')\n    const beforeDestroy = this.attr('beforeDestroy')\n    const afterDestroy = this.attr('afterDestroy')\n    const $headings = this.$headings\n\n    if (isFunction(beforeDestroy)) {\n      beforeDestroy.call(this)\n    }\n\n    this.removeListeners()\n    $headings.forEach(($heading) => {\n      _resetHeading($heading, hasAnchor, isAtStart)\n    })\n\n    this.attr(Anchors.DEFAULTS)\n    this.$articleElement = null\n    this.$scrollElement = null\n    this.$headings = []\n    this.chapters = []\n\n    if (isFunction(afterDestroy)) {\n      afterDestroy.call(this)\n    }\n\n    return this\n  }\n\n  onAnchorTrigger(evt) {\n    const anchorURL = this.attr('anchorURL')\n    const afterScroll = this.attr('afterScroll')\n    const stickyHeight = this.attr('stickyHeight')\n    const $anchor = evt.delegateTarget\n    const $heading = $anchor.parentNode\n    const top = offsetTop($heading) - (stickyHeight + 10)\n    const $scrollElement = this.$scrollElement\n    const min = 0\n    const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n    const after = () => {\n      if (isFunction(afterScroll)) {\n        afterScroll.call(this, 'anchor')\n      }\n\n      later(() => {\n        this.$emit('toolbar:update', {\n          top,\n          min,\n          max\n        })\n      })\n    }\n\n    this.scrollTo(top, after)\n\n    if (!anchorURL) {\n      stop(evt)\n    }\n\n    return this\n  }\n\n  addListeners() {\n    const $articleElement = this.$articleElement\n\n    on(\n      $articleElement,\n      '.outline-heading__anchor',\n      'click',\n      this.onAnchorTrigger,\n      this,\n      true\n    )\n\n    return this\n  }\n\n  removeListeners() {\n    const $articleElement = this.$articleElement\n\n    off($articleElement, 'click', this.onAnchorTrigger)\n\n    return this\n  }\n}\n\nAnchors.DEFAULTS = {\n  scrollElement: 'html,body',\n  articleElement: '#article',\n  selector: 'h1,h2,h3,h4,h5,h6',\n  stickyHeight: 0,\n  anchorURL: '',\n  hasAnchor: true,\n  isAtStart: true,\n  showCode: false,\n  created: null,\n  mounted: null,\n  afterScroll: null,\n  beforeDestroy: null,\n  afterDestroy: null,\n  chapterTextFilter: null\n}\n\nexport default Anchors\n","const toTree = (list, nodeKey, parentKey) => {\r\n  const map = {}\r\n  const roots = []\r\n\r\n  list.forEach((item, i) => {\r\n    // initialize the map\r\n    map[item[nodeKey]] = i\r\n    // initialize the children\r\n    item.children = []\r\n  })\r\n\r\n  list.forEach((item) => {\r\n    const node = list[map[item[parentKey]]]\r\n\r\n    if (item[parentKey] !== -1) {\r\n      // if you have dangling branches check that map[node.parentId] exists\r\n      node.children.push(item)\r\n    } else {\r\n      roots.push(item)\r\n    }\r\n  })\r\n\r\n  return roots\r\n}\r\n\r\nexport default toTree\r\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n  const $scrollElement = _getScrollElement(scrollElement)\n  let scrollTop = $scrollElement.scrollTop\n  let step = 0\n  const distance = top - scrollTop\n  const MAX_HEIGHT = $scrollElement.scrollHeight\n  const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n  const stop = (top) => {\n    if (isFunction(afterStop)) {\n      afterStop(top)\n    }\n\n    return false\n  }\n  const play = () => {\n    step += 1\n\n    // 向上滚动\n    if (distance < 0) {\n      scrollTop -= easeInQuad(step)\n      $scrollElement.scrollTop = scrollTop\n\n      if (scrollTop <= top) {\n        $scrollElement.scrollTop = top\n        return stop(top)\n      }\n    } else {\n      scrollTop += easeInQuad(step)\n      $scrollElement.scrollTop = scrollTop\n\n      if (scrollTop >= MAX_TOP) {\n        $scrollElement.scrollTop = MAX_TOP\n        return stop(MAX_TOP)\n      }\n    }\n\n    requestAnimationFrame(play)\n  }\n\n  requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n * 
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","length","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","push","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","offsetTop","el","top","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","forEach","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","arguments","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","call","addEventListener","isArray","Array","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","exec","iconName","getSymbol","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","obj","prop","hasOwnProperty","setAttributes","attrs","keys","attr","value","toLowerCase","style","cssText","setAttribute","className","innerText","options","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","pattern","RegExp","test","isSVG","xmlns","class","_updateHeading","$heading","CLS_HEADING","hasAnchor","isAtStart","showCode","chapterCode","anchorURL","headingId","text","$anchor","icon","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","href","removeClass","classList","allClass","contains","hasClass","remove","_resetHeading","removeAttribute","removeChild","getChapters","headings","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","rel","groups","group","JSON","stringify","code","String","c","subjects","_getChaptersWithCode","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","this","initialize","render","addListeners","origin","source","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","LIMIT","mounted","update","groupIndex","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","stopPropagation","preventDefault"],"mappings":"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"} \ No newline at end of file diff --git a/docs/js/chapters.min.js b/docs/js/chapters.min.js new file mode 100644 index 00000000..b644cca6 --- /dev/null +++ b/docs/js/chapters.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chapters=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t,n={},l=t=>e(n,t)&&n[t].length>0,o=(t,e=!0)=>e?l(t):(t=>{let e=l(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=l(t);return e})(t),a=(t,e,i=!0)=>{const r=t=>{if(!l(t))return!1;n[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},a=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!o(t))return!1;i?setTimeout(a,10):a()},c=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),h=t=>{if(!e(n,t))return!1;delete n[t]},u=(t,e)=>{if(!o(t))return!1;e?(t=>{const e=Object.keys(n);if(!t||e.length<1)return!1;e.forEach((e=>{const s=n[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&h(i)}))})(e):h(t)};class d{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const n=this.attrs;return t(s)?i&&e(n,s)?(n[s]=i,this):n[s]:r(s)?(l=n,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(l[t]=o[t])})),this):0===arguments.length?n:this;var l,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}$emit(t,e){return a(t,e),this}$on(t,e){return((t,e,s=null)=>{const r=c();let l="symbol"==typeof t?t.toString():t;i(e)&&(n[l]||(n[l]=[]),n[l].push({topic:l,callback:e,context:s,token:r}))})(t,e,this),this}$off(t,e){return u(t,e),this}addListeners(){return this}removeListeners(){return this}}const p=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),m=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),f=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],g=(t,e,s)=>{const i=f.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const n=t.fn;e===t.type&&(r=i,n===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},y=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,n=r.childNodes,l=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);l.forEach((t=>{g(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&n&&n.forEach((t=>{p(t)&&y(t,s,i)}))},b=(t,e,s)=>{if(!i(s))return y(t,e);g(t,e,s)},$=(t,e,s,r,n,l=!1)=>{const o=f.indexOf(e)>-1,a=function(i){let o=n||t;!0===n&&(o=r),!0===l&&b(t,e,a),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:a,data:r,context:n,capture:o}),s._delegateListener=a,t.addEventListener(e,a,o)},T=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},v=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,_=(t,e,s,i,r,n,l=!1)=>{const o=f.indexOf(s)>-1,a=function(o){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),h=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&T(t,e):T(t,e))||i&&t===r)return t;if(t===r)break}while(t=v(t))})(c,e,t);let u=n||t;o.delegateTarget=h,!0===n&&(u=r),h&&(!0===l&&b(t,s,a),i.call(u,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:r,context:n,capture:o}),i._delegateListener=a,t.addEventListener(s,a,o)},x=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),E=t=>{return!(!r(t)||!(p(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},k=(s,i,n)=>{const l=document.createDocumentFragment(),o=document.createElement(s),a=e=>E(e)||t(e),c=e=>{let s;if(!a(e))return!1;E(e)?s=e:t(e)&&(s=document.createTextNode(e)),l.appendChild(s)};return r(i)?((t,s)=>{if(!t||!r(s))return!1;Object.keys(s).forEach((i=>{const r=s[i];e(s,i)&&((t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}})(t,i,r)}))})(o,i):x(i)&&i.every((t=>a(t)))?i.forEach((t=>{c(t)})):E(i)?c(i):t(i)&&c(document.createTextNode(i)),x(n)?n.forEach((t=>{c(t)})):c(n),o.appendChild(l),o},S=t=>t*t,w=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):p(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},C=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!p(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},A=(t,e)=>{let s,i;if(C(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},j=(e,s)=>{let i,r=e.className;if(!r||!C(e,s))return!1;var n;i=e.classList,i?.remove?i.remove(s):(n=r.replace(s,""),r=!!t(n)&&n.replace(/(^\s+)|(\s+$)/g,""),e.className=r)},N=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=N(t.offsetParent)),e},O=(t,e)=>getComputedStyle(t)[e],L=(t,e)=>{document.documentElement.style.setProperty(t,e)},I=t=>{let e={};return null===t?null:(x(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=r(t[s])?I(t[s]):t[s]))),e)},F=[];let q,z;function H(t){for(;t.timeRemaining()>0&&F.length;){const t=F.shift();if(!i(t))return!1;t()}F.length?q=requestIdleCallback(H):(q=0,i(z)&&(z(),z=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return m((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const D=(t,e=null)=>{F.push(t),i(e)&&(z=e),q||requestIdleCallback(H)};class M extends d{constructor(t){super(),this.attrs=I(M.DEFAULTS),this._reset(),this.offsetWidth=0,this.playing=!1,this.scrollTimer=null,this.resizeTimer=null,this.Observer=null,t&&this.initialize(t)}_reset(){return this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetTop=0,this.closed=!1,this}initialize(e){let s,r,n,l;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),n=this.attr("scrollElement"),t(r)?l=document.querySelector(r):p(r)&&(l=r),this.$parentElement=l,this.$scrollElement=w(n),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("animationCurrent"),i=this.attr("customClass"),r=this.$parentElement,n=[],l=[];let o,a,c,h,u=null;return r?(this.isInside()&&e&&(u=k("h2",{className:"outline-chapters__title"},e),this.$title=u,l.push(u)),c=k("ul",{className:"outline-chapters__list"}),this.$list=c,n.push(c),s&&(h=k("div",{className:"outline-chapters__placeholder"}),this.$placeholder=h,n.push(h)),a=k("div",{className:"outline-chapters__main"},n),this.$main=a,l.push(a),o=k("nav",{id:"outline-chapters",className:"outline-chapters outline-chapters_hidden"},l),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),A(o,"outline-chapters_sticky")),i&&A(o,i),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("showCode"),e=this.attr("mounted"),s=this.$parentElement,r=this.chapters,n=this.count();let l,o;return!s||r.length<1||(this.isInside()&&A(s,"outline-chapters-parent"),this._paintEdge(),l=this.$el,o=this.$list,((t,e,s=!1)=>{const i=e.length,r=[...e],n=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,l=e.rel,o=[],a=k("span",{className:"outline-chapters__text"},e.text);let c,h,u,d,p;s&&(h=k("span",{className:"outline-chapters__code","data-id":n},e.code),o.push(h)),o.push(a),c=k("a",{id:`chapter__anchor-${n}`,className:"outline-chapters__anchor",href:"#"+l,rel:l,"data-id":n},o),u=k("li",{id:`chapter-${n}`,className:"outline-chapters__item","data-id":n},c),-1===r?t.appendChild(u):(p=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(u):(d=k("ul",{id:"subject-"+r,className:"outline-chapters__subject"},u),p.appendChild(d)))}))};if(i>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);D((()=>{n(t)}))}else n(r)})(o,r,t),j(l,"outline-chapters_hidden"),m((()=>{this.highlight(this.active)}),60),this.offsetTop=N(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),L("--outline-chapters-width",`${this.offsetWidth}px`)),i(e)&&e.call(this),n<400&&this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),n=this.attr("animationCurrent"),l=parseInt(O(e,"padding-top"),10),o=parseInt(O(e,"border-top-width"),10),a=parseInt(O(s,"padding-top"),10),c=parseInt(O(s,"margin-top"),10),h=parseInt(O(s,"border-top-width"),10);let u,d=r.offsetHeight,p=0;return n?(l&&(p+=l),a&&(p+=a),c&&(p+=c),o&&(p+=o),h&&(p+=h),u=d*t,i.style.cssText=`transform: translateY(${p+u}px);height:${d}px;`,this):this}highlight(t){const e=this.attr("animationCurrent"),s=this.$el.querySelector(`#chapter__anchor-${t}`),i="outline-chapters_active",r="outline-chapters_highlight";return s?(this.active=parseInt(s.getAttribute("data-id"),10),this.$active&&(j(this.$active,r),j(this.$active,i)),this.$active=s,A(this.$active,i),e?this.positionPlaceholder(this.active):A(this.$active,r),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let l;return this.isFixed()?(l=n>=r,l?A(s,e):j(s,e),i(t)&&t.call(this,this.isClosed(),l),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return L("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){return((t,e,s)=>{const r=w(t);let n=r.scrollTop,l=0;const o=e-n,a=r.scrollHeight,c=e-a<=0?e:a,h=t=>(i(s)&&s(t),!1),u=()=>{if(l+=1,o<0){if(n-=S(l),r.scrollTop=n,n<=e)return r.scrollTop=e,h(e)}else if(n+=S(l),r.scrollTop=n,n>=c)return r.scrollTop=c,h(c);requestAnimationFrame(u)};requestAnimationFrame(u)})(this.$scrollElement,t,e),this}show(){const t="outline-chapters_hidden",e=this.attr("afterOpened"),s=this.count(),r=this.$el,n=this.$parentElement;return this.isInside()?s>800?j(n,t):(j(n,t),m((()=>{j(n,"outline-chapters_folded")}),30)):j(r,t),this.closed=!1,i(e)&&e.call(this),this}hide(){const t="outline-chapters_hidden",e=this.attr("afterClosed"),s=this.count(),r=this.$el,n=this.$parentElement;return this.isInside()?s>800?A(n,t):(A(n,"outline-chapters_folded"),m((()=>{A(n,t)}))):A(r,t),this.closed=!0,i(e)&&e.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&m((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(M.DEFAULTS)._reset(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",n=e.context||null,l={rootMargin:e.rootMargin||"0px 0px -90% 0px"},o=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(n||e.target,e.target)}))}),l),a=p(s)?s:document;return s&&(l.root=s),a.querySelectorAll(r).forEach((t=>{o.observe(t)})),o})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=m((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),n=s.href.split("#")[1],l=document.querySelector(`#${n}`),o=N(l)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),h=()=>{i(c)&&c.call(this,"chapter"),m((()=>{this.playing=!1,this.$emit("toolbar:update",{top:o,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),m((()=>{this.scrollTo(o,h),this.highlight(r)}),10)):(this.scrollTo(o,h),this.highlight(r)),function(t){t.stopPropagation(),t.preventDefault()}(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=m((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=m((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),_(t,".outline-chapters__anchor","click",this.onSelect,this,!0),$(i,"scroll",this.onScroll,this,!0),this.isSticky()&&$(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),b(e,"click",this.onSelect),b(r,"scroll",this.onScroll),this.isSticky()&&$(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}return M.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null},M})); +//# sourceMappingURL=chapters.min.js.map diff --git a/docs/js/chapters.min.js.map b/docs/js/chapters.min.js.map new file mode 100644 index 00000000..96015c94 --- /dev/null +++ b/docs/js/chapters.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chapters.min.js","sources":["../../utils/types/isString.js","../../utils/lang/hasOwn.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/lang/extend.js","../../utils/observer/on.js","../../utils/types/isElement.js","../../utils/lang/later.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/at.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/types/isArray.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/createElement.js","../../utils/dom/setAttributes.js","../../utils/dom/setAttribute.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/removeClass.js","../../utils/lang/trim.js","../../utils/dom/offsetTop.js","../../utils/dom/getStyle.js","../../utils/dom/setProperty.js","../../utils/lang/cloneDeep.js","../../utils/lang/timeSlice.js","../../chapters.js","../../_paintChapters.js","../../utils/dom/scrollTo.js","../../utils/dom/intersection.js","../../utils/event/stop.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n setAttributes($el, attrs)\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n } else if (isDOM(attrs)) {\n append(attrs)\n } else if (isString(attrs)) {\n append(document.createTextNode(attrs))\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n if (!el || !isObject(attrs)) {\n return false\n }\n\n Object.keys(attrs).forEach((attr) => {\n const value = attrs[attr]\n if (hasOwn(attrs, attr)) {\n setAttribute(el, attr, value)\n }\n })\n}\n\nexport default setAttributes\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'htmlFor':\n el.setAttribute('for', value)\n break\n case 'className':\n el.className = value\n break\n case 'innerHTML':\n el.innerHTML = value\n break\n case 'innerText':\n el.innerText = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\n * timeSlice.js 时间切片功能函数\n * ====================================================\n * Created By: Yaohaixiao\n * Update: 2023.09.04\n */\nimport isFunction from '../types/isFunction'\nimport later from './later'\n\nconst queue = []\nlet isHandling\nlet done\n\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\nif (typeof window.requestIdleCallback === 'undefined') {\n window.requestIdleCallback = function (cb) {\n const start = Date.now()\n return later(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start))\n }\n })\n }, 10)\n }\n\n window.cancelIdleCallback = function (id) {\n clearTimeout(id)\n }\n}\n\nfunction runIdle(idleDeadline) {\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\n const fn = queue.shift()\n\n if (!isFunction(fn)) {\n return false\n }\n\n fn()\n }\n\n if (queue.length) {\n isHandling = requestIdleCallback(runIdle)\n } else {\n isHandling = 0\n\n if (isFunction(done)) {\n done()\n done = null\n }\n }\n}\n\n/**\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\n * 多个短时间任务\n * ====================================================\n * @param {Function} fn - 需要在空闲时执行的回调函数\n * @param {Function} afterComplete - queen 的\n * @return {(function(): (boolean|undefined))|*|boolean}\n */\nconst timeSlice = (fn, afterComplete = null) => {\n queue.push(fn)\n\n if (isFunction(afterComplete)) {\n done = afterComplete\n }\n\n if (!isHandling) {\n requestIdleCallback(runIdle)\n }\n}\n\nexport default timeSlice\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport cloneDeep from './utils/lang/cloneDeep'\n\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Chapters.DEFAULTS)\n\n this._reset()\n\n this.offsetWidth = 0\n this.playing = false\n this.scrollTimer = null\n this.resizeTimer = null\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n _reset() {\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.$active = null\n\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.closed = false\n\n return this\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n count() {\n return this.chapters.length\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const animationCurrent = this.attr('animationCurrent')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const children = []\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n title\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement('ul', {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n })\n this.$list = $list\n children.push($list)\n\n if (animationCurrent) {\n $placeholder = createElement('div', {\n className: 'outline-chapters__placeholder'\n })\n this.$placeholder = $placeholder\n children.push($placeholder)\n }\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n children\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n const count = this.count()\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n if (this.isInside()) {\n addClass($parentElement, 'outline-chapters-parent')\n }\n\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n\n later(() => {\n this.highlight(this.active)\n }, 60)\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n if (count < 400) {\n this.onObserver()\n }\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const animationCurrent = this.attr('animationCurrent')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (!animationCurrent) {\n return this\n }\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const animationCurrent = this.attr('animationCurrent')\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const ACTIVE = 'outline-chapters_active'\n const HIGHLIGHT = 'outline-chapters_highlight'\n\n if (!$anchor) {\n return this\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n removeClass(this.$active, ACTIVE)\n }\n\n this.$active = $anchor\n addClass(this.$active, ACTIVE)\n\n if (animationCurrent) {\n this.positionPlaceholder(this.active)\n } else {\n addClass(this.$active, HIGHLIGHT)\n }\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n removeClass($parent, HIDDEN)\n } else {\n removeClass($parent, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n }, 30)\n }\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n addClass($parent, HIDDEN)\n } else {\n addClass($parent, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n })\n }\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)._reset()\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at(window, 'resize', this.onResize, this, true)\n }\n this.$on('anchors:all:paint', this.onObserver, this)\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at(window, 'resize', this.onResize)\n }\n\n this.$off('anchors:all:paint')\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n animationCurrent: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\nimport timeSlice from './utils/lang/timeSlice'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const LIMIT = 400\n const count = chapters.length\n const clones = [...chapters]\n const paint = (parts) => {\n const byId = (id) => $list.querySelector(`#${id}`)\n parts.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const children = []\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n chapter.text\n )\n let $link\n let $code\n let $li\n let $subject\n let $chapter\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n chapter.code\n )\n\n children.push($code)\n }\n\n children.push($text)\n\n $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n children\n )\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n $link\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $chapter = byId(`chapter-${pid}`)\n $subject = byId(`subject-${pid}`)\n\n if (!$subject) {\n $subject = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n $li\n )\n\n $chapter.appendChild($subject)\n } else {\n $subject.appendChild($li)\n }\n }\n })\n }\n\n if (count > LIMIT) {\n // 同步绘制\n paint(clones.splice(0, LIMIT))\n // 剩余的采用 timeSlice 机制绘制\n while (clones.length > 0) {\n const once = clones.splice(0, LIMIT)\n timeSlice(() => {\n paint(once)\n })\n }\n } else {\n paint(clones)\n }\n}\n\nexport default _paintChapters\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","_subscribers","_hasDirectSubscribersFor","topic","length","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","forEach","subscriber","message","indexOf","callback","context","deliver","setTimeout","guid","uuid","prefix","_removeSubscriber","off","token","keys","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","arguments","destroy","removeListeners","reload","$emit","event","publish","$on","handler","push","subscribe","$off","unsubscribe","isElement","nodeName","tagName","nodeType","later","fn","delay","CAPTURE_EVENTS","_off","el","type","capture","_delegateListener","listeners","_listeners","index","listener","i","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","filter","getListeners","$child","at","once","evt","overrideContext","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","className","innerHTML","innerText","setAttributes","every","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","querySelectorAll","scrollTop","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","offsetTop","top","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","cloneDeep","clone","from","assign","key","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","Chapters","super","DEFAULTS","_reset","offsetWidth","playing","scrollTimer","resizeTimer","Observer","$title","$main","$list","$placeholder","$parentElement","$active","chapters","active","closed","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","count","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","showCode","mounted","clones","paint","parts","byId","chapter","pid","rel","$text","text","$link","$code","$li","$subject","$chapter","code","href","_paintChapters","highlight","sticky","onObserver","positionPlaceholder","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","height","offsetHeight","ACTIVE","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","clientHeight","innerHeight","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","show","HIDDEN","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","removeChild","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","$heading","onSelect","stickyHeight","headingId","split","afterScroll","min","stopPropagation","preventDefault","onScroll","onResize","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file diff --git a/docs/js/drawer.min.js b/docs/js/drawer.min.js new file mode 100644 index 00000000..820b3122 --- /dev/null +++ b/docs/js/drawer.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Drawer=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),l=t=>"function"==typeof t||"[object Function]"===s(t),i=t=>("[object Object]"===s(t)||"object"==typeof t||l(t))&&null!==t,o={},r=t=>e(o,t)&&o[t].length>0,n=(t,e=!0)=>e?r(t):(t=>{let e=r(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=r(t);return e})(t),a=(t,e,l=!0)=>{const i=t=>{if(!r(t))return!1;o[t].forEach((t=>{const l=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,l)}))},a=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),i(e);i(t),i("*")};if(!n(t))return!1;l?setTimeout(a,10):a()},c=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),h=t=>{if(!e(o,t))return!1;delete o[t]},d=(t,e)=>{if(!n(t))return!1;e?(t=>{const e=Object.keys(o);if(!t||e.length<1)return!1;e.forEach((e=>{const s=o[e];let l;s.forEach(((e,i)=>{e.callback!==t&&e.token!==t||(l=e.topic,s.splice(-1,i))})),s.length<1&&h(l)}))})(e):h(t)};class u{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,l){const o=this.attrs;return t(s)?l&&e(o,s)?(o[s]=l,this):o[s]:i(s)?(r=o,n=s,Object.keys(n).forEach((t=>{e(n,t)&&(r[t]=n[t])})),this):0===arguments.length?o:this;var r,n}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}$emit(t,e){return a(t,e),this}$on(t,e){return((t,e,s=null)=>{const i=c();let r="symbol"==typeof t?t.toString():t;l(e)&&(o[r]||(o[r]=[]),o[r].push({topic:r,callback:e,context:s,token:i}))})(t,e,this),this}$off(t,e){return d(t,e),this}addListeners(){return this}removeListeners(){return this}}const m=(t,e=300)=>!!l(t)&&setTimeout((()=>{t()}),e),p=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),y=t=>{let e={};return null===t?null:(p(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?y(t[s]):t[s]))),e)},f=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),v=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let l,i;return!!f(t)&&(l=t.className,!!l&&(i=t.classList,i?.contains?t.classList.contains(e):!!s.exec(l)))},b=(t,e)=>{let s,l;if(v(t,e))return!1;s=t.classList,s?.add?s.add(e):(l=t.className,l+=l.length>0?" "+e:e,t.className=l)},z=(e,s)=>{let l,i=e.className;if(!i||!v(e,s))return!1;var o;l=e.classList,l?.remove?l.remove(s):(o=i.replace(s,""),i=!!t(o)&&o.replace(/(^\s+)|(\s+$)/g,""),e.className=i)},g=t=>{return!(!i(t)||!(f(t)||(t=>!(!i(t)||"[object NodeList]"!==s(t)))(t)||(e=t,i(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!i(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},w=(t,s)=>{if(!t||!i(s))return!1;Object.keys(s).forEach((l=>{const i=s[l];e(s,l)&&((t,e,s)=>{let l=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===l||"textarea"===l?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}})(t,l,i)}))},x=(e,s,l)=>{const o=document.createDocumentFragment(),r=document.createElement(e),n=e=>g(e)||t(e),a=e=>{let s;if(!n(e))return!1;g(e)?s=e:t(e)&&(s=document.createTextNode(e)),o.appendChild(s)};return i(s)?w(r,s):p(s)&&s.every((t=>n(t)))?s.forEach((t=>{a(t)})):g(s)?a(s):t(s)&&a(document.createTextNode(s)),p(l)?l.forEach((t=>{a(t)})):a(l),r.appendChild(o),r},$=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},M=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,L=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],_=(t,e,s)=>{const l=L.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const l=t._listeners;let i=-1;if(l.length<1)return!1;l.forEach(((t,l)=>{const o=t.fn;e===t.type&&(i=l,o===s&&(i=l))})),i>-1&&l.splice(i,1)}(t,e,s),t.removeEventListener(e,s,l)},N=function(e,s,l=!1){const i=t(e)?document.querySelector(e):e,o=i.childNodes,r=((e,s)=>{let l=e._listeners||[];return t(s)&&s&&(l=l.filter((t=>t.type===s))),l})(i,s);r.forEach((t=>{_(i,t.type,t.fn)})),(l||!0===s||1===arguments.length)&&i&&o&&o.forEach((t=>{f(t)&&N(t,s,l)}))},j=(t,e,s)=>{if(!l(s))return N(t,e);_(t,e,s)},C=(t,e,s,l,i,o,r=!1)=>{const n=L.indexOf(s)>-1,a=function(n){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(n),h=((t,e,s,l)=>{const i=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===i&&$(t,e):$(t,e))||l&&t===i)return t;if(t===i)break}while(t=M(t))})(c,e,t);let d=o||t;n.delegateTarget=h,!0===o&&(d=i),h&&(!0===r&&j(t,s,a),l.call(d,n,i))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:i,context:o,capture:n}),l._delegateListener=a,t.addEventListener(s,a,n)},T=['','','','','','','','','','','','','','','','','','',''],A=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,l=/^(\w+)-/;return T.find((i=>{const o=s.exec(i)[1];return l.exec(o)[1]===e&&o===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...T],O=(e="")=>{const s=document.body;let l=document.querySelector("#outline-icons"),i=[];(e=>{if(!e)return!1;p(e)&&e.length>0?e.forEach((e=>{-1===T.indexOf(e)&&t(e)&&T.push(e)})):t(e)&&T.push(e)})(e),i=A(),l?l.innerHTML=i.join(""):(l=document.createElement("div"),l.innerHTML=``,s.insertBefore(l.firstChild,s.firstChild))},E=(e,s={})=>{const l="outline-icon",i=s.size||0,o=s.color||"",r=s.iconSet||"",n=p(i)?i[0]:i,a=p(i)?i[1]:i,c=i?`width:${n}px;height:${a}px;`:"",h=o?c+`color:${o}`:c,d=s.attrs||{},u=document.createElement("i");let m,y="",f="";return t(e)?((e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)})(e)?f=e:(y=r&&"icon"!==r?`xlink:href="#${r}-icon-${e}"`:`xlink:href="#icon-${e}"`,f=``),u.innerHTML=f,d.className?d.className=`${l} ${d.className}`:d.className=l,w(u,d),m=u.querySelector("svg"),w(m,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),u):null};let B=2e3;const k=t=>{var e,s;return t?B=t:B+=1,e="--outline-zIndex",s=`${B}`,document.documentElement.style.setProperty(e,s),B};class H extends u{constructor(t){super(),this.attrs=y(H.DEFAULTS),this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),i=this.attr("hasClose"),o=this.attr("hasOverlay"),r=this.attr("hasOffset"),n=this.attr("hasPadding"),a=this.attr("autoHeight"),c=this.attr("customClass");let h,d,u,m,p,y,f,v;return O(),this.zIndex=k(),m=x("h2",{className:"outline-drawer__title"},this.title),this.$title=m,i&&(p=x("div",{className:"outline-drawer__close"},((t,e={})=>E(t,e))("close",{iconSet:"outline",size:20})),this.$close=p),u=x("header",{className:"outline-drawer__header"},[m,p]),this.$header=u,y=x("div",{className:"outline-drawer__main"}),this.$main=y,n||b(y,"outline-drawer_full"),f=x("footer",{className:"outline-drawer__footer"}),this.$footer=f,d=x("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[u,y,f]),this.$modal=d,r&&b(d,"outline-drawer_offset"),a&&b(d,"outline-drawer_auto"),c&&b(d,c),o&&(v=x("div",{className:"outline-drawer__overlay"}),this.$overlay=v),h=x("div",{className:"outline-drawer"},[d,v]),this.$el=h,document.body.appendChild(h),l(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return b(this.$el,"outline-drawer_opened"),z(e,"outline-drawer_closed"),b(e,"outline-drawer_opened"),m((()=>{this.closed=!1,l(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return z(e,"outline-drawer_opened"),b(e,"outline-drawer_closed"),m((()=>{z(this.$el,"outline-drawer_opened"),this.closed=!0,l(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),l(t)&&m((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return l(e)&&e.call(this),this.removeListeners(),this.attrs=H.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,k(s),this.zIndex=0,l(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&C(s,".outline-drawer__close","click",this.onClose,this,!0),e&&C(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(j(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}return H.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null},H})); +//# sourceMappingURL=drawer.min.js.map diff --git a/docs/js/drawer.min.js.map b/docs/js/drawer.min.js.map new file mode 100644 index 00000000..7204aa47 --- /dev/null +++ b/docs/js/drawer.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"drawer.min.js","sources":["../../utils/types/isString.js","../../utils/lang/hasOwn.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/lang/extend.js","../../utils/observer/on.js","../../utils/lang/later.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/types/isElement.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/removeClass.js","../../utils/lang/trim.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/setAttributes.js","../../utils/dom/setAttribute.js","../../utils/dom/createElement.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../zIndex.js","../../utils/dom/setProperty.js","../../drawer.js","../../utils/icons/icon.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n if (!el || !isObject(attrs)) {\n return false\n }\n\n Object.keys(attrs).forEach((attr) => {\n const value = attrs[attr]\n if (hasOwn(attrs, attr)) {\n setAttribute(el, attr, value)\n }\n })\n}\n\nexport default setAttributes\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'htmlFor':\n el.setAttribute('for', value)\n break\n case 'className':\n el.className = value\n break\n case 'innerHTML':\n el.innerHTML = value\n break\n case 'innerText':\n el.innerText = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n setAttributes($el, attrs)\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n } else if (isDOM(attrs)) {\n append(attrs)\n } else if (isString(attrs)) {\n append(document.createTextNode(attrs))\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\nimport setAttributes from '../dom/setAttributes'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @param {Object} [options.attrs]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const ICON = 'outline-icon'\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const attrs = options.attrs || {}\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg = ``\n }\n\n $icon.innerHTML = svg\n\n if (attrs.className) {\n attrs.className = `${ICON} ${attrs.className}`\n } else {\n attrs.className = ICON\n }\n\n setAttributes($icon, attrs)\n\n $svg = $icon.querySelector('svg')\n setAttributes($svg, {\n 'aria-hidden': true,\n xmlns: 'http://www.w3.org/2000/svg',\n class: 'outline-icon__svg',\n width: 200,\n height: 200,\n style: cssRules\n })\n\n return $icon\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import setProperty from './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Drawer.DEFAULTS)\n this.title = ''\n this.closed = true\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n this.title\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n icon('close', { iconSet: 'outline', size: 20 })\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement('div', {\n className: 'outline-drawer__main'\n })\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement('footer', {\n className: 'outline-drawer__footer'\n })\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement('div', {\n className: 'outline-drawer__overlay'\n })\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","_subscribers","_hasDirectSubscribersFor","topic","length","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","forEach","subscriber","message","indexOf","callback","context","deliver","setTimeout","guid","uuid","prefix","_removeSubscriber","off","token","keys","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","arguments","destroy","removeListeners","reload","$emit","event","publish","$on","handler","push","subscribe","$off","unsubscribe","later","fn","delay","isArray","Array","cloneDeep","clone","from","assign","key","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","replace","isDOM","isHTMLCollection","fragment","isTextNode","setAttributes","toLowerCase","style","cssText","setAttribute","innerHTML","innerText","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","filter","getListeners","on","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","addEventListener","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","join","insertBefore","firstChild","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","zIndex","idx","documentElement","setProperty","Drawer","super","DEFAULTS","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","created","setTitle","isClosed","mounted","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","icon","open","opened","close","toggle","afterToggle","afterDestroy","beforeDestroy","onClose","afterClosed","afterOpened","afterScroll"],"mappings":"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"} \ No newline at end of file diff --git a/docs/js/message.min.js b/docs/js/message.min.js new file mode 100644 index 00000000..081876bd --- /dev/null +++ b/docs/js/message.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Message=t()}(this,(function(){"use strict";const e=e=>"string"==typeof e,t=e=>Object.prototype.toString.apply(e),s=e=>"function"==typeof e||"[object Function]"===t(e),i=e=>("[object Object]"===t(e)||"object"==typeof e||s(e))&&null!==e,o=e=>{const t=Object.getPrototypeOf;let s;if(!(e=>i(e)&&null!==e)(e))return!1;if(s=e.prototype,!s)return!0;for(s=e;null!==t(s);)s=t(s);return t(e)===s},r=(e,t)=>{const s=Object.prototype.hasOwnProperty;return e&&s.call(e,t)},n=(e,t)=>{Object.keys(t).forEach((s=>{r(t,s)&&(e[s]=t[s])}))},l=(e,t=300)=>!!s(e)&&setTimeout((()=>{e()}),t),c=e=>e.replace(/]*>.*?<\/script>/gi,""),a=e=>{const t={"&":"&","<":"<",">":">","'":"'",'"':"""};return e.replace(/[&<>'"]/g,(e=>t[e]||e))},h=e=>Array.isArray?Array.isArray(e):"[object Array]"===t(e),u=e=>{let t={};return null===e?null:(h(e)?t=Array.from(e):(t=Object.assign({},e),Object.keys(t).forEach((s=>t[s]=i(e[s])?u(e[s]):e[s]))),t)},d=(()=>{let e=0;return t=>(e+=1,t?t+"-"+e:"guid-"+e)})(),m=e=>!!(i(e)&&e.nodeName&&e.tagName&&1===e.nodeType),f=e=>{return!(!i(e)||!(m(e)||(e=>!(!i(e)||"[object NodeList]"!==t(e)))(e)||(s=e,i(s)&&"[object DocumentFragment]"===t(s))||(e=>!(!i(e)||!("[object Text]"===t(e)||e.tagName&&3===e.nodeType)))(e)));var s},p=(e,t,s)=>{let i=e.tagName.toLowerCase();switch(t){case"style":e.style.cssText=s;break;case"value":"input"===i||"textarea"===i?e.value=s:e.setAttribute(t,s);break;case"htmlFor":e.setAttribute("for",s);break;case"className":e.className=s;break;case"innerHTML":e.innerHTML=s;break;case"innerText":e.innerText=s;break;default:e.setAttribute(t,s)}},y=(e,t)=>{if(!e||!i(t))return!1;Object.keys(t).forEach((s=>{const i=t[s];r(t,s)&&p(e,s,i)}))},b=(t,s,o)=>{const r=document.createDocumentFragment(),n=document.createElement(t),l=t=>f(t)||e(t),c=t=>{let s;if(!l(t))return!1;f(t)?s=t:e(t)&&(s=document.createTextNode(t)),r.appendChild(s)};return i(s)?y(n,s):h(s)&&s.every((e=>l(e)))?s.forEach((e=>{c(e)})):f(s)?c(s):e(s)&&c(document.createTextNode(s)),h(o)?o.forEach((e=>{c(e)})):c(o),n.appendChild(r),n},g=(e,t)=>{const s=new RegExp("(\\s|^)"+t+"(\\s|$)");let i,o;return!!m(e)&&(i=e.className,!!i&&(o=e.classList,o?.contains?e.classList.contains(t):!!s.exec(i)))},v=(e,t)=>{let s,i;if(g(e,t))return!1;s=e.classList,s?.add?s.add(t):(i=e.className,i+=i.length>0?" "+t:t,e.className=i)},M=(t,s)=>{let i,o=t.className;if(!o||!g(t,s))return!1;var r;i=t.classList,i?.remove?i.remove(s):(r=o.replace(s,""),o=!!e(r)&&r.replace(/(^\s+)|(\s+$)/g,""),t.className=o)},z=(t,s={})=>{const i="outline-icon",o=s.size||0,r=s.color||"",n=s.iconSet||"",l=h(o)?o[0]:o,c=h(o)?o[1]:o,a=o?`width:${l}px;height:${c}px;`:"",u=r?a+`color:${r}`:a,d=s.attrs||{},m=document.createElement("i");let f,p="",b="";return e(t)?((t=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return e(t)&&s.test(t)})(t)?b=t:(p=n&&"icon"!==n?`xlink:href="#${n}-icon-${t}"`:`xlink:href="#icon-${t}"`,b=``),m.innerHTML=b,d.className?d.className=`${i} ${d.className}`:d.className=i,y(m,d),f=m.querySelector("svg"),y(f,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:u}),m):null},x=(e,t={})=>z(e,t),$=['','','','','','','','','','','','','','','','','','',''],L=(t,s="icon")=>e(t)?((e,t="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return $.find((o=>{const r=s.exec(o)[1];return i.exec(r)[1]===t&&r===("icon"===t?`${t}-${e}`:`${t}-icon-${e}`)}))})(t,s):[...$],_=(e,t="")=>{const s=t.replace(/^>/i,"");return!!(t&&s&&e)&&(e.matches?e.matches(s):!!e.msMatchesSelector&&e.msMatchesSelector(s))},w=e=>e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode,T=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],C=(e,t,s)=>{const i=T.indexOf(t)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(e,t,s){const i=e._listeners;let o=-1;if(i.length<1)return!1;i.forEach(((e,i)=>{const r=e.fn;t===e.type&&(o=i,r===s&&(o=i))})),o>-1&&i.splice(o,1)}(e,t,s),e.removeEventListener(t,s,i)},j=function(t,s,i=!1){const o=e(t)?document.querySelector(t):t,r=o.childNodes,n=((t,s)=>{let i=t._listeners||[];return e(s)&&s&&(i=i.filter((e=>e.type===s))),i})(o,s);n.forEach((e=>{C(o,e.type,e.fn)})),(i||!0===s||1===arguments.length)&&o&&r&&r.forEach((e=>{m(e)&&j(e,s,i)}))},E=(e,t,i)=>{if(!s(i))return j(e,t);C(e,t,i)},N=(e,t,s,i,o,r,n=!1)=>{const l=T.indexOf(s)>-1,c=function(l){const a=function(e){const t=e.target;return(s=t)&&3===s.nodeType?s.parentNode:s;var s}(l),h=((e,t,s,i)=>{const o=s||document;if(!e)return null;do{if(null!=t&&(t.startsWith(">")?e.parentNode===o&&_(e,t):_(e,t))||i&&e===o)return e;if(e===o)break}while(e=w(e))})(a,t,e);let u=r||e;l.delegateTarget=h,!0===r&&(u=o),h&&(!0===n&&E(e,s,c),i.call(u,l,o))};e._listeners||(e._listeners=[]),e._listeners.push({el:e,selector:t,type:s,fn:c,data:o,context:r,capture:l}),i._delegateListener=c,e.addEventListener(s,c,l)},A={},S=e=>r(A,e)&&A[e].length>0,H=(e,t=!0)=>t?S(e):(e=>{let t=S(e),s=e.lastIndexOf(".");for(;!t&&-1!==s;)s=(e=e.substring(0,s)).lastIndexOf("."),t=S(e);return t})(e),B=(e,s,i=!0)=>{const o=e=>{if(!S(e))return!1;A[e].forEach((e=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(t(s))>-1?s.toString():s;e.callback.call(e.context||e,i)}))},r=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),o(t);o(e),o("*")};if(!H(e))return!1;i?setTimeout(r,10):r()},k=e=>{if(!r(A,e))return!1;delete A[e]},O=(e,t)=>{if(!H(e))return!1;t?(e=>{const t=Object.keys(A);if(!e||t.length<1)return!1;t.forEach((t=>{const s=A[t];let i;s.forEach(((t,o)=>{t.callback!==e&&t.token!==e||(i=t.topic,s.splice(-1,o))})),s.length<1&&k(i)}))})(t):k(e)};class D{constructor(e){this.attrs={},e&&this.initialize(e)}initialize(e){return this.attr(e).render().addListeners(),this}attr(t,s){const o=this.attrs;return e(t)?s&&r(o,t)?(o[t]=s,this):o[t]:i(t)?(n(o,t),this):0===arguments.length?o:this}render(){return this}destroy(){return this.removeListeners(),this}reload(e){return this.destroy().initialize(this.attr(e)),this}$emit(e,t){return B(e,t),this}$on(e,t){return((e,t,i=null)=>{const o=d();let r="symbol"==typeof e?e.toString():e;s(t)&&(A[r]||(A[r]=[]),A[r].push({topic:r,callback:t,context:i,token:o}))})(e,t,this),this}$off(e,t){return O(e,t),this}addListeners(){return this}removeListeners(){return this}}const q=[];let I;((t="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),o=[];(t=>{if(!t)return!1;h(t)&&t.length>0?t.forEach((t=>{-1===$.indexOf(t)&&e(t)&&$.push(t)})):e(t)&&$.push(t)})(t),o=L(),i?i.innerHTML=o.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))})();class U extends D{constructor(e){super(),this.attrs=u(U.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,e&&this.initialize(e)}initialize(e){return this.attr(e),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",{...this.attr()}),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const e=this.attr("type"),t=this.attr("effect"),s=this.attr("round"),i=this.attr("closable"),o=this.attr("visible"),r=this.attr("customClass"),n=["outline-message",`outline-message_${e}`,`outline-message_${t}`];return s&&n.push("outline-message_round"),i||n.push("outline-message_full-width"),o&&n.push("outline-message_visible"),r&&n.push(r),n}render(){const e=this.attr("type"),t=this.attr("message"),s=this.attr("effect"),i=this.attr("round"),o=this.attr("closable"),r=this.attr("dangerouslyUseHTMLString"),n=this._getClassName(),l=[];let h,u,d,m,f,p=20;return i&&"default"===s&&(p=12),"plain"!==s&&(h=x("light"===s?`circle-${e}`:e,{iconSet:"outline",size:p}),v(h,"outline-message__icon"),l.push(h)),r?(d=document.createDocumentFragment(),d.innerHTML=t):d=document.createTextNode(a(c(t))),u=b("p",{className:"outline-message__content"},[d]),l.push(u),o&&(m=x("close",{iconSet:"outline",size:18}),v(m,"outline-message__close"),l.push(m)),f=b("div",{className:n.join(" ")},l),f.style.cssText="top:-50px;",this.$el=f,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const e=".outline-message_hidden",t=this.$el;let s,i,o,r,n,l,c,a=20;return this.isDestroyed()?this:(n=t.querySelector(".outline-icon"),n?(s=this.attr("type"),i=this.attr("effect"),o=this.attr("round"),"plain"===i?v(n,e):(M(n,e),o&&"default"===i&&(a=12)),l=n.querySelector(".outline-icon__svg"),y(l,{style:`width:${a}px;height:${a}px;`}),c=l.querySelector("use"),r="light"===i?`circle-${s}`:s,p(c,"xlink:href",`#outline-icon-${r}`),this):this)}_refreshMessage(){const e=this.$el;let t,s,i,o;return this.isDestroyed()||(t=e.querySelector(".outline-message__content"),s=this.attr("dangerouslyUseHTMLString"),i=this.attr("message"),o=s?i:a(c(i)),t.innerHTML=o),this}_refreshClose(){const e=".outline-message_hidden",t=this.$el;let s,i;return this.isDestroyed()||(s=t.querySelector(".outline-message__close"),i=this.attr("closable"),s&&(i?v(s,e):M(s,e))),this}_refreshEl(){const e=this.$el;let t;return this.isDestroyed()||(t=this._getClassName(),p(e,"className",t.join(" "))),this}refresh(e){return o(e)?(this.attr(e)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(e){return this.isDestroyed()||(this.timer=l((()=>{this.$emit("opened"),this.close()}),1e3*e)),this}open(e){const t=this.$el;let s,i,o,r;return this.isDestroyed()||(this.isClosed()&&this.refresh(e),s=this.attr("offset"),i=this.attr("duration"),o=s&&s>=this.offset?s:this.offset,r=`top:${o}px;`,this.clearTimer(),this.$emit("beforeOpen"),l((()=>{this.visible=!0,v(t,"outline-message_visible"),t.style.cssText=r,i>0&&this.startTimer(i)}),100)),this}close(){const e=this.$el;let t,i;return this.isDestroyed()||(t=this.attr("destroyAfterClosed"),i=this.attr("beforeClose"),s(i)&&i.call(this),e.style.cssText="top:-50px;",M(e,"outline-message_visible"),this.visible=!1,this.closed=!0,l((()=>{this.$emit("closed"),t&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),this.attr(U.DEFAULTS),this.id="",this.closed=!0,this.visible=!1,this.offset=-50,clearTimeout(this.timer),this.timer=null,this.destroyed=!0,this.$el=null,this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const e=this.attr("duration"),t=this.attr("delay");return e<=0||this.startTimer(t),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const e=this.$el;return N(e,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),N(e,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),N(e,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const e=this.$el;return E(e,"mouseenter",this.onMouseEnter),E(e,"mouseleave",this.onMouseLeave),E(e,"click",this.onClose),this}}return U.DEFAULTS={id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null},["info","success","warning","error"].forEach((t=>{U[t]=s=>{const i={},r=d("outline-message-"),l=s.beforeClose||null;let c=s.offset||30;return e(s)?i.message=s:o(s)&&n(i,s),i.id=r,i.type=t,i.offset=c,i.visible=!1,i.beforeClose=()=>{U.close(r,l)},I=new U(i),q.forEach((e=>{c+=e.$el.offsetHeight+16})),I.offset=c,I.open(),q.push(I),I}})),U.close=(e,t)=>{const i=q.length;let o,r,n=-1;if(q.forEach(((i,o)=>{e===i.id&&(r=i.$el.offsetHeight,n=o,s(t)&&t.call(i),q.splice(o,1))})),i<=1||-1===n||n>q.length-1)return!1;for(o=n;o{let e=q.length-1;for(;e>=0;e-=1)q[e].close()},U})); +//# sourceMappingURL=message.min.js.map diff --git a/docs/js/message.min.js.map b/docs/js/message.min.js.map new file mode 100644 index 00000000..f36cea14 --- /dev/null +++ b/docs/js/message.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"message.min.js","sources":["../../utils/types/isString.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/types/isPlainObject.js","../../utils/types/isObjectLike.js","../../utils/lang/hasOwn.js","../../utils/lang/extend.js","../../utils/lang/later.js","../../utils/lang/stripScripts.js","../../utils/lang/encodeHTML.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/lang/guid.js","../../utils/types/isElement.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/setAttribute.js","../../utils/dom/setAttributes.js","../../utils/dom/createElement.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/removeClass.js","../../utils/lang/trim.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../utils/icons/icon.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/observer/on.js","../../message.js","../../utils/icons/paint.js","../../utils/icons/add.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isObjectLike from './isObjectLike'\n\n/**\n * 检测测试数据是否为普通对象\n * ========================================================================\n * @method isPlainObject\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\n */\nconst isPlainObject = (val) => {\n const getPrototypeOf = Object.getPrototypeOf\n let proto\n\n // Detect obvious negatives\n if (!isObjectLike(val)) {\n return false\n }\n\n proto = val.prototype\n\n // JavaScript 对象分为两种:普通对象和函数对象\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\n if (!proto) {\n return true\n }\n\n proto = val\n\n while (getPrototypeOf(proto) !== null) {\n proto = getPrototypeOf(proto)\n }\n\n return getPrototypeOf(val) === proto\n}\n\nexport default isPlainObject\n","import isObject from './isObject'\n\n/**\n * 检测测试数据是否为类似 Object 类型\n * ========================================================================\n * @method isObjectLike\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\n */\nconst isObjectLike = (val) => {\n return isObject(val) && val !== null\n}\n\nexport default isObjectLike\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n *\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'htmlFor':\n el.setAttribute('for', value)\n break\n case 'className':\n el.className = value\n break\n case 'innerHTML':\n el.innerHTML = value\n break\n case 'innerText':\n el.innerText = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n if (!el || !isObject(attrs)) {\n return false\n }\n\n Object.keys(attrs).forEach((attr) => {\n const value = attrs[attr]\n if (hasOwn(attrs, attr)) {\n setAttribute(el, attr, value)\n }\n })\n}\n\nexport default setAttributes\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n setAttributes($el, attrs)\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n } else if (isDOM(attrs)) {\n append(attrs)\n } else if (isString(attrs)) {\n append(document.createTextNode(attrs))\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\nimport setAttributes from '../dom/setAttributes'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @param {Object} [options.attrs]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const ICON = 'outline-icon'\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const attrs = options.attrs || {}\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg = ``\n }\n\n $icon.innerHTML = svg\n\n if (attrs.className) {\n attrs.className = `${ICON} ${attrs.className}`\n } else {\n attrs.className = ICON\n }\n\n setAttributes($icon, attrs)\n\n $svg = $icon.querySelector('svg')\n setAttributes($svg, {\n 'aria-hidden': true,\n xmlns: 'http://www.w3.org/2000/svg',\n class: 'outline-icon__svg',\n width: 200,\n height: 200,\n style: cssRules\n })\n\n return $icon\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n document.body.removeChild(this.$el)\r\n\r\n this.attr(Message.DEFAULTS)\r\n\r\n this.id = ''\r\n this.closed = true\r\n this.visible = false\r\n this.offset = -50\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n this.destroyed = true\r\n\r\n this.$el = null\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n}\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isPlainObject","getPrototypeOf","proto","isObjectLike","hasOwn","obj","prop","hasOwnProperty","call","extend","origin","source","keys","forEach","later","fn","delay","setTimeout","stripScripts","replace","encodeHTML","CHARTS","tag","isArray","Array","cloneDeep","clone","from","assign","key","guid","uuid","prefix","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","setAttribute","attr","value","toLowerCase","style","cssText","className","innerHTML","innerText","setAttributes","attrs","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","add","length","removeClass","remove","name","options","ICON","size","color","iconSet","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","querySelector","xmlns","class","icon","SYMBOLS","getSymbols","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","arguments","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","this","initialize","render","addListeners","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","instances","instance","$body","body","$icons","symbols","join","insertBefore","firstChild","paint","Message","super","DEFAULTS","id","closed","visible","offset","timer","destroyed","open","isClosed","isDestroyed","_getClassName","effect","round","closable","customClass","dangerouslyUseHTMLString","$type","$message","$text","$close","iconSize","_refreshIcon","HIDDEN","$use","_refreshMessage","text","_refreshClose","_refreshEl","refresh","clearTimer","clearTimeout","startTimer","duration","close","top","destroyAfterClosed","beforeClose","removeChild","onMouseEnter","onMouseLeave","onClose","config","item","offsetHeight","len","dom","parseInt","clear"],"mappings":"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"} \ No newline at end of file diff --git a/docs/js/outline.min.js b/docs/js/outline.min.js index 18ec7b72..cc0b32bb 100644 --- a/docs/js/outline.min.js +++ b/docs/js/outline.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";const t=t=>Object.prototype.toString.apply(t),e=e=>"function"==typeof e||"[object Function]"===t(e),s=(t,s=300)=>!!e(t)&&setTimeout((()=>{t()}),s),i=s=>("[object Object]"===t(s)||"object"==typeof s||e(s))&&null!==s,r=e=>Array.isArray?Array.isArray(e):"[object Array]"===t(e),l=t=>{let e={};return null===t?null:(r(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?l(t[s]):t[s]))),e)},n=t=>"string"==typeof t,o=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),h=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!o(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},a=(t,e)=>{let s,i;if(h(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},c=t=>!!n(t)&&t.replace(/(^\s+)|(\s+$)/g,""),u=(t,e)=>{let s,i=t.className;if(!i||!h(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=c(i.replace(e,"")),t.className=i)},d=t=>t*t,p=(t=null)=>{let e,s;return t?n(t)?s=document.querySelector(t):o(t)&&(s=t):(e=document.querySelectorAll("html,body"),s=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),s},m=(t,s,i)=>{const r=p(t);let l=r.scrollTop,n=0;const o=s-l,h=r.scrollHeight,a=s-h<=0?s:h,c=t=>(e(i)&&i(t),!1),u=()=>{if(n+=1,o<0){if(l-=d(n),r.scrollTop=l,l<=s)return r.scrollTop=s,c(s)}else if(l+=d(n),r.scrollTop=l,l>=a)return r.scrollTop=a,c(a);requestAnimationFrame(u)};requestAnimationFrame(u)},f=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],g=(t,e,s)=>{const i=f.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},y=function(t,e,s=!1){const i=n(t)?document.querySelector(t):t,r=i.childNodes,l=((t,e)=>{let s=t._listeners||[];return n(e)&&e&&(s=s.filter((t=>t.type===e))),s})(i,e);l.forEach((t=>{g(i,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&i&&r&&r.forEach((t=>{o(t)&&y(t,e,s)}))},b=(t,s,i)=>{if(!e(i))return y(t,s);g(t,s,i)},$=(t,s,i,r,l,n=!1)=>{const o=f.indexOf(s)>-1,h=function(e){let o=l||t;!0===l&&(o=r),!0===n&&b(t,s,h),i.call(o,e,r)};if(!e(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},v=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},_=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,T=(t,e,s,i,r,l,n=!1)=>{const o=f.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&v(t,e):v(t,e))||i&&t===r)return t;if(t===r)break}while(t=_(t))})(a,e,t);let u=l||t;o.delegateTarget=c,!0===l&&(u=r),c&&(!0===n&&b(t,s,h),i.call(u,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},w=function(t){t.stopPropagation(),t.preventDefault()},E=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},S=(t,e)=>{Object.keys(e).forEach((s=>{E(e,s)&&(t[s]=e[s])}))},x={},C=t=>E(x,t)&&x[t].length>0,L=(t,e=!0)=>e?C(t):(t=>{let e=C(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=C(t);return e})(t),z=(e,s,i=!0)=>{const r=e=>{if(!C(e))return!1;x[e].forEach((e=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(t(s))>-1?s.toString():s;e.callback.call(e.context||e,i)}))},l=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),r(t);r(e),r("*")};if(!L(e))return!1;i?setTimeout(l,10):l()},k=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),M=t=>{if(!E(x,t))return!1;delete x[t]},A=(t,e)=>{if(!L(t))return!1;e?(t=>{const e=Object.keys(x);if(!t||e.length<1)return!1;e.forEach((e=>{const s=x[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&M(i)}))})(e):M(t)};class N{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return n(t)?e&&E(s,t)?(s[t]=e,this):s[t]:i(t)?(S(s,t),this):0===arguments.length?s:this}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}$emit(t,e){return z(t,e),this}$on(t,s){return((t,s,i=null)=>{const r=k();let l="symbol"==typeof t?t.toString():t;e(s)&&(x[l]||(x[l]=[]),x[l].push({topic:l,callback:s,context:i,token:r}))})(t,s,this),this}$off(t,e){return A(t,e),this}addListeners(){return this}removeListeners(){return this}}const D=[];let H,O;function q(t){for(;t.timeRemaining()>0&&D.length;){const t=D.shift();if(!e(t))return!1;t()}D.length?H=requestIdleCallback(q):(H=0,e(O)&&(O(),O=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return s((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const j=(t,s=null)=>{D.push(t),e(s)&&(O=s),H||requestIdleCallback(q)},F=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=F(t.offsetParent)),e},U=['','','','','','','','','','','','','','','','','','',''],I=(t,e="icon")=>n(t)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return U.find((r=>{const l=s.exec(r)[1];return i.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):[...U],R=(t="")=>{const e=document.body;let s=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;r(t)&&t.length>0?t.forEach((t=>{-1===U.indexOf(t)&&n(t)&&U.push(t)})):n(t)&&U.push(t)})(t),i=I(),s?s.innerHTML=i.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},B=e=>{return!(!i(e)||!(o(e)||(e=>!(!i(e)||"[object NodeList]"!==t(e)))(e)||(s=e,i(s)&&"[object DocumentFragment]"===t(s))||(e=>!(!i(e)||!("[object Text]"===t(e)||e.tagName&&3===e.nodeType)))(e)));var s},P=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}},V=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];E(e,s)&&P(t,s,i)}))},Q=(t,e,s)=>{const l=document.createDocumentFragment(),o=document.createElement(t),h=t=>B(t)||n(t),a=t=>{let e;if(!h(t))return!1;B(t)?e=t:n(t)&&(e=document.createTextNode(t)),l.appendChild(e)};return i(e)?V(o,e):r(e)&&e.every((t=>h(t)))?e.forEach((t=>{a(t)})):B(e)?a(e):n(e)&&a(document.createTextNode(e)),r(s)?s.forEach((t=>{a(t)})):a(s),o.appendChild(l),o},W=(t,e={})=>{const s="outline-icon",i=e.size||0,l=e.color||"",o=e.iconSet||"",h=r(i)?i[0]:i,a=r(i)?i[1]:i,c=i?`width:${h}px;height:${a}px;`:"",u=l?c+`color:${l}`:c,d=e.attrs||{},p=document.createElement("i");let m,f="",g="";return n(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return n(t)&&e.test(t)})(t)?g=t:(f=o&&"icon"!==o?`xlink:href="#${o}-icon-${t}"`:`xlink:href="#icon-${t}"`,g=``),p.innerHTML=g,d.className?d.className=`${s} ${d.className}`:d.className=s,V(p,d),m=p.querySelector("svg"),V(m,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:u}),p):null},J=(t,e={})=>W(t,e),Y=(t,e=!0,s=!0)=>{const i="outline-heading",r=t.innerHTML;let l;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),u(t,i),!e)return!1;var o;l=t.querySelector(`.${i}__anchor`),s&&u(t,`${i}_start`),o=c(t.className),n(o)&&""===o&&t.removeAttribute("class"),t.removeChild(l)},G=(t,s=!0,i=null)=>{let l=1,o=0,h="";const a=[];return t.forEach(((t,s)=>{const r=t.tagName,u=r.replace(/h/i,"");let d=parseInt(u,10),p=-1;var m;d>l?(o+=1,p=1===o?-1:s-1):d===l||do?1===d?(o=1,p=-1):p=a[s-1].pid:d<=o&&(1===d?o=1:(o-=l-d,o<=1&&(o=1)),p=1===o?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"",e(i)&&(h=i(h)),a.push({id:s,pid:p,level:o,rel:`heading-${s}`,text:h,tagName:r})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!r(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(a):a};class K extends N{constructor(t){super(),this.attrs=K.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(t){const s=this.attr("showCode")||!0;let i,r,l,h,a;return this.attr(t),a=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),i=this.attr("created"),n(a)?h=document.querySelector(a):o(a)&&(h=a),h?(this.$articleElement=h,this.$scrollElement=p(r),this.$headings=[...h.querySelectorAll(l)],this.$headings.length<1||(this.chapters=G(this.$headings,s,this.attr("chapterTextFilter")),e(i)&&i.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=400,s=this.attr("mounted"),i=this.attr("hasAnchor"),r=this.attr("isAtStart"),l=this.attr("showCode"),n=this.attr("anchorURL"),o=this.count(),h=[...this.$headings],a=this.getChapters(),u=(e,s)=>{e.forEach(((e,o)=>{const h=o+s*t,u=a[h].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,n=s.showCode||!1,o=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,u={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=c(t.innerHTML);let p,m;if(n&&(u.innerHTML=o+" "+d),V(t,u),!r)return!1;m=J("hash",{iconSet:"outline"}),p=Q("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},m),t.appendChild(p)})(e,h,{hasAnchor:i,isAtStart:r,showCode:l,chapterCode:u,anchorURL:n})}))};let d=-1;if(R(),o>t)for(d+=1,u(h.splice(0,t),0);h.length>0;){const e=h.splice(0,t);j((()=>{u(e,d+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else u(h,0);return e(s)&&s.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return m(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),s=this.attr("isAtStart"),i=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return e(i)&&i.call(this),this.removeListeners(),l.forEach((e=>{Y(e,t,s)})),this.attr(K.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],e(r)&&r.call(this),this}onAnchorTrigger(t){const i=this.attr("anchorURL"),r=this.attr("afterScroll"),l=this.attr("stickyHeight"),n=t.delegateTarget.parentNode,o=F(n)-(l+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(o,(()=>{e(r)&&r.call(this,"anchor"),s((()=>{this.$emit("toolbar:update",{top:o,min:0,max:a})}))})),i||w(t),this}addListeners(){const t=this.$articleElement;return T(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return b(t,"click",this.onAnchorTrigger),this}}K.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null};const X=(t,e)=>{document.documentElement.style.setProperty(t,e)};let Z=2e3;const tt=t=>(t?Z=t:Z+=1,X("--outline-zIndex",`${Z}`),Z);class et extends N{constructor(t){super(),this.attrs=l(et.DEFAULTS),this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let s;return this.attr(t),this.title=this.attr("title"),s=this.attr("created"),e(s)&&s.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),s=this.attr("size"),i=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),c=this.attr("customClass");let u,d,p,m,f,g,y,b;return R(),this.zIndex=tt(),m=Q("h2",{className:"outline-drawer__title"},this.title),this.$title=m,r&&(f=Q("div",{className:"outline-drawer__close"},J("close",{iconSet:"outline",size:20})),this.$close=f),p=Q("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=Q("div",{className:"outline-drawer__main"}),this.$main=g,o||a(g,"outline-drawer_full"),y=Q("footer",{className:"outline-drawer__footer"}),this.$footer=y,d=Q("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${s} outline-drawer_closed`},[p,g,y]),this.$modal=d,n&&a(d,"outline-drawer_offset"),h&&a(d,"outline-drawer_auto"),c&&a(d,c),l&&(b=Q("div",{className:"outline-drawer__overlay"}),this.$overlay=b),u=Q("div",{className:"outline-drawer"},[d,b]),this.$el=u,document.body.appendChild(u),e(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),i=this.$modal;return a(this.$el,"outline-drawer_opened"),u(i,"outline-drawer_closed"),a(i,"outline-drawer_opened"),s((()=>{this.closed=!1,e(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),i=this.$modal;return u(i,"outline-drawer_opened"),a(i,"outline-drawer_closed"),s((()=>{u(this.$el,"outline-drawer_opened"),this.closed=!0,e(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),i=this.isClosed();return i?this.open():this.close(),e(t)&&s((()=>{t.call(this,i)})),this}destroy(){const t=this.attr("afterDestroy"),s=this.attr("beforeDestroy");let i=this.zIndex;return e(s)&&s.call(this),this.removeListeners(),this.attrs=et.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,i-=1,tt(i),this.zIndex=0,e(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&T(s,".outline-drawer__close","click",this.onClose,this,!0),e&&T(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}et.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const st=(t,e)=>getComputedStyle(t)[e];class it extends N{constructor(t){super(),this.attrs=l(it.DEFAULTS),this._reset(),this.offsetWidth=0,this.playing=!1,this.scrollTimer=null,this.resizeTimer=null,this.Observer=null,t&&this.initialize(t)}_reset(){return this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetTop=0,this.closed=!1,this}initialize(t){let s,i,r,l;return this.attr(t),s=this.attr("created"),i=this.attr("parentElement"),r=this.attr("scrollElement"),n(i)?l=document.querySelector(i):o(i)&&(l=i),this.$parentElement=l,this.$scrollElement=p(r),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),e(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("animationCurrent"),i=this.attr("customClass"),r=this.$parentElement,l=[],n=[];let o,h,c,u,d=null;return r?(this.isInside()&&e&&(d=Q("h2",{className:"outline-chapters__title"},e),this.$title=d,n.push(d)),c=Q("ul",{className:"outline-chapters__list"}),this.$list=c,l.push(c),s&&(u=Q("div",{className:"outline-chapters__placeholder"}),this.$placeholder=u,l.push(u)),h=Q("div",{className:"outline-chapters__main"},l),this.$main=h,n.push(h),o=Q("nav",{id:"outline-chapters",className:"outline-chapters outline-chapters_hidden"},n),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),a(o,"outline-chapters_sticky")),i&&a(o,i),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("showCode"),i=this.attr("mounted"),r=this.$parentElement,l=this.chapters,n=this.count();let o,h;return!r||l.length<1||(this.isInside()&&a(r,"outline-chapters-parent"),this._paintEdge(),o=this.$el,h=this.$list,((t,e,s=!1)=>{const i=e.length,r=[...e],l=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=[],h=Q("span",{className:"outline-chapters__text"},e.text);let a,c,u,d,p;s&&(c=Q("span",{className:"outline-chapters__code","data-id":l},e.code),o.push(c)),o.push(h),a=Q("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},o),u=Q("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},a),-1===r?t.appendChild(u):(p=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(u):(d=Q("ul",{id:"subject-"+r,className:"outline-chapters__subject"},u),p.appendChild(d)))}))};if(i>400)for(l(r.splice(0,400));r.length>0;){const t=r.splice(0,400);j((()=>{l(t)}))}else l(r)})(h,l,t),u(o,"outline-chapters_hidden"),s((()=>{this.highlight(this.active)}),60),this.offsetTop=F(o),this.offsetWidth=o.offsetWidth,this.isFixed()&&(this.sticky(),X("--outline-chapters-width",`${this.offsetWidth}px`)),e(i)&&i.call(this),n<400&&this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=this.attr("animationCurrent"),n=parseInt(st(e,"padding-top"),10),o=parseInt(st(e,"border-top-width"),10),h=parseInt(st(s,"padding-top"),10),a=parseInt(st(s,"margin-top"),10),c=parseInt(st(s,"border-top-width"),10);let u,d=r.offsetHeight,p=0;return l?(n&&(p+=n),h&&(p+=h),a&&(p+=a),o&&(p+=o),c&&(p+=c),u=d*t,i.style.cssText=`transform: translateY(${p+u}px);height:${d}px;`,this):this}highlight(t){const e=this.attr("animationCurrent"),s=this.$el.querySelector(`#chapter__anchor-${t}`),i="outline-chapters_active",r="outline-chapters_highlight";return s?(this.active=parseInt(s.getAttribute("data-id"),10),this.$active&&(u(this.$active,r),u(this.$active,i)),this.$active=s,a(this.$active,i),e?this.positionPlaceholder(this.active):a(this.$active,r),this):this}sticky(){const t=this.attr("afterSticky"),s="outline-chapters_fixed",i=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?a(i,s):u(i,s),e(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return X("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return m(s,t,e),this}show(){const t="outline-chapters_hidden",i=this.attr("afterOpened"),r=this.count(),l=this.$el,n=this.$parentElement;return this.isInside()?r>800?u(n,t):(u(n,t),s((()=>{u(n,"outline-chapters_folded")}),30)):u(l,t),this.closed=!1,e(i)&&i.call(this),this}hide(){const t="outline-chapters_hidden",i=this.attr("afterClosed"),r=this.count(),l=this.$el,n=this.$parentElement;return this.isInside()?r>800?a(n,t):(a(n,"outline-chapters_folded"),s((()=>{a(n,t)}))):a(l,t),this.closed=!0,e(i)&&i.call(this),this}toggle(){const t=this.attr("afterToggle"),i=this.offsetTop,r=this.$scrollElement.scrollTop;let l;return this.isClosed()?this.show():this.hide(),e(t)&&s((()=>{l=r>=i,t.call(this,this.isClosed(),l)})),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(it.DEFAULTS)._reset(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),e(s)&&s.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let i=null;return this.Observer=((t,s={})=>{const i=s.root||null,r=s.selector||".outline-heading",l=s.context||null,n={rootMargin:s.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((s=>{s.forEach((s=>{s.intersectionRatio>0&&e(t)&&t.call(l||s.target,s.target)}))}),n),a=o(i)?i:document;return i&&(n.root=i),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;i&&clearTimeout(i),i=s((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const i=this.attr("stickyHeight"),r=t.delegateTarget,l=r.getAttribute("data-id"),n=r.href.split("#")[1],o=document.querySelector(`#${n}`),h=F(o)-(i+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{e(c)&&c.call(this,"chapter"),s((()=>{this.playing=!1,this.$emit("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),s((()=>{this.scrollTo(h,u),this.highlight(l)}),10)):(this.scrollTo(h,u),this.highlight(l)),w(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=s((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=s((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),T(t,".outline-chapters__anchor","click",this.onSelect,this,!0),$(i,"scroll",this.onScroll,this,!0),this.isSticky()&&$(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),b(e,"click",this.onSelect),b(r,"scroll",this.onScroll),this.isSticky()&&$(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}it.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const rt=(t,e=!0)=>{const s=J(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=Q("a",{className:"outline-toolbar__anchor",href:t.link},s),r=Q("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return a(s,"outline-toolbar__icon"),e&&a(r,"outline-toolbar_rounded"),t.disabled&&a(r,"outline-toolbar_disabled"),r},lt="outline-toolbar_disabled",nt="outline-toolbar_hidden";class ot extends N{constructor(t){super(),this.attrs=l(ot.DEFAULTS),this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let s;return this.attr(t),s=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),e(s)&&s.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,h(i,s)?u(i,s):a(i,s)),this}render(){const t=this.attr("mounted"),s=this.attr("buttons")||[],i=this.attr("rounded"),r=this.attr("placement"),l=[];return R(),s.forEach((t=>{const e=rt(t,i);l.push(e),this.buttons.push({name:t.name,$el:e})})),this.$el=Q("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},l),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),e(t)&&t.call(this),this}add(t){const s=this.$el,l=this.attr("buttons"),n=t.action,o=document.createDocumentFragment();let h;return i(t)?(l.push(t),o.appendChild(rt(t))):r(t)&&t.forEach((t=>{o.appendChild(rt(t))})),s.appendChild(o),n&&e(n.handler)&&(h=n.type||"click",T(s,`.${t.name}`,h,n.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(u(h,lt),n&&o&&T(s,`.${t}`,n,o)):(a(h,lt),n&&o&&b(s,n,o)),this):this}disable(t){const s=this.attr("afterDisabled");return t?this.switch(t,!1):(a(this.$el,lt),this.removeListeners(),this.disabled=!0,e(s)&&s.call(this)),this}enable(t){const s=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,u(this.$el,lt),this.addListeners(),e(s)&&s.call(this)),this}show(t){const i=this.attr("afterOpened"),r=this.attr("buttons").find((e=>e.name===t)),l=this.$el;let n;if(t){if(!r)return this;n=l.querySelector(`.${t}`),u(n,nt)}else u(l,nt),this.closed=!1,e(i)&&s((()=>{i.call(this)}),310);return this}hide(t){const i=this.attr("afterClosed"),r=this.attr("buttons").find((e=>e.name===t)),l=this.$el;let n;if(t){if(!r)return this;n=l.querySelector(`.${t}`),a(n,nt)}else a(l,nt),this.closed=!0,e(i)&&s((()=>{i.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");let i=this.$el;return e(t)&&t.call(this),this.removeListeners(),document.body.removeChild(i),i=null,this.attr(ot.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],e(s)&&s.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(rt(t))})),this.addListeners(),this}addListeners(){const t=this.attr("buttons"),s=this.$el;return!t||t.length<1||t.forEach((t=>{const i=t.action;let r,l,o,h;if(this.disabled)return!1;i&&(l=i.handler,n(l)&&(h=l,i.handler=function(){this.$emit(h,t.name)},l=i.handler),r=i.type||"click",o=i.context),e(l)&&T(s,`.${t.name}`,r,l,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),s=this.$el;return!t||t.length<1||t.forEach((t=>{const i=t.action;let r,l;if(this.disabled)return!1;i&&(l=i.handler,r=i.type||"click"),e(l)&&b(s,r,l)})),this}}ot.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const ht=t=>{const e=Object.getPrototypeOf;let s;if(!(t=>i(t)&&null!==t)(t))return!1;if(s=t.prototype,!s)return!0;for(s=t;null!==e(s);)s=e(s);return e(t)===s},at=t=>t.replace(/]*>.*?<\/script>/gi,""),ct=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},ut=[];let dt;R();class pt extends N{constructor(t){super(),this.attrs=l(pt.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,t&&this.initialize(t)}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",{...this.attr()}),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),s=this.attr("round"),i=this.attr("closable"),r=this.attr("visible"),l=this.attr("customClass"),n=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return s&&n.push("outline-message_round"),i||n.push("outline-message_full-width"),r&&n.push("outline-message_visible"),l&&n.push(l),n}render(){const t=this.attr("type"),e=this.attr("message"),s=this.attr("effect"),i=this.attr("round"),r=this.attr("closable"),l=this.attr("dangerouslyUseHTMLString"),n=this._getClassName(),o=[];let h,c,u,d,p,m=20;return i&&"default"===s&&(m=12),"plain"!==s&&(h=J("light"===s?`circle-${t}`:t,{iconSet:"outline",size:m}),a(h,"outline-message__icon"),o.push(h)),l?(u=document.createDocumentFragment(),u.innerHTML=e):u=document.createTextNode(ct(at(e))),c=Q("p",{className:"outline-message__content"},[u]),o.push(c),r&&(d=J("close",{iconSet:"outline",size:18}),a(d,"outline-message__close"),o.push(d)),p=Q("div",{className:n.join(" ")},o),p.style.cssText="top:-50px;",this.$el=p,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let s,i,r,l,n,o,h,c=20;return this.isDestroyed()?this:(n=e.querySelector(".outline-icon"),n?(s=this.attr("type"),i=this.attr("effect"),r=this.attr("round"),"plain"===i?a(n,t):(u(n,t),r&&"default"===i&&(c=12)),o=n.querySelector(".outline-icon__svg"),V(o,{style:`width:${c}px;height:${c}px;`}),h=o.querySelector("use"),l="light"===i?`circle-${s}`:s,P(h,"xlink:href",`#outline-icon-${l}`),this):this)}_refreshMessage(){const t=this.$el;let e,s,i,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),s=this.attr("dangerouslyUseHTMLString"),i=this.attr("message"),r=s?i:ct(at(i)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let s,i;return this.isDestroyed()||(s=e.querySelector(".outline-message__close"),i=this.attr("closable"),s&&(i?a(s,t):u(s,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),P(t,"className",e.join(" "))),this}refresh(t){return ht(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=s((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,r,l,n;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),r=this.attr("duration"),l=i&&i>=this.offset?i:this.offset,n=`top:${l}px;`,this.clearTimer(),this.$emit("beforeOpen"),s((()=>{this.visible=!0,a(e,"outline-message_visible"),e.style.cssText=n,r>0&&this.startTimer(r)}),100)),this}close(){const t=this.$el;let i,r;return this.isDestroyed()||(i=this.attr("destroyAfterClosed"),r=this.attr("beforeClose"),e(r)&&r.call(this),t.style.cssText="top:-50px;",u(t,"outline-message_visible"),this.visible=!1,this.closed=!0,s((()=>{this.$emit("closed"),i&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),this.attr(pt.DEFAULTS),this.id="",this.closed=!0,this.visible=!1,this.offset=-50,clearTimeout(this.timer),this.timer=null,this.destroyed=!0,this.$el=null,this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return T(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),T(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),T(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return b(t,"mouseenter",this.onMouseEnter),b(t,"mouseleave",this.onMouseLeave),b(t,"click",this.onClose),this}}pt.DEFAULTS={id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null},["info","success","warning","error"].forEach((t=>{pt[t]=e=>{const s={},i=k("outline-message-"),r=e.beforeClose||null;let l=e.offset||30;return n(e)?s.message=e:ht(e)&&S(s,e),s.id=i,s.type=t,s.offset=l,s.visible=!1,s.beforeClose=()=>{pt.close(i,r)},dt=new pt(s),ut.forEach((t=>{l+=t.$el.offsetHeight+16})),dt.offset=l,dt.open(),ut.push(dt),dt}})),pt.close=(t,s)=>{const i=ut.length;let r,l,n=-1;if(ut.forEach(((i,r)=>{t===i.id&&(l=i.$el.offsetHeight,n=r,e(s)&&s.call(i),ut.splice(r,1))})),i<=1||-1===n||n>ut.length-1)return!1;for(r=n;r{let t=ut.length-1;for(;t>=0;t-=1)ut[t].close()};const mt=(t,e)=>{let s,i=t;for(;i;)s=i.tagName.toLowerCase(),"script"!==s&&"style"!==s&&a(i,"outline-print_sibling"),i=e?i.previousElementSibling:i.nextElementSibling},ft="进入阅读模式,按 ESC 键可退出阅读模式";class gt extends N{constructor(t){super(),this.attrs=l(gt.DEFAULTS),this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,this.buttons=[],this.reading=!1,t&&this.initialize(t)}initialize(t){return this.attr(t),this.$emit("created",{...this.attr()}),this.render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){const t=this.attr("scrollElement"),e=document.querySelector(t);return this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar(),e&&this.onToolbarUpdate({top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}_renderPrint(){const t=this.attr("print"),e=this.attr("articleElement");let i,r,l;return t.element?(n(e)?i=document.querySelector(e):o(e)&&(i=e),a(i,"outline-article"),l=t.element,n(l)?r=document.querySelector(l):o(l)&&(r=l),((t,e)=>{const i=document.createDocumentFragment();let r,l,h,a,c,u,d,p=e;if(n(t)?r=document.querySelector(t):o(t)&&(r=t),!r)return!1;u=J("close",{iconSet:"outline",size:20,attrs:{className:"outline-print__close"}}),a=r.querySelector("h1"),o(e)&&(a=e),o(a)&&(p=a.innerText),a=Q("h1",{className:"outline-print__title"},p),h=Q("article",{id:"outline-print__article",className:"outline-print__article"}),l=Q("section",{id:"outline-print",className:"outline-print"},[u,a,h]),document.body.appendChild(l),s((()=>{c=l.previousElementSibling,mt(c,!0),c=l.nextElementSibling,mt(c),d=r.cloneNode(!0).childNodes,d.forEach((t=>{i.appendChild(t)})),h.appendChild(i)}))})(r,t.title),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new K({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n,chapterTextFilter:o}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("animationCurrent"),n=this.attr("position"),o=this.attr("placement"),h=this.attr("afterSticky"),a=this.attr("afterToggle"),c=this.attr("afterScroll"),u=this.count();let d,p=this.attr("parentElement");return u<1||(d={scrollElement:s,showCode:r,animationCurrent:l,position:n,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:h,afterToggle:a,afterScroll:c},"relative"===n?(this.drawer=new et({placement:o,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),p=this.drawer.$main):d.customClass=i,d.parentElement=p,this.chapters=new it(d)),this}_renderToolbar(){const t=this.attr("placement"),s=this.attr("homepage"),i=this.attr("git"),r=this.attr("tags"),l=this.attr("issues"),n=this.attr("tools"),o=this.attr("print"),h=this.count(),a={name:"homepage",icon:"homepage",size:20,link:s},c={name:"github",icon:"github",size:20,link:i},u={name:"tags",icon:"tags",size:20,link:r},d={name:"issues",icon:"issues",size:20,link:l},p={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},m={name:"reading",icon:"file",size:18,action:{type:"click",handler:"toolbar:action:reading"}},f={name:"print",icon:"print",size:20,action:{type:"click",handler:"toolbar:action:print"}},g=[];return g.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),h>0&&g.push(p),s&&g.push(a),i&&g.push(c),r&&g.push(u),l&&g.push(d),o.element&&(g.push(m),e(print)&&g.push(f)),n?.length>0&&g.push(...n),g.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.buttons=[...g],this.toolbar=new ot({placement:t,buttons:g}),this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}toTop(){const t=this.attr("afterScroll"),s=this.toolbar,i=this.chapters,r=this.count();return r>0&&(i.playing=!0),this.scrollTo(0,(()=>{s.hide("up"),s.show("down"),r>0&&(i.highlight(0),i.playing=!1),e(t)&&t.call(s,"up")})),this}toBottom(){const t=this.attr("afterScroll"),s=p(this.attr("scrollElement")),i=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(s.scrollHeight-s.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(n,(()=>{i.hide("down"),i.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),e(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return m(s,t,e),this}enterReading(){const t="outline-reading",e=`${t}_hidden`,s=document.querySelector("#outline-print"),i=document.querySelectorAll(".outline-print_sibling"),r=this.attr("print").enterReadingTip||ft;return this.reading||!s||(i.forEach((t=>{a(t,e)})),a(s,t),this.reading=!0,this.toolbar.toggle(),pt.info({round:!0,message:r}),this.$emit("enterReading")),this}exitReading(){const t="outline-reading",e=`${t}_hidden`,s=document.querySelector("#outline-print"),i=document.querySelectorAll(".outline-print_sibling");return this.reading&&s?(u(s,t),i.forEach((t=>{u(t,e)})),this.reading=!1,this.toolbar.toggle(),this.$emit("exitReading"),this):this}switchReading(){return document.querySelector("#outline-print")?(this.reading?this.exitReading():this.enterReading(),this):this}toggle(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.chapters;return this.count()<1||("relative"!==t?(r.toggle(),e.highlight("menu")):(e.toggle(),s((()=>{i.toggle()})))),this}print(){return e(print)?(print(),this):this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count(),n=document.querySelector("#outline-print");return this.$emit("beforeDestroy"),this.removeListeners(),n&&document.body.removeChild(n),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(gt.DEFAULTS),this.$emit("destroyed"),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onEnterReading(){return this.switchReading(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.switchReading(),w(t)),this}onPrint(){return this.print(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&rObject.prototype.toString.apply(t),e=e=>"function"==typeof e||"[object Function]"===t(e),s=(t,s=300)=>!!e(t)&&setTimeout((()=>{t()}),s),i=s=>("[object Object]"===t(s)||"object"==typeof s||e(s))&&null!==s,r=e=>Array.isArray?Array.isArray(e):"[object Array]"===t(e),l=t=>{let e={};return null===t?null:(r(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?l(t[s]):t[s]))),e)},n=t=>"string"==typeof t,o=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),h=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!o(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},a=(t,e)=>{let s,i;if(h(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},c=t=>!!n(t)&&t.replace(/(^\s+)|(\s+$)/g,""),u=(t,e)=>{let s,i=t.className;if(!i||!h(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=c(i.replace(e,"")),t.className=i)},d=t=>t*t,p=(t=null)=>{let e,s;return t?n(t)?s=document.querySelector(t):o(t)&&(s=t):(e=document.querySelectorAll("html,body"),s=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),s},m=(t,s,i)=>{const r=p(t);let l=r.scrollTop,n=0;const o=s-l,h=r.scrollHeight,a=s-h<=0?s:h,c=t=>(e(i)&&i(t),!1),u=()=>{if(n+=1,o<0){if(l-=d(n),r.scrollTop=l,l<=s)return r.scrollTop=s,c(s)}else if(l+=d(n),r.scrollTop=l,l>=a)return r.scrollTop=a,c(a);requestAnimationFrame(u)};requestAnimationFrame(u)},f=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],g=(t,e,s)=>{const i=f.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},y=function(t,e,s=!1){const i=n(t)?document.querySelector(t):t,r=i.childNodes,l=((t,e)=>{let s=t._listeners||[];return n(e)&&e&&(s=s.filter((t=>t.type===e))),s})(i,e);l.forEach((t=>{g(i,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&i&&r&&r.forEach((t=>{o(t)&&y(t,e,s)}))},b=(t,s,i)=>{if(!e(i))return y(t,s);g(t,s,i)},$=(t,s,i,r,l,n=!1)=>{const o=f.indexOf(s)>-1,h=function(e){let o=l||t;!0===l&&(o=r),!0===n&&b(t,s,h),i.call(o,e,r)};if(!e(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},v=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},_=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,T=(t,e,s,i,r,l,n=!1)=>{const o=f.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&v(t,e):v(t,e))||i&&t===r)return t;if(t===r)break}while(t=_(t))})(a,e,t);let u=l||t;o.delegateTarget=c,!0===l&&(u=r),c&&(!0===n&&b(t,s,h),i.call(u,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},w=function(t){t.stopPropagation(),t.preventDefault()},E=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},S=(t,e)=>{Object.keys(e).forEach((s=>{E(e,s)&&(t[s]=e[s])}))},x={},C=t=>E(x,t)&&x[t].length>0,L=(t,e=!0)=>e?C(t):(t=>{let e=C(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=C(t);return e})(t),z=(e,s,i=!0)=>{const r=e=>{if(!C(e))return!1;x[e].forEach((e=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(t(s))>-1?s.toString():s;e.callback.call(e.context||e,i)}))},l=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),r(t);r(e),r("*")};if(!L(e))return!1;i?setTimeout(l,10):l()},k=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),M=t=>{if(!E(x,t))return!1;delete x[t]},A=(t,e)=>{if(!L(t))return!1;e?(t=>{const e=Object.keys(x);if(!t||e.length<1)return!1;e.forEach((e=>{const s=x[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&M(i)}))})(e):M(t)};class N{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return n(t)?e&&E(s,t)?(s[t]=e,this):s[t]:i(t)?(S(s,t),this):0===arguments.length?s:this}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}$emit(t,e){return z(t,e),this}$on(t,s){return((t,s,i=null)=>{const r=k();let l="symbol"==typeof t?t.toString():t;e(s)&&(x[l]||(x[l]=[]),x[l].push({topic:l,callback:s,context:i,token:r}))})(t,s,this),this}$off(t,e){return A(t,e),this}addListeners(){return this}removeListeners(){return this}}const D=[];let H,O;function q(t){for(;t.timeRemaining()>0&&D.length;){const t=D.shift();if(!e(t))return!1;t()}D.length?H=requestIdleCallback(q):(H=0,e(O)&&(O(),O=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return s((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const j=(t,s=null)=>{D.push(t),e(s)&&(O=s),H||requestIdleCallback(q)},F=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=F(t.offsetParent)),e},U=['','','','','','','','','','','','','','','','','','',''],I=(t,e="icon")=>n(t)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return U.find((r=>{const l=s.exec(r)[1];return i.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):[...U],R=(t="")=>{const e=document.body;let s=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;r(t)&&t.length>0?t.forEach((t=>{-1===U.indexOf(t)&&n(t)&&U.push(t)})):n(t)&&U.push(t)})(t),i=I(),s?s.innerHTML=i.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},B=e=>{return!(!i(e)||!(o(e)||(e=>!(!i(e)||"[object NodeList]"!==t(e)))(e)||(s=e,i(s)&&"[object DocumentFragment]"===t(s))||(e=>!(!i(e)||!("[object Text]"===t(e)||e.tagName&&3===e.nodeType)))(e)));var s},P=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}},V=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];E(e,s)&&P(t,s,i)}))},Q=(t,e,s)=>{const l=document.createDocumentFragment(),o=document.createElement(t),h=t=>B(t)||n(t),a=t=>{let e;if(!h(t))return!1;B(t)?e=t:n(t)&&(e=document.createTextNode(t)),l.appendChild(e)};return i(e)?V(o,e):r(e)&&e.every((t=>h(t)))?e.forEach((t=>{a(t)})):B(e)?a(e):n(e)&&a(document.createTextNode(e)),r(s)?s.forEach((t=>{a(t)})):a(s),o.appendChild(l),o},W=(t,e={})=>{const s="outline-icon",i=e.size||0,l=e.color||"",o=e.iconSet||"",h=r(i)?i[0]:i,a=r(i)?i[1]:i,c=i?`width:${h}px;height:${a}px;`:"",u=l?c+`color:${l}`:c,d=e.attrs||{},p=document.createElement("i");let m,f="",g="";return n(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return n(t)&&e.test(t)})(t)?g=t:(f=o&&"icon"!==o?`xlink:href="#${o}-icon-${t}"`:`xlink:href="#icon-${t}"`,g=``),p.innerHTML=g,d.className?d.className=`${s} ${d.className}`:d.className=s,V(p,d),m=p.querySelector("svg"),V(m,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:u}),p):null},J=(t,e={})=>W(t,e),Y=(t,e=!0,s=!0)=>{const i="outline-heading",r=t.innerHTML;let l;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),u(t,i),!e)return!1;var o;l=t.querySelector(`.${i}__anchor`),s&&u(t,`${i}_start`),o=c(t.className),n(o)&&""===o&&t.removeAttribute("class"),t.removeChild(l)},G=(t,s=!0,i=null)=>{let l=1,o=0,h="";const a=[];return t.forEach(((t,s)=>{const r=t.tagName,u=r.replace(/h/i,"");let d=parseInt(u,10),p=-1;var m;d>l?(o+=1,p=1===o?-1:s-1):d===l||do?1===d?(o=1,p=-1):p=a[s-1].pid:d<=o&&(1===d?o=1:(o-=l-d,o<=1&&(o=1)),p=1===o?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"",e(i)&&(h=i(h)),a.push({id:s,pid:p,level:o,rel:`heading-${s}`,text:h,tagName:r})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!r(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(a):a};class K extends N{constructor(t){super(),this.attrs=K.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(t){const s=this.attr("showCode")||!0;let i,r,l,h,a;return this.attr(t),a=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),i=this.attr("created"),n(a)?h=document.querySelector(a):o(a)&&(h=a),h?(this.$articleElement=h,this.$scrollElement=p(r),this.$headings=[...h.querySelectorAll(l)],this.$headings.length<1||(this.chapters=G(this.$headings,s,this.attr("chapterTextFilter")),e(i)&&i.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=400,s=this.attr("mounted"),i=this.attr("hasAnchor"),r=this.attr("isAtStart"),l=this.attr("showCode"),n=this.attr("anchorURL"),o=this.count(),h=[...this.$headings],a=this.getChapters(),u=(e,s)=>{e.forEach(((e,o)=>{const h=o+s*t,u=a[h].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,n=s.showCode||!1,o=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,u={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=c(t.innerHTML);let p,m;if(n&&(u.innerHTML=o+" "+d),V(t,u),!r)return!1;m=J("hash",{iconSet:"outline"}),p=Q("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},m),t.appendChild(p)})(e,h,{hasAnchor:i,isAtStart:r,showCode:l,chapterCode:u,anchorURL:n})}))};let d=-1;if(R(),o>t)for(d+=1,u(h.splice(0,t),0);h.length>0;){const e=h.splice(0,t);j((()=>{u(e,d+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else u(h,0);return e(s)&&s.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return m(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),s=this.attr("isAtStart"),i=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return e(i)&&i.call(this),this.removeListeners(),l.forEach((e=>{Y(e,t,s)})),this.attr(K.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],e(r)&&r.call(this),this}onAnchorTrigger(t){const i=this.attr("anchorURL"),r=this.attr("afterScroll"),l=this.attr("stickyHeight"),n=t.delegateTarget.parentNode,o=F(n)-(l+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(o,(()=>{e(r)&&r.call(this,"anchor"),s((()=>{this.$emit("toolbar:update",{top:o,min:0,max:a})}))})),i||w(t),this}addListeners(){const t=this.$articleElement;return T(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return b(t,"click",this.onAnchorTrigger),this}}K.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null};const X=(t,e)=>{document.documentElement.style.setProperty(t,e)};let Z=2e3;const tt=t=>(t?Z=t:Z+=1,X("--outline-zIndex",`${Z}`),Z);class et extends N{constructor(t){super(),this.attrs=l(et.DEFAULTS),this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let s;return this.attr(t),this.title=this.attr("title"),s=this.attr("created"),e(s)&&s.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),s=this.attr("size"),i=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),c=this.attr("customClass");let u,d,p,m,f,g,y,b;return R(),this.zIndex=tt(),m=Q("h2",{className:"outline-drawer__title"},this.title),this.$title=m,r&&(f=Q("div",{className:"outline-drawer__close"},J("close",{iconSet:"outline",size:20})),this.$close=f),p=Q("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=Q("div",{className:"outline-drawer__main"}),this.$main=g,o||a(g,"outline-drawer_full"),y=Q("footer",{className:"outline-drawer__footer"}),this.$footer=y,d=Q("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${s} outline-drawer_closed`},[p,g,y]),this.$modal=d,n&&a(d,"outline-drawer_offset"),h&&a(d,"outline-drawer_auto"),c&&a(d,c),l&&(b=Q("div",{className:"outline-drawer__overlay"}),this.$overlay=b),u=Q("div",{className:"outline-drawer"},[d,b]),this.$el=u,document.body.appendChild(u),e(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),i=this.$modal;return a(this.$el,"outline-drawer_opened"),u(i,"outline-drawer_closed"),a(i,"outline-drawer_opened"),s((()=>{this.closed=!1,e(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),i=this.$modal;return u(i,"outline-drawer_opened"),a(i,"outline-drawer_closed"),s((()=>{u(this.$el,"outline-drawer_opened"),this.closed=!0,e(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),i=this.isClosed();return i?this.open():this.close(),e(t)&&s((()=>{t.call(this,i)})),this}destroy(){const t=this.attr("afterDestroy"),s=this.attr("beforeDestroy");let i=this.zIndex;return e(s)&&s.call(this),this.removeListeners(),this.attrs=et.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,i-=1,tt(i),this.zIndex=0,e(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&T(s,".outline-drawer__close","click",this.onClose,this,!0),e&&T(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}et.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const st=(t,e)=>getComputedStyle(t)[e];class it extends N{constructor(t){super(),this.attrs=l(it.DEFAULTS),this._reset(),this.offsetWidth=0,this.playing=!1,this.scrollTimer=null,this.resizeTimer=null,this.Observer=null,t&&this.initialize(t)}_reset(){return this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetTop=0,this.closed=!1,this}initialize(t){let s,i,r,l;return this.attr(t),s=this.attr("created"),i=this.attr("parentElement"),r=this.attr("scrollElement"),n(i)?l=document.querySelector(i):o(i)&&(l=i),this.$parentElement=l,this.$scrollElement=p(r),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),e(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("animationCurrent"),i=this.attr("customClass"),r=this.$parentElement,l=[],n=[];let o,h,c,u,d=null;return r?(this.isInside()&&e&&(d=Q("h2",{className:"outline-chapters__title"},e),this.$title=d,n.push(d)),c=Q("ul",{className:"outline-chapters__list"}),this.$list=c,l.push(c),s&&(u=Q("div",{className:"outline-chapters__placeholder"}),this.$placeholder=u,l.push(u)),h=Q("div",{className:"outline-chapters__main"},l),this.$main=h,n.push(h),o=Q("nav",{id:"outline-chapters",className:"outline-chapters outline-chapters_hidden"},n),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),a(o,"outline-chapters_sticky")),i&&a(o,i),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("showCode"),i=this.attr("mounted"),r=this.$parentElement,l=this.chapters,n=this.count();let o,h;return!r||l.length<1||(this.isInside()&&a(r,"outline-chapters-parent"),this._paintEdge(),o=this.$el,h=this.$list,((t,e,s=!1)=>{const i=e.length,r=[...e],l=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=[],h=Q("span",{className:"outline-chapters__text"},e.text);let a,c,u,d,p;s&&(c=Q("span",{className:"outline-chapters__code","data-id":l},e.code),o.push(c)),o.push(h),a=Q("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},o),u=Q("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},a),-1===r?t.appendChild(u):(p=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(u):(d=Q("ul",{id:"subject-"+r,className:"outline-chapters__subject"},u),p.appendChild(d)))}))};if(i>400)for(l(r.splice(0,400));r.length>0;){const t=r.splice(0,400);j((()=>{l(t)}))}else l(r)})(h,l,t),u(o,"outline-chapters_hidden"),s((()=>{this.highlight(this.active)}),60),this.offsetTop=F(o),this.offsetWidth=o.offsetWidth,this.isFixed()&&(this.sticky(),X("--outline-chapters-width",`${this.offsetWidth}px`)),e(i)&&i.call(this),n<400&&this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=this.attr("animationCurrent"),n=parseInt(st(e,"padding-top"),10),o=parseInt(st(e,"border-top-width"),10),h=parseInt(st(s,"padding-top"),10),a=parseInt(st(s,"margin-top"),10),c=parseInt(st(s,"border-top-width"),10);let u,d=r.offsetHeight,p=0;return l?(n&&(p+=n),h&&(p+=h),a&&(p+=a),o&&(p+=o),c&&(p+=c),u=d*t,i.style.cssText=`transform: translateY(${p+u}px);height:${d}px;`,this):this}highlight(t){const e=this.attr("animationCurrent"),s=this.$el.querySelector(`#chapter__anchor-${t}`),i="outline-chapters_active",r="outline-chapters_highlight";return s?(this.active=parseInt(s.getAttribute("data-id"),10),this.$active&&(u(this.$active,r),u(this.$active,i)),this.$active=s,a(this.$active,i),e?this.positionPlaceholder(this.active):a(this.$active,r),this):this}sticky(){const t=this.attr("afterSticky"),s="outline-chapters_fixed",i=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?a(i,s):u(i,s),e(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return X("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return m(s,t,e),this}show(){const t="outline-chapters_hidden",i=this.attr("afterOpened"),r=this.count(),l=this.$el,n=this.$parentElement;return this.isInside()?r>800?u(n,t):(u(n,t),s((()=>{u(n,"outline-chapters_folded")}),30)):u(l,t),this.closed=!1,e(i)&&i.call(this),this}hide(){const t="outline-chapters_hidden",i=this.attr("afterClosed"),r=this.count(),l=this.$el,n=this.$parentElement;return this.isInside()?r>800?a(n,t):(a(n,"outline-chapters_folded"),s((()=>{a(n,t)}))):a(l,t),this.closed=!0,e(i)&&i.call(this),this}toggle(){const t=this.attr("afterToggle"),i=this.offsetTop,r=this.$scrollElement.scrollTop;let l;return this.isClosed()?this.show():this.hide(),e(t)&&s((()=>{l=r>=i,t.call(this,this.isClosed(),l)})),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(it.DEFAULTS)._reset(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),e(s)&&s.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let i=null;return this.Observer=((t,s={})=>{const i=s.root||null,r=s.selector||".outline-heading",l=s.context||null,n={rootMargin:s.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((s=>{s.forEach((s=>{s.intersectionRatio>0&&e(t)&&t.call(l||s.target,s.target)}))}),n),a=o(i)?i:document;return i&&(n.root=i),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;i&&clearTimeout(i),i=s((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const i=this.attr("stickyHeight"),r=t.delegateTarget,l=r.getAttribute("data-id"),n=r.href.split("#")[1],o=document.querySelector(`#${n}`),h=F(o)-(i+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{e(c)&&c.call(this,"chapter"),s((()=>{this.playing=!1,this.$emit("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),s((()=>{this.scrollTo(h,u),this.highlight(l)}),10)):(this.scrollTo(h,u),this.highlight(l)),w(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=s((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=s((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),T(t,".outline-chapters__anchor","click",this.onSelect,this,!0),$(i,"scroll",this.onScroll,this,!0),this.isSticky()&&$(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),b(e,"click",this.onSelect),b(r,"scroll",this.onScroll),this.isSticky()&&$(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}it.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const rt=(t,e=!0)=>{const s=J(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=Q("a",{className:"outline-toolbar__anchor",href:t.link},s),r=Q("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return a(s,"outline-toolbar__icon"),e&&a(r,"outline-toolbar_rounded"),t.disabled&&a(r,"outline-toolbar_disabled"),r},lt="outline-toolbar_disabled",nt="outline-toolbar_hidden";class ot extends N{constructor(t){super(),this.attrs=l(ot.DEFAULTS),this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let s;return this.attr(t),s=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),e(s)&&s.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,h(i,s)?u(i,s):a(i,s)),this}render(){const t=this.attr("mounted"),s=this.attr("buttons")||[],i=this.attr("rounded"),r=this.attr("placement"),l=[];return R(),s.forEach((t=>{const e=rt(t,i);l.push(e),this.buttons.push({name:t.name,$el:e})})),this.$el=Q("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},l),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),e(t)&&t.call(this),this}add(t){const s=this.$el,l=this.attr("buttons"),n=t.action,o=document.createDocumentFragment();let h;return i(t)?(l.push(t),o.appendChild(rt(t))):r(t)&&t.forEach((t=>{o.appendChild(rt(t))})),s.appendChild(o),n&&e(n.handler)&&(h=n.type||"click",T(s,`.${t.name}`,h,n.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(u(h,lt),n&&o&&T(s,`.${t}`,n,o)):(a(h,lt),n&&o&&b(s,n,o)),this):this}disable(t){const s=this.attr("afterDisabled");return t?this.switch(t,!1):(a(this.$el,lt),this.removeListeners(),this.disabled=!0,e(s)&&s.call(this)),this}enable(t){const s=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,u(this.$el,lt),this.addListeners(),e(s)&&s.call(this)),this}show(t){const i=this.attr("afterOpened"),r=this.attr("buttons").find((e=>e.name===t)),l=this.$el;let n;if(t){if(!r)return this;n=l.querySelector(`.${t}`),u(n,nt)}else u(l,nt),this.closed=!1,e(i)&&s((()=>{i.call(this)}),310);return this}hide(t){const i=this.attr("afterClosed"),r=this.attr("buttons").find((e=>e.name===t)),l=this.$el;let n;if(t){if(!r)return this;n=l.querySelector(`.${t}`),a(n,nt)}else a(l,nt),this.closed=!0,e(i)&&s((()=>{i.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");let i=this.$el;return e(t)&&t.call(this),this.removeListeners(),document.body.removeChild(i),i=null,this.attr(ot.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],e(s)&&s.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(rt(t))})),this.addListeners(),this}addListeners(){const t=this.attr("buttons"),s=this.$el;return!t||t.length<1||t.forEach((t=>{const i=t.action;let r,l,o,h;if(this.disabled)return!1;i&&(l=i.handler,n(l)&&(h=l,i.handler=function(){this.$emit(h,t.name)},l=i.handler),r=i.type||"click",o=i.context),e(l)&&T(s,`.${t.name}`,r,l,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),s=this.$el;return!t||t.length<1||t.forEach((t=>{const i=t.action;let r,l;if(this.disabled)return!1;i&&(l=i.handler,r=i.type||"click"),e(l)&&b(s,r,l)})),this}}ot.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const ht=t=>{const e=Object.getPrototypeOf;let s;if(!(t=>i(t)&&null!==t)(t))return!1;if(s=t.prototype,!s)return!0;for(s=t;null!==e(s);)s=e(s);return e(t)===s},at=t=>t.replace(/]*>.*?<\/script>/gi,""),ct=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},ut=[];let dt;R();class pt extends N{constructor(t){super(),this.attrs=l(pt.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,t&&this.initialize(t)}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",{...this.attr()}),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),s=this.attr("round"),i=this.attr("closable"),r=this.attr("visible"),l=this.attr("customClass"),n=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return s&&n.push("outline-message_round"),i||n.push("outline-message_full-width"),r&&n.push("outline-message_visible"),l&&n.push(l),n}render(){const t=this.attr("type"),e=this.attr("message"),s=this.attr("effect"),i=this.attr("round"),r=this.attr("closable"),l=this.attr("dangerouslyUseHTMLString"),n=this._getClassName(),o=[];let h,c,u,d,p,m=20;return i&&"default"===s&&(m=12),"plain"!==s&&(h=J("light"===s?`circle-${t}`:t,{iconSet:"outline",size:m}),a(h,"outline-message__icon"),o.push(h)),l?(u=document.createDocumentFragment(),u.innerHTML=e):u=document.createTextNode(ct(at(e))),c=Q("p",{className:"outline-message__content"},[u]),o.push(c),r&&(d=J("close",{iconSet:"outline",size:18}),a(d,"outline-message__close"),o.push(d)),p=Q("div",{className:n.join(" ")},o),p.style.cssText="top:-50px;",this.$el=p,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let s,i,r,l,n,o,h,c=20;return this.isDestroyed()?this:(n=e.querySelector(".outline-icon"),n?(s=this.attr("type"),i=this.attr("effect"),r=this.attr("round"),"plain"===i?a(n,t):(u(n,t),r&&"default"===i&&(c=12)),o=n.querySelector(".outline-icon__svg"),V(o,{style:`width:${c}px;height:${c}px;`}),h=o.querySelector("use"),l="light"===i?`circle-${s}`:s,P(h,"xlink:href",`#outline-icon-${l}`),this):this)}_refreshMessage(){const t=this.$el;let e,s,i,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),s=this.attr("dangerouslyUseHTMLString"),i=this.attr("message"),r=s?i:ct(at(i)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let s,i;return this.isDestroyed()||(s=e.querySelector(".outline-message__close"),i=this.attr("closable"),s&&(i?a(s,t):u(s,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),P(t,"className",e.join(" "))),this}refresh(t){return ht(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=s((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,r,l,n;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),r=this.attr("duration"),l=i&&i>=this.offset?i:this.offset,n=`top:${l}px;`,this.clearTimer(),this.$emit("beforeOpen"),s((()=>{this.visible=!0,a(e,"outline-message_visible"),e.style.cssText=n,r>0&&this.startTimer(r)}),100)),this}close(){const t=this.$el;let i,r;return this.isDestroyed()||(i=this.attr("destroyAfterClosed"),r=this.attr("beforeClose"),e(r)&&r.call(this),t.style.cssText="top:-50px;",u(t,"outline-message_visible"),this.visible=!1,this.closed=!0,s((()=>{this.$emit("closed"),i&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),this.attr(pt.DEFAULTS),this.id="",this.closed=!0,this.visible=!1,this.offset=-50,clearTimeout(this.timer),this.timer=null,this.destroyed=!0,this.$el=null,this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return T(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),T(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),T(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return b(t,"mouseenter",this.onMouseEnter),b(t,"mouseleave",this.onMouseLeave),b(t,"click",this.onClose),this}}pt.DEFAULTS={id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null},["info","success","warning","error"].forEach((t=>{pt[t]=e=>{const s={},i=k("outline-message-"),r=e.beforeClose||null;let l=e.offset||30;return n(e)?s.message=e:ht(e)&&S(s,e),s.id=i,s.type=t,s.offset=l,s.visible=!1,s.beforeClose=()=>{pt.close(i,r)},dt=new pt(s),ut.forEach((t=>{l+=t.$el.offsetHeight+16})),dt.offset=l,dt.open(),ut.push(dt),dt}})),pt.close=(t,s)=>{const i=ut.length;let r,l,n=-1;if(ut.forEach(((i,r)=>{t===i.id&&(l=i.$el.offsetHeight,n=r,e(s)&&s.call(i),ut.splice(r,1))})),i<=1||-1===n||n>ut.length-1)return!1;for(r=n;r{let t=ut.length-1;for(;t>=0;t-=1)ut[t].close()};const mt=(t,e)=>{let s,i=t;for(;i;)s=i.tagName.toLowerCase(),"script"!==s&&"style"!==s&&a(i,"outline-print_sibling"),i=e?i.previousElementSibling:i.nextElementSibling},ft="进入阅读模式,按 ESC 键可退出阅读模式";class gt extends N{constructor(t){super(),this.attrs=l(gt.DEFAULTS),this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,this.buttons=[],this.reading=!1,t&&this.initialize(t)}initialize(t){return this.attr(t),this.$emit("created",{...this.attr()}),this.render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){const t=this.attr("hasToolbar"),e=this.attr("scrollElement"),s=document.querySelector(e);return this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar(),s&&t&&this.onToolbarUpdate({top:s.scrollTop,min:0,max:s.scrollHeight}),this.$emit("mounted"),this}_renderPrint(){const t=this.attr("print"),e=this.attr("articleElement");let i,r,l;return t.element?(n(e)?i=document.querySelector(e):o(e)&&(i=e),a(i,"outline-article"),l=t.element,n(l)?r=document.querySelector(l):o(l)&&(r=l),((t,e)=>{const i=document.createDocumentFragment();let r,l,h,a,c,u,d,p=e;if(n(t)?r=document.querySelector(t):o(t)&&(r=t),!r)return!1;u=J("close",{iconSet:"outline",size:20,attrs:{className:"outline-print__close"}}),a=r.querySelector("h1"),o(e)&&(a=e),o(a)&&(p=a.innerText),a=Q("h1",{className:"outline-print__title"},p),h=Q("article",{id:"outline-print__article",className:"outline-print__article"}),l=Q("section",{id:"outline-print",className:"outline-print"},[u,a,h]),document.body.appendChild(l),s((()=>{c=l.previousElementSibling,mt(c,!0),c=l.nextElementSibling,mt(c),d=r.cloneNode(!0).childNodes,d.forEach((t=>{i.appendChild(t)})),h.appendChild(i)}))})(r,t.title),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new K({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n,chapterTextFilter:o}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("animationCurrent"),n=this.attr("position"),o=this.attr("placement"),h=this.attr("afterSticky"),a=this.attr("afterToggle"),c=this.attr("afterScroll"),u=this.count();let d,p=this.attr("parentElement");return u<1||(d={scrollElement:s,showCode:r,animationCurrent:l,position:n,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:h,afterToggle:a,afterScroll:c},"relative"===n?(this.drawer=new et({placement:o,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),p=this.drawer.$main):d.customClass=i,d.parentElement=p,this.chapters=new it(d)),this}_renderToolbar(){const t=this.attr("hasToolbar"),s=this.attr("placement"),i=this.attr("homepage"),r=this.attr("git"),l=this.attr("tags"),n=this.attr("issues"),o=this.attr("tools"),h=this.attr("print"),a=this.count(),c={name:"homepage",icon:"homepage",size:20,link:i},u={name:"github",icon:"github",size:20,link:r},d={name:"tags",icon:"tags",size:20,link:l},p={name:"issues",icon:"issues",size:20,link:n},m={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},f={name:"reading",icon:"file",size:18,action:{type:"click",handler:"toolbar:action:reading"}},g={name:"print",icon:"print",size:20,action:{type:"click",handler:"toolbar:action:print"}},y=[];return t?(y.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),a>0&&y.push(m),i&&y.push(c),r&&y.push(u),l&&y.push(d),n&&y.push(p),h.element&&(y.push(f),e(print)&&y.push(g)),o?.length>0&&y.push(...o),y.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.buttons=[...y],this.toolbar=new ot({placement:s,buttons:y}),this):this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}toTop(){const t=this.attr("afterScroll"),s=this.toolbar,i=this.chapters,r=this.count();return r>0&&(i.playing=!0),this.scrollTo(0,(()=>{s.hide("up"),s.show("down"),r>0&&(i.highlight(0),i.playing=!1),e(t)&&t.call(s,"up")})),this}toBottom(){const t=this.attr("afterScroll"),s=p(this.attr("scrollElement")),i=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(s.scrollHeight-s.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(n,(()=>{i.hide("down"),i.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),e(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return m(s,t,e),this}enterReading(){const t="outline-reading",e=`${t}_hidden`,s=document.querySelector("#outline-print"),i=document.querySelectorAll(".outline-print_sibling"),r=this.attr("print").enterReadingTip||ft;return this.reading||!s||(i.forEach((t=>{a(t,e)})),a(s,t),this.reading=!0,this.toolbar.toggle(),pt.info({round:!0,message:r}),this.$emit("enterReading")),this}exitReading(){const t="outline-reading",e=`${t}_hidden`,s=document.querySelector("#outline-print"),i=document.querySelectorAll(".outline-print_sibling");return this.reading&&s?(u(s,t),i.forEach((t=>{u(t,e)})),this.reading=!1,this.toolbar.toggle(),this.$emit("exitReading"),this):this}switchReading(){return document.querySelector("#outline-print")?(this.reading?this.exitReading():this.enterReading(),this):this}toggle(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.chapters;return this.count()<1||("relative"!==t?(r.toggle(),e.highlight("menu")):(e.toggle(),s((()=>{i.toggle()})))),this}print(){return e(print)?(print(),this):this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count(),n=document.querySelector("#outline-print");return this.$emit("beforeDestroy"),this.removeListeners(),n&&document.body.removeChild(n),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(gt.DEFAULTS),this.$emit("destroyed"),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onEnterReading(){return this.switchReading(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.switchReading(),w(t)),this}onPrint(){return this.print(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","/**\n * timeSlice.js 时间切片功能函数\n * ====================================================\n * Created By: Yaohaixiao\n * Update: 2023.09.04\n */\nimport isFunction from '../types/isFunction'\nimport later from './later'\n\nconst queue = []\nlet isHandling\nlet done\n\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\nif (typeof window.requestIdleCallback === 'undefined') {\n window.requestIdleCallback = function (cb) {\n const start = Date.now()\n return later(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start))\n }\n })\n }, 10)\n }\n\n window.cancelIdleCallback = function (id) {\n clearTimeout(id)\n }\n}\n\nfunction runIdle(idleDeadline) {\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\n const fn = queue.shift()\n\n if (!isFunction(fn)) {\n return false\n }\n\n fn()\n }\n\n if (queue.length) {\n isHandling = requestIdleCallback(runIdle)\n } else {\n isHandling = 0\n\n if (isFunction(done)) {\n done()\n done = null\n }\n }\n}\n\n/**\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\n * 多个短时间任务\n * ====================================================\n * @param {Function} fn - 需要在空闲时执行的回调函数\n * @param {Function} afterComplete - queen 的\n * @return {(function(): (boolean|undefined))|*|boolean}\n */\nconst timeSlice = (fn, afterComplete = null) => {\n queue.push(fn)\n\n if (isFunction(afterComplete)) {\n done = afterComplete\n }\n\n if (!isHandling) {\n requestIdleCallback(runIdle)\n }\n}\n\nexport default timeSlice\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'htmlFor':\n el.setAttribute('for', value)\n break\n case 'className':\n el.className = value\n break\n case 'innerHTML':\n el.innerHTML = value\n break\n case 'innerText':\n el.innerText = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n if (!el || !isObject(attrs)) {\n return false\n }\n\n Object.keys(attrs).forEach((attr) => {\n const value = attrs[attr]\n if (hasOwn(attrs, attr)) {\n setAttribute(el, attr, value)\n }\n })\n}\n\nexport default setAttributes\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n setAttributes($el, attrs)\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n } else if (isDOM(attrs)) {\n append(attrs)\n } else if (isString(attrs)) {\n append(document.createTextNode(attrs))\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\nimport setAttributes from '../dom/setAttributes'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @param {Object} [options.attrs]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const ICON = 'outline-icon'\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const attrs = options.attrs || {}\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg = ``\n }\n\n $icon.innerHTML = svg\n\n if (attrs.className) {\n attrs.className = `${ICON} ${attrs.className}`\n } else {\n attrs.className = ICON\n }\n\n setAttributes($icon, attrs)\n\n $svg = $icon.querySelector('svg')\n setAttributes($svg, {\n 'aria-hidden': true,\n xmlns: 'http://www.w3.org/2000/svg',\n class: 'outline-icon__svg',\n width: 200,\n height: 200,\n style: cssRules\n })\n\n return $icon\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n let $anchor\n\n $heading.innerHTML = text.replace(pattern, '')\n $heading.removeAttribute('id')\n $heading.removeAttribute('data-id')\n\n removeClass($heading, CLS_HEADING)\n\n if (!hasAnchor) {\n return false\n }\n\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n if (isAtStart) {\n removeClass($heading, `${CLS_HEADING}_start`)\n }\n\n if (isEmpty(trim($heading.className))) {\n $heading.removeAttribute('class')\n }\n\n $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n let previous = 1\n let level = 0\n let text = ''\n const chapters = []\n\n headings.forEach((heading, i) => {\n const tagName = heading.tagName\n const headingLevel = tagName.replace(/h/i, '')\n let current = parseInt(headingLevel, 10)\n let pid = -1\n\n // 场景1:当前标题是前一个标题的子标题\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n // h2 (前一个标题)\n // h3 (当前标题)\n if (current > previous) {\n level += 1\n\n // 第一层级的 pid 是 -1\n if (level === 1) {\n pid = -1\n } else {\n pid = i - 1\n }\n }\n // 场景2:当前标题和前一个标题层级相同\n // 当前标题的(标题标签)序号 = 前一个标题的序号\n // h2 (前一个标题)\n // h2 (当前标题)\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\n // h2\n // h4 (前一个标题)\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n else if (current === previous || (current < previous && current > level)) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n pid = -1\n } else {\n pid = chapters[i - 1].pid\n }\n }\n // 场景3:当前标题比前一个标题层级高\n else if (current <= level) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n } else {\n level = level - (previous - current)\n\n if (level <= 1) {\n level = 1\n }\n }\n\n // 第一级的标题\n if (level === 1) {\n pid = -1\n } else {\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n }\n }\n\n previous = current\n\n text = stripTags(trim(heading.innerHTML))\n\n if (isFunction(chapterTextFilter)) {\n text = chapterTextFilter(text)\n }\n\n chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text,\n tagName\n })\n })\n\n return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n if (!isString(str)) {\n return ''\n }\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n let previous = chapters[index - 1]\n let pid\n let i\n\n for (i = 0; i < differ; i += 1) {\n pid = previous.pid\n previous = chapters[pid]\n }\n\n pid = previous.pid\n\n return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n const groups = {}\n const cb = (o) => {\n return [o.pid]\n }\n\n chapters.forEach((o) => {\n const group = JSON.stringify(cb(o))\n\n groups[group] = groups[group] || []\n groups[group].push(o)\n\n o.index = groups[group].length\n if (o.pid === -1) {\n o.code = String(o.index)\n }\n })\n\n Object.keys(groups).forEach((group) => {\n groups[group].forEach((c) => {\n const subjects = groups[`[${c.id}]`]\n if (!subjects || !isArray(subjects)) {\n return false\n }\n subjects.forEach((o) => {\n o.code = c.code + '.' + o.index\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport timeSlice from './utils/lang/timeSlice'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nimport Base from './base'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n const showCode = this.attr('showCode') || true\n let created\n let scrollElement\n let selector\n let $articleElement\n let articleElement\n\n this.attr(options)\n articleElement = this.attr('articleElement')\n scrollElement = this.attr('scrollElement')\n selector = this.attr('selector')\n created = this.attr('created')\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n if (!$articleElement) {\n return this\n }\n\n this.$articleElement = $articleElement\n this.$scrollElement = _getScrollElement(scrollElement)\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n if (this.$headings.length < 1) {\n return this\n }\n\n this.chapters = getChapters(\n this.$headings,\n showCode,\n this.attr('chapterTextFilter')\n )\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const chapters = this.chapters\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.chapters.length\n }\n\n render() {\n const LIMIT = 400\n const mounted = this.attr('mounted')\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const count = this.count()\n const $headings = [...this.$headings]\n const chapters = this.getChapters()\n const update = (headings, group) => {\n headings.forEach(($heading, i) => {\n const id = i + group * LIMIT\n const chapterCode = chapters[id].code\n _updateHeading($heading, id, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n }\n let groupIndex = -1\n\n paint()\n\n // 针对超长的文章,进行 timeSlice 处理\n if (count > LIMIT) {\n groupIndex += 1\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\n update($headings.splice(0, LIMIT), 0)\n // 采用 timeSlice 处理机制绘制剩余的标题\n while ($headings.length > 0) {\n const once = $headings.splice(0, LIMIT)\n timeSlice(\n () => {\n update(once, (groupIndex += 1))\n },\n () => {\n this.$emit('anchors:all:paint')\n }\n )\n }\n } else {\n update($headings, 0)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n destroy() {\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n onAnchorTrigger(evt) {\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const $heading = $anchor.parentNode\n const top = offsetTop($heading) - (stickyHeight + 10)\n const $scrollElement = this.$scrollElement\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'anchor')\n }\n\n later(() => {\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.scrollTo(top, after)\n\n if (!anchorURL) {\n stop(evt)\n }\n\n return this\n }\n\n addListeners() {\n const $articleElement = this.$articleElement\n\n on(\n $articleElement,\n '.outline-heading__anchor',\n 'click',\n this.onAnchorTrigger,\n this,\n true\n )\n\n return this\n }\n\n removeListeners() {\n const $articleElement = this.$articleElement\n\n off($articleElement, 'click', this.onAnchorTrigger)\n\n return this\n }\n}\n\nAnchors.DEFAULTS = {\n scrollElement: 'html,body',\n articleElement: '#article',\n selector: 'h1,h2,h3,h4,h5,h6',\n stickyHeight: 0,\n anchorURL: '',\n hasAnchor: true,\n isAtStart: true,\n showCode: false,\n created: null,\n mounted: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n chapterTextFilter: null\n}\n\nexport default Anchors\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttributes from './utils/dom/setAttributes'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n const CLS_HEADING = 'outline-heading'\n const hasAnchor = options.hasAnchor || true\n const isAtStart = options.isAtStart || true\n const showCode = options.showCode || false\n const chapterCode = options.chapterCode || ''\n const anchorURL = options.anchorURL || ''\n const headingId = `heading-${i}`\n const attrs = {\n id: headingId,\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n 'data-id': i\n }\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n if (showCode) {\n attrs.innerHTML = chapterCode + ' ' + text\n }\n setAttributes($heading, attrs)\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = icon('hash', { iconSet: 'outline' })\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL || `#${headingId}`,\n target: anchorURL ? '_blank' : 'self',\n 'data-id': i\n },\n $icon\n )\n $heading.appendChild($anchor)\n}\n\nexport default _updateHeading\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Drawer.DEFAULTS)\n this.title = ''\n this.closed = true\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n this.title\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n icon('close', { iconSet: 'outline', size: 20 })\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement('div', {\n className: 'outline-drawer__main'\n })\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement('footer', {\n className: 'outline-drawer__footer'\n })\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement('div', {\n className: 'outline-drawer__overlay'\n })\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport cloneDeep from './utils/lang/cloneDeep'\n\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Chapters.DEFAULTS)\n\n this._reset()\n\n this.offsetWidth = 0\n this.playing = false\n this.scrollTimer = null\n this.resizeTimer = null\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n _reset() {\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.$active = null\n\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.closed = false\n\n return this\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n count() {\n return this.chapters.length\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const animationCurrent = this.attr('animationCurrent')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const children = []\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n title\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement('ul', {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n })\n this.$list = $list\n children.push($list)\n\n if (animationCurrent) {\n $placeholder = createElement('div', {\n className: 'outline-chapters__placeholder'\n })\n this.$placeholder = $placeholder\n children.push($placeholder)\n }\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n children\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n const count = this.count()\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n if (this.isInside()) {\n addClass($parentElement, 'outline-chapters-parent')\n }\n\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n\n later(() => {\n this.highlight(this.active)\n }, 60)\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n if (count < 400) {\n this.onObserver()\n }\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const animationCurrent = this.attr('animationCurrent')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (!animationCurrent) {\n return this\n }\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const animationCurrent = this.attr('animationCurrent')\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const ACTIVE = 'outline-chapters_active'\n const HIGHLIGHT = 'outline-chapters_highlight'\n\n if (!$anchor) {\n return this\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n removeClass(this.$active, ACTIVE)\n }\n\n this.$active = $anchor\n addClass(this.$active, ACTIVE)\n\n if (animationCurrent) {\n this.positionPlaceholder(this.active)\n } else {\n addClass(this.$active, HIGHLIGHT)\n }\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n removeClass($parent, HIDDEN)\n } else {\n removeClass($parent, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n }, 30)\n }\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n addClass($parent, HIDDEN)\n } else {\n addClass($parent, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n })\n }\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)._reset()\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at(window, 'resize', this.onResize, this, true)\n }\n this.$on('anchors:all:paint', this.onObserver, this)\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at(window, 'resize', this.onResize)\n }\n\n this.$off('anchors:all:paint')\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n animationCurrent: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\nimport timeSlice from './utils/lang/timeSlice'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const LIMIT = 400\n const count = chapters.length\n const clones = [...chapters]\n const paint = (parts) => {\n const byId = (id) => $list.querySelector(`#${id}`)\n parts.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const children = []\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n chapter.text\n )\n let $link\n let $code\n let $li\n let $subject\n let $chapter\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n chapter.code\n )\n\n children.push($code)\n }\n\n children.push($text)\n\n $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n children\n )\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n $link\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $chapter = byId(`chapter-${pid}`)\n $subject = byId(`subject-${pid}`)\n\n if (!$subject) {\n $subject = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n $li\n )\n\n $chapter.appendChild($subject)\n } else {\n $subject.appendChild($li)\n }\n }\n })\n }\n\n if (count > LIMIT) {\n // 同步绘制\n paint(clones.splice(0, LIMIT))\n // 剩余的采用 timeSlice 机制绘制\n while (clones.length > 0) {\n const once = clones.splice(0, LIMIT)\n timeSlice(() => {\n paint(once)\n })\n }\n } else {\n paint(clones)\n }\n}\n\nexport default _paintChapters\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n $icon\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = []\n\n paint()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.push($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n $buttons\n )\n document.body.appendChild(this.$el)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n this.$emit(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n","import isObject from './isObject'\n\n/**\n * 检测测试数据是否为类似 Object 类型\n * ========================================================================\n * @method isObjectLike\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\n */\nconst isObjectLike = (val) => {\n return isObject(val) && val !== null\n}\n\nexport default isObjectLike\n","import isObjectLike from './isObjectLike'\n\n/**\n * 检测测试数据是否为普通对象\n * ========================================================================\n * @method isPlainObject\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\n */\nconst isPlainObject = (val) => {\n const getPrototypeOf = Object.getPrototypeOf\n let proto\n\n // Detect obvious negatives\n if (!isObjectLike(val)) {\n return false\n }\n\n proto = val.prototype\n\n // JavaScript 对象分为两种:普通对象和函数对象\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\n if (!proto) {\n return true\n }\n\n proto = val\n\n while (getPrototypeOf(proto) !== null) {\n proto = getPrototypeOf(proto)\n }\n\n return getPrototypeOf(val) === proto\n}\n\nexport default isPlainObject\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n *\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n document.body.removeChild(this.$el)\r\n\r\n this.attr(Message.DEFAULTS)\r\n\r\n this.id = ''\r\n this.closed = true\r\n this.visible = false\r\n this.offset = -50\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n this.destroyed = true\r\n\r\n this.$el = null\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n}\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport later from './utils/lang/later'\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nconst paintPrint = (el, title) => {\r\n const $fragment = document.createDocumentFragment()\r\n let text = title\r\n let $el\r\n let $wrapper\r\n let $article\r\n let $title\r\n let $sibling\r\n let $icon\r\n let $children\r\n\r\n if (isString(el)) {\r\n $el = document.querySelector(el)\r\n } else if (isElement(el)) {\r\n $el = el\r\n }\r\n\r\n if (!$el) {\r\n return false\r\n }\r\n\r\n $icon = icon('close', {\r\n iconSet: 'outline',\r\n size: 20,\r\n attrs: {\r\n className: 'outline-print__close'\r\n }\r\n })\r\n\r\n $title = $el.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n text = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-print__title'\r\n },\r\n text\r\n )\r\n\r\n $article = createElement('article', {\r\n id: 'outline-print__article',\r\n className: 'outline-print__article'\r\n })\r\n\r\n $wrapper = createElement(\r\n 'section',\r\n {\r\n id: 'outline-print',\r\n className: 'outline-print'\r\n },\r\n [$icon, $title, $article]\r\n )\r\n document.body.appendChild($wrapper)\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $wrapper.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $wrapper.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n\r\n // 克隆文章内容\r\n $children = $el.cloneNode(true).childNodes\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n $article.appendChild($fragment)\r\n })\r\n}\r\n\r\nexport default paintPrint\r\n","import later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport isFunction from './utils/types/isFunction'\nimport isString from './utils/types/isString'\nimport isElement from './utils/types/isElement'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\n\nimport Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\nimport Message from './message'\nimport paintPrint from './print'\n\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Outline.DEFAULTS)\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n this.buttons = []\n this.reading = false\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options)\n this.$emit('created', { ...this.attr() })\n this.render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n const scrollElement = this.attr('scrollElement')\n const $scrollElement = document.querySelector(scrollElement)\n\n this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar()\n\n if ($scrollElement) {\n this.onToolbarUpdate({\n top: $scrollElement.scrollTop,\n min: 0,\n max: $scrollElement.scrollHeight\n })\n }\n\n this.$emit('mounted')\n\n return this\n }\n\n _renderPrint() {\n const option = this.attr('print')\n const articleElement = this.attr('articleElement')\n let $articleElement\n let $print\n let element\n\n if (!option.element) {\n return this\n }\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n addClass($articleElement, 'outline-article')\n\n element = option.element\n\n if (isString(element)) {\n $print = document.querySelector(element)\n } else if (isElement(element)) {\n $print = element\n }\n\n paintPrint($print, option.title)\n\n return this\n }\n\n _renderAnchors() {\n const articleElement = this.attr('articleElement')\n const selector = this.attr('selector')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const chapterTextFilter = this.attr('chapterTextFilter')\n\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll,\n chapterTextFilter\n })\n\n return this\n }\n\n _renderChapters() {\n const title = this.attr('title')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const customClass = this.attr('customClass')\n const showCode = this.attr('showCode')\n const animationCurrent = this.attr('animationCurrent')\n const position = this.attr('position')\n const placement = this.attr('placement')\n const afterSticky = this.attr('afterSticky')\n const afterToggle = this.attr('afterToggle')\n const afterScroll = this.attr('afterScroll')\n const count = this.count()\n let parentElement = this.attr('parentElement')\n let CHAPTERS_OPTIONS\n\n if (count < 1) {\n return this\n }\n\n CHAPTERS_OPTIONS = {\n scrollElement,\n showCode,\n animationCurrent,\n position,\n title,\n stickyHeight,\n chapters: this.getChapters(),\n afterSticky,\n afterToggle,\n afterScroll\n }\n\n if (position === 'relative') {\n this.drawer = new Drawer({\n placement,\n title,\n size: 'tiny',\n hasOffset: true,\n hasPadding: false,\n customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\n } else {\n CHAPTERS_OPTIONS.customClass = customClass\n }\n\n CHAPTERS_OPTIONS.parentElement = parentElement\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\n\n return this\n }\n\n _renderToolbar() {\n const placement = this.attr('placement')\n const homepage = this.attr('homepage')\n const git = this.attr('git')\n const tags = this.attr('tags')\n const issues = this.attr('issues')\n const tools = this.attr('tools')\n const option = this.attr('print')\n const count = this.count()\n const UP = {\n name: 'up',\n icon: 'up',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:up'\n }\n }\n const HOME = {\n name: 'homepage',\n icon: 'homepage',\n size: 20,\n link: homepage\n }\n const GIT = {\n name: 'github',\n icon: 'github',\n size: 20,\n link: git\n }\n const TAGS = {\n name: 'tags',\n icon: 'tags',\n size: 20,\n link: tags\n }\n const ISSUES = {\n name: 'issues',\n icon: 'issues',\n size: 20,\n link: issues\n }\n const MENU = {\n name: 'menu',\n icon: 'menu',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:toggle'\n }\n }\n const READING = {\n name: 'reading',\n icon: 'file',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:reading'\n }\n }\n const PRINT = {\n name: 'print',\n icon: 'print',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:print'\n }\n }\n const DOWN = {\n name: 'down',\n icon: 'down',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:down'\n }\n }\n const buttons = []\n\n buttons.push(UP)\n if (count > 0) {\n buttons.push(MENU)\n }\n if (homepage) {\n buttons.push(HOME)\n }\n if (git) {\n buttons.push(GIT)\n }\n if (tags) {\n buttons.push(TAGS)\n }\n if (issues) {\n buttons.push(ISSUES)\n }\n if (option.element) {\n buttons.push(READING)\n if (isFunction(print)) {\n buttons.push(PRINT)\n }\n }\n if (tools?.length > 0) {\n buttons.push(...tools)\n }\n buttons.push(DOWN)\n this.buttons = [...buttons]\n\n this.toolbar = new Toolbar({\n placement,\n buttons\n })\n\n return this\n }\n\n addButton(button) {\n const toolbar = this.toolbar\n const buttons = this.buttons\n buttons.splice(-1, 0, button)\n toolbar.attr({\n buttons\n })\n toolbar.refresh()\n return this\n }\n\n removeButton(name) {\n this.toolbar.remove(name)\n return this\n }\n\n toTop() {\n const afterScroll = this.attr('afterScroll')\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const afterTop = () => {\n toolbar.hide('up')\n toolbar.show('down')\n\n if (count > 0) {\n chapters.highlight(0)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(0, afterTop)\n\n return this\n }\n\n toBottom() {\n const afterScroll = this.attr('afterScroll')\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const top = Math.floor(\n $scrollElement.scrollHeight - $scrollElement.clientHeight\n )\n const afterDown = () => {\n toolbar.hide('down')\n toolbar.show('up')\n\n if (count > 0) {\n chapters.highlight(count - 1)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(top, afterDown)\n\n return this\n }\n\n scrollTo(top, afterScroll) {\n const scrollElement = this.attr('scrollElement')\n scrollTo(scrollElement, top, afterScroll)\n return this\n }\n\n enterReading() {\n const READING = 'outline-reading'\n const HIDDEN = `${READING}_hidden`\n const $reading = document.querySelector('#outline-print')\n const $siblings = document.querySelectorAll('.outline-print_sibling')\n const options = this.attr('print')\n const enterReadingTip = options.enterReadingTip || ENTER_READING_TIP\n\n if (this.reading || !$reading) {\n return this\n }\n\n $siblings.forEach(($sibling) => {\n addClass($sibling, HIDDEN)\n })\n addClass($reading, READING)\n this.reading = true\n\n this.toolbar.toggle()\n\n Message.info({\n round: true,\n message: enterReadingTip\n })\n\n this.$emit('enterReading')\n\n return this\n }\n\n exitReading() {\n const READING = 'outline-reading'\n const HIDDEN = `${READING}_hidden`\n const $reading = document.querySelector('#outline-print')\n const $siblings = document.querySelectorAll('.outline-print_sibling')\n\n if (!this.reading || !$reading) {\n return this\n }\n\n removeClass($reading, READING)\n $siblings.forEach(($sibling) => {\n removeClass($sibling, HIDDEN)\n })\n this.reading = false\n\n this.toolbar.toggle()\n\n this.$emit('exitReading')\n\n return this\n }\n\n switchReading() {\n const $print = document.querySelector('#outline-print')\n\n if (!$print) {\n return this\n }\n\n if (!this.reading) {\n this.enterReading()\n } else {\n this.exitReading()\n }\n\n return this\n }\n\n toggle() {\n const position = this.attr('position')\n const toolbar = this.toolbar\n const drawer = this.drawer\n const chapters = this.chapters\n const count = this.count()\n\n if (count < 1) {\n return this\n }\n\n if (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n later(() => {\n drawer.toggle()\n })\n }\n\n return this\n }\n\n print() {\n if (!isFunction(print)) {\n return this\n }\n\n print()\n\n return this\n }\n\n destroy() {\n let anchors = this.anchors\n let chapters = this.chapters\n let drawer = this.drawer\n let toolbar = this.toolbar\n let isOutside = false\n const count = this.count()\n const $print = document.querySelector('#outline-print')\n\n this.$emit('beforeDestroy')\n\n this.removeListeners()\n\n if ($print) {\n document.body.removeChild($print)\n }\n\n if (count > 0) {\n isOutside = chapters.isOutside()\n\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(Outline.DEFAULTS)\n\n this.$emit('destroyed')\n\n return this\n }\n\n onToggle() {\n this.toggle()\n return this\n }\n\n onScrollTop() {\n this.toTop()\n return this\n }\n\n onScrollBottom() {\n this.toBottom()\n return this\n }\n\n onEnterReading() {\n this.switchReading()\n return this\n }\n\n onExitReading(evt) {\n const keyCode = evt.keyCode\n\n if (keyCode === 27 && this.reading) {\n this.switchReading()\n stop(evt)\n }\n\n return this\n }\n\n onPrint() {\n this.print()\n\n return this\n }\n\n onToolbarUpdate({ top, min, max }) {\n const toolbar = this.toolbar\n const current = Math.ceil(top)\n\n if (current <= min) {\n toolbar.hide('up')\n toolbar.show('down')\n } else if (current >= max) {\n toolbar.hide('down')\n toolbar.show('up')\n } else if (current > min && current < max) {\n toolbar.show('up')\n toolbar.show('down')\n }\n\n return this\n }\n\n addListeners() {\n const $print = document.querySelector('#outline-print')\n\n this.$on('toolbar:update', this.onToolbarUpdate)\n this.$on('toolbar:action:up', this.onScrollTop)\n this.$on('toolbar:action:toggle', this.onToggle)\n this.$on('toolbar:action:reading', this.onEnterReading)\n this.$on('toolbar:action:down', this.onScrollBottom)\n\n if ($print) {\n at(document, 'keyup', this.onExitReading, this, true)\n on($print, '.outline-print__close', 'click', this.exitReading, this, true)\n this.$on('toolbar:action:print', this.onPrint)\n }\n\n return this\n }\n\n removeListeners() {\n const $print = document.querySelector('#outline-print')\n\n this.$off('toolbar:update')\n this.$off('toolbar:action:up')\n this.$off('toolbar:action:toggle')\n this.$off('toolbar:action:down')\n\n if ($print) {\n off(document, 'keyup', this.onExitReading)\n off($print, 'click', this.exitReading)\n this.$off('toolbar:action:print')\n }\n\n return this\n }\n}\n\nOutline.DEFAULTS = {\n articleElement: '#article',\n selector: 'h2,h3,h4,h5,h6',\n title: '目录',\n scrollElement: 'html,body',\n position: 'relative',\n parentElement: '#aside',\n placement: 'rtl',\n animationCurrent: true,\n showCode: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n tools: [],\n print: {\n element: '',\n title: '',\n enterReadingTip: ENTER_READING_TIP\n },\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: null,\n chapterTextFilter: null\n}\n\nif (window.jQuery) {\n // 将 Outline 扩展为一个 jquery 插件\n // eslint-disable-next-line no-undef\n jQuery.extend(jQuery.fn, {\n outline: function (options) {\n // eslint-disable-next-line no-undef\n let $article = jQuery(this)\n\n return new Outline(\n // eslint-disable-next-line no-undef\n jQuery.extend({}, options, {\n articleElement: $article\n })\n )\n }\n })\n}\n\nexport default Outline\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","add","length","trim","replace","removeClass","remove","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","arguments","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","stopPropagation","preventDefault","hasOwn","prop","hasOwnProperty","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","innerHTML","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","rel","groups","group","JSON","stringify","code","String","c","subjects","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","LIMIT","mounted","anchorURL","update","chapterCode","headingId","href","_updateHeading","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","getStyle","ruleName","getComputedStyle","Chapters","_reset","offsetWidth","playing","scrollTimer","resizeTimer","Observer","$list","$placeholder","$parentElement","$active","active","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_paintChapters","highlight","sticky","onObserver","positionPlaceholder","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","ACTIVE","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","innerHeight","show","HIDDEN","hide","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","option","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","isPlainObject","getPrototypeOf","proto","isObjectLike","stripScripts","encodeHTML","CHARTS","tag","instances","instance","Message","visible","offset","destroyed","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Outline","anchors","drawer","toolbar","reading","_renderPrint","_renderAnchors","_renderChapters","_renderToolbar","onToolbarUpdate","$print","element","$wrapper","$article","cloneNode","paintPrint","CHAPTERS_OPTIONS","homepage","git","tags","issues","tools","HOME","GIT","TAGS","ISSUES","MENU","READING","PRINT","print","addButton","removeButton","toTop","toBottom","floor","enterReading","$reading","$siblings","enterReadingTip","info","exitReading","switchReading","onToggle","onScrollTop","onScrollBottom","onEnterReading","onExitReading","keyCode","onPrint","ceil","jQuery","outline"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/lang/later.js","../../utils/types/isObject.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/types/isString.js","../../utils/types/isElement.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/lang/trim.js","../../utils/dom/removeClass.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/scrollTo.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/at.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/event/stop.js","../../utils/lang/hasOwn.js","../../utils/lang/extend.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/observer/on.js","../../utils/lang/timeSlice.js","../../utils/dom/offsetTop.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/setAttribute.js","../../utils/dom/setAttributes.js","../../utils/dom/createElement.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../utils/icons/icon.js","../../_resetHeading.js","../../utils/types/isEmpty.js","../../getChapters.js","../../utils/lang/stripTags.js","../../_getChapterParentIdByDiffer.js","../../_getChaptersWithCode.js","../../anchors.js","../../utils/lang/toTree.js","../../_updateHeading.js","../../utils/dom/setProperty.js","../../zIndex.js","../../drawer.js","../../utils/dom/intersection.js","../../utils/dom/getStyle.js","../../chapters.js","../../_paintChapters.js","../../_createButton.js","../../toolbar.js","../../utils/types/isObjectLike.js","../../utils/types/isPlainObject.js","../../utils/lang/stripScripts.js","../../utils/lang/encodeHTML.js","../../message.js","../../print.js","../../outline.js"],"sourcesContent":["/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","/**\n * timeSlice.js 时间切片功能函数\n * ====================================================\n * Created By: Yaohaixiao\n * Update: 2023.09.04\n */\nimport isFunction from '../types/isFunction'\nimport later from './later'\n\nconst queue = []\nlet isHandling\nlet done\n\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\nif (typeof window.requestIdleCallback === 'undefined') {\n window.requestIdleCallback = function (cb) {\n const start = Date.now()\n return later(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start))\n }\n })\n }, 10)\n }\n\n window.cancelIdleCallback = function (id) {\n clearTimeout(id)\n }\n}\n\nfunction runIdle(idleDeadline) {\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\n const fn = queue.shift()\n\n if (!isFunction(fn)) {\n return false\n }\n\n fn()\n }\n\n if (queue.length) {\n isHandling = requestIdleCallback(runIdle)\n } else {\n isHandling = 0\n\n if (isFunction(done)) {\n done()\n done = null\n }\n }\n}\n\n/**\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\n * 多个短时间任务\n * ====================================================\n * @param {Function} fn - 需要在空闲时执行的回调函数\n * @param {Function} afterComplete - queen 的\n * @return {(function(): (boolean|undefined))|*|boolean}\n */\nconst timeSlice = (fn, afterComplete = null) => {\n queue.push(fn)\n\n if (isFunction(afterComplete)) {\n done = afterComplete\n }\n\n if (!isHandling) {\n requestIdleCallback(runIdle)\n }\n}\n\nexport default timeSlice\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'htmlFor':\n el.setAttribute('for', value)\n break\n case 'className':\n el.className = value\n break\n case 'innerHTML':\n el.innerHTML = value\n break\n case 'innerText':\n el.innerText = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n if (!el || !isObject(attrs)) {\n return false\n }\n\n Object.keys(attrs).forEach((attr) => {\n const value = attrs[attr]\n if (hasOwn(attrs, attr)) {\n setAttribute(el, attr, value)\n }\n })\n}\n\nexport default setAttributes\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n setAttributes($el, attrs)\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n } else if (isDOM(attrs)) {\n append(attrs)\n } else if (isString(attrs)) {\n append(document.createTextNode(attrs))\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\nimport setAttributes from '../dom/setAttributes'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @param {Object} [options.attrs]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const ICON = 'outline-icon'\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const attrs = options.attrs || {}\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg = ``\n }\n\n $icon.innerHTML = svg\n\n if (attrs.className) {\n attrs.className = `${ICON} ${attrs.className}`\n } else {\n attrs.className = ICON\n }\n\n setAttributes($icon, attrs)\n\n $svg = $icon.querySelector('svg')\n setAttributes($svg, {\n 'aria-hidden': true,\n xmlns: 'http://www.w3.org/2000/svg',\n class: 'outline-icon__svg',\n width: 200,\n height: 200,\n style: cssRules\n })\n\n return $icon\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n let $anchor\n\n $heading.innerHTML = text.replace(pattern, '')\n $heading.removeAttribute('id')\n $heading.removeAttribute('data-id')\n\n removeClass($heading, CLS_HEADING)\n\n if (!hasAnchor) {\n return false\n }\n\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n if (isAtStart) {\n removeClass($heading, `${CLS_HEADING}_start`)\n }\n\n if (isEmpty(trim($heading.className))) {\n $heading.removeAttribute('class')\n }\n\n $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n let previous = 1\n let level = 0\n let text = ''\n const chapters = []\n\n headings.forEach((heading, i) => {\n const tagName = heading.tagName\n const headingLevel = tagName.replace(/h/i, '')\n let current = parseInt(headingLevel, 10)\n let pid = -1\n\n // 场景1:当前标题是前一个标题的子标题\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n // h2 (前一个标题)\n // h3 (当前标题)\n if (current > previous) {\n level += 1\n\n // 第一层级的 pid 是 -1\n if (level === 1) {\n pid = -1\n } else {\n pid = i - 1\n }\n }\n // 场景2:当前标题和前一个标题层级相同\n // 当前标题的(标题标签)序号 = 前一个标题的序号\n // h2 (前一个标题)\n // h2 (当前标题)\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\n // h2\n // h4 (前一个标题)\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n else if (current === previous || (current < previous && current > level)) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n pid = -1\n } else {\n pid = chapters[i - 1].pid\n }\n }\n // 场景3:当前标题比前一个标题层级高\n else if (current <= level) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n } else {\n level = level - (previous - current)\n\n if (level <= 1) {\n level = 1\n }\n }\n\n // 第一级的标题\n if (level === 1) {\n pid = -1\n } else {\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n }\n }\n\n previous = current\n\n text = stripTags(trim(heading.innerHTML))\n\n if (isFunction(chapterTextFilter)) {\n text = chapterTextFilter(text)\n }\n\n chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text,\n tagName\n })\n })\n\n return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n if (!isString(str)) {\n return ''\n }\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n let previous = chapters[index - 1]\n let pid\n let i\n\n for (i = 0; i < differ; i += 1) {\n pid = previous.pid\n previous = chapters[pid]\n }\n\n pid = previous.pid\n\n return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n const groups = {}\n const cb = (o) => {\n return [o.pid]\n }\n\n chapters.forEach((o) => {\n const group = JSON.stringify(cb(o))\n\n groups[group] = groups[group] || []\n groups[group].push(o)\n\n o.index = groups[group].length\n if (o.pid === -1) {\n o.code = String(o.index)\n }\n })\n\n Object.keys(groups).forEach((group) => {\n groups[group].forEach((c) => {\n const subjects = groups[`[${c.id}]`]\n if (!subjects || !isArray(subjects)) {\n return false\n }\n subjects.forEach((o) => {\n o.code = c.code + '.' + o.index\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport timeSlice from './utils/lang/timeSlice'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nimport Base from './base'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n const showCode = this.attr('showCode') || true\n let created\n let scrollElement\n let selector\n let $articleElement\n let articleElement\n\n this.attr(options)\n articleElement = this.attr('articleElement')\n scrollElement = this.attr('scrollElement')\n selector = this.attr('selector')\n created = this.attr('created')\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n if (!$articleElement) {\n return this\n }\n\n this.$articleElement = $articleElement\n this.$scrollElement = _getScrollElement(scrollElement)\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n if (this.$headings.length < 1) {\n return this\n }\n\n this.chapters = getChapters(\n this.$headings,\n showCode,\n this.attr('chapterTextFilter')\n )\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const chapters = this.chapters\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.chapters.length\n }\n\n render() {\n const LIMIT = 400\n const mounted = this.attr('mounted')\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const count = this.count()\n const $headings = [...this.$headings]\n const chapters = this.getChapters()\n const update = (headings, group) => {\n headings.forEach(($heading, i) => {\n const id = i + group * LIMIT\n const chapterCode = chapters[id].code\n _updateHeading($heading, id, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n }\n let groupIndex = -1\n\n paint()\n\n // 针对超长的文章,进行 timeSlice 处理\n if (count > LIMIT) {\n groupIndex += 1\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\n update($headings.splice(0, LIMIT), 0)\n // 采用 timeSlice 处理机制绘制剩余的标题\n while ($headings.length > 0) {\n const once = $headings.splice(0, LIMIT)\n timeSlice(\n () => {\n update(once, (groupIndex += 1))\n },\n () => {\n this.$emit('anchors:all:paint')\n }\n )\n }\n } else {\n update($headings, 0)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n destroy() {\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n onAnchorTrigger(evt) {\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const $heading = $anchor.parentNode\n const top = offsetTop($heading) - (stickyHeight + 10)\n const $scrollElement = this.$scrollElement\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'anchor')\n }\n\n later(() => {\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.scrollTo(top, after)\n\n if (!anchorURL) {\n stop(evt)\n }\n\n return this\n }\n\n addListeners() {\n const $articleElement = this.$articleElement\n\n on(\n $articleElement,\n '.outline-heading__anchor',\n 'click',\n this.onAnchorTrigger,\n this,\n true\n )\n\n return this\n }\n\n removeListeners() {\n const $articleElement = this.$articleElement\n\n off($articleElement, 'click', this.onAnchorTrigger)\n\n return this\n }\n}\n\nAnchors.DEFAULTS = {\n scrollElement: 'html,body',\n articleElement: '#article',\n selector: 'h1,h2,h3,h4,h5,h6',\n stickyHeight: 0,\n anchorURL: '',\n hasAnchor: true,\n isAtStart: true,\n showCode: false,\n created: null,\n mounted: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n chapterTextFilter: null\n}\n\nexport default Anchors\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttributes from './utils/dom/setAttributes'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n const CLS_HEADING = 'outline-heading'\n const hasAnchor = options.hasAnchor || true\n const isAtStart = options.isAtStart || true\n const showCode = options.showCode || false\n const chapterCode = options.chapterCode || ''\n const anchorURL = options.anchorURL || ''\n const headingId = `heading-${i}`\n const attrs = {\n id: headingId,\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n 'data-id': i\n }\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n if (showCode) {\n attrs.innerHTML = chapterCode + ' ' + text\n }\n setAttributes($heading, attrs)\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = icon('hash', { iconSet: 'outline' })\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL || `#${headingId}`,\n target: anchorURL ? '_blank' : 'self',\n 'data-id': i\n },\n $icon\n )\n $heading.appendChild($anchor)\n}\n\nexport default _updateHeading\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Drawer.DEFAULTS)\n this.title = ''\n this.closed = true\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n this.title\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n icon('close', { iconSet: 'outline', size: 20 })\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement('div', {\n className: 'outline-drawer__main'\n })\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement('footer', {\n className: 'outline-drawer__footer'\n })\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement('div', {\n className: 'outline-drawer__overlay'\n })\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport cloneDeep from './utils/lang/cloneDeep'\n\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Chapters.DEFAULTS)\n\n this._reset()\n\n this.offsetWidth = 0\n this.playing = false\n this.scrollTimer = null\n this.resizeTimer = null\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n _reset() {\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.$active = null\n\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.closed = false\n\n return this\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n count() {\n return this.chapters.length\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const animationCurrent = this.attr('animationCurrent')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const children = []\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n title\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement('ul', {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n })\n this.$list = $list\n children.push($list)\n\n if (animationCurrent) {\n $placeholder = createElement('div', {\n className: 'outline-chapters__placeholder'\n })\n this.$placeholder = $placeholder\n children.push($placeholder)\n }\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n children\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n const count = this.count()\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n if (this.isInside()) {\n addClass($parentElement, 'outline-chapters-parent')\n }\n\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n\n later(() => {\n this.highlight(this.active)\n }, 60)\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n if (count < 400) {\n this.onObserver()\n }\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const animationCurrent = this.attr('animationCurrent')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (!animationCurrent) {\n return this\n }\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const animationCurrent = this.attr('animationCurrent')\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const ACTIVE = 'outline-chapters_active'\n const HIGHLIGHT = 'outline-chapters_highlight'\n\n if (!$anchor) {\n return this\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n removeClass(this.$active, ACTIVE)\n }\n\n this.$active = $anchor\n addClass(this.$active, ACTIVE)\n\n if (animationCurrent) {\n this.positionPlaceholder(this.active)\n } else {\n addClass(this.$active, HIGHLIGHT)\n }\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n removeClass($parent, HIDDEN)\n } else {\n removeClass($parent, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n }, 30)\n }\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n addClass($parent, HIDDEN)\n } else {\n addClass($parent, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n })\n }\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)._reset()\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at(window, 'resize', this.onResize, this, true)\n }\n this.$on('anchors:all:paint', this.onObserver, this)\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at(window, 'resize', this.onResize)\n }\n\n this.$off('anchors:all:paint')\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n animationCurrent: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\nimport timeSlice from './utils/lang/timeSlice'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const LIMIT = 400\n const count = chapters.length\n const clones = [...chapters]\n const paint = (parts) => {\n const byId = (id) => $list.querySelector(`#${id}`)\n parts.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const children = []\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n chapter.text\n )\n let $link\n let $code\n let $li\n let $subject\n let $chapter\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n chapter.code\n )\n\n children.push($code)\n }\n\n children.push($text)\n\n $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n children\n )\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n $link\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $chapter = byId(`chapter-${pid}`)\n $subject = byId(`subject-${pid}`)\n\n if (!$subject) {\n $subject = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n $li\n )\n\n $chapter.appendChild($subject)\n } else {\n $subject.appendChild($li)\n }\n }\n })\n }\n\n if (count > LIMIT) {\n // 同步绘制\n paint(clones.splice(0, LIMIT))\n // 剩余的采用 timeSlice 机制绘制\n while (clones.length > 0) {\n const once = clones.splice(0, LIMIT)\n timeSlice(() => {\n paint(once)\n })\n }\n } else {\n paint(clones)\n }\n}\n\nexport default _paintChapters\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n $icon\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = []\n\n paint()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.push($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n $buttons\n )\n document.body.appendChild(this.$el)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n this.$emit(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n","import isObject from './isObject'\n\n/**\n * 检测测试数据是否为类似 Object 类型\n * ========================================================================\n * @method isObjectLike\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\n */\nconst isObjectLike = (val) => {\n return isObject(val) && val !== null\n}\n\nexport default isObjectLike\n","import isObjectLike from './isObjectLike'\n\n/**\n * 检测测试数据是否为普通对象\n * ========================================================================\n * @method isPlainObject\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\n */\nconst isPlainObject = (val) => {\n const getPrototypeOf = Object.getPrototypeOf\n let proto\n\n // Detect obvious negatives\n if (!isObjectLike(val)) {\n return false\n }\n\n proto = val.prototype\n\n // JavaScript 对象分为两种:普通对象和函数对象\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\n if (!proto) {\n return true\n }\n\n proto = val\n\n while (getPrototypeOf(proto) !== null) {\n proto = getPrototypeOf(proto)\n }\n\n return getPrototypeOf(val) === proto\n}\n\nexport default isPlainObject\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n *\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n document.body.removeChild(this.$el)\r\n\r\n this.attr(Message.DEFAULTS)\r\n\r\n this.id = ''\r\n this.closed = true\r\n this.visible = false\r\n this.offset = -50\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n this.destroyed = true\r\n\r\n this.$el = null\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n}\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport later from './utils/lang/later'\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nconst paintPrint = (el, title) => {\r\n const $fragment = document.createDocumentFragment()\r\n let text = title\r\n let $el\r\n let $wrapper\r\n let $article\r\n let $title\r\n let $sibling\r\n let $icon\r\n let $children\r\n\r\n if (isString(el)) {\r\n $el = document.querySelector(el)\r\n } else if (isElement(el)) {\r\n $el = el\r\n }\r\n\r\n if (!$el) {\r\n return false\r\n }\r\n\r\n $icon = icon('close', {\r\n iconSet: 'outline',\r\n size: 20,\r\n attrs: {\r\n className: 'outline-print__close'\r\n }\r\n })\r\n\r\n $title = $el.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n text = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-print__title'\r\n },\r\n text\r\n )\r\n\r\n $article = createElement('article', {\r\n id: 'outline-print__article',\r\n className: 'outline-print__article'\r\n })\r\n\r\n $wrapper = createElement(\r\n 'section',\r\n {\r\n id: 'outline-print',\r\n className: 'outline-print'\r\n },\r\n [$icon, $title, $article]\r\n )\r\n document.body.appendChild($wrapper)\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $wrapper.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $wrapper.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n\r\n // 克隆文章内容\r\n $children = $el.cloneNode(true).childNodes\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n $article.appendChild($fragment)\r\n })\r\n}\r\n\r\nexport default paintPrint\r\n","import later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport isFunction from './utils/types/isFunction'\nimport isString from './utils/types/isString'\nimport isElement from './utils/types/isElement'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\n\nimport Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\nimport Message from './message'\nimport paintPrint from './print'\n\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Outline.DEFAULTS)\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n this.buttons = []\n this.reading = false\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options)\n this.$emit('created', { ...this.attr() })\n this.render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n const hasToolbar = this.attr('hasToolbar')\n const scrollElement = this.attr('scrollElement')\n const $scrollElement = document.querySelector(scrollElement)\n\n this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar()\n\n if ($scrollElement && hasToolbar) {\n this.onToolbarUpdate({\n top: $scrollElement.scrollTop,\n min: 0,\n max: $scrollElement.scrollHeight\n })\n }\n\n this.$emit('mounted')\n\n return this\n }\n\n _renderPrint() {\n const option = this.attr('print')\n const articleElement = this.attr('articleElement')\n let $articleElement\n let $print\n let element\n\n if (!option.element) {\n return this\n }\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n addClass($articleElement, 'outline-article')\n\n element = option.element\n\n if (isString(element)) {\n $print = document.querySelector(element)\n } else if (isElement(element)) {\n $print = element\n }\n\n paintPrint($print, option.title)\n\n return this\n }\n\n _renderAnchors() {\n const articleElement = this.attr('articleElement')\n const selector = this.attr('selector')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const chapterTextFilter = this.attr('chapterTextFilter')\n\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll,\n chapterTextFilter\n })\n\n return this\n }\n\n _renderChapters() {\n const title = this.attr('title')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const customClass = this.attr('customClass')\n const showCode = this.attr('showCode')\n const animationCurrent = this.attr('animationCurrent')\n const position = this.attr('position')\n const placement = this.attr('placement')\n const afterSticky = this.attr('afterSticky')\n const afterToggle = this.attr('afterToggle')\n const afterScroll = this.attr('afterScroll')\n const count = this.count()\n let parentElement = this.attr('parentElement')\n let CHAPTERS_OPTIONS\n\n if (count < 1) {\n return this\n }\n\n CHAPTERS_OPTIONS = {\n scrollElement,\n showCode,\n animationCurrent,\n position,\n title,\n stickyHeight,\n chapters: this.getChapters(),\n afterSticky,\n afterToggle,\n afterScroll\n }\n\n if (position === 'relative') {\n this.drawer = new Drawer({\n placement,\n title,\n size: 'tiny',\n hasOffset: true,\n hasPadding: false,\n customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\n } else {\n CHAPTERS_OPTIONS.customClass = customClass\n }\n\n CHAPTERS_OPTIONS.parentElement = parentElement\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\n\n return this\n }\n\n _renderToolbar() {\n const hasToolbar = this.attr('hasToolbar')\n const placement = this.attr('placement')\n const homepage = this.attr('homepage')\n const git = this.attr('git')\n const tags = this.attr('tags')\n const issues = this.attr('issues')\n const tools = this.attr('tools')\n const option = this.attr('print')\n const count = this.count()\n const UP = {\n name: 'up',\n icon: 'up',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:up'\n }\n }\n const HOME = {\n name: 'homepage',\n icon: 'homepage',\n size: 20,\n link: homepage\n }\n const GIT = {\n name: 'github',\n icon: 'github',\n size: 20,\n link: git\n }\n const TAGS = {\n name: 'tags',\n icon: 'tags',\n size: 20,\n link: tags\n }\n const ISSUES = {\n name: 'issues',\n icon: 'issues',\n size: 20,\n link: issues\n }\n const MENU = {\n name: 'menu',\n icon: 'menu',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:toggle'\n }\n }\n const READING = {\n name: 'reading',\n icon: 'file',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:reading'\n }\n }\n const PRINT = {\n name: 'print',\n icon: 'print',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:print'\n }\n }\n const DOWN = {\n name: 'down',\n icon: 'down',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:down'\n }\n }\n const buttons = []\n\n if (!hasToolbar) {\n return this\n }\n\n buttons.push(UP)\n if (count > 0) {\n buttons.push(MENU)\n }\n if (homepage) {\n buttons.push(HOME)\n }\n if (git) {\n buttons.push(GIT)\n }\n if (tags) {\n buttons.push(TAGS)\n }\n if (issues) {\n buttons.push(ISSUES)\n }\n if (option.element) {\n buttons.push(READING)\n if (isFunction(print)) {\n buttons.push(PRINT)\n }\n }\n if (tools?.length > 0) {\n buttons.push(...tools)\n }\n buttons.push(DOWN)\n this.buttons = [...buttons]\n\n this.toolbar = new Toolbar({\n placement,\n buttons\n })\n\n return this\n }\n\n addButton(button) {\n const toolbar = this.toolbar\n const buttons = this.buttons\n buttons.splice(-1, 0, button)\n toolbar.attr({\n buttons\n })\n toolbar.refresh()\n return this\n }\n\n removeButton(name) {\n this.toolbar.remove(name)\n return this\n }\n\n toTop() {\n const afterScroll = this.attr('afterScroll')\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const afterTop = () => {\n toolbar.hide('up')\n toolbar.show('down')\n\n if (count > 0) {\n chapters.highlight(0)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(0, afterTop)\n\n return this\n }\n\n toBottom() {\n const afterScroll = this.attr('afterScroll')\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const top = Math.floor(\n $scrollElement.scrollHeight - $scrollElement.clientHeight\n )\n const afterDown = () => {\n toolbar.hide('down')\n toolbar.show('up')\n\n if (count > 0) {\n chapters.highlight(count - 1)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(top, afterDown)\n\n return this\n }\n\n scrollTo(top, afterScroll) {\n const scrollElement = this.attr('scrollElement')\n scrollTo(scrollElement, top, afterScroll)\n return this\n }\n\n enterReading() {\n const READING = 'outline-reading'\n const HIDDEN = `${READING}_hidden`\n const $reading = document.querySelector('#outline-print')\n const $siblings = document.querySelectorAll('.outline-print_sibling')\n const options = this.attr('print')\n const enterReadingTip = options.enterReadingTip || ENTER_READING_TIP\n\n if (this.reading || !$reading) {\n return this\n }\n\n $siblings.forEach(($sibling) => {\n addClass($sibling, HIDDEN)\n })\n addClass($reading, READING)\n this.reading = true\n\n this.toolbar.toggle()\n\n Message.info({\n round: true,\n message: enterReadingTip\n })\n\n this.$emit('enterReading')\n\n return this\n }\n\n exitReading() {\n const READING = 'outline-reading'\n const HIDDEN = `${READING}_hidden`\n const $reading = document.querySelector('#outline-print')\n const $siblings = document.querySelectorAll('.outline-print_sibling')\n\n if (!this.reading || !$reading) {\n return this\n }\n\n removeClass($reading, READING)\n $siblings.forEach(($sibling) => {\n removeClass($sibling, HIDDEN)\n })\n this.reading = false\n\n this.toolbar.toggle()\n\n this.$emit('exitReading')\n\n return this\n }\n\n switchReading() {\n const $print = document.querySelector('#outline-print')\n\n if (!$print) {\n return this\n }\n\n if (!this.reading) {\n this.enterReading()\n } else {\n this.exitReading()\n }\n\n return this\n }\n\n toggle() {\n const position = this.attr('position')\n const toolbar = this.toolbar\n const drawer = this.drawer\n const chapters = this.chapters\n const count = this.count()\n\n if (count < 1) {\n return this\n }\n\n if (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n later(() => {\n drawer.toggle()\n })\n }\n\n return this\n }\n\n print() {\n if (!isFunction(print)) {\n return this\n }\n\n print()\n\n return this\n }\n\n destroy() {\n let anchors = this.anchors\n let chapters = this.chapters\n let drawer = this.drawer\n let toolbar = this.toolbar\n let isOutside = false\n const count = this.count()\n const $print = document.querySelector('#outline-print')\n\n this.$emit('beforeDestroy')\n\n this.removeListeners()\n\n if ($print) {\n document.body.removeChild($print)\n }\n\n if (count > 0) {\n isOutside = chapters.isOutside()\n\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(Outline.DEFAULTS)\n\n this.$emit('destroyed')\n\n return this\n }\n\n onToggle() {\n this.toggle()\n return this\n }\n\n onScrollTop() {\n this.toTop()\n return this\n }\n\n onScrollBottom() {\n this.toBottom()\n return this\n }\n\n onEnterReading() {\n this.switchReading()\n return this\n }\n\n onExitReading(evt) {\n const keyCode = evt.keyCode\n\n if (keyCode === 27 && this.reading) {\n this.switchReading()\n stop(evt)\n }\n\n return this\n }\n\n onPrint() {\n this.print()\n\n return this\n }\n\n onToolbarUpdate({ top, min, max }) {\n const toolbar = this.toolbar\n const current = Math.ceil(top)\n\n if (current <= min) {\n toolbar.hide('up')\n toolbar.show('down')\n } else if (current >= max) {\n toolbar.hide('down')\n toolbar.show('up')\n } else if (current > min && current < max) {\n toolbar.show('up')\n toolbar.show('down')\n }\n\n return this\n }\n\n addListeners() {\n const hasToolbar = this.attr('hasToolbar')\n const $print = document.querySelector('#outline-print')\n\n if (hasToolbar) {\n this.$on('toolbar:update', this.onToolbarUpdate)\n this.$on('toolbar:action:up', this.onScrollTop)\n this.$on('toolbar:action:toggle', this.onToggle)\n this.$on('toolbar:action:reading', this.onEnterReading)\n this.$on('toolbar:action:down', this.onScrollBottom)\n }\n\n if ($print) {\n at(document, 'keyup', this.onExitReading, this, true)\n on($print, '.outline-print__close', 'click', this.exitReading, this, true)\n this.$on('toolbar:action:print', this.onPrint)\n }\n\n return this\n }\n\n removeListeners() {\n const hasToolbar = this.attr('hasToolbar')\n const $print = document.querySelector('#outline-print')\n\n if (hasToolbar) {\n this.$off('toolbar:update')\n this.$off('toolbar:action:up')\n this.$off('toolbar:action:toggle')\n this.$off('toolbar:action:down')\n }\n\n if ($print) {\n off(document, 'keyup', this.onExitReading)\n off($print, 'click', this.exitReading)\n this.$off('toolbar:action:print')\n }\n\n return this\n }\n}\n\nOutline.DEFAULTS = {\n articleElement: '#article',\n selector: 'h2,h3,h4,h5,h6',\n title: '目录',\n scrollElement: 'html,body',\n position: 'relative',\n parentElement: '#aside',\n placement: 'rtl',\n animationCurrent: true,\n showCode: true,\n hasToolbar: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n tools: [],\n print: {\n element: '',\n title: '',\n enterReadingTip: ENTER_READING_TIP\n },\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: null,\n chapterTextFilter: null\n}\n\nif (window.jQuery) {\n // 将 Outline 扩展为一个 jquery 插件\n // eslint-disable-next-line no-undef\n jQuery.extend(jQuery.fn, {\n outline: function (options) {\n // eslint-disable-next-line no-undef\n let $article = jQuery(this)\n\n return new Outline(\n // eslint-disable-next-line no-undef\n jQuery.extend({}, options, {\n articleElement: $article\n })\n )\n }\n })\n}\n\nexport default Outline\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","add","length","trim","replace","removeClass","remove","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","arguments","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","stopPropagation","preventDefault","hasOwn","prop","hasOwnProperty","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","innerHTML","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","rel","groups","group","JSON","stringify","code","String","c","subjects","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","LIMIT","mounted","anchorURL","update","chapterCode","headingId","href","_updateHeading","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","getStyle","ruleName","getComputedStyle","Chapters","_reset","offsetWidth","playing","scrollTimer","resizeTimer","Observer","$list","$placeholder","$parentElement","$active","active","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_paintChapters","highlight","sticky","onObserver","positionPlaceholder","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","ACTIVE","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","innerHeight","show","HIDDEN","hide","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","option","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","isPlainObject","getPrototypeOf","proto","isObjectLike","stripScripts","encodeHTML","CHARTS","tag","instances","instance","Message","visible","offset","destroyed","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Outline","anchors","drawer","toolbar","reading","hasToolbar","_renderPrint","_renderAnchors","_renderChapters","_renderToolbar","onToolbarUpdate","$print","element","$wrapper","$article","cloneNode","paintPrint","CHAPTERS_OPTIONS","homepage","git","tags","issues","tools","HOME","GIT","TAGS","ISSUES","MENU","READING","PRINT","print","addButton","removeButton","toTop","toBottom","floor","enterReading","$reading","$siblings","enterReadingTip","info","exitReading","switchReading","onToggle","onScrollTop","onScrollBottom","onEnterReading","onExitReading","keyCode","onPrint","ceil","jQuery","outline"],"mappings":"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"} \ No newline at end of file diff --git a/docs/js/toolbar.min.js b/docs/js/toolbar.min.js new file mode 100644 index 00000000..777c13c8 --- /dev/null +++ b/docs/js/toolbar.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Toolbar=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),n=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t,o={},l=t=>e(o,t)&&o[t].length>0,r=(t,e=!0)=>e?l(t):(t=>{let e=l(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=l(t);return e})(t),a=(t,e,i=!0)=>{const n=t=>{if(!l(t))return!1;o[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},a=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),n(e);n(t),n("*")};if(!r(t))return!1;i?setTimeout(a,10):a()},c=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),h=t=>{if(!e(o,t))return!1;delete o[t]},d=(t,e)=>{if(!r(t))return!1;e?(t=>{const e=Object.keys(o);if(!t||e.length<1)return!1;e.forEach((e=>{const s=o[e];let i;s.forEach(((e,n)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,n))})),s.length<1&&h(i)}))})(e):h(t)};class u{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const o=this.attrs;return t(s)?i&&e(o,s)?(o[s]=i,this):o[s]:n(s)?(l=o,r=s,Object.keys(r).forEach((t=>{e(r,t)&&(l[t]=r[t])})),this):0===arguments.length?o:this;var l,r}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}$emit(t,e){return a(t,e),this}$on(t,e){return((t,e,s=null)=>{const n=c();let l="symbol"==typeof t?t.toString():t;i(e)&&(o[l]||(o[l]=[]),o[l].push({topic:l,callback:e,context:s,token:n}))})(t,e,this),this}$off(t,e){return d(t,e),this}addListeners(){return this}removeListeners(){return this}}const b=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),m=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),p=t=>{let e={};return null===t?null:(b(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=n(t[s])?p(t[s]):t[s]))),e)},f=t=>!!(n(t)&&t.nodeName&&t.tagName&&1===t.nodeType),y=t=>{return!(!n(t)||!(f(t)||(t=>!(!n(t)||"[object NodeList]"!==s(t)))(t)||(e=t,n(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!n(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},v=(t,s)=>{if(!t||!n(s))return!1;Object.keys(s).forEach((i=>{const n=s[i];e(s,i)&&((t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}})(t,i,n)}))},z=(e,s,i)=>{const o=document.createDocumentFragment(),l=document.createElement(e),r=e=>y(e)||t(e),a=e=>{let s;if(!r(e))return!1;y(e)?s=e:t(e)&&(s=document.createTextNode(e)),o.appendChild(s)};return n(s)?v(l,s):b(s)&&s.every((t=>r(t)))?s.forEach((t=>{a(t)})):y(s)?a(s):t(s)&&a(document.createTextNode(s)),b(i)?i.forEach((t=>{a(t)})):a(i),l.appendChild(o),l},g=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,n;return!!f(t)&&(i=t.className,!!i&&(n=t.classList,n?.contains?t.classList.contains(e):!!s.exec(i)))},x=(t,e)=>{let s,i;if(g(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},M=(e,s)=>{let i,n=e.className;if(!n||!g(e,s))return!1;var o;i=e.classList,i?.remove?i.remove(s):(o=n.replace(s,""),n=!!t(o)&&o.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},$=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},L=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,w=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],E=(t,e,s)=>{const i=w.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let n=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const o=t.fn;e===t.type&&(n=i,o===s&&(n=i))})),n>-1&&i.splice(n,1)}(t,e,s),t.removeEventListener(e,s,i)},j=function(e,s,i=!1){const n=t(e)?document.querySelector(e):e,o=n.childNodes,l=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(n,s);l.forEach((t=>{E(n,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&n&&o&&o.forEach((t=>{f(t)&&j(t,s,i)}))},A=(t,e,s)=>{if(!i(s))return j(t,e);E(t,e,s)},C=(t,e,s,i,n,o,l=!1)=>{const r=w.indexOf(s)>-1,a=function(r){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(r),h=((t,e,s,i)=>{const n=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&$(t,e):$(t,e))||i&&t===n)return t;if(t===n)break}while(t=L(t))})(c,e,t);let d=o||t;r.delegateTarget=h,!0===o&&(d=n),h&&(!0===l&&A(t,s,a),i.call(d,r,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:n,context:o,capture:r}),i._delegateListener=a,t.addEventListener(s,a,r)},N=['','','','','','','','','','','','','','','','','','',''],T=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return N.find((n=>{const o=s.exec(n)[1];return i.exec(o)[1]===e&&o===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...N],k=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),n=[];(e=>{if(!e)return!1;b(e)&&e.length>0?e.forEach((e=>{-1===N.indexOf(e)&&t(e)&&N.push(e)})):t(e)&&N.push(e)})(e),n=T(),i?i.innerHTML=n.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},S=(e,s={})=>{const i="outline-icon",n=s.size||0,o=s.color||"",l=s.iconSet||"",r=b(n)?n[0]:n,a=b(n)?n[1]:n,c=n?`width:${r}px;height:${a}px;`:"",h=o?c+`color:${o}`:c,d=s.attrs||{},u=document.createElement("i");let m,p="",f="";return t(e)?((e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)})(e)?f=e:(p=l&&"icon"!==l?`xlink:href="#${l}-icon-${e}"`:`xlink:href="#icon-${e}"`,f=``),u.innerHTML=f,d.className?d.className=`${i} ${d.className}`:d.className=i,v(u,d),m=u.querySelector("svg"),v(m,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),u):null},_=(t,e=!0)=>{const s=((t,e={})=>S(t,e))(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=z("a",{className:"outline-toolbar__anchor",href:t.link},s),n=z("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return x(s,"outline-toolbar__icon"),e&&x(n,"outline-toolbar_rounded"),t.disabled&&x(n,"outline-toolbar_disabled"),n},B="outline-toolbar_disabled",O="outline-toolbar_hidden";class H extends u{constructor(t){super(),this.attrs=p(H.DEFAULTS),this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,g(i,s)?M(i,s):x(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),n=this.attr("placement"),o=[];return k(),e.forEach((t=>{const e=_(t,s);o.push(e),this.buttons.push({name:t.name,$el:e})})),this.$el=z("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${n}`},o),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),o=t.action,l=document.createDocumentFragment();let r;return n(t)?(s.push(t),l.appendChild(_(t))):b(t)&&t.forEach((t=>{l.appendChild(_(t))})),e.appendChild(l),o&&i(o.handler)&&(r=o.type||"click",C(e,`.${t.name}`,r,o.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let n,o=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(o=s)})),o>-1&&this.attr().buttons.splice(o,1),n=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(n),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),n=i.find((e=>e.name===t));let o,l,r,a;return n?(i.forEach((s=>{s.name===t&&(n.disabled=!e)})),o=n.action,a=s.querySelector(`.${t}`),o&&(l=o.type||"click",r=o.handler),e?(M(a,B),l&&r&&C(s,`.${t}`,l,r)):(x(a,B),l&&r&&A(s,l,r)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(x(this.$el,B),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,M(this.$el,B),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),n=this.$el;let o;if(t){if(!s)return this;o=n.querySelector(`.${t}`),M(o,O)}else M(n,O),this.closed=!1,i(e)&&m((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),n=this.$el;let o;if(t){if(!s)return this;o=n.querySelector(`.${t}`),x(o,O)}else x(n,O),this.closed=!0,i(e)&&m((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(H.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(_(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const n=e.action;let o,l,r,a;if(this.disabled)return!1;n&&(l=n.handler,t(l)&&(a=l,n.handler=function(){this.$emit(a,e.name)},l=n.handler),o=n.type||"click",r=n.context),i(l)&&C(s,`.${e.name}`,o,l,r||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let n,o;if(this.disabled)return!1;s&&(o=s.handler,n=s.type||"click"),i(o)&&A(e,n,o)})),this}}return H.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null},H})); +//# sourceMappingURL=toolbar.min.js.map diff --git a/docs/js/toolbar.min.js.map b/docs/js/toolbar.min.js.map new file mode 100644 index 00000000..1fedd705 --- /dev/null +++ b/docs/js/toolbar.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"toolbar.min.js","sources":["../../utils/types/isString.js","../../utils/lang/hasOwn.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/lang/extend.js","../../utils/observer/on.js","../../utils/types/isArray.js","../../utils/lang/later.js","../../utils/lang/cloneDeep.js","../../utils/types/isElement.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/setAttributes.js","../../utils/dom/setAttribute.js","../../utils/dom/createElement.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/removeClass.js","../../utils/lang/trim.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../_createButton.js","../../utils/icons/icon.js","../../toolbar.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n if (!el || !isObject(attrs)) {\n return false\n }\n\n Object.keys(attrs).forEach((attr) => {\n const value = attrs[attr]\n if (hasOwn(attrs, attr)) {\n setAttribute(el, attr, value)\n }\n })\n}\n\nexport default setAttributes\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'htmlFor':\n el.setAttribute('for', value)\n break\n case 'className':\n el.className = value\n break\n case 'innerHTML':\n el.innerHTML = value\n break\n case 'innerText':\n el.innerText = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n setAttributes($el, attrs)\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n } else if (isDOM(attrs)) {\n append(attrs)\n } else if (isString(attrs)) {\n append(document.createTextNode(attrs))\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\nimport setAttributes from '../dom/setAttributes'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @param {Object} [options.attrs]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const ICON = 'outline-icon'\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const attrs = options.attrs || {}\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg = ``\n }\n\n $icon.innerHTML = svg\n\n if (attrs.className) {\n attrs.className = `${ICON} ${attrs.className}`\n } else {\n attrs.className = ICON\n }\n\n setAttributes($icon, attrs)\n\n $svg = $icon.querySelector('svg')\n setAttributes($svg, {\n 'aria-hidden': true,\n xmlns: 'http://www.w3.org/2000/svg',\n class: 'outline-icon__svg',\n width: 200,\n height: 200,\n style: cssRules\n })\n\n return $icon\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n $icon\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = []\n\n paint()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.push($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n $buttons\n )\n document.body.appendChild(this.$el)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n this.$emit(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","_subscribers","_hasDirectSubscribersFor","topic","length","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","forEach","subscriber","message","indexOf","callback","context","deliver","setTimeout","guid","uuid","prefix","_removeSubscriber","off","token","keys","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","arguments","destroy","removeListeners","reload","$emit","event","publish","$on","handler","push","subscribe","$off","unsubscribe","isArray","Array","later","fn","delay","cloneDeep","clone","from","assign","key","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","setAttributes","toLowerCase","style","cssText","setAttribute","className","innerHTML","innerText","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","replace","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","filter","getListeners","on","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","addEventListener","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","join","insertBefore","firstChild","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","_createButton","button","rounded","icon","$anchor","href","link","$button","disabled","DISABLED","HIDDEN","Toolbar","super","DEFAULTS","closed","buttons","created","isDisabled","option","isClosed","highlight","item","ACTIVE","mounted","placement","$buttons","id","hide","disable","action","switch","removeChild","enabled","enable","show","opened","toggle","beforeDestroy","afterDestroy","refresh","command","afterClosed","afterOpened","afterDisabled","afterEnabled"],"mappings":"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"} \ No newline at end of file diff --git a/docs/relative.html b/docs/relative.html index 9814f492..c457e393 100644 --- a/docs/relative.html +++ b/docs/relative.html @@ -61,6 +61,12 @@ // Customize Selector const outline = new Outline({ articleElement: $('#main') +})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -113,7 +119,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -774,6 +780,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
diff --git a/docs/sticky.html b/docs/sticky.html
index 0757f593..d70430b8 100644
--- a/docs/sticky.html
+++ b/docs/sticky.html
@@ -61,6 +61,12 @@
 // Customize Selector
 const outline = new Outline({
   articleElement: $('#main')
+})

selector

Description

Type:
String
Default:
'h1,h2,h3,h4,h5,h6'

可选,用来指定 article 节点下,要生成导航的标题标签的选择器。

// Default selector
+new Outline(Outline.DEFAULTS)
+
+// Customize selector
+new Outline({
+  selector: 'h2'
 })

title

Description

Type:
String|Boolean
Default:
'目录'

可选,用来指定文章导读导航菜单的标题文字。设置空字符串或者 false,则不显示标题。在插入导航菜单的 DOM 元素已有标题时,可以设置 title: '' 或者 false。

说明:本 API 文档的导航菜单便是使用 outline.js 生成,并且没有设置 title。

(function(){
   const defaults = Outline.DEFAULTS
   let outline
@@ -113,7 +119,7 @@
 // 设置 stickyHeight(outline.js 的示例页面的主标题元素的高度)
 defaults.stickyHeight = 86
 // 默认生成独立的侧滑弹窗导航菜单
-new Outline(defaults)
showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
+new Outline(defaults)

showCode

Description

Type:
Boolean
Default:
true

可选,是否显示段落章节编号:

animationCurrent

Description

Type:
Boolean
Default:
true

可选,是否采用动画定位高亮当前的章节标题:

hasToolbar

Description

Type:
Boolean
Default:
true

可选,是否显示侧边的按钮工具栏:

anchorURL

Description

Type:
String
Default:
''

可选,用来指定文章标题锚点链接图标的链接地址:

// Default URL - 默认链接,点击图标,页面会滚动到当前标题位置
 new Outline()
 
 // Customize URL - 直接打开链接了
@@ -774,6 +780,8 @@
   stickyHeight: 0,
   // 是否显示标题编号
   showCode: true,
+  // 是否显示侧边的按钮工具栏
+  hasToolbar: true,
   // 指定是否采用动画定位高亮当前的章节标题,默认值:true
   // 当值为 false 时,则采用高亮当前章节标题的链接文字并加粗文字
   // 如果喜欢更简洁的高亮效果,可以选择设置为 false
diff --git a/gulpfile.js b/gulpfile.js
index 41cf7870..c1228815 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -118,6 +118,7 @@ const buildApi = () => {
   return gulp
     .src([
       'api/pug/index.pug',
+      'api/pug/anchors.pug',
       'api/pug/relative.pug',
       'api/pug/sticky.pug',
       'api/pug/fixed.pug',
diff --git a/outline.js b/outline.js
index 7c7a33ac..1800fff7 100644
--- a/outline.js
+++ b/outline.js
@@ -55,12 +55,13 @@ class Outline extends Base {
   }
 
   render() {
+    const hasToolbar = this.attr('hasToolbar')
     const scrollElement = this.attr('scrollElement')
     const $scrollElement = document.querySelector(scrollElement)
 
     this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar()
 
-    if ($scrollElement) {
+    if ($scrollElement && hasToolbar) {
       this.onToolbarUpdate({
         top: $scrollElement.scrollTop,
         min: 0,
@@ -187,6 +188,7 @@ class Outline extends Base {
   }
 
   _renderToolbar() {
+    const hasToolbar = this.attr('hasToolbar')
     const placement = this.attr('placement')
     const homepage = this.attr('homepage')
     const git = this.attr('git')
@@ -266,6 +268,10 @@ class Outline extends Base {
     }
     const buttons = []
 
+    if (!hasToolbar) {
+      return this
+    }
+
     buttons.push(UP)
     if (count > 0) {
       buttons.push(MENU)
@@ -584,13 +590,16 @@ class Outline extends Base {
   }
 
   addListeners() {
+    const hasToolbar = this.attr('hasToolbar')
     const $print = document.querySelector('#outline-print')
 
-    this.$on('toolbar:update', this.onToolbarUpdate)
-    this.$on('toolbar:action:up', this.onScrollTop)
-    this.$on('toolbar:action:toggle', this.onToggle)
-    this.$on('toolbar:action:reading', this.onEnterReading)
-    this.$on('toolbar:action:down', this.onScrollBottom)
+    if (hasToolbar) {
+      this.$on('toolbar:update', this.onToolbarUpdate)
+      this.$on('toolbar:action:up', this.onScrollTop)
+      this.$on('toolbar:action:toggle', this.onToggle)
+      this.$on('toolbar:action:reading', this.onEnterReading)
+      this.$on('toolbar:action:down', this.onScrollBottom)
+    }
 
     if ($print) {
       at(document, 'keyup', this.onExitReading, this, true)
@@ -602,12 +611,15 @@ class Outline extends Base {
   }
 
   removeListeners() {
+    const hasToolbar = this.attr('hasToolbar')
     const $print = document.querySelector('#outline-print')
 
-    this.$off('toolbar:update')
-    this.$off('toolbar:action:up')
-    this.$off('toolbar:action:toggle')
-    this.$off('toolbar:action:down')
+    if (hasToolbar) {
+      this.$off('toolbar:update')
+      this.$off('toolbar:action:up')
+      this.$off('toolbar:action:toggle')
+      this.$off('toolbar:action:down')
+    }
 
     if ($print) {
       off(document, 'keyup', this.onExitReading)
@@ -629,6 +641,7 @@ Outline.DEFAULTS = {
   placement: 'rtl',
   animationCurrent: true,
   showCode: true,
+  hasToolbar: true,
   anchorURL: '',
   stickyHeight: 0,
   homepage: '',
diff --git a/outline.min.js b/outline.min.js
index 18ec7b72..cc0b32bb 100644
--- a/outline.min.js
+++ b/outline.min.js
@@ -1,2 +1,2 @@
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";const t=t=>Object.prototype.toString.apply(t),e=e=>"function"==typeof e||"[object Function]"===t(e),s=(t,s=300)=>!!e(t)&&setTimeout((()=>{t()}),s),i=s=>("[object Object]"===t(s)||"object"==typeof s||e(s))&&null!==s,r=e=>Array.isArray?Array.isArray(e):"[object Array]"===t(e),l=t=>{let e={};return null===t?null:(r(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?l(t[s]):t[s]))),e)},n=t=>"string"==typeof t,o=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),h=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!o(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},a=(t,e)=>{let s,i;if(h(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},c=t=>!!n(t)&&t.replace(/(^\s+)|(\s+$)/g,""),u=(t,e)=>{let s,i=t.className;if(!i||!h(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=c(i.replace(e,"")),t.className=i)},d=t=>t*t,p=(t=null)=>{let e,s;return t?n(t)?s=document.querySelector(t):o(t)&&(s=t):(e=document.querySelectorAll("html,body"),s=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),s},m=(t,s,i)=>{const r=p(t);let l=r.scrollTop,n=0;const o=s-l,h=r.scrollHeight,a=s-h<=0?s:h,c=t=>(e(i)&&i(t),!1),u=()=>{if(n+=1,o<0){if(l-=d(n),r.scrollTop=l,l<=s)return r.scrollTop=s,c(s)}else if(l+=d(n),r.scrollTop=l,l>=a)return r.scrollTop=a,c(a);requestAnimationFrame(u)};requestAnimationFrame(u)},f=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],g=(t,e,s)=>{const i=f.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},y=function(t,e,s=!1){const i=n(t)?document.querySelector(t):t,r=i.childNodes,l=((t,e)=>{let s=t._listeners||[];return n(e)&&e&&(s=s.filter((t=>t.type===e))),s})(i,e);l.forEach((t=>{g(i,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&i&&r&&r.forEach((t=>{o(t)&&y(t,e,s)}))},b=(t,s,i)=>{if(!e(i))return y(t,s);g(t,s,i)},$=(t,s,i,r,l,n=!1)=>{const o=f.indexOf(s)>-1,h=function(e){let o=l||t;!0===l&&(o=r),!0===n&&b(t,s,h),i.call(o,e,r)};if(!e(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},v=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},_=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,T=(t,e,s,i,r,l,n=!1)=>{const o=f.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&v(t,e):v(t,e))||i&&t===r)return t;if(t===r)break}while(t=_(t))})(a,e,t);let u=l||t;o.delegateTarget=c,!0===l&&(u=r),c&&(!0===n&&b(t,s,h),i.call(u,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},w=function(t){t.stopPropagation(),t.preventDefault()},E=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},S=(t,e)=>{Object.keys(e).forEach((s=>{E(e,s)&&(t[s]=e[s])}))},x={},C=t=>E(x,t)&&x[t].length>0,L=(t,e=!0)=>e?C(t):(t=>{let e=C(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=C(t);return e})(t),z=(e,s,i=!0)=>{const r=e=>{if(!C(e))return!1;x[e].forEach((e=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(t(s))>-1?s.toString():s;e.callback.call(e.context||e,i)}))},l=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),r(t);r(e),r("*")};if(!L(e))return!1;i?setTimeout(l,10):l()},k=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),M=t=>{if(!E(x,t))return!1;delete x[t]},A=(t,e)=>{if(!L(t))return!1;e?(t=>{const e=Object.keys(x);if(!t||e.length<1)return!1;e.forEach((e=>{const s=x[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&M(i)}))})(e):M(t)};class N{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return n(t)?e&&E(s,t)?(s[t]=e,this):s[t]:i(t)?(S(s,t),this):0===arguments.length?s:this}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}$emit(t,e){return z(t,e),this}$on(t,s){return((t,s,i=null)=>{const r=k();let l="symbol"==typeof t?t.toString():t;e(s)&&(x[l]||(x[l]=[]),x[l].push({topic:l,callback:s,context:i,token:r}))})(t,s,this),this}$off(t,e){return A(t,e),this}addListeners(){return this}removeListeners(){return this}}const D=[];let H,O;function q(t){for(;t.timeRemaining()>0&&D.length;){const t=D.shift();if(!e(t))return!1;t()}D.length?H=requestIdleCallback(q):(H=0,e(O)&&(O(),O=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return s((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const j=(t,s=null)=>{D.push(t),e(s)&&(O=s),H||requestIdleCallback(q)},F=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=F(t.offsetParent)),e},U=['','','','','','','','','','','','','','','','','','',''],I=(t,e="icon")=>n(t)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return U.find((r=>{const l=s.exec(r)[1];return i.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):[...U],R=(t="")=>{const e=document.body;let s=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;r(t)&&t.length>0?t.forEach((t=>{-1===U.indexOf(t)&&n(t)&&U.push(t)})):n(t)&&U.push(t)})(t),i=I(),s?s.innerHTML=i.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},B=e=>{return!(!i(e)||!(o(e)||(e=>!(!i(e)||"[object NodeList]"!==t(e)))(e)||(s=e,i(s)&&"[object DocumentFragment]"===t(s))||(e=>!(!i(e)||!("[object Text]"===t(e)||e.tagName&&3===e.nodeType)))(e)));var s},P=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}},V=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];E(e,s)&&P(t,s,i)}))},Q=(t,e,s)=>{const l=document.createDocumentFragment(),o=document.createElement(t),h=t=>B(t)||n(t),a=t=>{let e;if(!h(t))return!1;B(t)?e=t:n(t)&&(e=document.createTextNode(t)),l.appendChild(e)};return i(e)?V(o,e):r(e)&&e.every((t=>h(t)))?e.forEach((t=>{a(t)})):B(e)?a(e):n(e)&&a(document.createTextNode(e)),r(s)?s.forEach((t=>{a(t)})):a(s),o.appendChild(l),o},W=(t,e={})=>{const s="outline-icon",i=e.size||0,l=e.color||"",o=e.iconSet||"",h=r(i)?i[0]:i,a=r(i)?i[1]:i,c=i?`width:${h}px;height:${a}px;`:"",u=l?c+`color:${l}`:c,d=e.attrs||{},p=document.createElement("i");let m,f="",g="";return n(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return n(t)&&e.test(t)})(t)?g=t:(f=o&&"icon"!==o?`xlink:href="#${o}-icon-${t}"`:`xlink:href="#icon-${t}"`,g=``),p.innerHTML=g,d.className?d.className=`${s} ${d.className}`:d.className=s,V(p,d),m=p.querySelector("svg"),V(m,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:u}),p):null},J=(t,e={})=>W(t,e),Y=(t,e=!0,s=!0)=>{const i="outline-heading",r=t.innerHTML;let l;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),u(t,i),!e)return!1;var o;l=t.querySelector(`.${i}__anchor`),s&&u(t,`${i}_start`),o=c(t.className),n(o)&&""===o&&t.removeAttribute("class"),t.removeChild(l)},G=(t,s=!0,i=null)=>{let l=1,o=0,h="";const a=[];return t.forEach(((t,s)=>{const r=t.tagName,u=r.replace(/h/i,"");let d=parseInt(u,10),p=-1;var m;d>l?(o+=1,p=1===o?-1:s-1):d===l||do?1===d?(o=1,p=-1):p=a[s-1].pid:d<=o&&(1===d?o=1:(o-=l-d,o<=1&&(o=1)),p=1===o?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"",e(i)&&(h=i(h)),a.push({id:s,pid:p,level:o,rel:`heading-${s}`,text:h,tagName:r})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!r(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(a):a};class K extends N{constructor(t){super(),this.attrs=K.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(t){const s=this.attr("showCode")||!0;let i,r,l,h,a;return this.attr(t),a=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),i=this.attr("created"),n(a)?h=document.querySelector(a):o(a)&&(h=a),h?(this.$articleElement=h,this.$scrollElement=p(r),this.$headings=[...h.querySelectorAll(l)],this.$headings.length<1||(this.chapters=G(this.$headings,s,this.attr("chapterTextFilter")),e(i)&&i.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=400,s=this.attr("mounted"),i=this.attr("hasAnchor"),r=this.attr("isAtStart"),l=this.attr("showCode"),n=this.attr("anchorURL"),o=this.count(),h=[...this.$headings],a=this.getChapters(),u=(e,s)=>{e.forEach(((e,o)=>{const h=o+s*t,u=a[h].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,n=s.showCode||!1,o=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,u={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=c(t.innerHTML);let p,m;if(n&&(u.innerHTML=o+" "+d),V(t,u),!r)return!1;m=J("hash",{iconSet:"outline"}),p=Q("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},m),t.appendChild(p)})(e,h,{hasAnchor:i,isAtStart:r,showCode:l,chapterCode:u,anchorURL:n})}))};let d=-1;if(R(),o>t)for(d+=1,u(h.splice(0,t),0);h.length>0;){const e=h.splice(0,t);j((()=>{u(e,d+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else u(h,0);return e(s)&&s.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return m(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),s=this.attr("isAtStart"),i=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return e(i)&&i.call(this),this.removeListeners(),l.forEach((e=>{Y(e,t,s)})),this.attr(K.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],e(r)&&r.call(this),this}onAnchorTrigger(t){const i=this.attr("anchorURL"),r=this.attr("afterScroll"),l=this.attr("stickyHeight"),n=t.delegateTarget.parentNode,o=F(n)-(l+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(o,(()=>{e(r)&&r.call(this,"anchor"),s((()=>{this.$emit("toolbar:update",{top:o,min:0,max:a})}))})),i||w(t),this}addListeners(){const t=this.$articleElement;return T(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return b(t,"click",this.onAnchorTrigger),this}}K.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null};const X=(t,e)=>{document.documentElement.style.setProperty(t,e)};let Z=2e3;const tt=t=>(t?Z=t:Z+=1,X("--outline-zIndex",`${Z}`),Z);class et extends N{constructor(t){super(),this.attrs=l(et.DEFAULTS),this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let s;return this.attr(t),this.title=this.attr("title"),s=this.attr("created"),e(s)&&s.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),s=this.attr("size"),i=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),c=this.attr("customClass");let u,d,p,m,f,g,y,b;return R(),this.zIndex=tt(),m=Q("h2",{className:"outline-drawer__title"},this.title),this.$title=m,r&&(f=Q("div",{className:"outline-drawer__close"},J("close",{iconSet:"outline",size:20})),this.$close=f),p=Q("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=Q("div",{className:"outline-drawer__main"}),this.$main=g,o||a(g,"outline-drawer_full"),y=Q("footer",{className:"outline-drawer__footer"}),this.$footer=y,d=Q("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${s} outline-drawer_closed`},[p,g,y]),this.$modal=d,n&&a(d,"outline-drawer_offset"),h&&a(d,"outline-drawer_auto"),c&&a(d,c),l&&(b=Q("div",{className:"outline-drawer__overlay"}),this.$overlay=b),u=Q("div",{className:"outline-drawer"},[d,b]),this.$el=u,document.body.appendChild(u),e(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),i=this.$modal;return a(this.$el,"outline-drawer_opened"),u(i,"outline-drawer_closed"),a(i,"outline-drawer_opened"),s((()=>{this.closed=!1,e(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),i=this.$modal;return u(i,"outline-drawer_opened"),a(i,"outline-drawer_closed"),s((()=>{u(this.$el,"outline-drawer_opened"),this.closed=!0,e(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),i=this.isClosed();return i?this.open():this.close(),e(t)&&s((()=>{t.call(this,i)})),this}destroy(){const t=this.attr("afterDestroy"),s=this.attr("beforeDestroy");let i=this.zIndex;return e(s)&&s.call(this),this.removeListeners(),this.attrs=et.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,i-=1,tt(i),this.zIndex=0,e(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&T(s,".outline-drawer__close","click",this.onClose,this,!0),e&&T(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}et.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const st=(t,e)=>getComputedStyle(t)[e];class it extends N{constructor(t){super(),this.attrs=l(it.DEFAULTS),this._reset(),this.offsetWidth=0,this.playing=!1,this.scrollTimer=null,this.resizeTimer=null,this.Observer=null,t&&this.initialize(t)}_reset(){return this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetTop=0,this.closed=!1,this}initialize(t){let s,i,r,l;return this.attr(t),s=this.attr("created"),i=this.attr("parentElement"),r=this.attr("scrollElement"),n(i)?l=document.querySelector(i):o(i)&&(l=i),this.$parentElement=l,this.$scrollElement=p(r),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),e(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("animationCurrent"),i=this.attr("customClass"),r=this.$parentElement,l=[],n=[];let o,h,c,u,d=null;return r?(this.isInside()&&e&&(d=Q("h2",{className:"outline-chapters__title"},e),this.$title=d,n.push(d)),c=Q("ul",{className:"outline-chapters__list"}),this.$list=c,l.push(c),s&&(u=Q("div",{className:"outline-chapters__placeholder"}),this.$placeholder=u,l.push(u)),h=Q("div",{className:"outline-chapters__main"},l),this.$main=h,n.push(h),o=Q("nav",{id:"outline-chapters",className:"outline-chapters outline-chapters_hidden"},n),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),a(o,"outline-chapters_sticky")),i&&a(o,i),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("showCode"),i=this.attr("mounted"),r=this.$parentElement,l=this.chapters,n=this.count();let o,h;return!r||l.length<1||(this.isInside()&&a(r,"outline-chapters-parent"),this._paintEdge(),o=this.$el,h=this.$list,((t,e,s=!1)=>{const i=e.length,r=[...e],l=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=[],h=Q("span",{className:"outline-chapters__text"},e.text);let a,c,u,d,p;s&&(c=Q("span",{className:"outline-chapters__code","data-id":l},e.code),o.push(c)),o.push(h),a=Q("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},o),u=Q("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},a),-1===r?t.appendChild(u):(p=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(u):(d=Q("ul",{id:"subject-"+r,className:"outline-chapters__subject"},u),p.appendChild(d)))}))};if(i>400)for(l(r.splice(0,400));r.length>0;){const t=r.splice(0,400);j((()=>{l(t)}))}else l(r)})(h,l,t),u(o,"outline-chapters_hidden"),s((()=>{this.highlight(this.active)}),60),this.offsetTop=F(o),this.offsetWidth=o.offsetWidth,this.isFixed()&&(this.sticky(),X("--outline-chapters-width",`${this.offsetWidth}px`)),e(i)&&i.call(this),n<400&&this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=this.attr("animationCurrent"),n=parseInt(st(e,"padding-top"),10),o=parseInt(st(e,"border-top-width"),10),h=parseInt(st(s,"padding-top"),10),a=parseInt(st(s,"margin-top"),10),c=parseInt(st(s,"border-top-width"),10);let u,d=r.offsetHeight,p=0;return l?(n&&(p+=n),h&&(p+=h),a&&(p+=a),o&&(p+=o),c&&(p+=c),u=d*t,i.style.cssText=`transform: translateY(${p+u}px);height:${d}px;`,this):this}highlight(t){const e=this.attr("animationCurrent"),s=this.$el.querySelector(`#chapter__anchor-${t}`),i="outline-chapters_active",r="outline-chapters_highlight";return s?(this.active=parseInt(s.getAttribute("data-id"),10),this.$active&&(u(this.$active,r),u(this.$active,i)),this.$active=s,a(this.$active,i),e?this.positionPlaceholder(this.active):a(this.$active,r),this):this}sticky(){const t=this.attr("afterSticky"),s="outline-chapters_fixed",i=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?a(i,s):u(i,s),e(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return X("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return m(s,t,e),this}show(){const t="outline-chapters_hidden",i=this.attr("afterOpened"),r=this.count(),l=this.$el,n=this.$parentElement;return this.isInside()?r>800?u(n,t):(u(n,t),s((()=>{u(n,"outline-chapters_folded")}),30)):u(l,t),this.closed=!1,e(i)&&i.call(this),this}hide(){const t="outline-chapters_hidden",i=this.attr("afterClosed"),r=this.count(),l=this.$el,n=this.$parentElement;return this.isInside()?r>800?a(n,t):(a(n,"outline-chapters_folded"),s((()=>{a(n,t)}))):a(l,t),this.closed=!0,e(i)&&i.call(this),this}toggle(){const t=this.attr("afterToggle"),i=this.offsetTop,r=this.$scrollElement.scrollTop;let l;return this.isClosed()?this.show():this.hide(),e(t)&&s((()=>{l=r>=i,t.call(this,this.isClosed(),l)})),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(it.DEFAULTS)._reset(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),e(s)&&s.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let i=null;return this.Observer=((t,s={})=>{const i=s.root||null,r=s.selector||".outline-heading",l=s.context||null,n={rootMargin:s.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((s=>{s.forEach((s=>{s.intersectionRatio>0&&e(t)&&t.call(l||s.target,s.target)}))}),n),a=o(i)?i:document;return i&&(n.root=i),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;i&&clearTimeout(i),i=s((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const i=this.attr("stickyHeight"),r=t.delegateTarget,l=r.getAttribute("data-id"),n=r.href.split("#")[1],o=document.querySelector(`#${n}`),h=F(o)-(i+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{e(c)&&c.call(this,"chapter"),s((()=>{this.playing=!1,this.$emit("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),s((()=>{this.scrollTo(h,u),this.highlight(l)}),10)):(this.scrollTo(h,u),this.highlight(l)),w(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=s((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=s((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),T(t,".outline-chapters__anchor","click",this.onSelect,this,!0),$(i,"scroll",this.onScroll,this,!0),this.isSticky()&&$(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),b(e,"click",this.onSelect),b(r,"scroll",this.onScroll),this.isSticky()&&$(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}it.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const rt=(t,e=!0)=>{const s=J(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=Q("a",{className:"outline-toolbar__anchor",href:t.link},s),r=Q("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return a(s,"outline-toolbar__icon"),e&&a(r,"outline-toolbar_rounded"),t.disabled&&a(r,"outline-toolbar_disabled"),r},lt="outline-toolbar_disabled",nt="outline-toolbar_hidden";class ot extends N{constructor(t){super(),this.attrs=l(ot.DEFAULTS),this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let s;return this.attr(t),s=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),e(s)&&s.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,h(i,s)?u(i,s):a(i,s)),this}render(){const t=this.attr("mounted"),s=this.attr("buttons")||[],i=this.attr("rounded"),r=this.attr("placement"),l=[];return R(),s.forEach((t=>{const e=rt(t,i);l.push(e),this.buttons.push({name:t.name,$el:e})})),this.$el=Q("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},l),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),e(t)&&t.call(this),this}add(t){const s=this.$el,l=this.attr("buttons"),n=t.action,o=document.createDocumentFragment();let h;return i(t)?(l.push(t),o.appendChild(rt(t))):r(t)&&t.forEach((t=>{o.appendChild(rt(t))})),s.appendChild(o),n&&e(n.handler)&&(h=n.type||"click",T(s,`.${t.name}`,h,n.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(u(h,lt),n&&o&&T(s,`.${t}`,n,o)):(a(h,lt),n&&o&&b(s,n,o)),this):this}disable(t){const s=this.attr("afterDisabled");return t?this.switch(t,!1):(a(this.$el,lt),this.removeListeners(),this.disabled=!0,e(s)&&s.call(this)),this}enable(t){const s=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,u(this.$el,lt),this.addListeners(),e(s)&&s.call(this)),this}show(t){const i=this.attr("afterOpened"),r=this.attr("buttons").find((e=>e.name===t)),l=this.$el;let n;if(t){if(!r)return this;n=l.querySelector(`.${t}`),u(n,nt)}else u(l,nt),this.closed=!1,e(i)&&s((()=>{i.call(this)}),310);return this}hide(t){const i=this.attr("afterClosed"),r=this.attr("buttons").find((e=>e.name===t)),l=this.$el;let n;if(t){if(!r)return this;n=l.querySelector(`.${t}`),a(n,nt)}else a(l,nt),this.closed=!0,e(i)&&s((()=>{i.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");let i=this.$el;return e(t)&&t.call(this),this.removeListeners(),document.body.removeChild(i),i=null,this.attr(ot.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],e(s)&&s.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(rt(t))})),this.addListeners(),this}addListeners(){const t=this.attr("buttons"),s=this.$el;return!t||t.length<1||t.forEach((t=>{const i=t.action;let r,l,o,h;if(this.disabled)return!1;i&&(l=i.handler,n(l)&&(h=l,i.handler=function(){this.$emit(h,t.name)},l=i.handler),r=i.type||"click",o=i.context),e(l)&&T(s,`.${t.name}`,r,l,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),s=this.$el;return!t||t.length<1||t.forEach((t=>{const i=t.action;let r,l;if(this.disabled)return!1;i&&(l=i.handler,r=i.type||"click"),e(l)&&b(s,r,l)})),this}}ot.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const ht=t=>{const e=Object.getPrototypeOf;let s;if(!(t=>i(t)&&null!==t)(t))return!1;if(s=t.prototype,!s)return!0;for(s=t;null!==e(s);)s=e(s);return e(t)===s},at=t=>t.replace(/]*>.*?<\/script>/gi,""),ct=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},ut=[];let dt;R();class pt extends N{constructor(t){super(),this.attrs=l(pt.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,t&&this.initialize(t)}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",{...this.attr()}),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),s=this.attr("round"),i=this.attr("closable"),r=this.attr("visible"),l=this.attr("customClass"),n=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return s&&n.push("outline-message_round"),i||n.push("outline-message_full-width"),r&&n.push("outline-message_visible"),l&&n.push(l),n}render(){const t=this.attr("type"),e=this.attr("message"),s=this.attr("effect"),i=this.attr("round"),r=this.attr("closable"),l=this.attr("dangerouslyUseHTMLString"),n=this._getClassName(),o=[];let h,c,u,d,p,m=20;return i&&"default"===s&&(m=12),"plain"!==s&&(h=J("light"===s?`circle-${t}`:t,{iconSet:"outline",size:m}),a(h,"outline-message__icon"),o.push(h)),l?(u=document.createDocumentFragment(),u.innerHTML=e):u=document.createTextNode(ct(at(e))),c=Q("p",{className:"outline-message__content"},[u]),o.push(c),r&&(d=J("close",{iconSet:"outline",size:18}),a(d,"outline-message__close"),o.push(d)),p=Q("div",{className:n.join(" ")},o),p.style.cssText="top:-50px;",this.$el=p,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let s,i,r,l,n,o,h,c=20;return this.isDestroyed()?this:(n=e.querySelector(".outline-icon"),n?(s=this.attr("type"),i=this.attr("effect"),r=this.attr("round"),"plain"===i?a(n,t):(u(n,t),r&&"default"===i&&(c=12)),o=n.querySelector(".outline-icon__svg"),V(o,{style:`width:${c}px;height:${c}px;`}),h=o.querySelector("use"),l="light"===i?`circle-${s}`:s,P(h,"xlink:href",`#outline-icon-${l}`),this):this)}_refreshMessage(){const t=this.$el;let e,s,i,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),s=this.attr("dangerouslyUseHTMLString"),i=this.attr("message"),r=s?i:ct(at(i)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let s,i;return this.isDestroyed()||(s=e.querySelector(".outline-message__close"),i=this.attr("closable"),s&&(i?a(s,t):u(s,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),P(t,"className",e.join(" "))),this}refresh(t){return ht(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=s((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,r,l,n;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),r=this.attr("duration"),l=i&&i>=this.offset?i:this.offset,n=`top:${l}px;`,this.clearTimer(),this.$emit("beforeOpen"),s((()=>{this.visible=!0,a(e,"outline-message_visible"),e.style.cssText=n,r>0&&this.startTimer(r)}),100)),this}close(){const t=this.$el;let i,r;return this.isDestroyed()||(i=this.attr("destroyAfterClosed"),r=this.attr("beforeClose"),e(r)&&r.call(this),t.style.cssText="top:-50px;",u(t,"outline-message_visible"),this.visible=!1,this.closed=!0,s((()=>{this.$emit("closed"),i&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),this.attr(pt.DEFAULTS),this.id="",this.closed=!0,this.visible=!1,this.offset=-50,clearTimeout(this.timer),this.timer=null,this.destroyed=!0,this.$el=null,this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return T(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),T(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),T(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return b(t,"mouseenter",this.onMouseEnter),b(t,"mouseleave",this.onMouseLeave),b(t,"click",this.onClose),this}}pt.DEFAULTS={id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null},["info","success","warning","error"].forEach((t=>{pt[t]=e=>{const s={},i=k("outline-message-"),r=e.beforeClose||null;let l=e.offset||30;return n(e)?s.message=e:ht(e)&&S(s,e),s.id=i,s.type=t,s.offset=l,s.visible=!1,s.beforeClose=()=>{pt.close(i,r)},dt=new pt(s),ut.forEach((t=>{l+=t.$el.offsetHeight+16})),dt.offset=l,dt.open(),ut.push(dt),dt}})),pt.close=(t,s)=>{const i=ut.length;let r,l,n=-1;if(ut.forEach(((i,r)=>{t===i.id&&(l=i.$el.offsetHeight,n=r,e(s)&&s.call(i),ut.splice(r,1))})),i<=1||-1===n||n>ut.length-1)return!1;for(r=n;r{let t=ut.length-1;for(;t>=0;t-=1)ut[t].close()};const mt=(t,e)=>{let s,i=t;for(;i;)s=i.tagName.toLowerCase(),"script"!==s&&"style"!==s&&a(i,"outline-print_sibling"),i=e?i.previousElementSibling:i.nextElementSibling},ft="进入阅读模式,按 ESC 键可退出阅读模式";class gt extends N{constructor(t){super(),this.attrs=l(gt.DEFAULTS),this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,this.buttons=[],this.reading=!1,t&&this.initialize(t)}initialize(t){return this.attr(t),this.$emit("created",{...this.attr()}),this.render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){const t=this.attr("scrollElement"),e=document.querySelector(t);return this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar(),e&&this.onToolbarUpdate({top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}_renderPrint(){const t=this.attr("print"),e=this.attr("articleElement");let i,r,l;return t.element?(n(e)?i=document.querySelector(e):o(e)&&(i=e),a(i,"outline-article"),l=t.element,n(l)?r=document.querySelector(l):o(l)&&(r=l),((t,e)=>{const i=document.createDocumentFragment();let r,l,h,a,c,u,d,p=e;if(n(t)?r=document.querySelector(t):o(t)&&(r=t),!r)return!1;u=J("close",{iconSet:"outline",size:20,attrs:{className:"outline-print__close"}}),a=r.querySelector("h1"),o(e)&&(a=e),o(a)&&(p=a.innerText),a=Q("h1",{className:"outline-print__title"},p),h=Q("article",{id:"outline-print__article",className:"outline-print__article"}),l=Q("section",{id:"outline-print",className:"outline-print"},[u,a,h]),document.body.appendChild(l),s((()=>{c=l.previousElementSibling,mt(c,!0),c=l.nextElementSibling,mt(c),d=r.cloneNode(!0).childNodes,d.forEach((t=>{i.appendChild(t)})),h.appendChild(i)}))})(r,t.title),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new K({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n,chapterTextFilter:o}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("animationCurrent"),n=this.attr("position"),o=this.attr("placement"),h=this.attr("afterSticky"),a=this.attr("afterToggle"),c=this.attr("afterScroll"),u=this.count();let d,p=this.attr("parentElement");return u<1||(d={scrollElement:s,showCode:r,animationCurrent:l,position:n,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:h,afterToggle:a,afterScroll:c},"relative"===n?(this.drawer=new et({placement:o,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),p=this.drawer.$main):d.customClass=i,d.parentElement=p,this.chapters=new it(d)),this}_renderToolbar(){const t=this.attr("placement"),s=this.attr("homepage"),i=this.attr("git"),r=this.attr("tags"),l=this.attr("issues"),n=this.attr("tools"),o=this.attr("print"),h=this.count(),a={name:"homepage",icon:"homepage",size:20,link:s},c={name:"github",icon:"github",size:20,link:i},u={name:"tags",icon:"tags",size:20,link:r},d={name:"issues",icon:"issues",size:20,link:l},p={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},m={name:"reading",icon:"file",size:18,action:{type:"click",handler:"toolbar:action:reading"}},f={name:"print",icon:"print",size:20,action:{type:"click",handler:"toolbar:action:print"}},g=[];return g.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),h>0&&g.push(p),s&&g.push(a),i&&g.push(c),r&&g.push(u),l&&g.push(d),o.element&&(g.push(m),e(print)&&g.push(f)),n?.length>0&&g.push(...n),g.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.buttons=[...g],this.toolbar=new ot({placement:t,buttons:g}),this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}toTop(){const t=this.attr("afterScroll"),s=this.toolbar,i=this.chapters,r=this.count();return r>0&&(i.playing=!0),this.scrollTo(0,(()=>{s.hide("up"),s.show("down"),r>0&&(i.highlight(0),i.playing=!1),e(t)&&t.call(s,"up")})),this}toBottom(){const t=this.attr("afterScroll"),s=p(this.attr("scrollElement")),i=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(s.scrollHeight-s.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(n,(()=>{i.hide("down"),i.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),e(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return m(s,t,e),this}enterReading(){const t="outline-reading",e=`${t}_hidden`,s=document.querySelector("#outline-print"),i=document.querySelectorAll(".outline-print_sibling"),r=this.attr("print").enterReadingTip||ft;return this.reading||!s||(i.forEach((t=>{a(t,e)})),a(s,t),this.reading=!0,this.toolbar.toggle(),pt.info({round:!0,message:r}),this.$emit("enterReading")),this}exitReading(){const t="outline-reading",e=`${t}_hidden`,s=document.querySelector("#outline-print"),i=document.querySelectorAll(".outline-print_sibling");return this.reading&&s?(u(s,t),i.forEach((t=>{u(t,e)})),this.reading=!1,this.toolbar.toggle(),this.$emit("exitReading"),this):this}switchReading(){return document.querySelector("#outline-print")?(this.reading?this.exitReading():this.enterReading(),this):this}toggle(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.chapters;return this.count()<1||("relative"!==t?(r.toggle(),e.highlight("menu")):(e.toggle(),s((()=>{i.toggle()})))),this}print(){return e(print)?(print(),this):this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count(),n=document.querySelector("#outline-print");return this.$emit("beforeDestroy"),this.removeListeners(),n&&document.body.removeChild(n),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(gt.DEFAULTS),this.$emit("destroyed"),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onEnterReading(){return this.switchReading(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.switchReading(),w(t)),this}onPrint(){return this.print(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&rObject.prototype.toString.apply(t),e=e=>"function"==typeof e||"[object Function]"===t(e),s=(t,s=300)=>!!e(t)&&setTimeout((()=>{t()}),s),i=s=>("[object Object]"===t(s)||"object"==typeof s||e(s))&&null!==s,r=e=>Array.isArray?Array.isArray(e):"[object Array]"===t(e),l=t=>{let e={};return null===t?null:(r(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?l(t[s]):t[s]))),e)},n=t=>"string"==typeof t,o=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),h=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!o(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},a=(t,e)=>{let s,i;if(h(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},c=t=>!!n(t)&&t.replace(/(^\s+)|(\s+$)/g,""),u=(t,e)=>{let s,i=t.className;if(!i||!h(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=c(i.replace(e,"")),t.className=i)},d=t=>t*t,p=(t=null)=>{let e,s;return t?n(t)?s=document.querySelector(t):o(t)&&(s=t):(e=document.querySelectorAll("html,body"),s=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),s},m=(t,s,i)=>{const r=p(t);let l=r.scrollTop,n=0;const o=s-l,h=r.scrollHeight,a=s-h<=0?s:h,c=t=>(e(i)&&i(t),!1),u=()=>{if(n+=1,o<0){if(l-=d(n),r.scrollTop=l,l<=s)return r.scrollTop=s,c(s)}else if(l+=d(n),r.scrollTop=l,l>=a)return r.scrollTop=a,c(a);requestAnimationFrame(u)};requestAnimationFrame(u)},f=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],g=(t,e,s)=>{const i=f.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},y=function(t,e,s=!1){const i=n(t)?document.querySelector(t):t,r=i.childNodes,l=((t,e)=>{let s=t._listeners||[];return n(e)&&e&&(s=s.filter((t=>t.type===e))),s})(i,e);l.forEach((t=>{g(i,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&i&&r&&r.forEach((t=>{o(t)&&y(t,e,s)}))},b=(t,s,i)=>{if(!e(i))return y(t,s);g(t,s,i)},$=(t,s,i,r,l,n=!1)=>{const o=f.indexOf(s)>-1,h=function(e){let o=l||t;!0===l&&(o=r),!0===n&&b(t,s,h),i.call(o,e,r)};if(!e(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},v=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},_=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,T=(t,e,s,i,r,l,n=!1)=>{const o=f.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&v(t,e):v(t,e))||i&&t===r)return t;if(t===r)break}while(t=_(t))})(a,e,t);let u=l||t;o.delegateTarget=c,!0===l&&(u=r),c&&(!0===n&&b(t,s,h),i.call(u,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},w=function(t){t.stopPropagation(),t.preventDefault()},E=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},S=(t,e)=>{Object.keys(e).forEach((s=>{E(e,s)&&(t[s]=e[s])}))},x={},C=t=>E(x,t)&&x[t].length>0,L=(t,e=!0)=>e?C(t):(t=>{let e=C(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=C(t);return e})(t),z=(e,s,i=!0)=>{const r=e=>{if(!C(e))return!1;x[e].forEach((e=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(t(s))>-1?s.toString():s;e.callback.call(e.context||e,i)}))},l=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),r(t);r(e),r("*")};if(!L(e))return!1;i?setTimeout(l,10):l()},k=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),M=t=>{if(!E(x,t))return!1;delete x[t]},A=(t,e)=>{if(!L(t))return!1;e?(t=>{const e=Object.keys(x);if(!t||e.length<1)return!1;e.forEach((e=>{const s=x[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&M(i)}))})(e):M(t)};class N{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return n(t)?e&&E(s,t)?(s[t]=e,this):s[t]:i(t)?(S(s,t),this):0===arguments.length?s:this}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}$emit(t,e){return z(t,e),this}$on(t,s){return((t,s,i=null)=>{const r=k();let l="symbol"==typeof t?t.toString():t;e(s)&&(x[l]||(x[l]=[]),x[l].push({topic:l,callback:s,context:i,token:r}))})(t,s,this),this}$off(t,e){return A(t,e),this}addListeners(){return this}removeListeners(){return this}}const D=[];let H,O;function q(t){for(;t.timeRemaining()>0&&D.length;){const t=D.shift();if(!e(t))return!1;t()}D.length?H=requestIdleCallback(q):(H=0,e(O)&&(O(),O=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return s((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const j=(t,s=null)=>{D.push(t),e(s)&&(O=s),H||requestIdleCallback(q)},F=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=F(t.offsetParent)),e},U=['','','','','','','','','','','','','','','','','','',''],I=(t,e="icon")=>n(t)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return U.find((r=>{const l=s.exec(r)[1];return i.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):[...U],R=(t="")=>{const e=document.body;let s=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;r(t)&&t.length>0?t.forEach((t=>{-1===U.indexOf(t)&&n(t)&&U.push(t)})):n(t)&&U.push(t)})(t),i=I(),s?s.innerHTML=i.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},B=e=>{return!(!i(e)||!(o(e)||(e=>!(!i(e)||"[object NodeList]"!==t(e)))(e)||(s=e,i(s)&&"[object DocumentFragment]"===t(s))||(e=>!(!i(e)||!("[object Text]"===t(e)||e.tagName&&3===e.nodeType)))(e)));var s},P=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}},V=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];E(e,s)&&P(t,s,i)}))},Q=(t,e,s)=>{const l=document.createDocumentFragment(),o=document.createElement(t),h=t=>B(t)||n(t),a=t=>{let e;if(!h(t))return!1;B(t)?e=t:n(t)&&(e=document.createTextNode(t)),l.appendChild(e)};return i(e)?V(o,e):r(e)&&e.every((t=>h(t)))?e.forEach((t=>{a(t)})):B(e)?a(e):n(e)&&a(document.createTextNode(e)),r(s)?s.forEach((t=>{a(t)})):a(s),o.appendChild(l),o},W=(t,e={})=>{const s="outline-icon",i=e.size||0,l=e.color||"",o=e.iconSet||"",h=r(i)?i[0]:i,a=r(i)?i[1]:i,c=i?`width:${h}px;height:${a}px;`:"",u=l?c+`color:${l}`:c,d=e.attrs||{},p=document.createElement("i");let m,f="",g="";return n(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return n(t)&&e.test(t)})(t)?g=t:(f=o&&"icon"!==o?`xlink:href="#${o}-icon-${t}"`:`xlink:href="#icon-${t}"`,g=``),p.innerHTML=g,d.className?d.className=`${s} ${d.className}`:d.className=s,V(p,d),m=p.querySelector("svg"),V(m,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:u}),p):null},J=(t,e={})=>W(t,e),Y=(t,e=!0,s=!0)=>{const i="outline-heading",r=t.innerHTML;let l;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),u(t,i),!e)return!1;var o;l=t.querySelector(`.${i}__anchor`),s&&u(t,`${i}_start`),o=c(t.className),n(o)&&""===o&&t.removeAttribute("class"),t.removeChild(l)},G=(t,s=!0,i=null)=>{let l=1,o=0,h="";const a=[];return t.forEach(((t,s)=>{const r=t.tagName,u=r.replace(/h/i,"");let d=parseInt(u,10),p=-1;var m;d>l?(o+=1,p=1===o?-1:s-1):d===l||do?1===d?(o=1,p=-1):p=a[s-1].pid:d<=o&&(1===d?o=1:(o-=l-d,o<=1&&(o=1)),p=1===o?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"",e(i)&&(h=i(h)),a.push({id:s,pid:p,level:o,rel:`heading-${s}`,text:h,tagName:r})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!r(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(a):a};class K extends N{constructor(t){super(),this.attrs=K.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(t){const s=this.attr("showCode")||!0;let i,r,l,h,a;return this.attr(t),a=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),i=this.attr("created"),n(a)?h=document.querySelector(a):o(a)&&(h=a),h?(this.$articleElement=h,this.$scrollElement=p(r),this.$headings=[...h.querySelectorAll(l)],this.$headings.length<1||(this.chapters=G(this.$headings,s,this.attr("chapterTextFilter")),e(i)&&i.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=400,s=this.attr("mounted"),i=this.attr("hasAnchor"),r=this.attr("isAtStart"),l=this.attr("showCode"),n=this.attr("anchorURL"),o=this.count(),h=[...this.$headings],a=this.getChapters(),u=(e,s)=>{e.forEach(((e,o)=>{const h=o+s*t,u=a[h].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,n=s.showCode||!1,o=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,u={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=c(t.innerHTML);let p,m;if(n&&(u.innerHTML=o+" "+d),V(t,u),!r)return!1;m=J("hash",{iconSet:"outline"}),p=Q("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},m),t.appendChild(p)})(e,h,{hasAnchor:i,isAtStart:r,showCode:l,chapterCode:u,anchorURL:n})}))};let d=-1;if(R(),o>t)for(d+=1,u(h.splice(0,t),0);h.length>0;){const e=h.splice(0,t);j((()=>{u(e,d+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else u(h,0);return e(s)&&s.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return m(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),s=this.attr("isAtStart"),i=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return e(i)&&i.call(this),this.removeListeners(),l.forEach((e=>{Y(e,t,s)})),this.attr(K.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],e(r)&&r.call(this),this}onAnchorTrigger(t){const i=this.attr("anchorURL"),r=this.attr("afterScroll"),l=this.attr("stickyHeight"),n=t.delegateTarget.parentNode,o=F(n)-(l+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(o,(()=>{e(r)&&r.call(this,"anchor"),s((()=>{this.$emit("toolbar:update",{top:o,min:0,max:a})}))})),i||w(t),this}addListeners(){const t=this.$articleElement;return T(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return b(t,"click",this.onAnchorTrigger),this}}K.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null};const X=(t,e)=>{document.documentElement.style.setProperty(t,e)};let Z=2e3;const tt=t=>(t?Z=t:Z+=1,X("--outline-zIndex",`${Z}`),Z);class et extends N{constructor(t){super(),this.attrs=l(et.DEFAULTS),this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let s;return this.attr(t),this.title=this.attr("title"),s=this.attr("created"),e(s)&&s.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),s=this.attr("size"),i=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),c=this.attr("customClass");let u,d,p,m,f,g,y,b;return R(),this.zIndex=tt(),m=Q("h2",{className:"outline-drawer__title"},this.title),this.$title=m,r&&(f=Q("div",{className:"outline-drawer__close"},J("close",{iconSet:"outline",size:20})),this.$close=f),p=Q("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=Q("div",{className:"outline-drawer__main"}),this.$main=g,o||a(g,"outline-drawer_full"),y=Q("footer",{className:"outline-drawer__footer"}),this.$footer=y,d=Q("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${s} outline-drawer_closed`},[p,g,y]),this.$modal=d,n&&a(d,"outline-drawer_offset"),h&&a(d,"outline-drawer_auto"),c&&a(d,c),l&&(b=Q("div",{className:"outline-drawer__overlay"}),this.$overlay=b),u=Q("div",{className:"outline-drawer"},[d,b]),this.$el=u,document.body.appendChild(u),e(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),i=this.$modal;return a(this.$el,"outline-drawer_opened"),u(i,"outline-drawer_closed"),a(i,"outline-drawer_opened"),s((()=>{this.closed=!1,e(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),i=this.$modal;return u(i,"outline-drawer_opened"),a(i,"outline-drawer_closed"),s((()=>{u(this.$el,"outline-drawer_opened"),this.closed=!0,e(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),i=this.isClosed();return i?this.open():this.close(),e(t)&&s((()=>{t.call(this,i)})),this}destroy(){const t=this.attr("afterDestroy"),s=this.attr("beforeDestroy");let i=this.zIndex;return e(s)&&s.call(this),this.removeListeners(),this.attrs=et.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,i-=1,tt(i),this.zIndex=0,e(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&T(s,".outline-drawer__close","click",this.onClose,this,!0),e&&T(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}et.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const st=(t,e)=>getComputedStyle(t)[e];class it extends N{constructor(t){super(),this.attrs=l(it.DEFAULTS),this._reset(),this.offsetWidth=0,this.playing=!1,this.scrollTimer=null,this.resizeTimer=null,this.Observer=null,t&&this.initialize(t)}_reset(){return this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetTop=0,this.closed=!1,this}initialize(t){let s,i,r,l;return this.attr(t),s=this.attr("created"),i=this.attr("parentElement"),r=this.attr("scrollElement"),n(i)?l=document.querySelector(i):o(i)&&(l=i),this.$parentElement=l,this.$scrollElement=p(r),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),e(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("animationCurrent"),i=this.attr("customClass"),r=this.$parentElement,l=[],n=[];let o,h,c,u,d=null;return r?(this.isInside()&&e&&(d=Q("h2",{className:"outline-chapters__title"},e),this.$title=d,n.push(d)),c=Q("ul",{className:"outline-chapters__list"}),this.$list=c,l.push(c),s&&(u=Q("div",{className:"outline-chapters__placeholder"}),this.$placeholder=u,l.push(u)),h=Q("div",{className:"outline-chapters__main"},l),this.$main=h,n.push(h),o=Q("nav",{id:"outline-chapters",className:"outline-chapters outline-chapters_hidden"},n),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),a(o,"outline-chapters_sticky")),i&&a(o,i),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("showCode"),i=this.attr("mounted"),r=this.$parentElement,l=this.chapters,n=this.count();let o,h;return!r||l.length<1||(this.isInside()&&a(r,"outline-chapters-parent"),this._paintEdge(),o=this.$el,h=this.$list,((t,e,s=!1)=>{const i=e.length,r=[...e],l=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=[],h=Q("span",{className:"outline-chapters__text"},e.text);let a,c,u,d,p;s&&(c=Q("span",{className:"outline-chapters__code","data-id":l},e.code),o.push(c)),o.push(h),a=Q("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},o),u=Q("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},a),-1===r?t.appendChild(u):(p=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(u):(d=Q("ul",{id:"subject-"+r,className:"outline-chapters__subject"},u),p.appendChild(d)))}))};if(i>400)for(l(r.splice(0,400));r.length>0;){const t=r.splice(0,400);j((()=>{l(t)}))}else l(r)})(h,l,t),u(o,"outline-chapters_hidden"),s((()=>{this.highlight(this.active)}),60),this.offsetTop=F(o),this.offsetWidth=o.offsetWidth,this.isFixed()&&(this.sticky(),X("--outline-chapters-width",`${this.offsetWidth}px`)),e(i)&&i.call(this),n<400&&this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=this.attr("animationCurrent"),n=parseInt(st(e,"padding-top"),10),o=parseInt(st(e,"border-top-width"),10),h=parseInt(st(s,"padding-top"),10),a=parseInt(st(s,"margin-top"),10),c=parseInt(st(s,"border-top-width"),10);let u,d=r.offsetHeight,p=0;return l?(n&&(p+=n),h&&(p+=h),a&&(p+=a),o&&(p+=o),c&&(p+=c),u=d*t,i.style.cssText=`transform: translateY(${p+u}px);height:${d}px;`,this):this}highlight(t){const e=this.attr("animationCurrent"),s=this.$el.querySelector(`#chapter__anchor-${t}`),i="outline-chapters_active",r="outline-chapters_highlight";return s?(this.active=parseInt(s.getAttribute("data-id"),10),this.$active&&(u(this.$active,r),u(this.$active,i)),this.$active=s,a(this.$active,i),e?this.positionPlaceholder(this.active):a(this.$active,r),this):this}sticky(){const t=this.attr("afterSticky"),s="outline-chapters_fixed",i=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?a(i,s):u(i,s),e(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return X("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return m(s,t,e),this}show(){const t="outline-chapters_hidden",i=this.attr("afterOpened"),r=this.count(),l=this.$el,n=this.$parentElement;return this.isInside()?r>800?u(n,t):(u(n,t),s((()=>{u(n,"outline-chapters_folded")}),30)):u(l,t),this.closed=!1,e(i)&&i.call(this),this}hide(){const t="outline-chapters_hidden",i=this.attr("afterClosed"),r=this.count(),l=this.$el,n=this.$parentElement;return this.isInside()?r>800?a(n,t):(a(n,"outline-chapters_folded"),s((()=>{a(n,t)}))):a(l,t),this.closed=!0,e(i)&&i.call(this),this}toggle(){const t=this.attr("afterToggle"),i=this.offsetTop,r=this.$scrollElement.scrollTop;let l;return this.isClosed()?this.show():this.hide(),e(t)&&s((()=>{l=r>=i,t.call(this,this.isClosed(),l)})),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(it.DEFAULTS)._reset(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),e(s)&&s.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let i=null;return this.Observer=((t,s={})=>{const i=s.root||null,r=s.selector||".outline-heading",l=s.context||null,n={rootMargin:s.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((s=>{s.forEach((s=>{s.intersectionRatio>0&&e(t)&&t.call(l||s.target,s.target)}))}),n),a=o(i)?i:document;return i&&(n.root=i),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;i&&clearTimeout(i),i=s((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const i=this.attr("stickyHeight"),r=t.delegateTarget,l=r.getAttribute("data-id"),n=r.href.split("#")[1],o=document.querySelector(`#${n}`),h=F(o)-(i+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{e(c)&&c.call(this,"chapter"),s((()=>{this.playing=!1,this.$emit("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),s((()=>{this.scrollTo(h,u),this.highlight(l)}),10)):(this.scrollTo(h,u),this.highlight(l)),w(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=s((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=s((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),T(t,".outline-chapters__anchor","click",this.onSelect,this,!0),$(i,"scroll",this.onScroll,this,!0),this.isSticky()&&$(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),b(e,"click",this.onSelect),b(r,"scroll",this.onScroll),this.isSticky()&&$(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}it.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const rt=(t,e=!0)=>{const s=J(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=Q("a",{className:"outline-toolbar__anchor",href:t.link},s),r=Q("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return a(s,"outline-toolbar__icon"),e&&a(r,"outline-toolbar_rounded"),t.disabled&&a(r,"outline-toolbar_disabled"),r},lt="outline-toolbar_disabled",nt="outline-toolbar_hidden";class ot extends N{constructor(t){super(),this.attrs=l(ot.DEFAULTS),this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let s;return this.attr(t),s=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),e(s)&&s.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,h(i,s)?u(i,s):a(i,s)),this}render(){const t=this.attr("mounted"),s=this.attr("buttons")||[],i=this.attr("rounded"),r=this.attr("placement"),l=[];return R(),s.forEach((t=>{const e=rt(t,i);l.push(e),this.buttons.push({name:t.name,$el:e})})),this.$el=Q("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},l),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),e(t)&&t.call(this),this}add(t){const s=this.$el,l=this.attr("buttons"),n=t.action,o=document.createDocumentFragment();let h;return i(t)?(l.push(t),o.appendChild(rt(t))):r(t)&&t.forEach((t=>{o.appendChild(rt(t))})),s.appendChild(o),n&&e(n.handler)&&(h=n.type||"click",T(s,`.${t.name}`,h,n.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(u(h,lt),n&&o&&T(s,`.${t}`,n,o)):(a(h,lt),n&&o&&b(s,n,o)),this):this}disable(t){const s=this.attr("afterDisabled");return t?this.switch(t,!1):(a(this.$el,lt),this.removeListeners(),this.disabled=!0,e(s)&&s.call(this)),this}enable(t){const s=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,u(this.$el,lt),this.addListeners(),e(s)&&s.call(this)),this}show(t){const i=this.attr("afterOpened"),r=this.attr("buttons").find((e=>e.name===t)),l=this.$el;let n;if(t){if(!r)return this;n=l.querySelector(`.${t}`),u(n,nt)}else u(l,nt),this.closed=!1,e(i)&&s((()=>{i.call(this)}),310);return this}hide(t){const i=this.attr("afterClosed"),r=this.attr("buttons").find((e=>e.name===t)),l=this.$el;let n;if(t){if(!r)return this;n=l.querySelector(`.${t}`),a(n,nt)}else a(l,nt),this.closed=!0,e(i)&&s((()=>{i.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");let i=this.$el;return e(t)&&t.call(this),this.removeListeners(),document.body.removeChild(i),i=null,this.attr(ot.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],e(s)&&s.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(rt(t))})),this.addListeners(),this}addListeners(){const t=this.attr("buttons"),s=this.$el;return!t||t.length<1||t.forEach((t=>{const i=t.action;let r,l,o,h;if(this.disabled)return!1;i&&(l=i.handler,n(l)&&(h=l,i.handler=function(){this.$emit(h,t.name)},l=i.handler),r=i.type||"click",o=i.context),e(l)&&T(s,`.${t.name}`,r,l,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),s=this.$el;return!t||t.length<1||t.forEach((t=>{const i=t.action;let r,l;if(this.disabled)return!1;i&&(l=i.handler,r=i.type||"click"),e(l)&&b(s,r,l)})),this}}ot.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const ht=t=>{const e=Object.getPrototypeOf;let s;if(!(t=>i(t)&&null!==t)(t))return!1;if(s=t.prototype,!s)return!0;for(s=t;null!==e(s);)s=e(s);return e(t)===s},at=t=>t.replace(/]*>.*?<\/script>/gi,""),ct=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},ut=[];let dt;R();class pt extends N{constructor(t){super(),this.attrs=l(pt.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,t&&this.initialize(t)}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",{...this.attr()}),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),s=this.attr("round"),i=this.attr("closable"),r=this.attr("visible"),l=this.attr("customClass"),n=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return s&&n.push("outline-message_round"),i||n.push("outline-message_full-width"),r&&n.push("outline-message_visible"),l&&n.push(l),n}render(){const t=this.attr("type"),e=this.attr("message"),s=this.attr("effect"),i=this.attr("round"),r=this.attr("closable"),l=this.attr("dangerouslyUseHTMLString"),n=this._getClassName(),o=[];let h,c,u,d,p,m=20;return i&&"default"===s&&(m=12),"plain"!==s&&(h=J("light"===s?`circle-${t}`:t,{iconSet:"outline",size:m}),a(h,"outline-message__icon"),o.push(h)),l?(u=document.createDocumentFragment(),u.innerHTML=e):u=document.createTextNode(ct(at(e))),c=Q("p",{className:"outline-message__content"},[u]),o.push(c),r&&(d=J("close",{iconSet:"outline",size:18}),a(d,"outline-message__close"),o.push(d)),p=Q("div",{className:n.join(" ")},o),p.style.cssText="top:-50px;",this.$el=p,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let s,i,r,l,n,o,h,c=20;return this.isDestroyed()?this:(n=e.querySelector(".outline-icon"),n?(s=this.attr("type"),i=this.attr("effect"),r=this.attr("round"),"plain"===i?a(n,t):(u(n,t),r&&"default"===i&&(c=12)),o=n.querySelector(".outline-icon__svg"),V(o,{style:`width:${c}px;height:${c}px;`}),h=o.querySelector("use"),l="light"===i?`circle-${s}`:s,P(h,"xlink:href",`#outline-icon-${l}`),this):this)}_refreshMessage(){const t=this.$el;let e,s,i,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),s=this.attr("dangerouslyUseHTMLString"),i=this.attr("message"),r=s?i:ct(at(i)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let s,i;return this.isDestroyed()||(s=e.querySelector(".outline-message__close"),i=this.attr("closable"),s&&(i?a(s,t):u(s,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),P(t,"className",e.join(" "))),this}refresh(t){return ht(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=s((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,r,l,n;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),r=this.attr("duration"),l=i&&i>=this.offset?i:this.offset,n=`top:${l}px;`,this.clearTimer(),this.$emit("beforeOpen"),s((()=>{this.visible=!0,a(e,"outline-message_visible"),e.style.cssText=n,r>0&&this.startTimer(r)}),100)),this}close(){const t=this.$el;let i,r;return this.isDestroyed()||(i=this.attr("destroyAfterClosed"),r=this.attr("beforeClose"),e(r)&&r.call(this),t.style.cssText="top:-50px;",u(t,"outline-message_visible"),this.visible=!1,this.closed=!0,s((()=>{this.$emit("closed"),i&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),this.attr(pt.DEFAULTS),this.id="",this.closed=!0,this.visible=!1,this.offset=-50,clearTimeout(this.timer),this.timer=null,this.destroyed=!0,this.$el=null,this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return T(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),T(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),T(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return b(t,"mouseenter",this.onMouseEnter),b(t,"mouseleave",this.onMouseLeave),b(t,"click",this.onClose),this}}pt.DEFAULTS={id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null},["info","success","warning","error"].forEach((t=>{pt[t]=e=>{const s={},i=k("outline-message-"),r=e.beforeClose||null;let l=e.offset||30;return n(e)?s.message=e:ht(e)&&S(s,e),s.id=i,s.type=t,s.offset=l,s.visible=!1,s.beforeClose=()=>{pt.close(i,r)},dt=new pt(s),ut.forEach((t=>{l+=t.$el.offsetHeight+16})),dt.offset=l,dt.open(),ut.push(dt),dt}})),pt.close=(t,s)=>{const i=ut.length;let r,l,n=-1;if(ut.forEach(((i,r)=>{t===i.id&&(l=i.$el.offsetHeight,n=r,e(s)&&s.call(i),ut.splice(r,1))})),i<=1||-1===n||n>ut.length-1)return!1;for(r=n;r{let t=ut.length-1;for(;t>=0;t-=1)ut[t].close()};const mt=(t,e)=>{let s,i=t;for(;i;)s=i.tagName.toLowerCase(),"script"!==s&&"style"!==s&&a(i,"outline-print_sibling"),i=e?i.previousElementSibling:i.nextElementSibling},ft="进入阅读模式,按 ESC 键可退出阅读模式";class gt extends N{constructor(t){super(),this.attrs=l(gt.DEFAULTS),this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,this.buttons=[],this.reading=!1,t&&this.initialize(t)}initialize(t){return this.attr(t),this.$emit("created",{...this.attr()}),this.render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){const t=this.attr("hasToolbar"),e=this.attr("scrollElement"),s=document.querySelector(e);return this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar(),s&&t&&this.onToolbarUpdate({top:s.scrollTop,min:0,max:s.scrollHeight}),this.$emit("mounted"),this}_renderPrint(){const t=this.attr("print"),e=this.attr("articleElement");let i,r,l;return t.element?(n(e)?i=document.querySelector(e):o(e)&&(i=e),a(i,"outline-article"),l=t.element,n(l)?r=document.querySelector(l):o(l)&&(r=l),((t,e)=>{const i=document.createDocumentFragment();let r,l,h,a,c,u,d,p=e;if(n(t)?r=document.querySelector(t):o(t)&&(r=t),!r)return!1;u=J("close",{iconSet:"outline",size:20,attrs:{className:"outline-print__close"}}),a=r.querySelector("h1"),o(e)&&(a=e),o(a)&&(p=a.innerText),a=Q("h1",{className:"outline-print__title"},p),h=Q("article",{id:"outline-print__article",className:"outline-print__article"}),l=Q("section",{id:"outline-print",className:"outline-print"},[u,a,h]),document.body.appendChild(l),s((()=>{c=l.previousElementSibling,mt(c,!0),c=l.nextElementSibling,mt(c),d=r.cloneNode(!0).childNodes,d.forEach((t=>{i.appendChild(t)})),h.appendChild(i)}))})(r,t.title),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new K({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n,chapterTextFilter:o}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("animationCurrent"),n=this.attr("position"),o=this.attr("placement"),h=this.attr("afterSticky"),a=this.attr("afterToggle"),c=this.attr("afterScroll"),u=this.count();let d,p=this.attr("parentElement");return u<1||(d={scrollElement:s,showCode:r,animationCurrent:l,position:n,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:h,afterToggle:a,afterScroll:c},"relative"===n?(this.drawer=new et({placement:o,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),p=this.drawer.$main):d.customClass=i,d.parentElement=p,this.chapters=new it(d)),this}_renderToolbar(){const t=this.attr("hasToolbar"),s=this.attr("placement"),i=this.attr("homepage"),r=this.attr("git"),l=this.attr("tags"),n=this.attr("issues"),o=this.attr("tools"),h=this.attr("print"),a=this.count(),c={name:"homepage",icon:"homepage",size:20,link:i},u={name:"github",icon:"github",size:20,link:r},d={name:"tags",icon:"tags",size:20,link:l},p={name:"issues",icon:"issues",size:20,link:n},m={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},f={name:"reading",icon:"file",size:18,action:{type:"click",handler:"toolbar:action:reading"}},g={name:"print",icon:"print",size:20,action:{type:"click",handler:"toolbar:action:print"}},y=[];return t?(y.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),a>0&&y.push(m),i&&y.push(c),r&&y.push(u),l&&y.push(d),n&&y.push(p),h.element&&(y.push(f),e(print)&&y.push(g)),o?.length>0&&y.push(...o),y.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.buttons=[...y],this.toolbar=new ot({placement:s,buttons:y}),this):this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}toTop(){const t=this.attr("afterScroll"),s=this.toolbar,i=this.chapters,r=this.count();return r>0&&(i.playing=!0),this.scrollTo(0,(()=>{s.hide("up"),s.show("down"),r>0&&(i.highlight(0),i.playing=!1),e(t)&&t.call(s,"up")})),this}toBottom(){const t=this.attr("afterScroll"),s=p(this.attr("scrollElement")),i=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(s.scrollHeight-s.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(n,(()=>{i.hide("down"),i.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),e(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return m(s,t,e),this}enterReading(){const t="outline-reading",e=`${t}_hidden`,s=document.querySelector("#outline-print"),i=document.querySelectorAll(".outline-print_sibling"),r=this.attr("print").enterReadingTip||ft;return this.reading||!s||(i.forEach((t=>{a(t,e)})),a(s,t),this.reading=!0,this.toolbar.toggle(),pt.info({round:!0,message:r}),this.$emit("enterReading")),this}exitReading(){const t="outline-reading",e=`${t}_hidden`,s=document.querySelector("#outline-print"),i=document.querySelectorAll(".outline-print_sibling");return this.reading&&s?(u(s,t),i.forEach((t=>{u(t,e)})),this.reading=!1,this.toolbar.toggle(),this.$emit("exitReading"),this):this}switchReading(){return document.querySelector("#outline-print")?(this.reading?this.exitReading():this.enterReading(),this):this}toggle(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.chapters;return this.count()<1||("relative"!==t?(r.toggle(),e.highlight("menu")):(e.toggle(),s((()=>{i.toggle()})))),this}print(){return e(print)?(print(),this):this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count(),n=document.querySelector("#outline-print");return this.$emit("beforeDestroy"),this.removeListeners(),n&&document.body.removeChild(n),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(gt.DEFAULTS),this.$emit("destroyed"),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onEnterReading(){return this.switchReading(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.switchReading(),w(t)),this}onPrint(){return this.print(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r {\n  return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n  return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n  if (!isFunction(fn)) {\n    return false\n  }\n\n  return setTimeout(() => {\n    fn()\n  }, delay)\n}\n\nexport default later\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n  return (\n    (toString(o) === '[object Object]' ||\n      typeof o === 'object' ||\n      isFunction(o)) &&\n    o !== null\n  )\n}\n\nexport default isObject\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n  if (Array.isArray) {\n    return Array.isArray(o)\n  } else {\n    return toString(o) === '[object Array]'\n  }\n}\n\nexport default isArray\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n  let clone = {}\r\n\r\n  if (obj === null) {\r\n    return null\r\n  }\r\n\r\n  if (isArray(obj)) {\r\n    clone = Array.from(obj)\r\n  } else {\r\n    clone = Object.assign({}, obj)\r\n    Object.keys(clone).forEach((key) => {\r\n      return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n    })\r\n  }\r\n\r\n  return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n  return typeof str === 'string'\n}\n\nexport default isString\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n  return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n  const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n  let allClass\n  let classList\n\n  if (!isElement(el)) {\n    return false\n  }\n\n  allClass = el.className\n\n  if (!allClass) {\n    return false\n  }\n\n  classList = el.classList\n\n  if (classList?.contains) {\n    return el.classList.contains(className)\n  }\n\n  return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n  let classList\n  let allClass\n\n  if (hasClass(el, className)) {\n    return false\n  }\n\n  classList = el.classList\n\n  if (classList?.add) {\n    classList.add(className)\n  } else {\n    allClass = el.className\n    allClass += allClass.length > 0 ? ' ' + className : className\n    el.className = allClass\n  }\n}\n\nexport default addClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n  if (!isString(str)) {\n    return false\n  }\n  return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n  let allClass = el.className\n  let classList\n\n  if (!allClass || !hasClass(el, className)) {\n    return false\n  }\n\n  classList = el.classList\n\n  if (classList?.remove) {\n    classList.remove(className)\n  } else {\n    allClass = trim(allClass.replace(className, ''))\n    el.className = allClass\n  }\n}\n\nexport default removeClass\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n  return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n  let $rootElements\n  let $scrollElement\n\n  if (!scrollElement) {\n    $rootElements = document.querySelectorAll('html,body')\n    $scrollElement =\n      $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n        ? $rootElements[0]\n        : $rootElements[1]\n  } else {\n    if (isString(scrollElement)) {\n      $scrollElement = document.querySelector(scrollElement)\n    } else if (isElement(scrollElement)) {\n      $scrollElement = scrollElement\n    }\n  }\n\n  return $scrollElement\n}\n\nexport default _getScrollElement\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n  const $scrollElement = _getScrollElement(scrollElement)\n  let scrollTop = $scrollElement.scrollTop\n  let step = 0\n  const distance = top - scrollTop\n  const MAX_HEIGHT = $scrollElement.scrollHeight\n  const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n  const stop = (top) => {\n    if (isFunction(afterStop)) {\n      afterStop(top)\n    }\n\n    return false\n  }\n  const play = () => {\n    step += 1\n\n    // 向上滚动\n    if (distance < 0) {\n      scrollTop -= easeInQuad(step)\n      $scrollElement.scrollTop = scrollTop\n\n      if (scrollTop <= top) {\n        $scrollElement.scrollTop = top\n        return stop(top)\n      }\n    } else {\n      scrollTop += easeInQuad(step)\n      $scrollElement.scrollTop = scrollTop\n\n      if (scrollTop >= MAX_TOP) {\n        $scrollElement.scrollTop = MAX_TOP\n        return stop(MAX_TOP)\n      }\n    }\n\n    requestAnimationFrame(play)\n  }\n\n  requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","export const CAPTURE_EVENTS = [\n  'focusout',\n  'blur',\n  'focusin',\n  'focus',\n  'load',\n  'unload',\n  'mouseenter',\n  'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n  /* istanbul ignore else */\n  if (fn._delegateListener) {\n    fn = fn._delegateListener\n    delete fn._delegateListener\n  }\n\n  // 移除缓存的 _listeners 数据\n  _delete(el, type, fn)\n\n  el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n  const listeners = el._listeners\n  let index = -1\n\n  if (listeners.length < 1) {\n    return false\n  }\n\n  // 移除缓存的 _listeners 数据\n  listeners.forEach((listener, i) => {\n    const handler = listener.fn\n\n    if (type === listener.type) {\n      index = i\n\n      if (handler === fn) {\n        index = i\n      }\n    }\n  })\n\n  /* istanbul ignore else */\n  if (index > -1) {\n    listeners.splice(index, 1)\n  }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n  const $element = isString(el) ? document.querySelector(el) : el\n  const $children = $element.childNodes\n  const listeners = getListeners($element, type)\n\n  listeners.forEach((listener) => {\n    _off($element, listener.type, listener.fn)\n  })\n\n  if (\n    (recurse || type === true || arguments.length === 1) &&\n    $element &&\n    $children\n  ) {\n    $children.forEach(($child) => {\n      if (isElement($child)) {\n        purgeElement($child, type, recurse)\n      }\n    })\n  }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n  let listeners = el._listeners || []\n\n  if (isString(type) && type) {\n    listeners = listeners.filter((listener) => {\n      return listener.type === type\n    })\n  }\n\n  return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n  // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n  if (!isFunction(fn)) {\n    return purgeElement(el, type)\n  }\n\n  _off(el, type, fn)\n}\n\nexport default off\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n  // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\n  const listener = function (evt) {\n    let overrideContext = context || el\n\n    // 当设置为 true 时,则事件处理器回调函数的\n    // this 上下文指向为 data 对象\n    if (context === true) {\n      overrideContext = data\n    }\n\n    // 仅触发一次\n    /* istanbul ignore else */\n    if (once === true) {\n      off(el, type, listener)\n    }\n\n    fn.call(overrideContext, evt, data)\n  }\n\n  if (!isFunction(fn)) {\n    return false\n  }\n\n  if (!el._listeners) {\n    el._listeners = []\n  }\n\n  // 缓存 options 元素绑定的事件处理器\n  el._listeners.push({\n    el,\n    type,\n    fn: listener,\n    data,\n    context,\n    capture\n  })\n\n  // 缓存包装后的事件处理器\n  fn._delegateListener = listener\n\n  el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n  const sel = selector.replace(/^>/i, '')\n\n  if (!selector || !sel || !el) {\n    return false\n  }\n\n  /* istanbul ignore else */\n  if (el.matches) {\n    return el.matches(sel)\n  } else if (el.msMatchesSelector) {\n    return el.msMatchesSelector(sel)\n  } else {\n    return false\n  }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n  return el.host && el !== document && el.host.nodeType\n    ? el.host\n    : el.parentNode\n}\n\nexport default getParentOrHost\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n  // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n  const listener = function (evt) {\n    const target = getTarget(evt)\n    // 通过 Element.matches 方法获得点击的目标元素\n    const delegateTarget = closest(target, selector, el)\n    let overrideContext = context || el\n\n    evt.delegateTarget = delegateTarget\n\n    // 当设置为 true 时,则事件处理器回调函数的\n    // this 上下文指向为 data 对象\n    if (context === true) {\n      overrideContext = data\n    }\n\n    /* istanbul ignore else */\n    if (delegateTarget) {\n      // 仅触发一次\n      /* istanbul ignore else */\n      if (once === true) {\n        off(el, type, listener)\n      }\n\n      fn.call(overrideContext, evt, data)\n    }\n  }\n\n  if (!el._listeners) {\n    el._listeners = []\n  }\n\n  // 缓存 options 元素绑定的事件处理器\n  el._listeners.push({\n    el,\n    selector,\n    type,\n    fn: listener,\n    data,\n    context,\n    capture\n  })\n\n  // 缓存包装后的事件处理器\n  fn._delegateListener = listener\n\n  el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n  const target = evt.target\n\n  return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n  if (el && el.nodeType === 3) {\n    return el.parentNode\n  }\n\n  return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n  const context = ctx || document\n\n  if (!el) {\n    return null\n  }\n\n  do {\n    /* istanbul ignore else */\n    if (\n      (selector != null &&\n        (selector.startsWith('>')\n          ? el.parentNode === context && matches(el, selector)\n          : matches(el, selector))) ||\n      (includeCTX && el === context)\n    ) {\n      return el\n    }\n\n    /* istanbul ignore else */\n    if (el === context) {\n      break\n    }\n\n    /* jshint boss:true */\n  } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n * 
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","/**\n * timeSlice.js 时间切片功能函数\n * ====================================================\n * Created By: Yaohaixiao\n * Update: 2023.09.04\n */\nimport isFunction from '../types/isFunction'\nimport later from './later'\n\nconst queue = []\nlet isHandling\nlet done\n\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\nif (typeof window.requestIdleCallback === 'undefined') {\n window.requestIdleCallback = function (cb) {\n const start = Date.now()\n return later(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start))\n }\n })\n }, 10)\n }\n\n window.cancelIdleCallback = function (id) {\n clearTimeout(id)\n }\n}\n\nfunction runIdle(idleDeadline) {\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\n const fn = queue.shift()\n\n if (!isFunction(fn)) {\n return false\n }\n\n fn()\n }\n\n if (queue.length) {\n isHandling = requestIdleCallback(runIdle)\n } else {\n isHandling = 0\n\n if (isFunction(done)) {\n done()\n done = null\n }\n }\n}\n\n/**\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\n * 多个短时间任务\n * ====================================================\n * @param {Function} fn - 需要在空闲时执行的回调函数\n * @param {Function} afterComplete - queen 的\n * @return {(function(): (boolean|undefined))|*|boolean}\n */\nconst timeSlice = (fn, afterComplete = null) => {\n queue.push(fn)\n\n if (isFunction(afterComplete)) {\n done = afterComplete\n }\n\n if (!isHandling) {\n requestIdleCallback(runIdle)\n }\n}\n\nexport default timeSlice\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'htmlFor':\n el.setAttribute('for', value)\n break\n case 'className':\n el.className = value\n break\n case 'innerHTML':\n el.innerHTML = value\n break\n case 'innerText':\n el.innerText = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n if (!el || !isObject(attrs)) {\n return false\n }\n\n Object.keys(attrs).forEach((attr) => {\n const value = attrs[attr]\n if (hasOwn(attrs, attr)) {\n setAttribute(el, attr, value)\n }\n })\n}\n\nexport default setAttributes\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n setAttributes($el, attrs)\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n } else if (isDOM(attrs)) {\n append(attrs)\n } else if (isString(attrs)) {\n append(document.createTextNode(attrs))\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\nimport setAttributes from '../dom/setAttributes'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @param {Object} [options.attrs]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const ICON = 'outline-icon'\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const attrs = options.attrs || {}\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg = ``\n }\n\n $icon.innerHTML = svg\n\n if (attrs.className) {\n attrs.className = `${ICON} ${attrs.className}`\n } else {\n attrs.className = ICON\n }\n\n setAttributes($icon, attrs)\n\n $svg = $icon.querySelector('svg')\n setAttributes($svg, {\n 'aria-hidden': true,\n xmlns: 'http://www.w3.org/2000/svg',\n class: 'outline-icon__svg',\n width: 200,\n height: 200,\n style: cssRules\n })\n\n return $icon\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n let $anchor\n\n $heading.innerHTML = text.replace(pattern, '')\n $heading.removeAttribute('id')\n $heading.removeAttribute('data-id')\n\n removeClass($heading, CLS_HEADING)\n\n if (!hasAnchor) {\n return false\n }\n\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n if (isAtStart) {\n removeClass($heading, `${CLS_HEADING}_start`)\n }\n\n if (isEmpty(trim($heading.className))) {\n $heading.removeAttribute('class')\n }\n\n $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n let previous = 1\n let level = 0\n let text = ''\n const chapters = []\n\n headings.forEach((heading, i) => {\n const tagName = heading.tagName\n const headingLevel = tagName.replace(/h/i, '')\n let current = parseInt(headingLevel, 10)\n let pid = -1\n\n // 场景1:当前标题是前一个标题的子标题\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n // h2 (前一个标题)\n // h3 (当前标题)\n if (current > previous) {\n level += 1\n\n // 第一层级的 pid 是 -1\n if (level === 1) {\n pid = -1\n } else {\n pid = i - 1\n }\n }\n // 场景2:当前标题和前一个标题层级相同\n // 当前标题的(标题标签)序号 = 前一个标题的序号\n // h2 (前一个标题)\n // h2 (当前标题)\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\n // h2\n // h4 (前一个标题)\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n else if (current === previous || (current < previous && current > level)) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n pid = -1\n } else {\n pid = chapters[i - 1].pid\n }\n }\n // 场景3:当前标题比前一个标题层级高\n else if (current <= level) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n } else {\n level = level - (previous - current)\n\n if (level <= 1) {\n level = 1\n }\n }\n\n // 第一级的标题\n if (level === 1) {\n pid = -1\n } else {\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n }\n }\n\n previous = current\n\n text = stripTags(trim(heading.innerHTML))\n\n if (isFunction(chapterTextFilter)) {\n text = chapterTextFilter(text)\n }\n\n chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text,\n tagName\n })\n })\n\n return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n if (!isString(str)) {\n return ''\n }\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n let previous = chapters[index - 1]\n let pid\n let i\n\n for (i = 0; i < differ; i += 1) {\n pid = previous.pid\n previous = chapters[pid]\n }\n\n pid = previous.pid\n\n return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n const groups = {}\n const cb = (o) => {\n return [o.pid]\n }\n\n chapters.forEach((o) => {\n const group = JSON.stringify(cb(o))\n\n groups[group] = groups[group] || []\n groups[group].push(o)\n\n o.index = groups[group].length\n if (o.pid === -1) {\n o.code = String(o.index)\n }\n })\n\n Object.keys(groups).forEach((group) => {\n groups[group].forEach((c) => {\n const subjects = groups[`[${c.id}]`]\n if (!subjects || !isArray(subjects)) {\n return false\n }\n subjects.forEach((o) => {\n o.code = c.code + '.' + o.index\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport timeSlice from './utils/lang/timeSlice'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nimport Base from './base'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n const showCode = this.attr('showCode') || true\n let created\n let scrollElement\n let selector\n let $articleElement\n let articleElement\n\n this.attr(options)\n articleElement = this.attr('articleElement')\n scrollElement = this.attr('scrollElement')\n selector = this.attr('selector')\n created = this.attr('created')\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n if (!$articleElement) {\n return this\n }\n\n this.$articleElement = $articleElement\n this.$scrollElement = _getScrollElement(scrollElement)\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n if (this.$headings.length < 1) {\n return this\n }\n\n this.chapters = getChapters(\n this.$headings,\n showCode,\n this.attr('chapterTextFilter')\n )\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const chapters = this.chapters\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.chapters.length\n }\n\n render() {\n const LIMIT = 400\n const mounted = this.attr('mounted')\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const count = this.count()\n const $headings = [...this.$headings]\n const chapters = this.getChapters()\n const update = (headings, group) => {\n headings.forEach(($heading, i) => {\n const id = i + group * LIMIT\n const chapterCode = chapters[id].code\n _updateHeading($heading, id, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n }\n let groupIndex = -1\n\n paint()\n\n // 针对超长的文章,进行 timeSlice 处理\n if (count > LIMIT) {\n groupIndex += 1\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\n update($headings.splice(0, LIMIT), 0)\n // 采用 timeSlice 处理机制绘制剩余的标题\n while ($headings.length > 0) {\n const once = $headings.splice(0, LIMIT)\n timeSlice(\n () => {\n update(once, (groupIndex += 1))\n },\n () => {\n this.$emit('anchors:all:paint')\n }\n )\n }\n } else {\n update($headings, 0)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n destroy() {\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n onAnchorTrigger(evt) {\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const $heading = $anchor.parentNode\n const top = offsetTop($heading) - (stickyHeight + 10)\n const $scrollElement = this.$scrollElement\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'anchor')\n }\n\n later(() => {\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.scrollTo(top, after)\n\n if (!anchorURL) {\n stop(evt)\n }\n\n return this\n }\n\n addListeners() {\n const $articleElement = this.$articleElement\n\n on(\n $articleElement,\n '.outline-heading__anchor',\n 'click',\n this.onAnchorTrigger,\n this,\n true\n )\n\n return this\n }\n\n removeListeners() {\n const $articleElement = this.$articleElement\n\n off($articleElement, 'click', this.onAnchorTrigger)\n\n return this\n }\n}\n\nAnchors.DEFAULTS = {\n scrollElement: 'html,body',\n articleElement: '#article',\n selector: 'h1,h2,h3,h4,h5,h6',\n stickyHeight: 0,\n anchorURL: '',\n hasAnchor: true,\n isAtStart: true,\n showCode: false,\n created: null,\n mounted: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n chapterTextFilter: null\n}\n\nexport default Anchors\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttributes from './utils/dom/setAttributes'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n const CLS_HEADING = 'outline-heading'\n const hasAnchor = options.hasAnchor || true\n const isAtStart = options.isAtStart || true\n const showCode = options.showCode || false\n const chapterCode = options.chapterCode || ''\n const anchorURL = options.anchorURL || ''\n const headingId = `heading-${i}`\n const attrs = {\n id: headingId,\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n 'data-id': i\n }\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n if (showCode) {\n attrs.innerHTML = chapterCode + ' ' + text\n }\n setAttributes($heading, attrs)\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = icon('hash', { iconSet: 'outline' })\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL || `#${headingId}`,\n target: anchorURL ? '_blank' : 'self',\n 'data-id': i\n },\n $icon\n )\n $heading.appendChild($anchor)\n}\n\nexport default _updateHeading\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Drawer.DEFAULTS)\n this.title = ''\n this.closed = true\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n this.title\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n icon('close', { iconSet: 'outline', size: 20 })\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement('div', {\n className: 'outline-drawer__main'\n })\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement('footer', {\n className: 'outline-drawer__footer'\n })\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement('div', {\n className: 'outline-drawer__overlay'\n })\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport cloneDeep from './utils/lang/cloneDeep'\n\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Chapters.DEFAULTS)\n\n this._reset()\n\n this.offsetWidth = 0\n this.playing = false\n this.scrollTimer = null\n this.resizeTimer = null\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n _reset() {\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.$active = null\n\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.closed = false\n\n return this\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n count() {\n return this.chapters.length\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const animationCurrent = this.attr('animationCurrent')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const children = []\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n title\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement('ul', {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n })\n this.$list = $list\n children.push($list)\n\n if(animationCurrent) {\n $placeholder = createElement('div', {\n className: 'outline-chapters__placeholder'\n })\n this.$placeholder = $placeholder\n children.push($placeholder)\n }\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n children\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n const count = this.count()\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n if (this.isInside()) {\n addClass($parentElement, 'outline-chapters-parent')\n }\n\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n\n later(() => {\n this.highlight(this.active)\n }, 60)\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n if (count < 400) {\n this.onObserver()\n }\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const animationCurrent = this.attr('animationCurrent')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (!animationCurrent) {\n return this\n }\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const animationCurrent = this.attr('animationCurrent')\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const ACTIVE = 'outline-chapters_active'\n const HIGHLIGHT = 'outline-chapters_highlight'\n\n if (!$anchor) {\n return this\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n removeClass(this.$active, ACTIVE)\n }\n\n this.$active = $anchor\n addClass(this.$active, ACTIVE)\n\n if (animationCurrent) {\n this.positionPlaceholder(this.active)\n } else {\n addClass(this.$active, HIGHLIGHT)\n }\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n removeClass($parent, HIDDEN)\n } else {\n removeClass($parent, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n }, 30)\n }\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n addClass($parent, HIDDEN)\n } else {\n addClass($parent, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n })\n }\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)._reset()\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at(window, 'resize', this.onResize, this, true)\n }\n this.$on('anchors:all:paint', this.onObserver, this)\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at(window, 'resize', this.onResize)\n }\n\n this.$off('anchors:all:paint')\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n animationCurrent: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\nimport timeSlice from './utils/lang/timeSlice'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const LIMIT = 400\n const count = chapters.length\n const clones = [...chapters]\n const paint = (parts) => {\n const byId = (id) => $list.querySelector(`#${id}`)\n parts.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const children = []\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n chapter.text\n )\n let $link\n let $code\n let $li\n let $subject\n let $chapter\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n chapter.code\n )\n\n children.push($code)\n }\n\n children.push($text)\n\n $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n children\n )\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n $link\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $chapter = byId(`chapter-${pid}`)\n $subject = byId(`subject-${pid}`)\n\n if (!$subject) {\n $subject = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n $li\n )\n\n $chapter.appendChild($subject)\n } else {\n $subject.appendChild($li)\n }\n }\n })\n }\n\n if (count > LIMIT) {\n // 同步绘制\n paint(clones.splice(0, LIMIT))\n // 剩余的采用 timeSlice 机制绘制\n while (clones.length > 0) {\n const once = clones.splice(0, LIMIT)\n timeSlice(() => {\n paint(once)\n })\n }\n } else {\n paint(clones)\n }\n}\n\nexport default _paintChapters\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n $icon\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = []\n\n paint()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.push($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n $buttons\n )\n document.body.appendChild(this.$el)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n this.$emit(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n","import isObject from './isObject'\n\n/**\n * 检测测试数据是否为类似 Object 类型\n * ========================================================================\n * @method isObjectLike\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\n */\nconst isObjectLike = (val) => {\n return isObject(val) && val !== null\n}\n\nexport default isObjectLike\n","import isObjectLike from './isObjectLike'\n\n/**\n * 检测测试数据是否为普通对象\n * ========================================================================\n * @method isPlainObject\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\n */\nconst isPlainObject = (val) => {\n const getPrototypeOf = Object.getPrototypeOf\n let proto\n\n // Detect obvious negatives\n if (!isObjectLike(val)) {\n return false\n }\n\n proto = val.prototype\n\n // JavaScript 对象分为两种:普通对象和函数对象\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\n if (!proto) {\n return true\n }\n\n proto = val\n\n while (getPrototypeOf(proto) !== null) {\n proto = getPrototypeOf(proto)\n }\n\n return getPrototypeOf(val) === proto\n}\n\nexport default isPlainObject\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n *\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n document.body.removeChild(this.$el)\r\n\r\n this.attr(Message.DEFAULTS)\r\n\r\n this.id = ''\r\n this.closed = true\r\n this.visible = false\r\n this.offset = -50\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n this.destroyed = true\r\n\r\n this.$el = null\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n}\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport later from './utils/lang/later'\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nconst paintPrint = (el, title) => {\r\n const $fragment = document.createDocumentFragment()\r\n let text = title\r\n let $el\r\n let $wrapper\r\n let $article\r\n let $title\r\n let $sibling\r\n let $icon\r\n let $children\r\n\r\n if (isString(el)) {\r\n $el = document.querySelector(el)\r\n } else if (isElement(el)) {\r\n $el = el\r\n }\r\n\r\n if (!$el) {\r\n return false\r\n }\r\n\r\n $icon = icon('close', {\r\n iconSet: 'outline',\r\n size: 20,\r\n attrs: {\r\n className: 'outline-print__close'\r\n }\r\n })\r\n\r\n $title = $el.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n text = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-print__title'\r\n },\r\n text\r\n )\r\n\r\n $article = createElement('article', {\r\n id: 'outline-print__article',\r\n className: 'outline-print__article'\r\n })\r\n\r\n $wrapper = createElement(\r\n 'section',\r\n {\r\n id: 'outline-print',\r\n className: 'outline-print'\r\n },\r\n [$icon, $title, $article]\r\n )\r\n document.body.appendChild($wrapper)\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $wrapper.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $wrapper.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n\r\n // 克隆文章内容\r\n $children = $el.cloneNode(true).childNodes\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n $article.appendChild($fragment)\r\n })\r\n}\r\n\r\nexport default paintPrint\r\n","import later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport isFunction from './utils/types/isFunction'\nimport isString from './utils/types/isString'\nimport isElement from './utils/types/isElement'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\n\nimport Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\nimport Message from './message'\nimport paintPrint from './print'\n\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Outline.DEFAULTS)\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n this.buttons = []\n this.reading = false\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options)\n this.$emit('created', { ...this.attr() })\n this.render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n const scrollElement = this.attr('scrollElement')\n const $scrollElement = document.querySelector(scrollElement)\n\n this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar()\n\n if ($scrollElement) {\n this.onToolbarUpdate({\n top: $scrollElement.scrollTop,\n min: 0,\n max: $scrollElement.scrollHeight\n })\n }\n\n this.$emit('mounted')\n\n return this\n }\n\n _renderPrint() {\n const option = this.attr('print')\n const articleElement = this.attr('articleElement')\n let $articleElement\n let $print\n let element\n\n if (!option.element) {\n return this\n }\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n addClass($articleElement, 'outline-article')\n\n element = option.element\n\n if (isString(element)) {\n $print = document.querySelector(element)\n } else if (isElement(element)) {\n $print = element\n }\n\n paintPrint($print, option.title)\n\n return this\n }\n\n _renderAnchors() {\n const articleElement = this.attr('articleElement')\n const selector = this.attr('selector')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const chapterTextFilter = this.attr('chapterTextFilter')\n\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll,\n chapterTextFilter\n })\n\n return this\n }\n\n _renderChapters() {\n const title = this.attr('title')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const customClass = this.attr('customClass')\n const showCode = this.attr('showCode')\n const animationCurrent = this.attr('animationCurrent')\n const position = this.attr('position')\n const placement = this.attr('placement')\n const afterSticky = this.attr('afterSticky')\n const afterToggle = this.attr('afterToggle')\n const afterScroll = this.attr('afterScroll')\n const count = this.count()\n let parentElement = this.attr('parentElement')\n let CHAPTERS_OPTIONS\n\n if (count < 1) {\n return this\n }\n\n CHAPTERS_OPTIONS = {\n scrollElement,\n showCode,\n animationCurrent,\n position,\n title,\n stickyHeight,\n chapters: this.getChapters(),\n afterSticky,\n afterToggle,\n afterScroll\n }\n\n if (position === 'relative') {\n this.drawer = new Drawer({\n placement,\n title,\n size: 'tiny',\n hasOffset: true,\n hasPadding: false,\n customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\n } else {\n CHAPTERS_OPTIONS.customClass = customClass\n }\n\n CHAPTERS_OPTIONS.parentElement = parentElement\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\n\n return this\n }\n\n _renderToolbar() {\n const placement = this.attr('placement')\n const homepage = this.attr('homepage')\n const git = this.attr('git')\n const tags = this.attr('tags')\n const issues = this.attr('issues')\n const tools = this.attr('tools')\n const option = this.attr('print')\n const count = this.count()\n const UP = {\n name: 'up',\n icon: 'up',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:up'\n }\n }\n const HOME = {\n name: 'homepage',\n icon: 'homepage',\n size: 20,\n link: homepage\n }\n const GIT = {\n name: 'github',\n icon: 'github',\n size: 20,\n link: git\n }\n const TAGS = {\n name: 'tags',\n icon: 'tags',\n size: 20,\n link: tags\n }\n const ISSUES = {\n name: 'issues',\n icon: 'issues',\n size: 20,\n link: issues\n }\n const MENU = {\n name: 'menu',\n icon: 'menu',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:toggle'\n }\n }\n const READING = {\n name: 'reading',\n icon: 'file',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:reading'\n }\n }\n const PRINT = {\n name: 'print',\n icon: 'print',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:print'\n }\n }\n const DOWN = {\n name: 'down',\n icon: 'down',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:down'\n }\n }\n const buttons = []\n\n buttons.push(UP)\n if (count > 0) {\n buttons.push(MENU)\n }\n if (homepage) {\n buttons.push(HOME)\n }\n if (git) {\n buttons.push(GIT)\n }\n if (tags) {\n buttons.push(TAGS)\n }\n if (issues) {\n buttons.push(ISSUES)\n }\n if (option.element) {\n buttons.push(READING)\n if (isFunction(print)) {\n buttons.push(PRINT)\n }\n }\n if (tools?.length > 0) {\n buttons.push(...tools)\n }\n buttons.push(DOWN)\n this.buttons = [...buttons]\n\n this.toolbar = new Toolbar({\n placement,\n buttons\n })\n\n return this\n }\n\n addButton(button) {\n const toolbar = this.toolbar\n const buttons = this.buttons\n buttons.splice(-1, 0, button)\n toolbar.attr({\n buttons\n })\n toolbar.refresh()\n return this\n }\n\n removeButton(name) {\n this.toolbar.remove(name)\n return this\n }\n\n toTop() {\n const afterScroll = this.attr('afterScroll')\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const afterTop = () => {\n toolbar.hide('up')\n toolbar.show('down')\n\n if (count > 0) {\n chapters.highlight(0)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(0, afterTop)\n\n return this\n }\n\n toBottom() {\n const afterScroll = this.attr('afterScroll')\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const top = Math.floor(\n $scrollElement.scrollHeight - $scrollElement.clientHeight\n )\n const afterDown = () => {\n toolbar.hide('down')\n toolbar.show('up')\n\n if (count > 0) {\n chapters.highlight(count - 1)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(top, afterDown)\n\n return this\n }\n\n scrollTo(top, afterScroll) {\n const scrollElement = this.attr('scrollElement')\n scrollTo(scrollElement, top, afterScroll)\n return this\n }\n\n enterReading() {\n const READING = 'outline-reading'\n const HIDDEN = `${READING}_hidden`\n const $reading = document.querySelector('#outline-print')\n const $siblings = document.querySelectorAll('.outline-print_sibling')\n const options = this.attr('print')\n const enterReadingTip = options.enterReadingTip || ENTER_READING_TIP\n\n if (this.reading || !$reading) {\n return this\n }\n\n $siblings.forEach(($sibling) => {\n addClass($sibling, HIDDEN)\n })\n addClass($reading, READING)\n this.reading = true\n\n this.toolbar.toggle()\n\n Message.info({\n round: true,\n message: enterReadingTip\n })\n\n this.$emit('enterReading')\n\n return this\n }\n\n exitReading() {\n const READING = 'outline-reading'\n const HIDDEN = `${READING}_hidden`\n const $reading = document.querySelector('#outline-print')\n const $siblings = document.querySelectorAll('.outline-print_sibling')\n\n if (!this.reading || !$reading) {\n return this\n }\n\n removeClass($reading, READING)\n $siblings.forEach(($sibling) => {\n removeClass($sibling, HIDDEN)\n })\n this.reading = false\n\n this.toolbar.toggle()\n\n this.$emit('exitReading')\n\n return this\n }\n\n switchReading() {\n const $print = document.querySelector('#outline-print')\n\n if (!$print) {\n return this\n }\n\n if (!this.reading) {\n this.enterReading()\n } else {\n this.exitReading()\n }\n\n return this\n }\n\n toggle() {\n const position = this.attr('position')\n const toolbar = this.toolbar\n const drawer = this.drawer\n const chapters = this.chapters\n const count = this.count()\n\n if (count < 1) {\n return this\n }\n\n if (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n later(() => {\n drawer.toggle()\n })\n }\n\n return this\n }\n\n print() {\n if (!isFunction(print)) {\n return this\n }\n\n print()\n\n return this\n }\n\n destroy() {\n let anchors = this.anchors\n let chapters = this.chapters\n let drawer = this.drawer\n let toolbar = this.toolbar\n let isOutside = false\n const count = this.count()\n const $print = document.querySelector('#outline-print')\n\n this.$emit('beforeDestroy')\n\n this.removeListeners()\n\n if ($print) {\n document.body.removeChild($print)\n }\n\n if (count > 0) {\n isOutside = chapters.isOutside()\n\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(Outline.DEFAULTS)\n\n this.$emit('destroyed')\n\n return this\n }\n\n onToggle() {\n this.toggle()\n return this\n }\n\n onScrollTop() {\n this.toTop()\n return this\n }\n\n onScrollBottom() {\n this.toBottom()\n return this\n }\n\n onEnterReading() {\n this.switchReading()\n return this\n }\n\n onExitReading(evt) {\n const keyCode = evt.keyCode\n\n if (keyCode === 27 && this.reading) {\n this.switchReading()\n stop(evt)\n }\n\n return this\n }\n\n onPrint() {\n this.print()\n\n return this\n }\n\n onToolbarUpdate({ top, min, max }) {\n const toolbar = this.toolbar\n const current = Math.ceil(top)\n\n if (current <= min) {\n toolbar.hide('up')\n toolbar.show('down')\n } else if (current >= max) {\n toolbar.hide('down')\n toolbar.show('up')\n } else if (current > min && current < max) {\n toolbar.show('up')\n toolbar.show('down')\n }\n\n return this\n }\n\n addListeners() {\n const $print = document.querySelector('#outline-print')\n\n this.$on('toolbar:update', this.onToolbarUpdate)\n this.$on('toolbar:action:up', this.onScrollTop)\n this.$on('toolbar:action:toggle', this.onToggle)\n this.$on('toolbar:action:reading', this.onEnterReading)\n this.$on('toolbar:action:down', this.onScrollBottom)\n\n if ($print) {\n at(document, 'keyup', this.onExitReading, this, true)\n on($print, '.outline-print__close', 'click', this.exitReading, this, true)\n this.$on('toolbar:action:print', this.onPrint)\n }\n\n return this\n }\n\n removeListeners() {\n const $print = document.querySelector('#outline-print')\n\n this.$off('toolbar:update')\n this.$off('toolbar:action:up')\n this.$off('toolbar:action:toggle')\n this.$off('toolbar:action:down')\n\n if ($print) {\n off(document, 'keyup', this.onExitReading)\n off($print, 'click', this.exitReading)\n this.$off('toolbar:action:print')\n }\n\n return this\n }\n}\n\nOutline.DEFAULTS = {\n articleElement: '#article',\n selector: 'h2,h3,h4,h5,h6',\n title: '目录',\n scrollElement: 'html,body',\n position: 'relative',\n parentElement: '#aside',\n placement: 'rtl',\n animationCurrent: true,\n showCode: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n tools: [],\n print: {\n element: '',\n title: '',\n enterReadingTip: ENTER_READING_TIP\n },\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: null,\n chapterTextFilter: null\n}\n\nif (window.jQuery) {\n // 将 Outline 扩展为一个 jquery 插件\n // eslint-disable-next-line no-undef\n jQuery.extend(jQuery.fn, {\n outline: function (options) {\n // eslint-disable-next-line no-undef\n let $article = jQuery(this)\n\n return new Outline(\n // eslint-disable-next-line no-undef\n jQuery.extend({}, options, {\n articleElement: $article\n })\n )\n }\n })\n}\n\nexport default Outline\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","add","length","trim","replace","removeClass","remove","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","arguments","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","stopPropagation","preventDefault","hasOwn","prop","hasOwnProperty","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","innerHTML","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","rel","groups","group","JSON","stringify","code","String","c","subjects","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","LIMIT","mounted","anchorURL","update","chapterCode","headingId","href","_updateHeading","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","getStyle","ruleName","getComputedStyle","Chapters","_reset","offsetWidth","playing","scrollTimer","resizeTimer","Observer","$list","$placeholder","$parentElement","$active","active","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_paintChapters","highlight","sticky","onObserver","positionPlaceholder","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","ACTIVE","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","innerHeight","show","HIDDEN","hide","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","option","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","isPlainObject","getPrototypeOf","proto","isObjectLike","stripScripts","encodeHTML","CHARTS","tag","instances","instance","Message","visible","offset","destroyed","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Outline","anchors","drawer","toolbar","reading","_renderPrint","_renderAnchors","_renderChapters","_renderToolbar","onToolbarUpdate","$print","element","$wrapper","$article","cloneNode","paintPrint","CHAPTERS_OPTIONS","homepage","git","tags","issues","tools","HOME","GIT","TAGS","ISSUES","MENU","READING","PRINT","print","addButton","removeButton","toTop","toBottom","floor","enterReading","$reading","$siblings","enterReadingTip","info","exitReading","switchReading","onToggle","onScrollTop","onScrollBottom","onEnterReading","onExitReading","keyCode","onPrint","ceil","jQuery","outline"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["utils/lang/toString.js","utils/types/isFunction.js","utils/lang/later.js","utils/types/isObject.js","utils/types/isArray.js","utils/lang/cloneDeep.js","utils/types/isString.js","utils/types/isElement.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/lang/trim.js","utils/dom/removeClass.js","utils/lang/easeInQuad.js","utils/dom/_getScrollElement.js","utils/dom/scrollTo.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/at.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/event/stop.js","utils/lang/hasOwn.js","utils/lang/extend.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/observer/on.js","utils/lang/timeSlice.js","utils/dom/offsetTop.js","utils/icons/symbols.js","utils/icons/defaults.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/dom/setAttribute.js","utils/dom/setAttributes.js","utils/dom/createElement.js","utils/icons/createElement.js","utils/types/isSVG.js","utils/icons/icon.js","_resetHeading.js","utils/types/isEmpty.js","getChapters.js","utils/lang/stripTags.js","_getChapterParentIdByDiffer.js","_getChaptersWithCode.js","anchors.js","utils/lang/toTree.js","_updateHeading.js","utils/dom/setProperty.js","zIndex.js","drawer.js","utils/dom/intersection.js","utils/dom/getStyle.js","chapters.js","_paintChapters.js","_createButton.js","toolbar.js","utils/types/isObjectLike.js","utils/types/isPlainObject.js","utils/lang/stripScripts.js","utils/lang/encodeHTML.js","message.js","print.js","outline.js"],"sourcesContent":["/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","/**\n * timeSlice.js 时间切片功能函数\n * ====================================================\n * Created By: Yaohaixiao\n * Update: 2023.09.04\n */\nimport isFunction from '../types/isFunction'\nimport later from './later'\n\nconst queue = []\nlet isHandling\nlet done\n\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\nif (typeof window.requestIdleCallback === 'undefined') {\n window.requestIdleCallback = function (cb) {\n const start = Date.now()\n return later(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start))\n }\n })\n }, 10)\n }\n\n window.cancelIdleCallback = function (id) {\n clearTimeout(id)\n }\n}\n\nfunction runIdle(idleDeadline) {\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\n const fn = queue.shift()\n\n if (!isFunction(fn)) {\n return false\n }\n\n fn()\n }\n\n if (queue.length) {\n isHandling = requestIdleCallback(runIdle)\n } else {\n isHandling = 0\n\n if (isFunction(done)) {\n done()\n done = null\n }\n }\n}\n\n/**\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\n * 多个短时间任务\n * ====================================================\n * @param {Function} fn - 需要在空闲时执行的回调函数\n * @param {Function} afterComplete - queen 的\n * @return {(function(): (boolean|undefined))|*|boolean}\n */\nconst timeSlice = (fn, afterComplete = null) => {\n queue.push(fn)\n\n if (isFunction(afterComplete)) {\n done = afterComplete\n }\n\n if (!isHandling) {\n requestIdleCallback(runIdle)\n }\n}\n\nexport default timeSlice\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'htmlFor':\n el.setAttribute('for', value)\n break\n case 'className':\n el.className = value\n break\n case 'innerHTML':\n el.innerHTML = value\n break\n case 'innerText':\n el.innerText = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n if (!el || !isObject(attrs)) {\n return false\n }\n\n Object.keys(attrs).forEach((attr) => {\n const value = attrs[attr]\n if (hasOwn(attrs, attr)) {\n setAttribute(el, attr, value)\n }\n })\n}\n\nexport default setAttributes\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n setAttributes($el, attrs)\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n } else if (isDOM(attrs)) {\n append(attrs)\n } else if (isString(attrs)) {\n append(document.createTextNode(attrs))\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\nimport setAttributes from '../dom/setAttributes'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @param {Object} [options.attrs]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const ICON = 'outline-icon'\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const attrs = options.attrs || {}\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg = ``\n }\n\n $icon.innerHTML = svg\n\n if (attrs.className) {\n attrs.className = `${ICON} ${attrs.className}`\n } else {\n attrs.className = ICON\n }\n\n setAttributes($icon, attrs)\n\n $svg = $icon.querySelector('svg')\n setAttributes($svg, {\n 'aria-hidden': true,\n xmlns: 'http://www.w3.org/2000/svg',\n class: 'outline-icon__svg',\n width: 200,\n height: 200,\n style: cssRules\n })\n\n return $icon\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n let $anchor\n\n $heading.innerHTML = text.replace(pattern, '')\n $heading.removeAttribute('id')\n $heading.removeAttribute('data-id')\n\n removeClass($heading, CLS_HEADING)\n\n if (!hasAnchor) {\n return false\n }\n\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n if (isAtStart) {\n removeClass($heading, `${CLS_HEADING}_start`)\n }\n\n if (isEmpty(trim($heading.className))) {\n $heading.removeAttribute('class')\n }\n\n $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n let previous = 1\n let level = 0\n let text = ''\n const chapters = []\n\n headings.forEach((heading, i) => {\n const tagName = heading.tagName\n const headingLevel = tagName.replace(/h/i, '')\n let current = parseInt(headingLevel, 10)\n let pid = -1\n\n // 场景1:当前标题是前一个标题的子标题\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n // h2 (前一个标题)\n // h3 (当前标题)\n if (current > previous) {\n level += 1\n\n // 第一层级的 pid 是 -1\n if (level === 1) {\n pid = -1\n } else {\n pid = i - 1\n }\n }\n // 场景2:当前标题和前一个标题层级相同\n // 当前标题的(标题标签)序号 = 前一个标题的序号\n // h2 (前一个标题)\n // h2 (当前标题)\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\n // h2\n // h4 (前一个标题)\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n else if (current === previous || (current < previous && current > level)) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n pid = -1\n } else {\n pid = chapters[i - 1].pid\n }\n }\n // 场景3:当前标题比前一个标题层级高\n else if (current <= level) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n } else {\n level = level - (previous - current)\n\n if (level <= 1) {\n level = 1\n }\n }\n\n // 第一级的标题\n if (level === 1) {\n pid = -1\n } else {\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n }\n }\n\n previous = current\n\n text = stripTags(trim(heading.innerHTML))\n\n if (isFunction(chapterTextFilter)) {\n text = chapterTextFilter(text)\n }\n\n chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text,\n tagName\n })\n })\n\n return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n if (!isString(str)) {\n return ''\n }\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n let previous = chapters[index - 1]\n let pid\n let i\n\n for (i = 0; i < differ; i += 1) {\n pid = previous.pid\n previous = chapters[pid]\n }\n\n pid = previous.pid\n\n return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n const groups = {}\n const cb = (o) => {\n return [o.pid]\n }\n\n chapters.forEach((o) => {\n const group = JSON.stringify(cb(o))\n\n groups[group] = groups[group] || []\n groups[group].push(o)\n\n o.index = groups[group].length\n if (o.pid === -1) {\n o.code = String(o.index)\n }\n })\n\n Object.keys(groups).forEach((group) => {\n groups[group].forEach((c) => {\n const subjects = groups[`[${c.id}]`]\n if (!subjects || !isArray(subjects)) {\n return false\n }\n subjects.forEach((o) => {\n o.code = c.code + '.' + o.index\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport timeSlice from './utils/lang/timeSlice'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nimport Base from './base'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n const showCode = this.attr('showCode') || true\n let created\n let scrollElement\n let selector\n let $articleElement\n let articleElement\n\n this.attr(options)\n articleElement = this.attr('articleElement')\n scrollElement = this.attr('scrollElement')\n selector = this.attr('selector')\n created = this.attr('created')\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n if (!$articleElement) {\n return this\n }\n\n this.$articleElement = $articleElement\n this.$scrollElement = _getScrollElement(scrollElement)\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n if (this.$headings.length < 1) {\n return this\n }\n\n this.chapters = getChapters(\n this.$headings,\n showCode,\n this.attr('chapterTextFilter')\n )\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const chapters = this.chapters\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.chapters.length\n }\n\n render() {\n const LIMIT = 400\n const mounted = this.attr('mounted')\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const count = this.count()\n const $headings = [...this.$headings]\n const chapters = this.getChapters()\n const update = (headings, group) => {\n headings.forEach(($heading, i) => {\n const id = i + group * LIMIT\n const chapterCode = chapters[id].code\n _updateHeading($heading, id, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n }\n let groupIndex = -1\n\n paint()\n\n // 针对超长的文章,进行 timeSlice 处理\n if (count > LIMIT) {\n groupIndex += 1\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\n update($headings.splice(0, LIMIT), 0)\n // 采用 timeSlice 处理机制绘制剩余的标题\n while ($headings.length > 0) {\n const once = $headings.splice(0, LIMIT)\n timeSlice(\n () => {\n update(once, (groupIndex += 1))\n },\n () => {\n this.$emit('anchors:all:paint')\n }\n )\n }\n } else {\n update($headings, 0)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n destroy() {\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n onAnchorTrigger(evt) {\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const $heading = $anchor.parentNode\n const top = offsetTop($heading) - (stickyHeight + 10)\n const $scrollElement = this.$scrollElement\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'anchor')\n }\n\n later(() => {\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.scrollTo(top, after)\n\n if (!anchorURL) {\n stop(evt)\n }\n\n return this\n }\n\n addListeners() {\n const $articleElement = this.$articleElement\n\n on(\n $articleElement,\n '.outline-heading__anchor',\n 'click',\n this.onAnchorTrigger,\n this,\n true\n )\n\n return this\n }\n\n removeListeners() {\n const $articleElement = this.$articleElement\n\n off($articleElement, 'click', this.onAnchorTrigger)\n\n return this\n }\n}\n\nAnchors.DEFAULTS = {\n scrollElement: 'html,body',\n articleElement: '#article',\n selector: 'h1,h2,h3,h4,h5,h6',\n stickyHeight: 0,\n anchorURL: '',\n hasAnchor: true,\n isAtStart: true,\n showCode: false,\n created: null,\n mounted: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n chapterTextFilter: null\n}\n\nexport default Anchors\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttributes from './utils/dom/setAttributes'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n const CLS_HEADING = 'outline-heading'\n const hasAnchor = options.hasAnchor || true\n const isAtStart = options.isAtStart || true\n const showCode = options.showCode || false\n const chapterCode = options.chapterCode || ''\n const anchorURL = options.anchorURL || ''\n const headingId = `heading-${i}`\n const attrs = {\n id: headingId,\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n 'data-id': i\n }\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n if (showCode) {\n attrs.innerHTML = chapterCode + ' ' + text\n }\n setAttributes($heading, attrs)\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = icon('hash', { iconSet: 'outline' })\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL || `#${headingId}`,\n target: anchorURL ? '_blank' : 'self',\n 'data-id': i\n },\n $icon\n )\n $heading.appendChild($anchor)\n}\n\nexport default _updateHeading\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Drawer.DEFAULTS)\n this.title = ''\n this.closed = true\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n this.title\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n icon('close', { iconSet: 'outline', size: 20 })\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement('div', {\n className: 'outline-drawer__main'\n })\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement('footer', {\n className: 'outline-drawer__footer'\n })\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement('div', {\n className: 'outline-drawer__overlay'\n })\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport cloneDeep from './utils/lang/cloneDeep'\n\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Chapters.DEFAULTS)\n\n this._reset()\n\n this.offsetWidth = 0\n this.playing = false\n this.scrollTimer = null\n this.resizeTimer = null\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n _reset() {\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.$active = null\n\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.closed = false\n\n return this\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n count() {\n return this.chapters.length\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const animationCurrent = this.attr('animationCurrent')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const children = []\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n title\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement('ul', {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n })\n this.$list = $list\n children.push($list)\n\n if (animationCurrent) {\n $placeholder = createElement('div', {\n className: 'outline-chapters__placeholder'\n })\n this.$placeholder = $placeholder\n children.push($placeholder)\n }\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n children\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n const count = this.count()\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n if (this.isInside()) {\n addClass($parentElement, 'outline-chapters-parent')\n }\n\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n\n later(() => {\n this.highlight(this.active)\n }, 60)\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n if (count < 400) {\n this.onObserver()\n }\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const animationCurrent = this.attr('animationCurrent')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (!animationCurrent) {\n return this\n }\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const animationCurrent = this.attr('animationCurrent')\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const ACTIVE = 'outline-chapters_active'\n const HIGHLIGHT = 'outline-chapters_highlight'\n\n if (!$anchor) {\n return this\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n removeClass(this.$active, ACTIVE)\n }\n\n this.$active = $anchor\n addClass(this.$active, ACTIVE)\n\n if (animationCurrent) {\n this.positionPlaceholder(this.active)\n } else {\n addClass(this.$active, HIGHLIGHT)\n }\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n removeClass($parent, HIDDEN)\n } else {\n removeClass($parent, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n }, 30)\n }\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n addClass($parent, HIDDEN)\n } else {\n addClass($parent, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n })\n }\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)._reset()\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at(window, 'resize', this.onResize, this, true)\n }\n this.$on('anchors:all:paint', this.onObserver, this)\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at(window, 'resize', this.onResize)\n }\n\n this.$off('anchors:all:paint')\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n animationCurrent: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\nimport timeSlice from './utils/lang/timeSlice'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const LIMIT = 400\n const count = chapters.length\n const clones = [...chapters]\n const paint = (parts) => {\n const byId = (id) => $list.querySelector(`#${id}`)\n parts.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const children = []\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n chapter.text\n )\n let $link\n let $code\n let $li\n let $subject\n let $chapter\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n chapter.code\n )\n\n children.push($code)\n }\n\n children.push($text)\n\n $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n children\n )\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n $link\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $chapter = byId(`chapter-${pid}`)\n $subject = byId(`subject-${pid}`)\n\n if (!$subject) {\n $subject = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n $li\n )\n\n $chapter.appendChild($subject)\n } else {\n $subject.appendChild($li)\n }\n }\n })\n }\n\n if (count > LIMIT) {\n // 同步绘制\n paint(clones.splice(0, LIMIT))\n // 剩余的采用 timeSlice 机制绘制\n while (clones.length > 0) {\n const once = clones.splice(0, LIMIT)\n timeSlice(() => {\n paint(once)\n })\n }\n } else {\n paint(clones)\n }\n}\n\nexport default _paintChapters\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n $icon\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = []\n\n paint()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.push($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n $buttons\n )\n document.body.appendChild(this.$el)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n this.$emit(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n","import isObject from './isObject'\n\n/**\n * 检测测试数据是否为类似 Object 类型\n * ========================================================================\n * @method isObjectLike\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\n */\nconst isObjectLike = (val) => {\n return isObject(val) && val !== null\n}\n\nexport default isObjectLike\n","import isObjectLike from './isObjectLike'\n\n/**\n * 检测测试数据是否为普通对象\n * ========================================================================\n * @method isPlainObject\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\n */\nconst isPlainObject = (val) => {\n const getPrototypeOf = Object.getPrototypeOf\n let proto\n\n // Detect obvious negatives\n if (!isObjectLike(val)) {\n return false\n }\n\n proto = val.prototype\n\n // JavaScript 对象分为两种:普通对象和函数对象\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\n if (!proto) {\n return true\n }\n\n proto = val\n\n while (getPrototypeOf(proto) !== null) {\n proto = getPrototypeOf(proto)\n }\n\n return getPrototypeOf(val) === proto\n}\n\nexport default isPlainObject\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n *\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n document.body.removeChild(this.$el)\r\n\r\n this.attr(Message.DEFAULTS)\r\n\r\n this.id = ''\r\n this.closed = true\r\n this.visible = false\r\n this.offset = -50\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n this.destroyed = true\r\n\r\n this.$el = null\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n}\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport later from './utils/lang/later'\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nconst paintPrint = (el, title) => {\r\n const $fragment = document.createDocumentFragment()\r\n let text = title\r\n let $el\r\n let $wrapper\r\n let $article\r\n let $title\r\n let $sibling\r\n let $icon\r\n let $children\r\n\r\n if (isString(el)) {\r\n $el = document.querySelector(el)\r\n } else if (isElement(el)) {\r\n $el = el\r\n }\r\n\r\n if (!$el) {\r\n return false\r\n }\r\n\r\n $icon = icon('close', {\r\n iconSet: 'outline',\r\n size: 20,\r\n attrs: {\r\n className: 'outline-print__close'\r\n }\r\n })\r\n\r\n $title = $el.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n text = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-print__title'\r\n },\r\n text\r\n )\r\n\r\n $article = createElement('article', {\r\n id: 'outline-print__article',\r\n className: 'outline-print__article'\r\n })\r\n\r\n $wrapper = createElement(\r\n 'section',\r\n {\r\n id: 'outline-print',\r\n className: 'outline-print'\r\n },\r\n [$icon, $title, $article]\r\n )\r\n document.body.appendChild($wrapper)\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $wrapper.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $wrapper.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n\r\n // 克隆文章内容\r\n $children = $el.cloneNode(true).childNodes\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n $article.appendChild($fragment)\r\n })\r\n}\r\n\r\nexport default paintPrint\r\n","import later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport isFunction from './utils/types/isFunction'\nimport isString from './utils/types/isString'\nimport isElement from './utils/types/isElement'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\n\nimport Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\nimport Message from './message'\nimport paintPrint from './print'\n\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Outline.DEFAULTS)\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n this.buttons = []\n this.reading = false\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options)\n this.$emit('created', { ...this.attr() })\n this.render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n const hasToolbar = this.attr('hasToolbar')\n const scrollElement = this.attr('scrollElement')\n const $scrollElement = document.querySelector(scrollElement)\n\n this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar()\n\n if ($scrollElement && hasToolbar) {\n this.onToolbarUpdate({\n top: $scrollElement.scrollTop,\n min: 0,\n max: $scrollElement.scrollHeight\n })\n }\n\n this.$emit('mounted')\n\n return this\n }\n\n _renderPrint() {\n const option = this.attr('print')\n const articleElement = this.attr('articleElement')\n let $articleElement\n let $print\n let element\n\n if (!option.element) {\n return this\n }\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n addClass($articleElement, 'outline-article')\n\n element = option.element\n\n if (isString(element)) {\n $print = document.querySelector(element)\n } else if (isElement(element)) {\n $print = element\n }\n\n paintPrint($print, option.title)\n\n return this\n }\n\n _renderAnchors() {\n const articleElement = this.attr('articleElement')\n const selector = this.attr('selector')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const chapterTextFilter = this.attr('chapterTextFilter')\n\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll,\n chapterTextFilter\n })\n\n return this\n }\n\n _renderChapters() {\n const title = this.attr('title')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const customClass = this.attr('customClass')\n const showCode = this.attr('showCode')\n const animationCurrent = this.attr('animationCurrent')\n const position = this.attr('position')\n const placement = this.attr('placement')\n const afterSticky = this.attr('afterSticky')\n const afterToggle = this.attr('afterToggle')\n const afterScroll = this.attr('afterScroll')\n const count = this.count()\n let parentElement = this.attr('parentElement')\n let CHAPTERS_OPTIONS\n\n if (count < 1) {\n return this\n }\n\n CHAPTERS_OPTIONS = {\n scrollElement,\n showCode,\n animationCurrent,\n position,\n title,\n stickyHeight,\n chapters: this.getChapters(),\n afterSticky,\n afterToggle,\n afterScroll\n }\n\n if (position === 'relative') {\n this.drawer = new Drawer({\n placement,\n title,\n size: 'tiny',\n hasOffset: true,\n hasPadding: false,\n customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\n } else {\n CHAPTERS_OPTIONS.customClass = customClass\n }\n\n CHAPTERS_OPTIONS.parentElement = parentElement\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\n\n return this\n }\n\n _renderToolbar() {\n const hasToolbar = this.attr('hasToolbar')\n const placement = this.attr('placement')\n const homepage = this.attr('homepage')\n const git = this.attr('git')\n const tags = this.attr('tags')\n const issues = this.attr('issues')\n const tools = this.attr('tools')\n const option = this.attr('print')\n const count = this.count()\n const UP = {\n name: 'up',\n icon: 'up',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:up'\n }\n }\n const HOME = {\n name: 'homepage',\n icon: 'homepage',\n size: 20,\n link: homepage\n }\n const GIT = {\n name: 'github',\n icon: 'github',\n size: 20,\n link: git\n }\n const TAGS = {\n name: 'tags',\n icon: 'tags',\n size: 20,\n link: tags\n }\n const ISSUES = {\n name: 'issues',\n icon: 'issues',\n size: 20,\n link: issues\n }\n const MENU = {\n name: 'menu',\n icon: 'menu',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:toggle'\n }\n }\n const READING = {\n name: 'reading',\n icon: 'file',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:reading'\n }\n }\n const PRINT = {\n name: 'print',\n icon: 'print',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:print'\n }\n }\n const DOWN = {\n name: 'down',\n icon: 'down',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:down'\n }\n }\n const buttons = []\n\n if (!hasToolbar) {\n return this\n }\n\n buttons.push(UP)\n if (count > 0) {\n buttons.push(MENU)\n }\n if (homepage) {\n buttons.push(HOME)\n }\n if (git) {\n buttons.push(GIT)\n }\n if (tags) {\n buttons.push(TAGS)\n }\n if (issues) {\n buttons.push(ISSUES)\n }\n if (option.element) {\n buttons.push(READING)\n if (isFunction(print)) {\n buttons.push(PRINT)\n }\n }\n if (tools?.length > 0) {\n buttons.push(...tools)\n }\n buttons.push(DOWN)\n this.buttons = [...buttons]\n\n this.toolbar = new Toolbar({\n placement,\n buttons\n })\n\n return this\n }\n\n addButton(button) {\n const toolbar = this.toolbar\n const buttons = this.buttons\n buttons.splice(-1, 0, button)\n toolbar.attr({\n buttons\n })\n toolbar.refresh()\n return this\n }\n\n removeButton(name) {\n this.toolbar.remove(name)\n return this\n }\n\n toTop() {\n const afterScroll = this.attr('afterScroll')\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const afterTop = () => {\n toolbar.hide('up')\n toolbar.show('down')\n\n if (count > 0) {\n chapters.highlight(0)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(0, afterTop)\n\n return this\n }\n\n toBottom() {\n const afterScroll = this.attr('afterScroll')\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const top = Math.floor(\n $scrollElement.scrollHeight - $scrollElement.clientHeight\n )\n const afterDown = () => {\n toolbar.hide('down')\n toolbar.show('up')\n\n if (count > 0) {\n chapters.highlight(count - 1)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(top, afterDown)\n\n return this\n }\n\n scrollTo(top, afterScroll) {\n const scrollElement = this.attr('scrollElement')\n scrollTo(scrollElement, top, afterScroll)\n return this\n }\n\n enterReading() {\n const READING = 'outline-reading'\n const HIDDEN = `${READING}_hidden`\n const $reading = document.querySelector('#outline-print')\n const $siblings = document.querySelectorAll('.outline-print_sibling')\n const options = this.attr('print')\n const enterReadingTip = options.enterReadingTip || ENTER_READING_TIP\n\n if (this.reading || !$reading) {\n return this\n }\n\n $siblings.forEach(($sibling) => {\n addClass($sibling, HIDDEN)\n })\n addClass($reading, READING)\n this.reading = true\n\n this.toolbar.toggle()\n\n Message.info({\n round: true,\n message: enterReadingTip\n })\n\n this.$emit('enterReading')\n\n return this\n }\n\n exitReading() {\n const READING = 'outline-reading'\n const HIDDEN = `${READING}_hidden`\n const $reading = document.querySelector('#outline-print')\n const $siblings = document.querySelectorAll('.outline-print_sibling')\n\n if (!this.reading || !$reading) {\n return this\n }\n\n removeClass($reading, READING)\n $siblings.forEach(($sibling) => {\n removeClass($sibling, HIDDEN)\n })\n this.reading = false\n\n this.toolbar.toggle()\n\n this.$emit('exitReading')\n\n return this\n }\n\n switchReading() {\n const $print = document.querySelector('#outline-print')\n\n if (!$print) {\n return this\n }\n\n if (!this.reading) {\n this.enterReading()\n } else {\n this.exitReading()\n }\n\n return this\n }\n\n toggle() {\n const position = this.attr('position')\n const toolbar = this.toolbar\n const drawer = this.drawer\n const chapters = this.chapters\n const count = this.count()\n\n if (count < 1) {\n return this\n }\n\n if (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n later(() => {\n drawer.toggle()\n })\n }\n\n return this\n }\n\n print() {\n if (!isFunction(print)) {\n return this\n }\n\n print()\n\n return this\n }\n\n destroy() {\n let anchors = this.anchors\n let chapters = this.chapters\n let drawer = this.drawer\n let toolbar = this.toolbar\n let isOutside = false\n const count = this.count()\n const $print = document.querySelector('#outline-print')\n\n this.$emit('beforeDestroy')\n\n this.removeListeners()\n\n if ($print) {\n document.body.removeChild($print)\n }\n\n if (count > 0) {\n isOutside = chapters.isOutside()\n\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(Outline.DEFAULTS)\n\n this.$emit('destroyed')\n\n return this\n }\n\n onToggle() {\n this.toggle()\n return this\n }\n\n onScrollTop() {\n this.toTop()\n return this\n }\n\n onScrollBottom() {\n this.toBottom()\n return this\n }\n\n onEnterReading() {\n this.switchReading()\n return this\n }\n\n onExitReading(evt) {\n const keyCode = evt.keyCode\n\n if (keyCode === 27 && this.reading) {\n this.switchReading()\n stop(evt)\n }\n\n return this\n }\n\n onPrint() {\n this.print()\n\n return this\n }\n\n onToolbarUpdate({ top, min, max }) {\n const toolbar = this.toolbar\n const current = Math.ceil(top)\n\n if (current <= min) {\n toolbar.hide('up')\n toolbar.show('down')\n } else if (current >= max) {\n toolbar.hide('down')\n toolbar.show('up')\n } else if (current > min && current < max) {\n toolbar.show('up')\n toolbar.show('down')\n }\n\n return this\n }\n\n addListeners() {\n const hasToolbar = this.attr('hasToolbar')\n const $print = document.querySelector('#outline-print')\n\n if (hasToolbar) {\n this.$on('toolbar:update', this.onToolbarUpdate)\n this.$on('toolbar:action:up', this.onScrollTop)\n this.$on('toolbar:action:toggle', this.onToggle)\n this.$on('toolbar:action:reading', this.onEnterReading)\n this.$on('toolbar:action:down', this.onScrollBottom)\n }\n\n if ($print) {\n at(document, 'keyup', this.onExitReading, this, true)\n on($print, '.outline-print__close', 'click', this.exitReading, this, true)\n this.$on('toolbar:action:print', this.onPrint)\n }\n\n return this\n }\n\n removeListeners() {\n const hasToolbar = this.attr('hasToolbar')\n const $print = document.querySelector('#outline-print')\n\n if (hasToolbar) {\n this.$off('toolbar:update')\n this.$off('toolbar:action:up')\n this.$off('toolbar:action:toggle')\n this.$off('toolbar:action:down')\n }\n\n if ($print) {\n off(document, 'keyup', this.onExitReading)\n off($print, 'click', this.exitReading)\n this.$off('toolbar:action:print')\n }\n\n return this\n }\n}\n\nOutline.DEFAULTS = {\n articleElement: '#article',\n selector: 'h2,h3,h4,h5,h6',\n title: '目录',\n scrollElement: 'html,body',\n position: 'relative',\n parentElement: '#aside',\n placement: 'rtl',\n animationCurrent: true,\n showCode: true,\n hasToolbar: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n tools: [],\n print: {\n element: '',\n title: '',\n enterReadingTip: ENTER_READING_TIP\n },\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: null,\n chapterTextFilter: null\n}\n\nif (window.jQuery) {\n // 将 Outline 扩展为一个 jquery 插件\n // eslint-disable-next-line no-undef\n jQuery.extend(jQuery.fn, {\n outline: function (options) {\n // eslint-disable-next-line no-undef\n let $article = jQuery(this)\n\n return new Outline(\n // eslint-disable-next-line no-undef\n jQuery.extend({}, options, {\n articleElement: $article\n })\n )\n }\n })\n}\n\nexport default Outline\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","add","length","trim","replace","removeClass","remove","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","arguments","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","stopPropagation","preventDefault","hasOwn","prop","hasOwnProperty","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","innerHTML","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","rel","groups","group","JSON","stringify","code","String","c","subjects","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","LIMIT","mounted","anchorURL","update","chapterCode","headingId","href","_updateHeading","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","getStyle","ruleName","getComputedStyle","Chapters","_reset","offsetWidth","playing","scrollTimer","resizeTimer","Observer","$list","$placeholder","$parentElement","$active","active","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_paintChapters","highlight","sticky","onObserver","positionPlaceholder","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","ACTIVE","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","innerHeight","show","HIDDEN","hide","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","option","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","isPlainObject","getPrototypeOf","proto","isObjectLike","stripScripts","encodeHTML","CHARTS","tag","instances","instance","Message","visible","offset","destroyed","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Outline","anchors","drawer","toolbar","reading","hasToolbar","_renderPrint","_renderAnchors","_renderChapters","_renderToolbar","onToolbarUpdate","$print","element","$wrapper","$article","cloneNode","paintPrint","CHAPTERS_OPTIONS","homepage","git","tags","issues","tools","HOME","GIT","TAGS","ISSUES","MENU","READING","PRINT","print","addButton","removeButton","toTop","toBottom","floor","enterReading","$reading","$siblings","enterReadingTip","info","exitReading","switchReading","onToggle","onScrollTop","onScrollBottom","onEnterReading","onExitReading","keyCode","onPrint","ceil","jQuery","outline"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index df97ff1e..0e657439 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@yaohaixiao/outline.js", - "version": "3.29.0", + "version": "3.30.0", "description": "outline.js - 自动生成文章导读(Table of Contents)导航的 JavaScript 工具。", "main": "outline.min.js", "files": [