simple-window-manager 2.1.1 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsdoc.json +1 -1
- package/package.json +14 -14
- package/public/simple-window-manager.es.js +353 -338
- package/public/simple-window-manager.es.js.map +1 -1
- package/public/simple-window-manager.min.js +1 -1
- package/public/simple-window-manager.min.js.map +1 -1
- package/rollup.config.js +1 -1
- package/src/Window.js +2 -0
- package/src/WindowManager.js +1 -0
- package/images/src/images.js/export const close = '<?xml version=/"1.0/" encoding=/"UTF-8/" standalone=/"no/"?><!DOCTYPE svg PUBLIC /"-/W3C/DTD SVG 1.1/EN/" /"http:/www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd/"><svg width=/"100%/" height=/"100%/" viewBox=/"0 0 20 20/" version=/"1.1/" xmlns=/"http:/www.w3.org/2000/svg/" xmlns:xlink=/"http:/www.w3.org/1999/xlink/" xml:space=/"preserve/" xmlns:serif=/"http:/www.serif.com//" style=/"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;/"><rect id=/"close/" x=/"0/" y=/"0/" width=/"20/" height=/"20/" style=/"fill:none;/"/><g><path d=/"M3.5,3.5l13,13/" style=/"fill:none;stroke:#fff;stroke-width:3px;/"/><path d=/"M16.5,3.5l-13,13/" style=/"fill:none;stroke:#fff;stroke-width:3px;/"/></g></svg>';export const minimize = '<?xml version=/"1.0/" encoding=/"UTF-8/" standalone=/"no/"?><!DOCTYPE svg PUBLIC /"-/W3C/DTD SVG 1.1/EN/" /"http:/www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd/"><svg width=/"100%/" height=/"100%/" viewBox=/"0 0 20 20/" version=/"1.1/" xmlns=/"http:/www.w3.org/2000/svg/" xmlns:xlink=/"http:/www.w3.org/1999/xlink/" xml:space=/"preserve/" xmlns:serif=/"http:/www.serif.com//" style=/"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;/"><rect id=/"minimize/" x=/"0/" y=/"0/" width=/"20/" height=/"20/" style=/"fill:none;/"/><rect x=/"2/" y=/"15.6/" width=/"16/" height=/"3.2/" style=/"fill:#fff;/"/></svg>';export const resize = '<?xml version=/"1.0/" encoding=/"UTF-8/" standalone=/"no/"?><!DOCTYPE svg PUBLIC /"-/W3C/DTD SVG 1.1/EN/" /"http:/www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd/"><svg width=/"100%/" height=/"100%/" viewBox=/"0 0 20 20/" version=/"1.1/" xmlns=/"http:/www.w3.org/2000/svg/" xmlns:xlink=/"http:/www.w3.org/1999/xlink/" xml:space=/"preserve/" xmlns:serif=/"http:/www.serif.com//" style=/"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;/"><rect id=/"resize/" x=/"0/" y=/"0/" width=/"20/" height=/"20/" style=/"fill:none;/"/><clipPath id=/"_clip1/"><rect x=/"0/" y=/"0/" width=/"20/" height=/"20/"/></clipPath><g clip-path=/"url(#_clip1)/"><rect x=/"0/" y=/"16.8/" width=/"20/" height=/"3.2/" style=/"fill:#fff;/"/><path d=/"M17.737,3.595l-14.142,14.142l2.263,2.263l14.142,-14.142l-2.263,-2.263Z/" style=/"fill:#fff;/"/><path d=/"M16.8,0l0,20l3.2,0l0,-20l-3.2,0Z/" style=/"fill:#fff;/"/><path d=/"M7.099,18.4l11.301,-11.123l0,11.123l-11.301,0Z/" style=/"fill:#fff;/"/></g></svg>';export const restore = '<?xml version=/"1.0/" encoding=/"UTF-8/" standalone=/"no/"?><!DOCTYPE svg PUBLIC /"-/W3C/DTD SVG 1.1/EN/" /"http:/www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd/"><svg width=/"100%/" height=/"100%/" viewBox=/"0 0 20 20/" version=/"1.1/" xmlns=/"http:/www.w3.org/2000/svg/" xmlns:xlink=/"http:/www.w3.org/1999/xlink/" xml:space=/"preserve/" xmlns:serif=/"http:/www.serif.com//" style=/"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;/"><rect id=/"restore/" x=/"0/" y=/"0/" width=/"20/" height=/"20/" style=/"fill:none;/"/><g><rect x=/"7/" y=/"2.5/" width=/"10/" height=/"10/" style=/"fill:none;stroke:#fff;stroke-width:1.5px;/"/><rect x=/"7/" y=/"2.5/" width=/"10/" height=/"2/" style=/"fill:#fff;/"/></g><g><rect x=/"3/" y=/"7.5/" width=/"10/" height=/"10/" style=/"fill:none;stroke:#fff;stroke-width:1.5px;/"/><g><rect x=/"3/" y=/"7.5/" width=/"10/" height=/"2/" style=/"fill:#fff;/"/></g></g></svg>';" +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-window-manager.min.js","sources":["../src/html.js","../node_modules/eventemitter3/index.js","../node_modules/clicked/clicked.js","../src/Menu/config.js","../src/accelerator.js","../src/Menu/Menu.js","../src/Window.js","../src/images.js","../src/defaults.js","../src/Snap.js","../src/WindowManager.js"],"sourcesContent":["/**\r\n * shortcut to create an html element\r\n * @param {object} options\r\n * @param {type} [options.type=div]\r\n * @param {string} [options.className]\r\n * @param {object} [options.styles]\r\n * @param {HTMLElement} [options.parent]\r\n * @param {string} [options.html]\r\n * @returns {HTMLElement}\r\n * @ignore\r\n */\r\nexport function html(options = {})\r\n{\r\n const element = document.createElement(options.type || 'div')\r\n if (options.styles)\r\n {\r\n Object.assign(element.style, options.styles)\r\n }\r\n if (options.className)\r\n {\r\n element.className = options.className\r\n }\r\n if (options.html)\r\n {\r\n element.innerHTML = options.html\r\n }\r\n if (options.parent)\r\n {\r\n options.parent.appendChild(element)\r\n }\r\n return element\r\n}","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","/**\n * Watcher for click, double-click, or long-click event for both mouse and touch\n * @example\n * import { clicked } from 'clicked'\n *\n * function handleClick()\n * {\n * console.log('I was clicked.')\n * }\n *\n * const div = document.getElementById('clickme')\n * const c = clicked(div, handleClick, { threshold: 15 })\n *\n * // change callback\n * c.callback = () => console.log('different clicker')\n *\n * // destroy\n * c.destroy()\n *\n * // using built-in querySelector\n * clicked('#clickme', handleClick2)\n *\n * // watching for all types of clicks\n * function handleAllClicks(e) {\n * switch (e.type)\n * {\n * case 'clicked': ...\n * case 'double-clicked': ...\n * case 'long-clicked': ...\n * }\n *\n * // view UIEvent that caused callback\n * console.log(e.event)\n * }\n * clicked('#clickme', handleAllClicks, { doubleClicked: true, longClicked: true })\n */\n\n/** @type {object} */\nconst defaultOptions = {\n threshold: 10,\n clicked: true,\n doubleClicked: false,\n doubleClickedTime: 300,\n longClicked: false,\n longClickedTime: 500,\n capture: false,\n clickDown: false\n}\n\n/**\n * @param {HTMLElement|string} element or querySelector entry (e.g., #id-name or .class-name)\n * @param {ClickedCallback} callback called after a click, double click, or long click is registered\n * @param {object} [options]\n * @param {number} [options.threshold=10] if touch moves threshhold-pixels then the touch-click is cancelled\n * @param {boolean} [options.clicked=true] disable watcher for default clicked event\n * @param {boolean} [options.doubleClicked] enable watcher for double click\n * @param {number} [options.doubleClickedTime=500] wait time in millseconds for double click\n * @param {boolean} [options.longClicked] enable watcher for long click\n * @param {number} [options.longClickedTime=500] wait time for long click\n * @param {boolean} [options.clickDown] enable watcher for click start\n * @param {boolean} [options.capture] events will be dispatched to this registered listener before being dispatched to any EventTarget beneath it in the DOM tree\n * @returns {Clicked}\n */\nexport function clicked(element, callback, options)\n{\n return new Clicked(element, callback, options)\n}\n\nclass Clicked\n{\n constructor(element, callback, options)\n {\n if (typeof element === 'string')\n {\n element = document.querySelector(element)\n if (!element)\n {\n console.warn(`Unknown element: document.querySelector(${element}) in clicked()`)\n return\n }\n }\n this.options = Object.assign({}, defaultOptions, options)\n this.events = {\n mousedown: (e) => this.mousedown(e),\n mouseup: (e) => this.mouseup(e),\n mousemove: (e) => this.mousemove(e),\n touchstart: (e) => this.touchstart(e),\n touchmove: (e) => this.touchmove(e),\n touchcancel: (e) => this.cancel(e),\n touchend: (e) => this.touchend(e)\n }\n element.addEventListener('mousedown', this.events.mousedown, { capture: this.options.capture })\n element.addEventListener('mouseup', this.events.mouseup, { capture: this.options.capture })\n element.addEventListener('mousemove', this.events.mousemove, { capture: this.options.capture })\n element.addEventListener('touchstart', this.events.touchstart, { passive: true, capture: this.options.capture })\n element.addEventListener('touchmove', this.events.touchmove, { passive: true, capture: this.options.capture })\n element.addEventListener('touchcancel', this.events.touchcancel, { capture: this.options.capture})\n element.addEventListener('touchend', this.events.touchend, { capture: this.options.capture })\n this.element = element\n this.callback = callback\n }\n\n /**\n * removes event listeners added by Clicked\n */\n destroy()\n {\n this.element.removeEventListener('mousedown', this.events.mousedown)\n this.element.removeEventListener('mouseup', this.events.mouseup)\n this.element.removeEventListener('mousemove', this.events.mousemove)\n this.element.removeEventListener('touchstart', this.events.touchstart, { passive: true })\n this.element.removeEventListener('touchmove', this.events.touchmove, { passive: true })\n this.element.removeEventListener('touchcancel', this.events.touchcancel)\n this.element.removeEventListener('touchend', this.events.touchend)\n }\n\n touchstart(e)\n {\n if (this.down === true)\n {\n this.cancel()\n }\n else\n {\n if (e.touches.length === 1)\n {\n this.handleDown(e.changedTouches[0].screenX, e.changedTouches[0].screenY)\n }\n }\n }\n\n pastThreshold(x, y)\n {\n return Math.abs(this.lastX - x) > this.options.threshold || Math.abs(this.lastY - y) > this.options.threshold\n }\n\n touchmove(e)\n {\n if (this.down)\n {\n if (e.touches.length !== 1)\n {\n this.cancel()\n }\n else\n {\n const x = e.changedTouches[0].screenX\n const y = e.changedTouches[0].screenY\n if (this.pastThreshold(x, y))\n {\n this.cancel()\n }\n }\n }\n }\n\n /** cancel current event */\n cancel()\n {\n this.down = false\n if (this.doubleClickedTimeout)\n {\n clearTimeout(this.doubleClickedTimeout)\n this.doubleClickedTimeout = null\n }\n if (this.longClickedTimeout)\n {\n clearTimeout(this.longClickedTimeout)\n this.longClickedTimeout = null\n }\n }\n\n touchend(e)\n {\n if (this.down)\n {\n e.preventDefault()\n this.handleClicks(e, e.pointerId)\n }\n }\n\n handleClicks(e)\n {\n if (this.options.doubleClicked)\n {\n this.doubleClickedTimeout = setTimeout(() => this.doubleClickedCancel(e), this.options.doubleClickedTime)\n }\n else if (this.options.clicked)\n {\n this.callback({ event: e, type: 'clicked' })\n }\n if (this.longClickedTimeout)\n {\n clearTimeout(this.longClickedTimeout)\n this.longClickedTimeout = null\n }\n this.down = false\n }\n\n handleDown(e, x, y)\n {\n if (this.doubleClickedTimeout)\n {\n if (this.pastThreshold(x, y))\n {\n if (this.options.clicked)\n {\n this.callback({ event: e, type: 'clicked' })\n }\n this.cancel()\n }\n else\n {\n this.callback({ event: e, type: 'double-clicked' })\n this.cancel()\n }\n }\n else\n {\n this.lastX = x\n this.lastY = y\n this.down = true\n if (this.options.longClicked)\n {\n this.longClickedTimeout = setTimeout(() => this.longClicked(e), this.options.longClickedTime)\n }\n if (this.options.clickDown) {\n this.callback({ event: e, type: 'click-down' })\n }\n }\n }\n\n longClicked(e)\n {\n this.longClikedTimeout = null\n this.down = false\n this.callback({ event: e, type: 'long-clicked' })\n }\n\n doubleClickedCancel(e)\n {\n this.doubleClickedTimeout = null\n if (this.options.clicked)\n {\n this.callback({ event: e, type: 'double-clicked' })\n }\n }\n\n mousedown(e)\n {\n if (this.down === true)\n {\n this.down = false\n }\n else\n {\n this.handleDown(e, e.screenX, e.screenY)\n }\n }\n\n mousemove(e)\n {\n if (this.down)\n {\n const x = e.screenX\n const y = e.screenY\n if (this.pastThreshold(x, y))\n {\n this.cancel()\n }\n }\n }\n\n mouseup(e)\n {\n if (this.down)\n {\n e.preventDefault()\n this.handleClicks(e)\n }\n }\n}\n\n/**\n * Callback for\n * @callback Clicked~ClickedCallback\n * @param {UIEvent} event\n * @param {('clicked'|'double-clicked'|'long-clicked'|'click-down')} type\n */","export const config = {\n\n /**\n * application menu container styles\n * @type {object}\n */\n ApplicationContainerStyle: {\n 'z-index': 999999,\n 'position': 'absolute',\n 'top': 0,\n 'left': 0,\n 'user-select': 'none',\n 'font-size': '0.85em'\n },\n\n /**\n * application menu-bar styles\n * @type {object}\n */\n ApplicationMenuStyle: {\n 'display': 'flex',\n 'position': 'relative',\n 'flex-direction': 'row',\n 'color': 'black',\n 'backgroundColor': 'rgb(230,230,230)',\n 'width': '100vw',\n 'border': 'none',\n 'box-shadow': 'unset',\n 'outline': 'none'\n },\n\n /**\n * application menu entry styles\n * @type {object}\n */\n ApplicationMenuRowStyle: {\n 'padding': '0.25em 0.5em',\n 'margin': 0,\n 'line-height': '1em'\n },\n\n /**\n * lower-level menu window styles\n * @type {object}\n */\n MenuStyle: {\n 'flex-direction': 'column',\n 'position': 'absolute',\n 'user-select': 'none',\n 'color': 'black',\n 'z-index': 999999,\n 'backgroundColor': 'white',\n 'border': '1px solid rgba(0,0,0,0.5)',\n 'boxShadow': '1px 3px 3px rgba(0,0,0,0.25)'\n },\n\n /**\n * lower-level menu row styles\n * @type {object}\n */\n RowStyle: {\n 'display': 'flex',\n 'padding': '0.25em 1.5em 0.25em',\n 'line-height': '1.5em'\n },\n\n /**\n * lower-level menu accelerator styles\n * @type {object}\n */\n AcceleratorStyle: {\n 'opacity': 0.5\n },\n\n /**\n * lower-level menu separator styles\n * @type {object}\n */\n SeparatorStyle: {\n 'border-bottom': '1px solid rgba(0,0,0,0.1)',\n 'margin': '0.5em 0'\n },\n\n /**\n * accelerator key styles\n * NOTE: accelerator keys must use text-decoration as its used as a toggle in the code\n * @type {object}\n */\n AcceleratorKeyStyle: {\n 'text-decoration': 'underline',\n 'text-decoration-color': 'rgba(0,0,0,0.5)'\n },\n\n /**\n * minimum column width in pixels for checked and arrow in the lower-level menus\n * @type {number}\n */\n MinimumColumnWidth: 20,\n\n /**\n * CSS background style for selected MenuItems\n * NOTE: unselected have 'transparent' style\n * @type {string}\n */\n SelectedBackgroundStyle: 'rgba(0,0,0,0.1)',\n\n /**\n * number of pixels to overlap child menus\n * @type {number}\n */\n Overlap: 5,\n\n /**\n * time in milliseconds to wait for submenu to open when mouse hovers\n * @param {number}\n */\n SubmenuOpenDelay: 500\n}","/**\n * Keyboard Accelerator support used by menu (if available) and user-registered keys. Also works for user-defined keys independent of the menu system. Automatically instantiated when used with WindowManager.\n */\nclass Accelerator {\n\n init()\n {\n // may be initialized by Menu or WindowManager in any order\n if (!this.initialized)\n {\n this.menuKeys = {}\n this.keys = {}\n document.body.addEventListener('keydown', e => this._keydown(e))\n document.body.addEventListener('keyup', e => this._keyup(e))\n this.initialized = true\n }\n }\n\n /** clears all menu keys */\n clearMenuKeys()\n {\n this.menuKeys = {}\n }\n\n /** clear all user-registered keys */\n clearKeys()\n {\n this.keys = {}\n }\n\n /**\n * Register a shortcut key for use by an open menu\n * @param {Accelerator~KeyCodes} letter\n * @param {MenuItem} menuItem\n * @param {boolean} applicationMenu\n */\n registerMenuShortcut(letter, menuItem)\n {\n if (letter)\n {\n const keyCode = (menuItem.menu.applicationMenu ? 'alt+' : '') + letter\n this.menuKeys[this._prepareKey(keyCode)] = e =>\n {\n menuItem.handleClick(e)\n e.stopPropagation()\n e.preventDefault()\n }\n }\n }\n\n /**\n * Register special shortcut keys for menu\n * @param {MenuItem} menuItem\n */\n registerMenuSpecial(menu)\n {\n this.menuKeys['escape'] = () => menu.closeAll()\n this.menuKeys['enter'] = e => menu.enter(e)\n this.menuKeys['space'] = e => menu.enter(e)\n this.menuKeys['arrowright'] = e => menu.move(e, 'right')\n this.menuKeys['arrowleft'] = e => menu.move(e, 'left')\n this.menuKeys['arrowup'] = e => menu.move(e, 'up')\n this.menuKeys['arrowdown'] = e => menu.move(e, 'down')\n }\n\n /**\n * special key registration for alt\n * @param {function} pressed\n * @param {function} released\n */\n registerAlt(pressed, released)\n {\n this.alt = { pressed, released }\n }\n\n /**\n * Removes menu shortcuts\n */\n unregisterMenuShortcuts()\n {\n this.menuKeys = {}\n }\n\n /**\n * Keycodes definition. In the form of modifier[+modifier...]+key\n * <p>For example: ctrl+shift+e</p>\n * <p>KeyCodes are case insensitive (i.e., shift+a is the same as Shift+A). And spaces are removed</p>\n * <p>You can assign more than one key to the same shortcut by using a | between the keys (e.g., 'shift+a | ctrl+a')</p>\n * <pre>\n * Modifiers:\n * ctrl, alt, shift, meta, (ctrl aliases: command, control, commandorcontrol)\n * </pre>\n * <pre>\n * Keys:\n * escape, 0-9, minus, equal, backspace, tab, a-z, backetleft, bracketright, semicolon, quote,\n * backquote, backslash, comma, period, slash, numpadmultiply, space, capslock, f1-f24, pause,\n * scrolllock, printscreen, home, arrowup, arrowleft, arrowright, arrowdown, pageup, pagedown,\n * end, insert, delete, enter, shiftleft, shiftright, ctrlleft, ctrlright, altleft, altright, shiftleft,\n * shiftright, numlock, numpad...\n * </pre>\n * For OS-specific codes and a more detailed explanation see {@link https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code}. Also note that 'Digit' and 'Key' are removed from the code to make it easier to type.\n *\n * @typedef {string} Accelerator~KeyCodes\n */\n\n /**\n * translate a user-provided keycode\n * @param {Accelerator~KeyCodes} keyCode\n * @return {Accelerator~KeyCodes} formatted and sorted keyCode\n * @private\n */\n _prepareKey(keyCode)\n {\n const keys = []\n let split\n keyCode += ''\n if (keyCode.length > 1 && keyCode.indexOf('|') !== -1)\n {\n split = keyCode.split('|')\n }\n else\n {\n split = [keyCode]\n }\n for (let code of split)\n {\n let key = ''\n let modifiers = []\n code = code.toLowerCase().replace(' ', '')\n if (code.indexOf('+') !== -1)\n {\n const split = code.split('+')\n for (let i = 0; i < split.length - 1; i++)\n {\n let modifier = split[i]\n modifier = modifier.replace('commandorcontrol', 'ctrl')\n modifier = modifier.replace('command', 'ctrl')\n modifier = modifier.replace('control', 'ctrl')\n modifiers.push(modifier)\n }\n modifiers = modifiers.sort((a, b) => { return a[0] > b[0] ? 1 : a[0] < b[0] ? -1 : 0 })\n for (let part of modifiers)\n {\n key += part + '+'\n }\n key += split[split.length - 1]\n }\n else\n {\n key = code\n }\n keys.push(key)\n }\n return keys\n }\n\n /**\n * Make the KeyCode pretty for printing on the menu\n * @param {KeyCode} keyCode\n * @return {string}\n */\n prettifyKey(keyCode)\n {\n let key = ''\n const codes = this._prepareKey(keyCode)\n for (let i = 0; i < codes.length; i++)\n {\n const keyCode = codes[i]\n if (keyCode.indexOf('+') !== -1)\n {\n const split = keyCode.toLowerCase().split('+')\n for (let i = 0; i < split.length - 1; i++)\n {\n let modifier = split[i]\n key += modifier[0].toUpperCase() + modifier.substr(1) + '+'\n }\n key += split[split.length - 1].toUpperCase()\n }\n else\n {\n key = keyCode.toUpperCase()\n }\n if (i !== codes.length - 1)\n {\n key += ' or '\n }\n }\n return key\n }\n\n /**\n * register a key as a global accelerator\n * @param {Accelerator~KeyCodes} keyCode (e.g., Ctrl+shift+E)\n * @param {function} callback\n */\n register(keyCode, callback)\n {\n const keys = this._prepareKey(keyCode)\n for (let key of keys)\n {\n this.keys[key] = e =>\n {\n callback(e)\n e.preventDefault()\n e.stopPropagation()\n }\n }\n }\n\n _keyup(e)\n {\n if (this.alt && (e.code === 'AltLeft' || e.code === 'AltRight'))\n {\n this.alt.released()\n this.alt.isPressed = false\n }\n }\n\n _keydown(e)\n {\n if (this.alt && !this.alt.isPressed && (e.code === 'AltLeft' || e.code === 'AltRight'))\n {\n this.alt.pressed()\n this.alt.isPressed = true\n e.preventDefault()\n }\n const modifiers = []\n if (e.altKey)\n {\n modifiers.push('alt')\n }\n if (e.ctrlKey)\n {\n modifiers.push('ctrl')\n }\n if (e.metaKey)\n {\n modifiers.push('meta')\n }\n if (e.shiftKey)\n {\n modifiers.push('shift')\n }\n let keyCode = ''\n for (let modifier of modifiers)\n {\n keyCode += modifier + '+'\n }\n let translate = e.code.toLowerCase()\n translate = translate.replace('digit', '')\n translate = translate.replace('key', '')\n keyCode += translate\n if (this.menuKeys[keyCode])\n {\n this.menuKeys[keyCode](e)\n }\n else if (this.keys[keyCode])\n {\n this.keys[keyCode](e)\n }\n }\n}\n\nexport const accelerator = new Accelerator()","import { config } from './config'\r\nimport { MenuItem } from './MenuItem'\r\nimport { accelerator } from '../accelerator'\r\nimport { html } from '../html'\r\n\r\n/**\r\n * creates a menu bar or a submenu within a menu\r\n * @param {object} [options]\r\n * @param {object} [options.styles] additional CSS styles for menu\r\n */\r\nexport class Menu\r\n{\r\n constructor(options)\r\n {\r\n accelerator.init()\r\n options = options || {}\r\n this.div = document.createElement('div')\r\n this.styles = options.styles\r\n this.children = []\r\n this.applyConfig(config.MenuStyle)\r\n this.div.tabIndex = -1\r\n }\r\n\r\n /**\r\n * append a MenuItem to the Menu\r\n * @param {MenuItem} menuItem\r\n */\r\n append(menuItem)\r\n {\r\n if (menuItem.submenu)\r\n {\r\n menuItem.submenu.menu = this\r\n }\r\n menuItem.menu = this\r\n this.div.appendChild(menuItem.div)\r\n if (menuItem.type !== 'separator')\r\n {\r\n this.children.push(menuItem)\r\n }\r\n }\r\n\r\n /**\r\n * inserts a MenuItem into the Menu\r\n * @param {number} pos\r\n * @param {MenuItem} menuItem\r\n */\r\n insert(pos, menuItem)\r\n {\r\n if (pos >= this.div.childNodes.length)\r\n {\r\n this.append(menuItem)\r\n }\r\n else\r\n {\r\n if (menuItem.submenu)\r\n {\r\n menuItem.submenu.menu = this\r\n }\r\n menuItem.menu = this\r\n this.div.insertBefore(menuItem.div, this.div.childNodes[pos])\r\n if (menuItem.type !== 'separator')\r\n {\r\n this.children.splice(pos, 0, menuItem)\r\n }\r\n }\r\n }\r\n\r\n hide()\r\n {\r\n let current = this.menu.showing\r\n while (current && current.submenu)\r\n {\r\n current.div.style.backgroundColor = 'transparent'\r\n current.submenu.div.remove()\r\n let next = current.submenu.showing\r\n if (next)\r\n {\r\n current.submenu.showing.div.style.backgroundColor = 'transparent'\r\n current.submenu.showing = null\r\n }\r\n current = next\r\n }\r\n }\r\n\r\n show(menuItem)\r\n {\r\n accelerator.unregisterMenuShortcuts()\r\n if (this.menu && this.menu.showing === menuItem)\r\n {\r\n this.hide()\r\n this.menu.showing = null\r\n this.div.remove()\r\n this.menu.showAccelerators()\r\n }\r\n else\r\n {\r\n if (this.menu)\r\n {\r\n if (this.menu.showing && this.menu.children.indexOf(menuItem) !== -1)\r\n {\r\n this.hide()\r\n }\r\n this.menu.showing = menuItem\r\n this.menu.hideAccelerators()\r\n }\r\n const div = menuItem.div\r\n const parent = this.menu.div\r\n if (this.menu.applicationMenu)\r\n {\r\n this.div.style.left = div.offsetLeft + 'px'\r\n this.div.style.top = div.offsetTop + div.offsetHeight + 'px'\r\n }\r\n else\r\n {\r\n this.div.style.left = parent.offsetLeft + parent.offsetWidth - config.Overlap + 'px'\r\n this.div.style.top = parent.offsetTop + div.offsetTop - config.Overlap + 'px'\r\n }\r\n this.attached = menuItem\r\n this.showAccelerators()\r\n Menu.application.appendChild(this.div)\r\n let label = 0, accelerator = 0, arrow = 0, checked = 0\r\n for (let child of this.children)\r\n {\r\n child.check.style.width = 'auto'\r\n child.label.style.width = 'auto'\r\n child.accelerator.style.width = 'auto'\r\n child.arrow.style.width = 'auto'\r\n if (child.type === 'checkbox')\r\n {\r\n checked = config.MinimumColumnWidth\r\n }\r\n if (child.submenu)\r\n {\r\n arrow = config.MinimumColumnWidth\r\n }\r\n }\r\n for (let child of this.children)\r\n {\r\n const childLabel = child.label.offsetWidth * 2\r\n label = childLabel > label ? childLabel : label\r\n const childAccelerator = child.accelerator.offsetWidth\r\n accelerator = childAccelerator > accelerator ? childAccelerator : accelerator\r\n if (child.submenu)\r\n {\r\n arrow = child.arrow.offsetWidth\r\n }\r\n }\r\n for (let child of this.children)\r\n {\r\n child.check.style.width = checked + 'px'\r\n child.label.style.width = label + 'px'\r\n child.accelerator.style.width = accelerator + 'px'\r\n child.arrow.style.width = arrow + 'px'\r\n }\r\n if (this.div.offsetLeft + this.div.offsetWidth > window.innerWidth)\r\n {\r\n this.div.style.left = window.innerWidth - this.div.offsetWidth + 'px'\r\n }\r\n if (this.div.offsetTop + this.div.offsetHeight > window.innerHeight)\r\n {\r\n this.div.style.top = window.innerHeight - this.div.offsetHeight + 'px'\r\n }\r\n Menu.application.menu.div.focus()\r\n }\r\n }\r\n\r\n applyConfig(base)\r\n {\r\n const styles = {}\r\n for (let style in base)\r\n {\r\n styles[style] = base[style]\r\n }\r\n if (this.styles)\r\n {\r\n for (let style in this.styles)\r\n {\r\n styles[style] = this.styles[style]\r\n }\r\n }\r\n for (let style in styles)\r\n {\r\n this.div.style[style] = styles[style]\r\n }\r\n }\r\n\r\n showAccelerators()\r\n {\r\n for (let child of this.children)\r\n {\r\n child.showShortcut()\r\n if (child.type !== 'separator')\r\n {\r\n const index = child.text.indexOf('&')\r\n if (index !== -1)\r\n {\r\n accelerator.registerMenuShortcut(child.text[index + 1], child)\r\n }\r\n }\r\n }\r\n if (!this.applicationMenu)\r\n {\r\n accelerator.registerMenuSpecial(this)\r\n }\r\n }\r\n\r\n hideAccelerators()\r\n {\r\n for (let child of this.children)\r\n {\r\n child.hideShortcut()\r\n }\r\n }\r\n\r\n closeAll()\r\n {\r\n accelerator.unregisterMenuShortcuts()\r\n let application = Menu.application.menu\r\n if (application.showing)\r\n {\r\n let menu = application\r\n while (menu.showing)\r\n {\r\n menu = menu.showing.submenu\r\n }\r\n while (menu && !menu.applicationMenu)\r\n {\r\n if (menu.showing)\r\n {\r\n menu.showing.div.style.backgroundColor = 'transparent'\r\n menu.showing = null\r\n }\r\n menu.div.remove()\r\n menu = menu.menu\r\n }\r\n if (menu)\r\n {\r\n menu.showing.div.style.background = 'transparent'\r\n menu.showing = null\r\n menu.hideAccelerators()\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * move selector to the next child pane\r\n * @param {string} direction (left or right)\r\n * @private\r\n */\r\n moveChild(direction)\r\n {\r\n let index\r\n if (direction === 'left')\r\n {\r\n const parent = this.selector.menu.menu\r\n index = parent.children.indexOf(parent.showing)\r\n index--\r\n index = (index < 0) ? parent.children.length - 1 : index\r\n parent.children[index].handleClick()\r\n }\r\n else\r\n {\r\n let parent = this.selector.menu.menu\r\n let selector = parent.showing\r\n while (!parent.applicationMenu)\r\n {\r\n selector.handleClick()\r\n selector.div.style.backgroundColor = 'transparent'\r\n parent = parent.menu\r\n selector = parent.showing\r\n }\r\n index = parent.children.indexOf(selector)\r\n index++\r\n index = (index === parent.children.length) ? 0 : index\r\n parent.children[index].handleClick()\r\n }\r\n this.selector = null\r\n }\r\n\r\n /**\r\n * move selector right and left\r\n * @param {MouseEvent} e\r\n * @param {string} direction\r\n * @private\r\n */\r\n horizontalSelector(e, direction)\r\n {\r\n if (direction === 'right')\r\n {\r\n if (this.selector.submenu)\r\n {\r\n this.selector.handleClick(e)\r\n this.selector.submenu.selector = this.selector.submenu.children[0]\r\n this.selector.submenu.selector.div.style.backgroundColor = config.SelectedBackgroundStyle\r\n this.selector = null\r\n }\r\n else\r\n {\r\n this.moveChild(direction)\r\n }\r\n }\r\n else if (direction === 'left')\r\n {\r\n if (!this.selector.menu.menu.applicationMenu)\r\n {\r\n this.selector.menu.attached.handleClick(e)\r\n this.selector.menu.menu.selector = this.selector.menu.attached\r\n this.selector = null\r\n }\r\n else\r\n {\r\n this.moveChild(direction)\r\n }\r\n }\r\n e.stopPropagation()\r\n e.preventDefault()\r\n }\r\n\r\n /**\r\n * move the selector in the menu\r\n * @param {KeyboardEvent} e\r\n * @param {string} direction (left, right, up, down)\r\n */\r\n move(e, direction)\r\n {\r\n if (this.selector)\r\n {\r\n this.selector.div.style.backgroundColor = 'transparent'\r\n let index = this.children.indexOf(this.selector)\r\n if (direction === 'down')\r\n {\r\n index++\r\n index = (index === this.children.length) ? 0 : index\r\n }\r\n else if (direction === 'up')\r\n {\r\n index--\r\n index = (index < 0) ? this.children.length - 1 : index\r\n }\r\n else\r\n {\r\n return this.horizontalSelector(e, direction)\r\n }\r\n this.selector = this.children[index]\r\n }\r\n else\r\n {\r\n if (direction === 'up')\r\n {\r\n this.selector = this.children[this.children.length - 1]\r\n }\r\n else\r\n {\r\n this.selector = this.children[0]\r\n }\r\n }\r\n if (this.selector)\r\n {\r\n this.selector.div.style.backgroundColor = config.SelectedBackgroundStyle\r\n }\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }\r\n\r\n /**\r\n * click the selector with keyboard\r\n * @private\r\n */\r\n enter(e)\r\n {\r\n if (this.selector)\r\n {\r\n this.selector.handleClick(e)\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }\r\n }\r\n\r\n /**\r\n * array containing the menu's items\r\n * @property {MenuItems[]} items\r\n * @readonly\r\n */\r\n get items()\r\n {\r\n return this.children\r\n }\r\n\r\n /**\r\n * show application menu accelerators when alt is pressed\r\n * @private\r\n */\r\n showApplicationAccelerators()\r\n {\r\n this.hideAccelerators()\r\n accelerator.registerAlt(() =>\r\n {\r\n if (!this.showing)\r\n {\r\n this.showAccelerators()\r\n }\r\n }, () =>\r\n {\r\n this.hideAccelerators()\r\n })\r\n }\r\n\r\n /**\r\n * use this to change the default config settings across all menus\r\n * @type {config}\r\n */\r\n static get config()\r\n {\r\n return config\r\n }\r\n\r\n /**\r\n * gets application menu height\r\n * @returns {number}\r\n */\r\n static getApplicationHeight()\r\n {\r\n return Menu.application ? Menu.application.offsetHeight : 0\r\n }\r\n\r\n /**\r\n * sets active application Menu (and removes any existing application menus)\r\n * @param {Menu} menu\r\n * @param {HTMLElement} [parent=document.body]\r\n */\r\n static setApplicationMenu(menu, parent=document.body)\r\n {\r\n accelerator.clearMenuKeys()\r\n if (Menu.application)\r\n {\r\n Menu.application.remove()\r\n }\r\n Menu.application = html({ parent, styles: config.ApplicationContainerStyle })\r\n Menu.application.menu = menu\r\n menu.applyConfig(config.ApplicationMenuStyle)\r\n for (let child of menu.children)\r\n {\r\n child.applyConfig(config.ApplicationMenuRowStyle)\r\n if (child.arrow)\r\n {\r\n child.arrow.style.display = 'none'\r\n }\r\n menu.div.appendChild(child.div)\r\n }\r\n\r\n Menu.application.appendChild(menu.div)\r\n menu.applicationMenu = true\r\n menu.div.tabIndex = -1\r\n\r\n // don't let menu bar focus unless windows are open (this fixes a focus bug)\r\n menu.div.addEventListener('focus', () =>\r\n {\r\n if (!menu.showing)\r\n {\r\n menu.div.blur()\r\n }\r\n })\r\n\r\n // close all windows if menu is no longer the focus\r\n menu.div.addEventListener('blur', () =>\r\n {\r\n if (menu.showing)\r\n {\r\n menu.closeAll()\r\n }\r\n })\r\n menu.showApplicationAccelerators()\r\n }\r\n}","import Events from 'eventemitter3'\r\nimport { clicked } from 'clicked'\r\n\r\nimport './events'\r\nimport { html } from './html'\r\nimport { Menu } from './Menu/Menu'\r\n\r\n/**\r\n * Window class returned by WindowManager.createWindow()\r\n * @param {WindowManager} [wm]\r\n * @param {Window~WindowOptions} [options]\r\n * @fires open\r\n * @fires focus\r\n * @fires blur\r\n * @fires close\r\n * @fires maximize\r\n * @fires maximize-restore\r\n * @fires move\r\n * @fires move-start\r\n * @fires move-end\r\n * @fires resize\r\n * @fires resize-start\r\n * @fires resize-end\r\n * @fires move-x\r\n * @fires move-y\r\n * @fires resize-width\r\n * @fires resize-height\r\n * @fires loaded\r\n */\r\nexport class Window extends Events\r\n{\r\n constructor(wm, options = {})\r\n {\r\n super()\r\n this.wm = wm\r\n this.options = options\r\n this.id = typeof this.options.id === 'undefined' ? Window.id++ : this.options.id\r\n\r\n this._createWin()\r\n this._createWinBox()\r\n this._createTitlebar()\r\n this._createContent()\r\n if (this.options.resizable)\r\n {\r\n this._createResize()\r\n }\r\n this._createOverlay()\r\n this._buildTransform()\r\n this._listeners()\r\n\r\n this.active = false\r\n this.maximized = false\r\n\r\n this._closed = true\r\n this._restore = null\r\n this._moving = null\r\n this._resizing = null\r\n this._attachedToScreen = { vertical: '', horziontal: '' }\r\n }\r\n\r\n /**\r\n * open the window\r\n * @param {boolean} [noFocus] do not focus window when opened\r\n */\r\n open(noFocus)\r\n {\r\n if (this._closed)\r\n {\r\n this.win.style.display = 'block'\r\n this._closed = false\r\n this.emit('open', this)\r\n if (!noFocus)\r\n {\r\n this.focus()\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * focus the window\r\n */\r\n focus()\r\n {\r\n this.active = true\r\n if (this.options.titlebar)\r\n {\r\n this.winTitlebar.style.backgroundColor = this.options.backgroundTitlebarActive\r\n }\r\n this.emit('focus', this)\r\n }\r\n\r\n /**\r\n * blur the window\r\n */\r\n blur()\r\n {\r\n this.active = false\r\n if (this.options.titlebar)\r\n {\r\n this.winTitlebar.style.backgroundColor = this.options.backgroundTitlebarInactive\r\n }\r\n this.emit('blur', this)\r\n }\r\n\r\n /**\r\n * closes the window (can be reopened with open)\r\n */\r\n close()\r\n {\r\n if (!this._closed)\r\n {\r\n this._closed = true\r\n this.win.style.display = 'none'\r\n this.emit('close', this)\r\n }\r\n }\r\n\r\n /**\r\n * is window closed?\r\n * @type {boolean}\r\n * @readonly\r\n */\r\n get closed()\r\n {\r\n return this._closed\r\n }\r\n\r\n /**\r\n * left coordinate\r\n * @type {number}\r\n */\r\n get x() { return this.options.x }\r\n set x(value)\r\n {\r\n if (value !== this.options.x)\r\n {\r\n this.options.x = value\r\n this.emit('move-x', this)\r\n this._buildTransform()\r\n }\r\n }\r\n\r\n _buildTransform()\r\n {\r\n this.win.style.transform = `translate(${this.options.x}px,${this.options.y}px)`\r\n }\r\n\r\n /**\r\n * top coordinate\r\n * @type {number}\r\n */\r\n get y() { return this.options.y }\r\n set y(value)\r\n {\r\n if (value !== this.options.y)\r\n {\r\n this.options.y = value\r\n this._buildTransform()\r\n this.emit('move-y', this)\r\n }\r\n }\r\n\r\n /**\r\n * width of window\r\n * @type {number}\r\n */\r\n get width() { return this.options.width || this.win.offsetWidth }\r\n set width(value)\r\n {\r\n if (value !== this.options.width)\r\n {\r\n if (value)\r\n {\r\n this.win.style.width = `${value}px`\r\n this.options.width = this.win.offsetWidth\r\n }\r\n else\r\n {\r\n this.win.style.width = 'auto'\r\n this.options.width = ''\r\n }\r\n this.emit('resize-width', this)\r\n }\r\n }\r\n\r\n /**\r\n * height of window\r\n * @type {number}\r\n */\r\n get height() { return this.options.height || this.win.offsetHeight }\r\n set height(value)\r\n {\r\n if (value !== this.options.height)\r\n {\r\n if (value)\r\n {\r\n this.win.style.height = `${value}px`\r\n this.options.height = this.win.offsetHeight\r\n }\r\n else\r\n {\r\n this.win.style.height = 'auto'\r\n this.options.height = ''\r\n }\r\n this.emit('resize-height', this)\r\n }\r\n }\r\n\r\n /**\r\n * resize the window\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n resize(width, height)\r\n {\r\n this.width = width\r\n this.height = height\r\n }\r\n\r\n /**\r\n * move window\r\n * @param {number} x\r\n * @param {number} y\r\n */\r\n move(x, y)\r\n {\r\n const keepInside = this.keepInside\r\n if (keepInside)\r\n {\r\n if (keepInside === true || keepInside === 'horizontal')\r\n {\r\n const width = this.wm.win.offsetWidth\r\n x = x + this.width > width ? width - this.width : x\r\n x = x < 0 ? 0 : x\r\n }\r\n if (keepInside === true || keepInside === 'vertical')\r\n {\r\n const height = this.wm.win.offsetHeight\r\n y = y + this.height > height ? height - this.height : y\r\n const top = Menu.getApplicationHeight()\r\n y = y < top ? top : y\r\n }\r\n }\r\n if (x !== this.options.x)\r\n {\r\n this.options.x = x\r\n this.emit('move-x', this)\r\n }\r\n if (y !== this.options.y)\r\n {\r\n this.options.y = y\r\n this.emit('move-y', this)\r\n }\r\n this._buildTransform()\r\n }\r\n\r\n /**\r\n * maximize the window\r\n */\r\n maximize()\r\n {\r\n if (this.options.maximizable)\r\n {\r\n if (this.maximized)\r\n {\r\n this.x = this.maximized.x\r\n this.y = this.maximized.y\r\n this.width = this.maximized.width\r\n this.height = this.maximized.height\r\n this.maximized = null\r\n this.emit('restore', this)\r\n this.buttons.maximize.innerHTML = this.options.maximizeButton\r\n }\r\n else\r\n {\r\n const x = this.x, y = this.y, width = this.win.offsetWidth, height = this.win.offsetHeight\r\n this.maximized = { x, y, width, height }\r\n this.x = 0\r\n this.y = 0\r\n this.width = this.wm.wallpaper.offsetWidth\r\n this.height = this.wm.wallpaper.offsetHeight\r\n this.emit('maximize', this)\r\n this.buttons.maximize.innerHTML = this.options.restoreButton\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * sends window to back of window-manager\r\n */\r\n sendToBack()\r\n {\r\n this.wm.sendToBack(this)\r\n }\r\n\r\n /**\r\n * send window to front of window-manager\r\n */\r\n sendToFront()\r\n {\r\n this.wm.sendToFront(this)\r\n }\r\n\r\n /**\r\n * save the state of the window\r\n * @return {Object} data\r\n */\r\n save()\r\n {\r\n const data = {}\r\n const maximized = this.maximized\r\n if (maximized)\r\n {\r\n data.maximized = { left: maximized.left, top: maximized.top, width: maximized.width, height: maximized.height }\r\n }\r\n data.x = this.x\r\n data.y = this.y\r\n if (typeof this.options.width !== 'undefined')\r\n {\r\n data.width = this.options.width\r\n }\r\n if (typeof this.options.height !== 'undefined')\r\n {\r\n data.height = this.options.height\r\n }\r\n data.closed = this._closed\r\n return data\r\n }\r\n\r\n /**\r\n * return the state of the window\r\n * @param {Object} data from save()\r\n */\r\n load(data)\r\n {\r\n if (data.maximized)\r\n {\r\n if (!this.maximized)\r\n {\r\n this.maximize(true)\r\n }\r\n }\r\n else if (this.maximized)\r\n {\r\n this.maximize(true)\r\n }\r\n if (typeof data.width !== 'undefined')\r\n {\r\n this.width = data.width\r\n }\r\n else\r\n {\r\n this.win.style.width = 'auto'\r\n }\r\n if (typeof data.height !== 'undefined')\r\n {\r\n this.height = data.height\r\n }\r\n else\r\n {\r\n this.win.style.height = 'auto'\r\n }\r\n this.move(data.x, data.y)\r\n if (data.closed)\r\n {\r\n this.close(true)\r\n }\r\n else if (this.closed)\r\n {\r\n this.open(true, true)\r\n }\r\n this.emit('loaded')\r\n }\r\n\r\n /**\r\n * change title\r\n * @type {string}\r\n */\r\n get title() { return this._title }\r\n set title(value)\r\n {\r\n this.winTitle.innerText = value\r\n this.emit('title-change', this)\r\n }\r\n\r\n\r\n /**\r\n * right coordinate of window\r\n * @type {number}\r\n */\r\n get right() { return this.x + this.width }\r\n set right(value)\r\n {\r\n this.x = value - this.width\r\n }\r\n\r\n /**\r\n * bottom coordinate of window\r\n * @type {number}\r\n */\r\n get bottom() { return this.y + this.height }\r\n set bottom(value)\r\n {\r\n this.y = value - this.height\r\n }\r\n\r\n /**\r\n * centers window in middle of other window or document.body\r\n * @param {Window} [win]\r\n */\r\n center(win)\r\n {\r\n if (win)\r\n {\r\n this.move(\r\n win.x + win.width / 2 - this.width / 2,\r\n win.y + win.height / 2 - this.height / 2\r\n )\r\n }\r\n else\r\n {\r\n this.move(\r\n window.innerWidth / 2 - this.width / 2,\r\n window.innerHeight / 2 - this.height / 2\r\n )\r\n }\r\n }\r\n\r\n _createWin()\r\n {\r\n /**\r\n * This is the top-level DOM element\r\n * @type {HTMLElement}\r\n * @readonly\r\n */\r\n this.win = html({\r\n parent: this.wm.win,\r\n styles: {\r\n 'display': 'none',\r\n 'border-radius': this.options.borderRadius,\r\n 'user-select': 'none',\r\n 'overflow': 'hidden',\r\n 'position': 'absolute',\r\n 'min-width': this.options.minWidth,\r\n 'min-height': this.options.minHeight,\r\n 'background-color': this.options.backgroundWindow,\r\n 'width': isNaN(this.options.width) ? this.options.width : this.options.width + 'px',\r\n 'height': isNaN(this.options.height) ? this.options.height : this.options.height + 'px',\r\n ...this.options.styles\r\n }\r\n })\r\n }\r\n\r\n _createWinBox()\r\n {\r\n /**\r\n * This is the container for the titlebar+content\r\n * @type {HTMLElement}\r\n * @readonly\r\n */\r\n this.winBox = html({\r\n parent: this.win,\r\n styles: {\r\n 'display': 'flex',\r\n 'flex-direction': 'column',\r\n 'width': '100%',\r\n 'height': '100%',\r\n 'min-height': this.options.minHeight\r\n }\r\n })\r\n }\r\n\r\n _createContent()\r\n {\r\n /**\r\n * This is the content DOM element. Use this to add content to the Window.\r\n * @type {HTMLElement}\r\n * @readonly\r\n */\r\n this.content = html({\r\n parent: this.winBox,\r\n type: 'section',\r\n styles: {\r\n 'display': 'block',\r\n 'flex': 1,\r\n 'min-height': this.options.minHeight,\r\n 'overflow-x': 'hidden',\r\n 'overflow-y': 'auto'\r\n }\r\n })\r\n }\r\n\r\n _createOverlay()\r\n {\r\n this.overlay = html({\r\n parent: this.win,\r\n styles: {\r\n 'display': 'none',\r\n 'position': 'absolute',\r\n 'left': 0,\r\n 'top': 0,\r\n 'width': '100%',\r\n 'height': '100%'\r\n }\r\n })\r\n this.overlay.addEventListener('mousedown', (e) => { this._downTitlebar(e); e.stopPropagation() })\r\n this.overlay.addEventListener('touchstart', (e) => { this._downTitlebar(e); e.stopPropagation() })\r\n }\r\n\r\n _downTitlebar(e)\r\n { const event = this._convertMoveEvent(e)\r\n this._moving = {\r\n x: event.pageX - this.x,\r\n y: event.pageY - this.y\r\n }\r\n this.emit('move-start', this)\r\n this._moved = false\r\n }\r\n\r\n _createTitlebar()\r\n {\r\n if (this.options.titlebar)\r\n {\r\n this.winTitlebar = html({\r\n parent: this.winBox, type: 'header', styles: {\r\n 'user-select': 'none',\r\n 'display': 'flex',\r\n 'flex-direction': 'row',\r\n 'align-items': 'center',\r\n 'justify-content': 'center',\r\n 'height': this.options.titlebarHeight,\r\n 'min-height': this.options.titlebarHeight,\r\n 'border': 0,\r\n 'padding': '0 8px',\r\n 'overflow': 'hidden',\r\n }\r\n })\r\n const winTitleStyles = {\r\n 'user-select': 'none',\r\n 'flex': 1,\r\n 'display': 'flex',\r\n 'flex-direction': 'row',\r\n 'align-items': 'center',\r\n 'user-select': 'none',\r\n 'cursor': 'default',\r\n 'padding': 0,\r\n 'margin': 0,\r\n 'font-size': '16px',\r\n 'font-weight': 400,\r\n 'color': this.options.foregroundTitle\r\n }\r\n if (this.options.titleCenter)\r\n {\r\n winTitleStyles['justify-content'] = 'center'\r\n }\r\n else\r\n {\r\n winTitleStyles['padding-left'] = '8px'\r\n\r\n }\r\n this.winTitle = html({ parent: this.winTitlebar, type: 'span', html: this.options.title, styles: winTitleStyles })\r\n this._createButtons()\r\n\r\n if (this.options.movable)\r\n {\r\n this.winTitlebar.addEventListener('mousedown', (e) => this._downTitlebar(e))\r\n this.winTitlebar.addEventListener('touchstart', (e) => this._downTitlebar(e))\r\n }\r\n if (this.options.maximizable)\r\n {\r\n clicked(this.winTitlebar, () => this.maximize(), { doubleClicked: true, clicked: false})\r\n }\r\n }\r\n }\r\n\r\n _createButtons()\r\n {\r\n this.winButtonGroup = html({\r\n parent: this.winTitlebar, styles: {\r\n 'display': 'flex',\r\n 'flex-direction': 'row',\r\n 'align-items': 'center',\r\n 'padding-left': '10px'\r\n }\r\n })\r\n const button = {\r\n 'display': 'inline-block',\r\n 'border': 0,\r\n 'margin': 0,\r\n 'margin-left': '15px',\r\n 'padding': 0,\r\n 'width': '12px',\r\n 'height': '12px',\r\n 'background-color': 'transparent',\r\n 'background-size': 'cover',\r\n 'background-repeat': 'no-repeat',\r\n 'opacity': .7,\r\n 'color': this.options.foregroundButton,\r\n 'outline': 0\r\n }\r\n this.buttons = {}\r\n if (this.options.maximizable)\r\n {\r\n this.buttons.maximize = html({ parent: this.winButtonGroup, html: this.options.maximizeButton, type: 'button', styles: button })\r\n clicked(this.buttons.maximize, () => this.maximize())\r\n }\r\n if (this.options.closable)\r\n {\r\n this.buttons.close = html({ parent: this.winButtonGroup, html: this.options.closeButton, type: 'button', styles: button })\r\n clicked(this.buttons.close, () => this.close())\r\n }\r\n for (let key in this.buttons)\r\n {\r\n const button = this.buttons[key]\r\n button.addEventListener('mousemove', () =>\r\n {\r\n button.style.opacity = 1\r\n })\r\n button.addEventListener('mouseout', () =>\r\n {\r\n button.style.opacity = 0.7\r\n })\r\n }\r\n }\r\n\r\n _createResize()\r\n {\r\n this.resizeEdge = html({\r\n parent: this.winBox, type: 'button', html: this.options.backgroundResize, styles: {\r\n 'position': 'absolute',\r\n 'bottom': 0,\r\n 'right': '4px',\r\n 'border': 0,\r\n 'margin': 0,\r\n 'padding': 0,\r\n 'cursor': 'se-resize',\r\n 'user-select': 'none',\r\n 'height': '15px',\r\n 'width': '10px',\r\n 'background': 'none'\r\n }\r\n })\r\n const down = (e) =>\r\n {\r\n const event = this._convertMoveEvent(e)\r\n const width = this.width || this.win.offsetWidth\r\n const height = this.height || this.win.offsetHeight\r\n this._resizing = {\r\n width: width - event.pageX,\r\n height: height - event.pageY\r\n }\r\n this.emit('resize-start')\r\n e.preventDefault()\r\n }\r\n this.resizeEdge.addEventListener('mousedown', down)\r\n this.resizeEdge.addEventListener('touchstart', down)\r\n }\r\n\r\n _move(e)\r\n {\r\n const event = this._convertMoveEvent(e)\r\n\r\n if (!this._isTouchEvent(e) && e.which !== 1)\r\n {\r\n this._moving && this._stopMove()\r\n this._resizing && this._stopResize()\r\n }\r\n if (this._moving)\r\n {\r\n this.move(event.pageX - this._moving.x, event.pageY - this._moving.y)\r\n this.emit('move', this)\r\n e.preventDefault()\r\n }\r\n if (this._resizing)\r\n {\r\n this.resize(\r\n event.pageX + this._resizing.width,\r\n event.pageY + this._resizing.height\r\n )\r\n this.maximized = null\r\n this.emit('resize', this)\r\n e.preventDefault()\r\n }\r\n }\r\n\r\n _up()\r\n {\r\n if (this._moving)\r\n {\r\n this._stopMove()\r\n }\r\n this._resizing && this._stopResize()\r\n }\r\n\r\n _listeners()\r\n {\r\n this.win.addEventListener('mousedown', () => this.focus())\r\n this.win.addEventListener('touchstart', () => this.focus())\r\n }\r\n\r\n _stopMove()\r\n {\r\n this._moving = null\r\n this.emit('move-end', this)\r\n }\r\n\r\n _stopResize()\r\n {\r\n this._restore = this._resizing = null\r\n this.emit('resize-end', this)\r\n }\r\n\r\n _isTouchEvent(e)\r\n {\r\n return !!window.TouchEvent && (e instanceof window.TouchEvent)\r\n }\r\n\r\n _convertMoveEvent(e)\r\n {\r\n return this._isTouchEvent(e) ? e.changedTouches[0] : e\r\n }\r\n\r\n /**\r\n * attaches window to a side of the screen\r\n * @param {('horizontal'|'vertical')} direction\r\n * @param {('left'|'right'|'top'|'bottom')} location\r\n */\r\n attachToScreen(direction, location)\r\n {\r\n this._attachedToScreen[direction] = location\r\n }\r\n\r\n /**\r\n * @param {WindowManager~Bounds} bounds\r\n * @param {(boolean|'horizontal'|'vertical')} keepInside\r\n */\r\n reposition(bounds, keepInside)\r\n {\r\n this.bounds = bounds\r\n this.keepInside = keepInside\r\n let x = this.x\r\n let y = this.y\r\n x = this._attachedToScreen.horziontal === 'right' ? bounds.right - this.width : x\r\n x = this._attachedToScreen.horizontal === 'left' ? bounds.left : x\r\n y = this._attachedToScreen.vertical === 'bottom' ? bounds.bottom - this.height : y\r\n y = this._attachedToScreen.vertical === 'top' ? bounds.top : y\r\n this.move(x, y)\r\n }\r\n\r\n /**\r\n * @param {boolean} [ignoreClosed]\r\n * @returns {boolean}\r\n */\r\n isModal(ignoreClosed)\r\n {\r\n return (ignoreClosed || !this._closed) && this.options.modal\r\n }\r\n\r\n /** @returns {boolean} */\r\n isClosed()\r\n {\r\n return this._closed\r\n }\r\n\r\n get z()\r\n {\r\n return parseInt(this.win.style.zIndex)\r\n }\r\n set z(value)\r\n {\r\n this.win.style.zIndex = value\r\n }\r\n}\r\n\r\nWindow.id = 0\r\n\r\n/**\r\n * @typedef {Object} Window~WindowOptions\r\n * @property {number} [x=0]\r\n * @property {number} [y=0]\r\n * @property {number} [width]\r\n * @property {number} [height]\r\n * @property {boolean} [modal]\r\n * @property {boolean} [openOnCreate=true]\r\n * @property {*} [id]\r\n * @property {boolean} [movable=true]\r\n * @property {boolean} [resizable=true]\r\n * @property {boolean} [maximizable=true]\r\n * @property {boolean} [closable=true]\r\n * @property {boolean} [noSnap] don't snap this window or use this window as a snap target\r\n * @property {boolean} [titlebar=true]\r\n * @property {string} [titlebarHeight=36px]\r\n * @property {boolean} [titleCenter]\r\n * @property {string} [minWidth=200px]\r\n * @property {string} [minHeight=60px]\r\n * @property {string} [borderRadius=4px]\r\n * @property {string} [backgroundModal=rgba(0,0,0,0.6)]\r\n * @property {string} [backgroundWindow=#fefefe]\r\n * @property {string} [backgroundTitlebarActive=#365d98]\r\n * @property {string} [backgroundTitlebarInactive=#888888]\r\n * @property {string} [foregroundButton=#ffffff]\r\n * @property {string} [foregroundTitle=#ffffff]\r\n * @property {Object} [styles]\r\n * @property {string} [maximizeButton=...] used to replace the graphics for the button\r\n * @property {string} [closeButton=...] used to replace the graphics for the button\r\n * @property {string} [resize=...] used to replace the graphics for the button\r\n */","export const close='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\"><rect id=\"close\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" style=\"fill:none;\"/><g><path d=\"M3.5,3.5l13,13\" style=\"fill:none;stroke:#fff;stroke-width:3px;\"/><path d=\"M16.5,3.5l-13,13\" style=\"fill:none;stroke:#fff;stroke-width:3px;\"/></g></svg>';export const maximize='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\"><rect id=\"maximize\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" style=\"fill:none;\"/><rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" style=\"fill:none;stroke:#fff;stroke-width:2px;\"/><rect x=\"2\" y=\"2\" width=\"16\" height=\"3.2\" style=\"fill:#fff;\"/></svg>';export const minimize='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><rect id=\"minimize\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" style=\"fill:none;\"/><rect x=\"2\" y=\"15.6\" width=\"16\" height=\"3.2\" style=\"fill:#fff;\"/></svg>';export const resize='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><rect id=\"resize\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" style=\"fill:none;\"/><clipPath id=\"_clip1\"><rect x=\"0\" y=\"0\" width=\"20\" height=\"20\"/></clipPath><g clip-path=\"url(#_clip1)\"><rect x=\"0\" y=\"16.8\" width=\"20\" height=\"3.2\" style=\"fill:#fff;\"/><path d=\"M17.737,3.595l-14.142,14.142l2.263,2.263l14.142,-14.142l-2.263,-2.263Z\" style=\"fill:#fff;\"/><path d=\"M16.8,0l0,20l3.2,0l0,-20l-3.2,0Z\" style=\"fill:#fff;\"/><path d=\"M7.099,18.4l11.301,-11.123l0,11.123l-11.301,0Z\" style=\"fill:#fff;\"/></g></svg>';export const restore='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\"><rect id=\"restore\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" style=\"fill:none;\"/><g><rect x=\"7\" y=\"2.5\" width=\"10\" height=\"10\" style=\"fill:none;stroke:#fff;stroke-width:1.5px;\"/><rect x=\"7\" y=\"2.5\" width=\"10\" height=\"2\" style=\"fill:#fff;\"/></g><g><rect x=\"3\" y=\"7.5\" width=\"10\" height=\"10\" style=\"fill:none;stroke:#fff;stroke-width:1.5px;\"/><g><rect x=\"3\" y=\"7.5\" width=\"10\" height=\"2\" style=\"fill:#fff;\"/></g></g></svg>';","import { close, maximize, restore, resize } from './images'\n\nexport const defaultWindowOptions = {\n x: 0,\n y: 0,\n width: undefined,\n height: undefined,\n modal: false,\n openOnCreate: true,\n id: null,\n\n minWidth: '200px',\n minHeight: '60px',\n borderRadius: 0,\n styles: {},\n\n movable: true,\n resizable: true,\n maximizable: true,\n closable: true,\n\n noSnap: false,\n noMenu: false,\n\n titlebar: true,\n titlebarHeight: '2rem',\n\n backgroundWindow: '#fefefe',\n backgroundTitlebarActive: '#365d98',\n backgroundTitlebarInactive: '#888888',\n foregroundButton: '#ffffff',\n foregroundTitle: '#ffffff',\n\n closeButton: close,\n maximizeButton: maximize,\n restoreButton: restore,\n\n backgroundResize: resize\n}\n\nexport const defaultWindowManagerOptions = {\n quiet: false,\n keepInside: true,\n snap: true,\n noAccelerator: false,\n menu: false,\n styles: {},\n backgroundModal: 'rgba(0, 0, 0, 0.6)',\n}","import { html } from './html'\nimport { Menu } from './Menu/Menu'\n\nconst DEFAULT_COLOR = '#a8f0f4'\nconst DEFAULT_SIZE = 10\n\nconst SnapOptionsDefault = {\n screen: true,\n windows: true,\n snap: 20,\n color: DEFAULT_COLOR,\n spacing: 0,\n indicator: DEFAULT_SIZE\n}\n\n/**\n * edge snapping plugin\n * @param {WindowManager} wm\n * @param {object} [options]\n * @param {boolean} [options.screen=true] snap to screen edges\n * @param {boolean} [options.windows=true] snap to window edges\n * @param {number} [options.snap=20] distance to edge in pixels before snapping and width/height of snap bars\n * @param {string} [options.color=#a8f0f4] color for snap bars\n * @param {number} [options.spacing=0] spacing distance between window and edges\n * @param {number} [options.indicator=10] size in pixels of snapping indicator (the indicator is actually twice the size of what is shown)\n * @ignore\n */\nexport class Snap\n{\n constructor(wm, options={})\n {\n this.wm = wm\n this.options = { ...SnapOptionsDefault, ...options }\n this.highlights = html({ parent: this.wm.wallpaper, styles: { position: 'absolute' } })\n this.horizontal = html({\n parent: this.highlights, styles: {\n display: 'none',\n position: 'absolute',\n height: `${this.options.indicator}px`,\n borderRadius: `${this.options.indicator}px`,\n backgroundColor: this.options.color\n }\n })\n this.vertical = html({\n parent: this.highlights, styles: {\n display: 'none',\n position: 'absolute',\n width: `${this.options.indicator}px`,\n borderRadius: `${this.options.indicator}px`,\n backgroundColor: this.options.color\n }\n })\n this.horizontal\n this.showing = []\n }\n\n stop()\n {\n this.highlights.remove()\n this.stopped = true\n }\n\n addWindow(win)\n {\n win.on('move', () => this.move(win))\n win.on('move-end', () => this.moveEnd(win))\n }\n\n screenMove(rect, horizontal, vertical)\n {\n const top = Menu.getApplicationHeight()\n const width = this.wm.win.clientWidth\n const height = this.wm.win.clientHeight\n if (rect.left - this.options.snap <= width && rect.right + this.options.snap >= 0)\n {\n if (Math.abs(rect.top - top) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.top - top), left: 0, width, top: top, side: 'top', screen: true })\n }\n else if (Math.abs(rect.bottom - height) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.bottom - height), left: 0, width, top: height, side: 'bottom', screen: true })\n }\n }\n if (rect.top - this.options.snap <= height && rect.bottom + this.options.snap >= 0)\n {\n if (Math.abs(rect.left - 0) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.left - 0), top: 0, height, left: 0, side: 'left', screen: true })\n }\n else if (Math.abs(rect.right - width) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.right - width), top: 0, height, left: width, side: 'right', screen: true })\n }\n }\n }\n\n windowsMove(original, rect, horizontal, vertical)\n {\n for (let win of this.wm.windows)\n {\n if (!win.options.noSnap && win !== original)\n {\n const rect2 = win.win.getBoundingClientRect()\n if (rect.left - this.options.snap <= rect2.right && rect.right + this.options.snap >= rect2.left)\n {\n if (Math.abs(rect.top - rect2.bottom) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.top - rect2.bottom), left: rect2.left, width: rect2.width, top: rect2.bottom, side: 'top' })\n if (Math.abs(rect.left - rect2.left) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.left - rect2.left), top: rect2.top, height: rect2.height, left: rect2.left, side: 'left', noSpacing: true })\n }\n else if (Math.abs(rect.right - rect2.right) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.right - rect2.right), top: rect2.top, height: rect2.height, left: rect2.right, side: 'right', noSpacing: true })\n }\n }\n else if (Math.abs(rect.bottom - rect2.top) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.bottom - rect2.top), left: rect2.left, width: rect2.width, top: rect2.top, side: 'bottom' })\n if (Math.abs(rect.left - rect2.left) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.left - rect2.left), top: rect2.top, height: rect2.height, left: rect2.left, side: 'left', noSpacing: true })\n }\n else if (Math.abs(rect.right - rect2.right) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.right - rect2.right), top: rect2.top, height: rect2.height, left: rect2.right, side: 'right', noSpacing: true })\n }\n }\n }\n if (rect.top - this.options.snap <= rect2.bottom && rect.bottom + this.options.snap >= rect2.top)\n {\n if (Math.abs(rect.left - rect2.right) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.left - rect2.right), top: rect2.top, height: rect2.height, left: rect2.right, side: 'left' })\n if (Math.abs(rect.top - rect2.top) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.top - rect2.top), left: rect2.left, width: rect2.width, top: rect2.top, side: 'top', noSpacing: true })\n }\n else if (Math.abs(rect.bottom - rect2.bottom) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.bottom - rect2.bottom), left: rect2.left, width: rect2.width, top: rect2.bottom, side: 'bottom', noSpacing: true })\n }\n }\n else if (Math.abs(rect.right - rect2.left) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.right - rect2.left), top: rect2.top, height: rect2.height, left: rect2.left, side: 'right' })\n if (Math.abs(rect.top - rect2.top) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.top - rect2.top), left: rect2.left, width: rect2.width, top: rect2.top, side: 'top', noSpacing: true })\n }\n else if (Math.abs(rect.bottom - rect2.bottom) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.bottom - rect2.bottom), left: rect2.left, width: rect2.width, top: rect2.bottom, side: 'bottom', noSpacing: true })\n }\n }\n }\n }\n }\n }\n\n move(win)\n {\n if (this.stopped || win.options.noSnap || win.isModal())\n {\n return\n }\n this.horizontal.style.display = 'none'\n this.vertical.style.display = 'none'\n const horizontal = []\n const vertical = []\n const rect = win.win.getBoundingClientRect()\n if (this.options.screen)\n {\n this.screenMove(rect, horizontal, vertical)\n }\n if (this.options.windows)\n {\n this.windowsMove(win, rect, horizontal, vertical)\n }\n if (horizontal.length)\n {\n horizontal.sort((a, b) => { return a.distance - b.distance })\n const find = horizontal[0]\n this.horizontal.style.display = 'block'\n this.horizontal.style.width = find.width + 'px'\n this.horizontal.y = find.top - this.options.indicator / 2\n this.horizontal.yPosition = find.top\n this.horizontal.style.transform = `translate(${find.left}px,${this.horizontal.y}px)`\n this.horizontal.side = find.side\n this.horizontal.noSpacing = find.noSpacing\n this.horizontal.screen = find.screen\n }\n if (vertical.length)\n {\n vertical.sort((a, b) => { return a.distance - b.distance })\n const find = vertical[0]\n this.vertical.style.display = 'block'\n this.vertical.style.height = find.height + 'px'\n this.vertical.x = find.left - this.options.indicator / 2\n this.vertical.xPosition = find.left\n this.vertical.style.transform = `translate(${this.vertical.x}px,${find.top}px)`\n this.vertical.side = find.side\n this.vertical.noSpacing = find.noSpacing\n this.vertical.screen = find.screen\n }\n }\n\n moveEnd(win)\n {\n if (this.stopped)\n {\n return\n }\n const bounds = this.wm.bounds\n const top = Menu.getApplicationHeight()\n if (this.horizontal.style.display === 'block')\n {\n const spacing = this.horizontal.noSpacing ? 0 : this.options.spacing\n switch (this.horizontal.side)\n {\n case 'top':\n win.y = this.horizontal.yPosition + spacing - bounds.top + top\n break\n\n case 'bottom':\n win.bottom = Math.floor(this.horizontal.yPosition - spacing - bounds.top + top)\n break\n }\n win.attachToScreen('vertical', this.horizontal.screen ? this.horizontal.side : '')\n }\n if (this.vertical.style.display === 'block')\n {\n const spacing = this.vertical.noSpacing ? 0 : this.options.spacing\n switch (this.vertical.side)\n {\n case 'left':\n win.x = this.vertical.xPosition + spacing - bounds.left\n break\n\n case 'right':\n win.right = Math.floor(this.vertical.xPosition - spacing - bounds.left)\n break\n }\n win.attachToScreen('horziontal', this.vertical.screen ? this.vertical.side : '')\n }\n this.horizontal.style.display = this.vertical.style.display = 'none'\n }\n}\n\n\n/**\n * @typedef {Object} Snap~SnapOptions\n * @property {boolean} [screen=true] snap to screen edges\n * @property {boolean} [windows=true] snap to window edges\n * @property {number} [snap=20] distance to edge before snapping\n * @property {string} [color=#a8f0f4] color for snap bars\n * @property {number} [spacing=0] spacing distance between window and edges\n * @property {number} [options.indicator=10] size in pixels of snapping indicator (the indicator is actually twice the size of what is shown)\n */","import { html } from './html'\r\nimport { Window } from './Window'\r\nimport { defaultWindowManagerOptions, defaultWindowOptions } from './defaults'\r\nimport { Snap } from './Snap'\r\nimport { accelerator } from './accelerator'\r\nimport { Menu } from './Menu/Menu'\r\n\r\n/**\r\n * Create the WindowManager\r\n * @param {Object} [options]\r\n * @param {HTMLElement} [options.parent=document.body] parent to append WindowManager\r\n * @param {string} [options.backgroundModal=rgba(0, 0, 0, 0.6)] background color for window\r\n * @param {boolean} [options.quiet] suppress the simple-window-manager console message\r\n * @param {(boolean|WindowManager~SnapOptions)} [options.snap] initialize snap plugin\r\n * @param {boolean} [options.noAccelerator] do not initialize keyboard accelerators (needed for Menu)\r\n * @param {(boolean|'horizontal'|'vertical')} [options.keepInside=true] keep windows inside the parent in a certain direction\r\n * @param {Object} [options.styles] additional hard-coded styles for main container window (eg, { color: 'green' })\r\n * @param {Window~WindowOptions} [windowOptions] default options used when createWindow is called\r\n */\r\nexport class WindowManager\r\n{\r\n constructor(options = {}, windowOptions = {})\r\n {\r\n this.options = { ...defaultWindowManagerOptions, ...options }\r\n this.options.parent = this.options.parent || document.body\r\n if (!this.options.quiet)\r\n {\r\n console.log('%c ☕ simple-window-manager initialized ☕', 'color: #ff00ff')\r\n }\r\n this.windows = []\r\n this.active = null\r\n this._setupWin()\r\n this._setupWallpaper()\r\n this._setupModal()\r\n if (this.options.snap)\r\n {\r\n this.snap(this.options.snap === true ? {} : this.options.snap)\r\n }\r\n this.windowOptions = { ...defaultWindowOptions, ...windowOptions }\r\n window.addEventListener('resize', () => this.resize())\r\n if (!this.options.noAccelerator)\r\n {\r\n accelerator.init()\r\n }\r\n }\r\n\r\n /**\r\n * Create a window\r\n * @param {WindowOptions} [options]\r\n * @param {string} [options.title]\r\n * @param {number} [options.x] position\r\n * @param {number} [options.y] position\r\n * @param {boolean} [options.modal]\r\n * @param {(number|*)} [options.id] if not provide, id will be assigned in order of creation (0, 1, 2...)\r\n * @returns {Window} the created window\r\n */\r\n createWindow(options = {})\r\n {\r\n const win = new Window(this, { ...this.windowOptions, ...options })\r\n win.on('open', () => this._open(win))\r\n win.on('focus', () => this._focus(win))\r\n win.on('blur', () => this._blur(win))\r\n win.on('close', () => this._close(win))\r\n win.win.addEventListener('mousemove', (e) => this._move(e))\r\n win.win.addEventListener('touchmove', (e) => this._move(e))\r\n win.win.addEventListener('mouseup', (e) => this._up(e))\r\n win.win.addEventListener('touchend', (e) => this._up(e))\r\n if (this._snap && !options.noSnap)\r\n {\r\n this._snap.addWindow(win)\r\n }\r\n win.reposition(this.bounds, this.options.keepInside)\r\n if (win.options.openOnCreate)\r\n {\r\n win.open()\r\n }\r\n return win\r\n }\r\n\r\n /**\r\n * enable edge and/or screen snapping\r\n * @param {WindowManager~SnapOptions} [options]\r\n */\r\n snap(options)\r\n {\r\n this._snap = new Snap(this, options)\r\n for (const win of this.windows)\r\n {\r\n if (!win.options.noSnap)\r\n {\r\n this._snap.addWindow(win)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * send window to front\r\n * @param {Window} win\r\n */\r\n sendToFront(win)\r\n {\r\n const index = this.windows.indexOf(win)\r\n console.assert(index !== -1, 'sendToFront should find window in this.windows')\r\n if (index !== this.windows.length - 1)\r\n {\r\n this.windows.splice(index, 1)\r\n this.windows.push(win)\r\n this._reorder()\r\n }\r\n }\r\n\r\n /**\r\n * send window to back\r\n * @param {Window} win\r\n */\r\n sendToBack(win)\r\n {\r\n const index = this.windows.indexOf(win)\r\n console.assert(index !== -1, 'sendToFront should find window in this.windows')\r\n if (index !== 0)\r\n {\r\n this.windows.splice(index, 1)\r\n this.windows.unshift(win)\r\n this._reorder()\r\n }\r\n }\r\n\r\n /**\r\n * save the state of all the windows\r\n * @returns {Object} use this object in load() to restore the state of all windows\r\n */\r\n save()\r\n {\r\n const data = {}\r\n for (let i = 0; i < this.windows.length; i++)\r\n {\r\n const win = this.windows[i]\r\n data[win.id] = win.save()\r\n data[win.id].order = i\r\n }\r\n return data\r\n }\r\n\r\n /**\r\n * restores the state of all the windows\r\n * NOTE: this requires that the windows have the same id as when save() was called\r\n * @param {Object} data created by save()\r\n */\r\n load(data)\r\n {\r\n for (const id in data)\r\n {\r\n const win = this.getWindowById(id)\r\n if (win)\r\n {\r\n win.load(data[id])\r\n }\r\n }\r\n // reorder windows\r\n }\r\n\r\n /**\r\n * close all windows\r\n */\r\n closeAll()\r\n {\r\n for (let win of this.windows)\r\n {\r\n win.close()\r\n }\r\n this.windows = []\r\n this.active = null\r\n }\r\n\r\n /**\r\n * reorder windows\r\n * @private\r\n * @returns {number} available z-index for top window\r\n */\r\n _reorder()\r\n {\r\n let i = 0\r\n for (const win of this.windows)\r\n {\r\n if (!win.isClosed())\r\n {\r\n win.z = i++\r\n }\r\n }\r\n }\r\n\r\n _setupWin()\r\n {\r\n /**\r\n * This is the top-level DOM element\r\n * @type {HTMLElement}\r\n * @readonly\r\n */\r\n this.win = html({\r\n parent: this.options.parent,\r\n styles: {\r\n ...{\r\n 'user-select': 'none',\r\n 'width': '100%',\r\n 'height': '100%',\r\n 'overflow': 'hidden',\r\n 'z-index': -1,\r\n 'cursor': 'default',\r\n },\r\n ...this.options.styles\r\n }\r\n })\r\n }\r\n\r\n _setupWallpaper()\r\n {\r\n /**\r\n * This is the bottom DOM element. Use this to set a wallpaper or attach elements underneath the windows\r\n * @type {HTMLElement}\r\n * @readonly\r\n */\r\n this.wallpaper = html({\r\n parent: this.win,\r\n styles: {\r\n ...{\r\n 'user-select': 'none',\r\n 'position': 'absolute',\r\n 'top': 0,\r\n 'left': 0,\r\n 'width': '100%',\r\n 'height': '100%',\r\n 'overflow': 'hidden'\r\n }\r\n }\r\n })\r\n this.wallpaper.addEventListener('mousemove', (e) => this._move(e))\r\n this.wallpaper.addEventListener('touchmove', (e) => this._move(e))\r\n this.wallpaper.addEventListener('mouseup', (e) => this._up(e))\r\n this.wallpaper.addEventListener('touchend', (e) => this._up(e))\r\n }\r\n\r\n _setupModal()\r\n {\r\n this.modalOverlay = html({\r\n parent: this.win,\r\n styles: {\r\n 'display': 'none',\r\n 'user-select': 'none',\r\n 'position': 'absolute',\r\n 'top': 0,\r\n 'left': 0,\r\n 'width': '100%',\r\n 'height': '100%',\r\n 'overflow': 'hidden',\r\n 'background': this.options.backgroundModal\r\n }\r\n })\r\n this.modalOverlay.addEventListener('mousemove', (e) => { this._move(e); e.preventDefault(); e.stopPropagation() })\r\n this.modalOverlay.addEventListener('touchmove', (e) => { this._move(e); e.preventDefault(); e.stopPropagation() })\r\n this.modalOverlay.addEventListener('mouseup', (e) => { this._up(e); e.preventDefault(); e.stopPropagation() })\r\n this.modalOverlay.addEventListener('touchend', (e) => { this._up(e); e.preventDefault(); e.stopPropagation() })\r\n this.modalOverlay.addEventListener('mousedown', (e) => { e.preventDefault(); e.stopPropagation() })\r\n this.modalOverlay.addEventListener('touchstart', (e) => { e.preventDefault(); e.stopPropagation() })\r\n }\r\n\r\n _open(win)\r\n {\r\n this.windows.push(win)\r\n this._reorder()\r\n if (win.options.modal)\r\n {\r\n this.modalOverlay.style.display = 'block'\r\n this.modalOverlay.style.zIndex = win.z\r\n }\r\n else\r\n {\r\n this.modalOverlay.style.display = 'none'\r\n }\r\n }\r\n\r\n _focus(win)\r\n {\r\n if (this.active === win)\r\n {\r\n return\r\n }\r\n if (this.active)\r\n {\r\n this.active.blur()\r\n }\r\n const index = this.windows.indexOf(win)\r\n console.assert(index !== -1, 'WindowManager._focus should find window in this.windows')\r\n if (index !== this.windows.length - 1)\r\n {\r\n this.windows.splice(index, 1)\r\n this.windows.push(win)\r\n }\r\n this._reorder()\r\n this.active = this.windows[this.windows.length - 1]\r\n }\r\n\r\n _blur(win)\r\n {\r\n if (this.active === win)\r\n {\r\n this.active = null\r\n }\r\n }\r\n\r\n _close(win)\r\n {\r\n if (win.isModal(true))\r\n {\r\n if (next && next.isModal())\r\n {\r\n this.modalOverlay.style.zIndex = next.z\r\n }\r\n else\r\n {\r\n this.modalOverlay.style.display = 'none'\r\n }\r\n }\r\n }\r\n\r\n _move(e)\r\n {\r\n for (const key in this.windows)\r\n {\r\n this.windows[key]._move(e)\r\n }\r\n }\r\n\r\n _up(e)\r\n {\r\n for (const key in this.windows)\r\n {\r\n this.windows[key]._up(e)\r\n }\r\n }\r\n\r\n checkModal(win)\r\n {\r\n return !this.modal || this.modal === win\r\n }\r\n\r\n /** @type {WindowManager~Bounds} */\r\n get bounds()\r\n {\r\n const top = Menu.getApplicationHeight()\r\n return {\r\n top: this.win.offsetTop + top,\r\n bottom: this.win.offsetTop + this.win.offsetHeight,\r\n left: this.win.offsetLeft,\r\n right: this.win.offsetLeft + this.win.offsetWidth\r\n }\r\n }\r\n\r\n resize()\r\n {\r\n const bounds = this.bounds\r\n for (const key in this.windows)\r\n {\r\n this.windows[key].reposition(bounds, this.options.keepInside)\r\n }\r\n }\r\n\r\n /**\r\n * Find a window by id\r\n * @param {*} id\r\n * @returns {Window}\r\n */\r\n getWindowById(id)\r\n {\r\n return this.windows.find(win => win.id === id)\r\n }\r\n}\r\n\r\n/**\r\n * @typedef {Object} WindowManager~Bounds\r\n * @property {number} left\r\n * @property {number} right\r\n * @property {number} top\r\n * @property {number} bottom\r\n */\r\n\r\n /**\r\n * @typedef {Object} WindowManager~SnapOptions\r\n * @property {boolean} [screen=true] snap to screen edges\r\n * @property {boolean} [windows=true] snap to window edges\r\n * @property {number} [snap=20] distance to edge in pixels before snapping and width/height of snap bars\r\n * @property {string} [color=#a8f0f4] color for snap bars\r\n * @property {number} [spacing=0] spacing distance between window and edges\r\n * @property {number} [indicator=10] size in pixels of snapping indicator (the indicator is actually twice the size of what is shown)\r\n */"],"names":["html","options","element","document","createElement","type","styles","Object","assign","style","className","innerHTML","parent","appendChild","has","prototype","hasOwnProperty","prefix","Events","EE","fn","context","once","this","addListener","emitter","event","TypeError","listener","evt","_events","push","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","events","name","names","call","slice","getOwnPropertySymbols","concat","listeners","handlers","i","l","length","ee","Array","listenerCount","emit","a1","a2","a3","a4","a5","args","len","arguments","removeListener","undefined","apply","j","on","removeAllListeners","off","prefixed","module","defaultOptions","threshold","clicked","doubleClicked","doubleClickedTime","longClicked","longClickedTime","capture","clickDown","callback","Clicked","[object Object]","querySelector","mousedown","e","mouseup","mousemove","touchstart","touchmove","touchcancel","cancel","touchend","addEventListener","passive","console","warn","removeEventListener","down","touches","handleDown","changedTouches","screenX","screenY","x","y","Math","abs","lastX","lastY","pastThreshold","doubleClickedTimeout","clearTimeout","longClickedTimeout","preventDefault","handleClicks","pointerId","setTimeout","doubleClickedCancel","longClikedTimeout","config","ApplicationContainerStyle","z-index","position","top","left","user-select","font-size","ApplicationMenuStyle","display","flex-direction","color","backgroundColor","width","border","box-shadow","outline","ApplicationMenuRowStyle","padding","margin","line-height","MenuStyle","boxShadow","RowStyle","AcceleratorStyle","opacity","SeparatorStyle","border-bottom","AcceleratorKeyStyle","text-decoration","text-decoration-color","MinimumColumnWidth","SelectedBackgroundStyle","Overlap","SubmenuOpenDelay","accelerator","initialized","menuKeys","keys","body","_keydown","_keyup","letter","menuItem","keyCode","menu","applicationMenu","_prepareKey","handleClick","stopPropagation","closeAll","enter","move","pressed","released","alt","split","indexOf","code","key","modifiers","toLowerCase","replace","modifier","sort","a","b","part","codes","toUpperCase","substr","isPressed","altKey","ctrlKey","metaKey","shiftKey","translate","Menu","init","div","children","applyConfig","tabIndex","submenu","pos","childNodes","append","insertBefore","splice","current","showing","remove","next","unregisterMenuShortcuts","hide","showAccelerators","hideAccelerators","offsetLeft","offsetTop","offsetHeight","offsetWidth","attached","application","label","arrow","checked","child","check","childLabel","childAccelerator","window","innerWidth","innerHeight","focus","base","showShortcut","index","text","registerMenuShortcut","registerMenuSpecial","hideShortcut","background","direction","selector","moveChild","horizontalSelector","items","registerAlt","clearMenuKeys","blur","showApplicationAccelerators","Window","wm","super","id","_createWin","_createWinBox","_createTitlebar","_createContent","resizable","_createResize","_createOverlay","_buildTransform","_listeners","active","maximized","_closed","_restore","_moving","_resizing","_attachedToScreen","vertical","horziontal","noFocus","win","titlebar","winTitlebar","backgroundTitlebarActive","backgroundTitlebarInactive","closed","value","transform","height","keepInside","getApplicationHeight","maximizable","buttons","maximize","maximizeButton","wallpaper","restoreButton","sendToBack","sendToFront","data","close","open","title","_title","winTitle","innerText","right","bottom","border-radius","borderRadius","overflow","min-width","minWidth","min-height","minHeight","background-color","backgroundWindow","isNaN","winBox","content","flex","overflow-x","overflow-y","overlay","_downTitlebar","_convertMoveEvent","pageX","pageY","_moved","align-items","justify-content","titlebarHeight","winTitleStyles","cursor","font-weight","foregroundTitle","titleCenter","_createButtons","movable","winButtonGroup","padding-left","button","margin-left","background-size","background-repeat","foregroundButton","closable","closeButton","resizeEdge","backgroundResize","_isTouchEvent","which","_stopMove","_stopResize","resize","TouchEvent","location","bounds","horizontal","ignoreClosed","modal","z","parseInt","zIndex","defaultWindowOptions","openOnCreate","noSnap","noMenu","defaultWindowManagerOptions","quiet","snap","noAccelerator","backgroundModal","SnapOptionsDefault","screen","windows","spacing","indicator","Snap","highlights","stopped","moveEnd","rect","clientWidth","clientHeight","distance","side","original","rect2","getBoundingClientRect","noSpacing","isModal","screenMove","windowsMove","find","yPosition","xPosition","floor","attachToScreen","windowOptions","log","_setupWin","_setupWallpaper","_setupModal","_open","_focus","_blur","_close","_move","_up","_snap","addWindow","reposition","assert","_reorder","unshift","save","order","getWindowById","load","isClosed","modalOverlay"],"mappings":"qPAWO,SAASA,EAAKC,EAAU,IAE3B,MAAMC,EAAUC,SAASC,cAAcH,EAAQI,MAAQ,OAiBvD,OAhBIJ,EAAQK,QAERC,OAAOC,OAAON,EAAQO,MAAOR,EAAQK,QAErCL,EAAQS,YAERR,EAAQQ,UAAYT,EAAQS,WAE5BT,EAAQD,OAERE,EAAQS,UAAYV,EAAQD,MAE5BC,EAAQW,QAERX,EAAQW,OAAOC,YAAYX,GAExBA,iFC5BX,IAAIY,EAAMP,OAAOQ,UAAUC,eACvBC,EAAS,IASb,SAASC,KA4BT,SAASC,EAAGC,EAAIC,EAASC,GACvBC,KAAKH,GAAKA,EACVG,KAAKF,QAAUA,EACfE,KAAKD,KAAOA,IAAQ,EActB,SAASE,EAAYC,EAASC,EAAON,EAAIC,EAASC,GAChD,GAAkB,mBAAPF,EACT,MAAM,IAAIO,UAAU,mCAGtB,IAAIC,EAAW,IAAIT,EAAGC,EAAIC,GAAWI,EAASH,GAC1CO,EAAMZ,EAASA,EAASS,EAAQA,EAMpC,OAJKD,EAAQK,QAAQD,GACXJ,EAAQK,QAAQD,GAAKT,GAC1BK,EAAQK,QAAQD,GAAO,CAACJ,EAAQK,QAAQD,GAAMD,GADhBH,EAAQK,QAAQD,GAAKE,KAAKH,IADlCH,EAAQK,QAAQD,GAAOD,EAAUH,EAAQO,gBAI7DP,EAUT,SAASQ,EAAWR,EAASI,GACI,KAAzBJ,EAAQO,aAAoBP,EAAQK,QAAU,IAAIZ,SAC5CO,EAAQK,QAAQD,GAU9B,SAASK,IACPX,KAAKO,QAAU,IAAIZ,EACnBK,KAAKS,aAAe,EAxElBzB,OAAO4B,SACTjB,EAAOH,UAAYR,OAAO4B,OAAO,OAM5B,IAAIjB,GAASkB,YAAWnB,GAAS,IA2ExCiB,EAAanB,UAAUsB,WAAa,WAClC,IACIC,EACAC,EAFAC,EAAQ,GAIZ,GAA0B,IAAtBjB,KAAKS,aAAoB,OAAOQ,EAEpC,IAAKD,KAASD,EAASf,KAAKO,QACtBhB,EAAI2B,KAAKH,EAAQC,IAAOC,EAAMT,KAAKd,EAASsB,EAAKG,MAAM,GAAKH,GAGlE,OAAIhC,OAAOoC,sBACFH,EAAMI,OAAOrC,OAAOoC,sBAAsBL,IAG5CE,GAUTN,EAAanB,UAAU8B,UAAY,SAAmBnB,GACpD,IAAIG,EAAMZ,EAASA,EAASS,EAAQA,EAChCoB,EAAWvB,KAAKO,QAAQD,GAE5B,IAAKiB,EAAU,MAAO,GACtB,GAAIA,EAAS1B,GAAI,MAAO,CAAC0B,EAAS1B,IAElC,IAAK,IAAI2B,EAAI,EAAGC,EAAIF,EAASG,OAAQC,EAAK,IAAIC,MAAMH,GAAID,EAAIC,EAAGD,IAC7DG,EAAGH,GAAKD,EAASC,GAAG3B,GAGtB,OAAO8B,GAUThB,EAAanB,UAAUqC,cAAgB,SAAuB1B,GAC5D,IAAIG,EAAMZ,EAASA,EAASS,EAAQA,EAChCmB,EAAYtB,KAAKO,QAAQD,GAE7B,OAAKgB,EACDA,EAAUzB,GAAW,EAClByB,EAAUI,OAFM,GAYzBf,EAAanB,UAAUsC,KAAO,SAAc3B,EAAO4B,EAAIC,EAAIC,EAAIC,EAAIC,GACjE,IAAI7B,EAAMZ,EAASA,EAASS,EAAQA,EAEpC,IAAKH,KAAKO,QAAQD,GAAM,OAAO,EAE/B,IAEI8B,EACAZ,EAHAF,EAAYtB,KAAKO,QAAQD,GACzB+B,EAAMC,UAAUZ,OAIpB,GAAIJ,EAAUzB,GAAI,CAGhB,OAFIyB,EAAUvB,MAAMC,KAAKuC,eAAepC,EAAOmB,EAAUzB,QAAI2C,GAAW,GAEhEH,GACN,KAAK,EAAG,OAAOf,EAAUzB,GAAGqB,KAAKI,EAAUxB,UAAU,EACrD,KAAK,EAAG,OAAOwB,EAAUzB,GAAGqB,KAAKI,EAAUxB,QAASiC,IAAK,EACzD,KAAK,EAAG,OAAOT,EAAUzB,GAAGqB,KAAKI,EAAUxB,QAASiC,EAAIC,IAAK,EAC7D,KAAK,EAAG,OAAOV,EAAUzB,GAAGqB,KAAKI,EAAUxB,QAASiC,EAAIC,EAAIC,IAAK,EACjE,KAAK,EAAG,OAAOX,EAAUzB,GAAGqB,KAAKI,EAAUxB,QAASiC,EAAIC,EAAIC,EAAIC,IAAK,EACrE,KAAK,EAAG,OAAOZ,EAAUzB,GAAGqB,KAAKI,EAAUxB,QAASiC,EAAIC,EAAIC,EAAIC,EAAIC,IAAK,EAG3E,IAAKX,EAAI,EAAGY,EAAO,IAAIR,MAAMS,EAAK,GAAIb,EAAIa,EAAKb,IAC7CY,EAAKZ,EAAI,GAAKc,UAAUd,GAG1BF,EAAUzB,GAAG4C,MAAMnB,EAAUxB,QAASsC,OACjC,CACL,IACIM,EADAhB,EAASJ,EAAUI,OAGvB,IAAKF,EAAI,EAAGA,EAAIE,EAAQF,IAGtB,OAFIF,EAAUE,GAAGzB,MAAMC,KAAKuC,eAAepC,EAAOmB,EAAUE,GAAG3B,QAAI2C,GAAW,GAEtEH,GACN,KAAK,EAAGf,EAAUE,GAAG3B,GAAGqB,KAAKI,EAAUE,GAAG1B,SAAU,MACpD,KAAK,EAAGwB,EAAUE,GAAG3B,GAAGqB,KAAKI,EAAUE,GAAG1B,QAASiC,GAAK,MACxD,KAAK,EAAGT,EAAUE,GAAG3B,GAAGqB,KAAKI,EAAUE,GAAG1B,QAASiC,EAAIC,GAAK,MAC5D,KAAK,EAAGV,EAAUE,GAAG3B,GAAGqB,KAAKI,EAAUE,GAAG1B,QAASiC,EAAIC,EAAIC,GAAK,MAChE,QACE,IAAKG,EAAM,IAAKM,EAAI,EAAGN,EAAO,IAAIR,MAAMS,EAAK,GAAIK,EAAIL,EAAKK,IACxDN,EAAKM,EAAI,GAAKJ,UAAUI,GAG1BpB,EAAUE,GAAG3B,GAAG4C,MAAMnB,EAAUE,GAAG1B,QAASsC,IAKpD,OAAO,GAYTzB,EAAanB,UAAUmD,GAAK,SAAYxC,EAAON,EAAIC,GACjD,OAAOG,EAAYD,KAAMG,EAAON,EAAIC,GAAS,IAY/Ca,EAAanB,UAAUO,KAAO,SAAcI,EAAON,EAAIC,GACrD,OAAOG,EAAYD,KAAMG,EAAON,EAAIC,GAAS,IAa/Ca,EAAanB,UAAU+C,eAAiB,SAAwBpC,EAAON,EAAIC,EAASC,GAClF,IAAIO,EAAMZ,EAASA,EAASS,EAAQA,EAEpC,IAAKH,KAAKO,QAAQD,GAAM,OAAON,KAC/B,IAAKH,EAEH,OADAa,EAAWV,KAAMM,GACVN,KAGT,IAAIsB,EAAYtB,KAAKO,QAAQD,GAE7B,GAAIgB,EAAUzB,GAEVyB,EAAUzB,KAAOA,GACfE,IAAQuB,EAAUvB,MAClBD,GAAWwB,EAAUxB,UAAYA,GAEnCY,EAAWV,KAAMM,OAEd,CACL,IAAK,IAAIkB,EAAI,EAAGT,EAAS,GAAIW,EAASJ,EAAUI,OAAQF,EAAIE,EAAQF,KAEhEF,EAAUE,GAAG3B,KAAOA,GACnBE,IAASuB,EAAUE,GAAGzB,MACtBD,GAAWwB,EAAUE,GAAG1B,UAAYA,IAErCiB,EAAOP,KAAKc,EAAUE,IAOtBT,EAAOW,OAAQ1B,KAAKO,QAAQD,GAAyB,IAAlBS,EAAOW,OAAeX,EAAO,GAAKA,EACpEL,EAAWV,KAAMM,GAGxB,OAAON,MAUTW,EAAanB,UAAUoD,mBAAqB,SAA4BzC,GACtE,IAAIG,EAUJ,OARIH,GACFG,EAAMZ,EAASA,EAASS,EAAQA,EAC5BH,KAAKO,QAAQD,IAAMI,EAAWV,KAAMM,KAExCN,KAAKO,QAAU,IAAIZ,EACnBK,KAAKS,aAAe,GAGfT,MAMTW,EAAanB,UAAUqD,IAAMlC,EAAanB,UAAU+C,eACpD5B,EAAanB,UAAUS,YAAcU,EAAanB,UAAUmD,GAK5DhC,EAAamC,SAAWpD,EAKxBiB,EAAaA,aAAeA,EAM1BoC,UAAiBpC,KCxSnB,MAAMqC,EAAiB,CACnBC,UAAW,GACXC,SAAS,EACTC,eAAe,EACfC,kBAAmB,IACnBC,aAAa,EACbC,gBAAiB,IACjBC,SAAS,EACTC,WAAW,GAiBR,SAASN,EAAQvE,EAAS8E,EAAU/E,GAEvC,OAAO,IAAIgF,EAAQ/E,EAAS8E,EAAU/E,GAG1C,MAAMgF,EAEFC,YAAYhF,EAAS8E,EAAU/E,GAEJ,iBAAZC,IAEPA,EAAUC,SAASgF,cAAcjF,KAOrCqB,KAAKtB,QAAUM,OAAOC,OAAO,GAAI+D,EAAgBtE,GACjDsB,KAAKe,OAAS,CACV8C,UAAYC,GAAM9D,KAAK6D,UAAUC,GACjCC,QAAUD,GAAM9D,KAAK+D,QAAQD,GAC7BE,UAAYF,GAAM9D,KAAKgE,UAAUF,GACjCG,WAAaH,GAAM9D,KAAKiE,WAAWH,GACnCI,UAAYJ,GAAM9D,KAAKkE,UAAUJ,GACjCK,YAAcL,GAAM9D,KAAKoE,OAAON,GAChCO,SAAWP,GAAM9D,KAAKqE,SAASP,IAEnCnF,EAAQ2F,iBAAiB,YAAatE,KAAKe,OAAO8C,UAAW,CAAEN,QAASvD,KAAKtB,QAAQ6E,UACrF5E,EAAQ2F,iBAAiB,UAAWtE,KAAKe,OAAOgD,QAAS,CAAER,QAASvD,KAAKtB,QAAQ6E,UACjF5E,EAAQ2F,iBAAiB,YAAatE,KAAKe,OAAOiD,UAAW,CAAET,QAASvD,KAAKtB,QAAQ6E,UACrF5E,EAAQ2F,iBAAiB,aAActE,KAAKe,OAAOkD,WAAY,CAAEM,SAAS,EAAMhB,QAASvD,KAAKtB,QAAQ6E,UACtG5E,EAAQ2F,iBAAiB,YAAatE,KAAKe,OAAOmD,UAAW,CAAEK,SAAS,EAAMhB,QAASvD,KAAKtB,QAAQ6E,UACpG5E,EAAQ2F,iBAAiB,cAAetE,KAAKe,OAAOoD,YAAa,CAAEZ,QAASvD,KAAKtB,QAAQ6E,UACzF5E,EAAQ2F,iBAAiB,WAAYtE,KAAKe,OAAOsD,SAAU,CAAEd,QAASvD,KAAKtB,QAAQ6E,UACnFvD,KAAKrB,QAAUA,EACfqB,KAAKyD,SAAWA,GAtBRe,QAAQC,KAAK,2CAA2C9F,mBA4BpEgF,UAEI3D,KAAKrB,QAAQ+F,oBAAoB,YAAa1E,KAAKe,OAAO8C,WAC1D7D,KAAKrB,QAAQ+F,oBAAoB,UAAW1E,KAAKe,OAAOgD,SACxD/D,KAAKrB,QAAQ+F,oBAAoB,YAAa1E,KAAKe,OAAOiD,WAC1DhE,KAAKrB,QAAQ+F,oBAAoB,aAAc1E,KAAKe,OAAOkD,WAAY,CAAEM,SAAS,IAClFvE,KAAKrB,QAAQ+F,oBAAoB,YAAa1E,KAAKe,OAAOmD,UAAW,CAAEK,SAAS,IAChFvE,KAAKrB,QAAQ+F,oBAAoB,cAAe1E,KAAKe,OAAOoD,aAC5DnE,KAAKrB,QAAQ+F,oBAAoB,WAAY1E,KAAKe,OAAOsD,UAG7DV,WAAWG,IAEW,IAAd9D,KAAK2E,KAEL3E,KAAKoE,SAIoB,IAArBN,EAAEc,QAAQlD,QAEV1B,KAAK6E,WAAWf,EAAEgB,eAAe,GAAGC,QAASjB,EAAEgB,eAAe,GAAGE,SAK7ErB,cAAcsB,EAAGC,GAEb,OAAOC,KAAKC,IAAIpF,KAAKqF,MAAQJ,GAAKjF,KAAKtB,QAAQuE,WAAakC,KAAKC,IAAIpF,KAAKsF,MAAQJ,GAAKlF,KAAKtB,QAAQuE,UAGxGU,UAAUG,GAEN,GAAI9D,KAAK2E,KAEL,GAAyB,IAArBb,EAAEc,QAAQlD,OAEV1B,KAAKoE,aAGT,CACI,MAAMa,EAAInB,EAAEgB,eAAe,GAAGC,QACxBG,EAAIpB,EAAEgB,eAAe,GAAGE,QAC1BhF,KAAKuF,cAAcN,EAAGC,IAEtBlF,KAAKoE,UAOrBT,SAEI3D,KAAK2E,MAAO,EACR3E,KAAKwF,uBAELC,aAAazF,KAAKwF,sBAClBxF,KAAKwF,qBAAuB,MAE5BxF,KAAK0F,qBAELD,aAAazF,KAAK0F,oBAClB1F,KAAK0F,mBAAqB,MAIlC/B,SAASG,GAED9D,KAAK2E,OAELb,EAAE6B,iBACF3F,KAAK4F,aAAa9B,EAAGA,EAAE+B,YAI/BlC,aAAaG,GAEL9D,KAAKtB,QAAQyE,cAEbnD,KAAKwF,qBAAuBM,WAAW,IAAM9F,KAAK+F,oBAAoBjC,GAAI9D,KAAKtB,QAAQ0E,mBAElFpD,KAAKtB,QAAQwE,SAElBlD,KAAKyD,SAAS,CAAEtD,MAAO2D,EAAGhF,KAAM,YAEhCkB,KAAK0F,qBAELD,aAAazF,KAAK0F,oBAClB1F,KAAK0F,mBAAqB,MAE9B1F,KAAK2E,MAAO,EAGhBhB,WAAWG,EAAGmB,EAAGC,GAETlF,KAAKwF,qBAEDxF,KAAKuF,cAAcN,EAAGC,IAElBlF,KAAKtB,QAAQwE,SAEblD,KAAKyD,SAAS,CAAEtD,MAAO2D,EAAGhF,KAAM,YAEpCkB,KAAKoE,WAILpE,KAAKyD,SAAS,CAAEtD,MAAO2D,EAAGhF,KAAM,mBAChCkB,KAAKoE,WAKTpE,KAAKqF,MAAQJ,EACbjF,KAAKsF,MAAQJ,EACblF,KAAK2E,MAAO,EACR3E,KAAKtB,QAAQ2E,cAEbrD,KAAK0F,mBAAqBI,WAAW,IAAM9F,KAAKqD,YAAYS,GAAI9D,KAAKtB,QAAQ4E,kBAE7EtD,KAAKtB,QAAQ8E,WACbxD,KAAKyD,SAAS,CAAEtD,MAAO2D,EAAGhF,KAAM,gBAK5C6E,YAAYG,GAER9D,KAAKgG,kBAAoB,KACzBhG,KAAK2E,MAAO,EACZ3E,KAAKyD,SAAS,CAAEtD,MAAO2D,EAAGhF,KAAM,iBAGpC6E,oBAAoBG,GAEhB9D,KAAKwF,qBAAuB,KACxBxF,KAAKtB,QAAQwE,SAEblD,KAAKyD,SAAS,CAAEtD,MAAO2D,EAAGhF,KAAM,mBAIxC6E,UAAUG,IAEY,IAAd9D,KAAK2E,KAEL3E,KAAK2E,MAAO,EAIZ3E,KAAK6E,WAAWf,EAAGA,EAAEiB,QAASjB,EAAEkB,SAIxCrB,UAAUG,GAEN,GAAI9D,KAAK2E,KACT,CACI,MAAMM,EAAInB,EAAEiB,QACNG,EAAIpB,EAAEkB,QACRhF,KAAKuF,cAAcN,EAAGC,IAEtBlF,KAAKoE,UAKjBT,QAAQG,GAEA9D,KAAK2E,OAELb,EAAE6B,iBACF3F,KAAK4F,aAAa9B,KCtRvB,MAAMmC,EAAS,CAMlBC,0BAA2B,CACvBC,UAAW,OACXC,SAAY,WACZC,IAAO,EACPC,KAAQ,EACRC,cAAe,OACfC,YAAa,UAOjBC,qBAAsB,CAClBC,QAAW,OACXN,SAAY,WACZO,iBAAkB,MAClBC,MAAS,QACTC,gBAAmB,mBACnBC,MAAS,QACTC,OAAU,OACVC,aAAc,QACdC,QAAW,QAOfC,wBAAyB,CACrBC,QAAW,eACXC,OAAU,EACVC,cAAe,OAOnBC,UAAW,CACPX,iBAAkB,SAClBP,SAAY,WACZG,cAAe,OACfK,MAAS,QACTT,UAAW,OACXU,gBAAmB,QACnBE,OAAU,4BACVQ,UAAa,gCAOjBC,SAAU,CACNd,QAAW,OACXS,QAAW,sBACXE,cAAe,SAOnBI,iBAAkB,CACdC,QAAW,IAOfC,eAAgB,CACZC,gBAAiB,4BACjBR,OAAU,WAQdS,oBAAqB,CACjBC,kBAAmB,YACnBC,wBAAyB,mBAO7BC,mBAAoB,GAOpBC,wBAAyB,kBAMzBC,QAAS,EAMTC,iBAAkB,KCmJf,MAAMC,EAAc,IApQ3B,MAEIzE,OAGS3D,KAAKqI,cAENrI,KAAKsI,SAAW,GAChBtI,KAAKuI,KAAO,GACZ3J,SAAS4J,KAAKlE,iBAAiB,UAAWR,GAAK9D,KAAKyI,SAAS3E,IAC7DlF,SAAS4J,KAAKlE,iBAAiB,QAASR,GAAK9D,KAAK0I,OAAO5E,IACzD9D,KAAKqI,aAAc,GAK3B1E,gBAEI3D,KAAKsI,SAAW,GAIpB3E,YAEI3D,KAAKuI,KAAO,GAShB5E,qBAAqBgF,EAAQC,GAEzB,GAAID,EACJ,CACI,MAAME,GAAWD,EAASE,KAAKC,gBAAkB,OAAS,IAAMJ,EAChE3I,KAAKsI,SAAStI,KAAKgJ,YAAYH,IAAY/E,IAEvC8E,EAASK,YAAYnF,GACrBA,EAAEoF,kBACFpF,EAAE6B,mBASdhC,oBAAoBmF,GAEhB9I,KAAKsI,SAAiB,OAAI,IAAMQ,EAAKK,WACrCnJ,KAAKsI,SAAgB,MAAIxE,GAAKgF,EAAKM,MAAMtF,GACzC9D,KAAKsI,SAAgB,MAAIxE,GAAKgF,EAAKM,MAAMtF,GACzC9D,KAAKsI,SAAqB,WAAIxE,GAAKgF,EAAKO,KAAKvF,EAAG,SAChD9D,KAAKsI,SAAoB,UAAIxE,GAAKgF,EAAKO,KAAKvF,EAAG,QAC/C9D,KAAKsI,SAAkB,QAAIxE,GAAKgF,EAAKO,KAAKvF,EAAG,MAC7C9D,KAAKsI,SAAoB,UAAIxE,GAAKgF,EAAKO,KAAKvF,EAAG,QAQnDH,YAAY2F,EAASC,GAEjBvJ,KAAKwJ,IAAM,CAAEF,QAAAA,EAASC,SAAAA,GAM1B5F,0BAEI3D,KAAKsI,SAAW,GA+BpB3E,YAAYkF,GAER,MAAMN,EAAO,GACb,IAAIkB,EAIAA,GAHJZ,GAAW,IACCnH,OAAS,IAA+B,IAA1BmH,EAAQa,QAAQ,KAE9Bb,EAAQY,MAAM,KAId,CAACZ,GAEb,IAAK,IAAIc,KAAQF,EACjB,CACI,IAAIG,EAAM,GACNC,EAAY,GAEhB,GADAF,EAAOA,EAAKG,cAAcC,QAAQ,IAAK,KACZ,IAAvBJ,EAAKD,QAAQ,KACjB,CACI,MAAMD,EAAQE,EAAKF,MAAM,KACzB,IAAK,IAAIjI,EAAI,EAAGA,EAAIiI,EAAM/H,OAAS,EAAGF,IACtC,CACI,IAAIwI,EAAWP,EAAMjI,GACrBwI,EAAWA,EAASD,QAAQ,mBAAoB,QAChDC,EAAWA,EAASD,QAAQ,UAAW,QACvCC,EAAWA,EAASD,QAAQ,UAAW,QACvCF,EAAUrJ,KAAKwJ,GAEnBH,EAAYA,EAAUI,KAAK,CAACC,EAAGC,IAAeD,EAAE,GAAKC,EAAE,GAAK,EAAID,EAAE,GAAKC,EAAE,IAAM,EAAI,GACnF,IAAK,IAAIC,KAAQP,EAEbD,GAAOQ,EAAO,IAElBR,GAAOH,EAAMA,EAAM/H,OAAS,QAI5BkI,EAAMD,EAEVpB,EAAK/H,KAAKoJ,GAEd,OAAOrB,EAQX5E,YAAYkF,GAER,IAAIe,EAAM,GACV,MAAMS,EAAQrK,KAAKgJ,YAAYH,GAC/B,IAAK,IAAIrH,EAAI,EAAGA,EAAI6I,EAAM3I,OAAQF,IAClC,CACI,MAAMqH,EAAUwB,EAAM7I,GACtB,IAA8B,IAA1BqH,EAAQa,QAAQ,KACpB,CACI,MAAMD,EAAQZ,EAAQiB,cAAcL,MAAM,KAC1C,IAAK,IAAIjI,EAAI,EAAGA,EAAIiI,EAAM/H,OAAS,EAAGF,IACtC,CACI,IAAIwI,EAAWP,EAAMjI,GACrBoI,GAAOI,EAAS,GAAGM,cAAgBN,EAASO,OAAO,GAAK,IAE5DX,GAAOH,EAAMA,EAAM/H,OAAS,GAAG4I,mBAI/BV,EAAMf,EAAQyB,cAEd9I,IAAM6I,EAAM3I,OAAS,IAErBkI,GAAO,QAGf,OAAOA,EAQXjG,SAASkF,EAASpF,GAEd,MAAM8E,EAAOvI,KAAKgJ,YAAYH,GAC9B,IAAK,IAAIe,KAAOrB,EAEZvI,KAAKuI,KAAKqB,GAAO9F,IAEbL,EAASK,GACTA,EAAE6B,iBACF7B,EAAEoF,mBAKdvF,OAAOG,IAEC9D,KAAKwJ,KAAmB,YAAX1F,EAAE6F,MAAiC,aAAX7F,EAAE6F,OAEvC3J,KAAKwJ,IAAID,WACTvJ,KAAKwJ,IAAIgB,WAAY,GAI7B7G,SAASG,IAED9D,KAAKwJ,KAAQxJ,KAAKwJ,IAAIgB,WAAyB,YAAX1G,EAAE6F,MAAiC,aAAX7F,EAAE6F,OAE9D3J,KAAKwJ,IAAIF,UACTtJ,KAAKwJ,IAAIgB,WAAY,EACrB1G,EAAE6B,kBAEN,MAAMkE,EAAY,GACd/F,EAAE2G,QAEFZ,EAAUrJ,KAAK,OAEfsD,EAAE4G,SAEFb,EAAUrJ,KAAK,QAEfsD,EAAE6G,SAEFd,EAAUrJ,KAAK,QAEfsD,EAAE8G,UAEFf,EAAUrJ,KAAK,SAEnB,IAAIqI,EAAU,GACd,IAAK,IAAImB,KAAYH,EAEjBhB,GAAWmB,EAAW,IAE1B,IAAIa,EAAY/G,EAAE6F,KAAKG,cACvBe,EAAYA,EAAUd,QAAQ,QAAS,IACvCc,EAAYA,EAAUd,QAAQ,MAAO,IACrClB,GAAWgC,EACP7K,KAAKsI,SAASO,GAEd7I,KAAKsI,SAASO,GAAS/E,GAElB9D,KAAKuI,KAAKM,IAEf7I,KAAKuI,KAAKM,GAAS/E,KCxPxB,MAAMgH,EAETnH,YAAYjF,GAER0J,EAAY2C,OACZrM,EAAUA,GAAW,GACrBsB,KAAKgL,IAAMpM,SAASC,cAAc,OAClCmB,KAAKjB,OAASL,EAAQK,OACtBiB,KAAKiL,SAAW,GAChBjL,KAAKkL,YAAYjF,EAAOqB,WACxBtH,KAAKgL,IAAIG,UAAY,EAOzBxH,OAAOiF,GAECA,EAASwC,UAETxC,EAASwC,QAAQtC,KAAO9I,MAE5B4I,EAASE,KAAO9I,KAChBA,KAAKgL,IAAI1L,YAAYsJ,EAASoC,KACR,cAAlBpC,EAAS9J,MAETkB,KAAKiL,SAASzK,KAAKoI,GAS3BjF,OAAO0H,EAAKzC,GAEJyC,GAAOrL,KAAKgL,IAAIM,WAAW5J,OAE3B1B,KAAKuL,OAAO3C,IAIRA,EAASwC,UAETxC,EAASwC,QAAQtC,KAAO9I,MAE5B4I,EAASE,KAAO9I,KAChBA,KAAKgL,IAAIQ,aAAa5C,EAASoC,IAAKhL,KAAKgL,IAAIM,WAAWD,IAClC,cAAlBzC,EAAS9J,MAETkB,KAAKiL,SAASQ,OAAOJ,EAAK,EAAGzC,IAKzCjF,OAEI,IAAI+H,EAAU1L,KAAK8I,KAAK6C,QACxB,KAAOD,GAAWA,EAAQN,SAC1B,CACIM,EAAQV,IAAI9L,MAAM2H,gBAAkB,cACpC6E,EAAQN,QAAQJ,IAAIY,SACpB,IAAIC,EAAOH,EAAQN,QAAQO,QACvBE,IAEAH,EAAQN,QAAQO,QAAQX,IAAI9L,MAAM2H,gBAAkB,cACpD6E,EAAQN,QAAQO,QAAU,MAE9BD,EAAUG,GAIlBlI,KAAKiF,GAGD,GADAR,EAAY0D,0BACR9L,KAAK8I,MAAQ9I,KAAK8I,KAAK6C,UAAY/C,EAEnC5I,KAAK+L,OACL/L,KAAK8I,KAAK6C,QAAU,KACpB3L,KAAKgL,IAAIY,SACT5L,KAAK8I,KAAKkD,uBAGd,CACQhM,KAAK8I,OAED9I,KAAK8I,KAAK6C,UAAqD,IAA1C3L,KAAK8I,KAAKmC,SAASvB,QAAQd,IAEhD5I,KAAK+L,OAET/L,KAAK8I,KAAK6C,QAAU/C,EACpB5I,KAAK8I,KAAKmD,oBAEd,MAAMjB,EAAMpC,EAASoC,IACf3L,EAASW,KAAK8I,KAAKkC,IACrBhL,KAAK8I,KAAKC,iBAEV/I,KAAKgL,IAAI9L,MAAMoH,KAAO0E,EAAIkB,WAAa,KACvClM,KAAKgL,IAAI9L,MAAMmH,IAAM2E,EAAImB,UAAYnB,EAAIoB,aAAe,OAIxDpM,KAAKgL,IAAI9L,MAAMoH,KAAOjH,EAAO6M,WAAa7M,EAAOgN,YAAcpG,EAAOiC,QAAU,KAChFlI,KAAKgL,IAAI9L,MAAMmH,IAAMhH,EAAO8M,UAAYnB,EAAImB,UAAYlG,EAAOiC,QAAU,MAE7ElI,KAAKsM,SAAW1D,EAChB5I,KAAKgM,mBACLlB,EAAKyB,YAAYjN,YAAYU,KAAKgL,KAClC,IAAIwB,EAAQ,EAAGpE,EAAc,EAAGqE,EAAQ,EAAGC,EAAU,EACrD,IAAK,IAAIC,KAAS3M,KAAKiL,SAEnB0B,EAAMC,MAAM1N,MAAM4H,MAAQ,OAC1B6F,EAAMH,MAAMtN,MAAM4H,MAAQ,OAC1B6F,EAAMvE,YAAYlJ,MAAM4H,MAAQ,OAChC6F,EAAMF,MAAMvN,MAAM4H,MAAQ,OACP,aAAf6F,EAAM7N,OAEN4N,EAAUzG,EAAO+B,oBAEjB2E,EAAMvB,UAENqB,EAAQxG,EAAO+B,oBAGvB,IAAK,IAAI2E,KAAS3M,KAAKiL,SACvB,CACI,MAAM4B,EAAuC,EAA1BF,EAAMH,MAAMH,YAC/BG,EAAQK,EAAaL,EAAQK,EAAaL,EAC1C,MAAMM,EAAmBH,EAAMvE,YAAYiE,YAC3CjE,EAAc0E,EAAmB1E,EAAc0E,EAAmB1E,EAC9DuE,EAAMvB,UAENqB,EAAQE,EAAMF,MAAMJ,aAG5B,IAAK,IAAIM,KAAS3M,KAAKiL,SAEnB0B,EAAMC,MAAM1N,MAAM4H,MAAQ4F,EAAU,KACpCC,EAAMH,MAAMtN,MAAM4H,MAAQ0F,EAAQ,KAClCG,EAAMvE,YAAYlJ,MAAM4H,MAAQsB,EAAc,KAC9CuE,EAAMF,MAAMvN,MAAM4H,MAAQ2F,EAAQ,KAElCzM,KAAKgL,IAAIkB,WAAalM,KAAKgL,IAAIqB,YAAcU,OAAOC,aAEpDhN,KAAKgL,IAAI9L,MAAMoH,KAAOyG,OAAOC,WAAahN,KAAKgL,IAAIqB,YAAc,MAEjErM,KAAKgL,IAAImB,UAAYnM,KAAKgL,IAAIoB,aAAeW,OAAOE,cAEpDjN,KAAKgL,IAAI9L,MAAMmH,IAAM0G,OAAOE,YAAcjN,KAAKgL,IAAIoB,aAAe,MAEtEtB,EAAKyB,YAAYzD,KAAKkC,IAAIkC,SAIlCvJ,YAAYwJ,GAER,MAAMpO,EAAS,GACf,IAAK,IAAIG,KAASiO,EAEdpO,EAAOG,GAASiO,EAAKjO,GAEzB,GAAIc,KAAKjB,OAEL,IAAK,IAAIG,KAASc,KAAKjB,OAEnBA,EAAOG,GAASc,KAAKjB,OAAOG,GAGpC,IAAK,IAAIA,KAASH,EAEdiB,KAAKgL,IAAI9L,MAAMA,GAASH,EAAOG,GAIvCyE,mBAEI,IAAK,IAAIgJ,KAAS3M,KAAKiL,SAGnB,GADA0B,EAAMS,eACa,cAAfT,EAAM7N,KACV,CACI,MAAMuO,EAAQV,EAAMW,KAAK5D,QAAQ,MAClB,IAAX2D,GAEAjF,EAAYmF,qBAAqBZ,EAAMW,KAAKD,EAAQ,GAAIV,GAI/D3M,KAAK+I,iBAENX,EAAYoF,oBAAoBxN,MAIxC2D,mBAEI,IAAK,IAAIgJ,KAAS3M,KAAKiL,SAEnB0B,EAAMc,eAId9J,WAEIyE,EAAY0D,0BACZ,IAAIS,EAAczB,EAAKyB,YAAYzD,KACnC,GAAIyD,EAAYZ,QAChB,CACI,IAAI7C,EAAOyD,EACX,KAAOzD,EAAK6C,SAER7C,EAAOA,EAAK6C,QAAQP,QAExB,KAAOtC,IAASA,EAAKC,iBAEbD,EAAK6C,UAEL7C,EAAK6C,QAAQX,IAAI9L,MAAM2H,gBAAkB,cACzCiC,EAAK6C,QAAU,MAEnB7C,EAAKkC,IAAIY,SACT9C,EAAOA,EAAKA,KAEZA,IAEAA,EAAK6C,QAAQX,IAAI9L,MAAMwO,WAAa,cACpC5E,EAAK6C,QAAU,KACf7C,EAAKmD,qBAUjBtI,UAAUgK,GAEN,IAAIN,EACJ,GAAkB,SAAdM,EACJ,CACI,MAAMtO,EAASW,KAAK4N,SAAS9E,KAAKA,KAClCuE,EAAQhO,EAAO4L,SAASvB,QAAQrK,EAAOsM,SACvC0B,IACAA,EAASA,EAAQ,EAAKhO,EAAO4L,SAASvJ,OAAS,EAAI2L,EACnDhO,EAAO4L,SAASoC,GAAOpE,kBAG3B,CACI,IAAI5J,EAASW,KAAK4N,SAAS9E,KAAKA,KAC5B8E,EAAWvO,EAAOsM,QACtB,MAAQtM,EAAO0J,iBAEX6E,EAAS3E,cACT2E,EAAS5C,IAAI9L,MAAM2H,gBAAkB,cACrCxH,EAASA,EAAOyJ,KAChB8E,EAAWvO,EAAOsM,QAEtB0B,EAAQhO,EAAO4L,SAASvB,QAAQkE,GAChCP,IACAA,EAASA,IAAUhO,EAAO4L,SAASvJ,OAAU,EAAI2L,EACjDhO,EAAO4L,SAASoC,GAAOpE,cAE3BjJ,KAAK4N,SAAW,KASpBjK,mBAAmBG,EAAG6J,GAEA,UAAdA,EAEI3N,KAAK4N,SAASxC,SAEdpL,KAAK4N,SAAS3E,YAAYnF,GAC1B9D,KAAK4N,SAASxC,QAAQwC,SAAW5N,KAAK4N,SAASxC,QAAQH,SAAS,GAChEjL,KAAK4N,SAASxC,QAAQwC,SAAS5C,IAAI9L,MAAM2H,gBAAkBZ,EAAOgC,wBAClEjI,KAAK4N,SAAW,MAIhB5N,KAAK6N,UAAUF,GAGA,SAAdA,IAEA3N,KAAK4N,SAAS9E,KAAKA,KAAKC,gBAQzB/I,KAAK6N,UAAUF,IANf3N,KAAK4N,SAAS9E,KAAKwD,SAASrD,YAAYnF,GACxC9D,KAAK4N,SAAS9E,KAAKA,KAAK8E,SAAW5N,KAAK4N,SAAS9E,KAAKwD,SACtDtM,KAAK4N,SAAW,OAOxB9J,EAAEoF,kBACFpF,EAAE6B,iBAQNhC,KAAKG,EAAG6J,GAEJ,GAAI3N,KAAK4N,SACT,CACI5N,KAAK4N,SAAS5C,IAAI9L,MAAM2H,gBAAkB,cAC1C,IAAIwG,EAAQrN,KAAKiL,SAASvB,QAAQ1J,KAAK4N,UACvC,GAAkB,SAAdD,EAEAN,IACAA,EAASA,IAAUrN,KAAKiL,SAASvJ,OAAU,EAAI2L,MAE9C,CAAA,GAAkB,OAAdM,EAOL,OAAO3N,KAAK8N,mBAAmBhK,EAAG6J,GALlCN,IACAA,EAASA,EAAQ,EAAKrN,KAAKiL,SAASvJ,OAAS,EAAI2L,EAMrDrN,KAAK4N,SAAW5N,KAAKiL,SAASoC,QAM1BrN,KAAK4N,SAFS,OAAdD,EAEgB3N,KAAKiL,SAASjL,KAAKiL,SAASvJ,OAAS,GAIrC1B,KAAKiL,SAAS,GAGlCjL,KAAK4N,WAEL5N,KAAK4N,SAAS5C,IAAI9L,MAAM2H,gBAAkBZ,EAAOgC,yBAErDnE,EAAE6B,iBACF7B,EAAEoF,kBAONvF,MAAMG,GAEE9D,KAAK4N,WAEL5N,KAAK4N,SAAS3E,YAAYnF,GAC1BA,EAAE6B,iBACF7B,EAAEoF,mBASV6E,YAEI,OAAO/N,KAAKiL,SAOhBtH,8BAEI3D,KAAKiM,mBACL7D,EAAY4F,YAAY,KAEfhO,KAAK2L,SAEN3L,KAAKgM,oBAEV,KAEChM,KAAKiM,qBAQbhG,oBAEI,OAAOA,EAOXtC,8BAEI,OAAOmH,EAAKyB,YAAczB,EAAKyB,YAAYH,aAAe,EAQ9DzI,0BAA0BmF,EAAMzJ,EAAOT,SAAS4J,MAE5CJ,EAAY6F,gBACRnD,EAAKyB,aAELzB,EAAKyB,YAAYX,SAErBd,EAAKyB,YAAc9N,EAAK,CAAEY,OAAAA,EAAQN,OAAQkH,EAAOC,4BACjD4E,EAAKyB,YAAYzD,KAAOA,EACxBA,EAAKoC,YAAYjF,EAAOQ,sBACxB,IAAK,IAAIkG,KAAS7D,EAAKmC,SAEnB0B,EAAMzB,YAAYjF,EAAOiB,yBACrByF,EAAMF,QAENE,EAAMF,MAAMvN,MAAMwH,QAAU,QAEhCoC,EAAKkC,IAAI1L,YAAYqN,EAAM3B,KAG/BF,EAAKyB,YAAYjN,YAAYwJ,EAAKkC,KAClClC,EAAKC,iBAAkB,EACvBD,EAAKkC,IAAIG,UAAY,EAGrBrC,EAAKkC,IAAI1G,iBAAiB,QAAS,KAE1BwE,EAAK6C,SAEN7C,EAAKkC,IAAIkD,SAKjBpF,EAAKkC,IAAI1G,iBAAiB,OAAQ,KAE1BwE,EAAK6C,SAEL7C,EAAKK,aAGbL,EAAKqF,+BC1bN,MAAMC,UAAezO,EAExBgE,YAAY0K,EAAI3P,EAAU,IAEtB4P,QACAtO,KAAKqO,GAAKA,EACVrO,KAAKtB,QAAUA,EACfsB,KAAKuO,QAAgC,IAApBvO,KAAKtB,QAAQ6P,GAAqBH,EAAOG,KAAOvO,KAAKtB,QAAQ6P,GAE9EvO,KAAKwO,aACLxO,KAAKyO,gBACLzO,KAAK0O,kBACL1O,KAAK2O,iBACD3O,KAAKtB,QAAQkQ,WAEb5O,KAAK6O,gBAET7O,KAAK8O,iBACL9O,KAAK+O,kBACL/O,KAAKgP,aAELhP,KAAKiP,QAAS,EACdjP,KAAKkP,WAAY,EAEjBlP,KAAKmP,SAAU,EACfnP,KAAKoP,SAAW,KAChBpP,KAAKqP,QAAU,KACfrP,KAAKsP,UAAY,KACjBtP,KAAKuP,kBAAoB,CAAEC,SAAU,GAAIC,WAAY,IAOzD9L,KAAK+L,GAEG1P,KAAKmP,UAELnP,KAAK2P,IAAIzQ,MAAMwH,QAAU,QACzB1G,KAAKmP,SAAU,EACfnP,KAAK8B,KAAK,OAAQ9B,MACb0P,GAED1P,KAAKkN,SAQjBvJ,QAEI3D,KAAKiP,QAAS,EACVjP,KAAKtB,QAAQkR,WAEb5P,KAAK6P,YAAY3Q,MAAM2H,gBAAkB7G,KAAKtB,QAAQoR,0BAE1D9P,KAAK8B,KAAK,QAAS9B,MAMvB2D,OAEI3D,KAAKiP,QAAS,EACVjP,KAAKtB,QAAQkR,WAEb5P,KAAK6P,YAAY3Q,MAAM2H,gBAAkB7G,KAAKtB,QAAQqR,4BAE1D/P,KAAK8B,KAAK,OAAQ9B,MAMtB2D,QAES3D,KAAKmP,UAENnP,KAAKmP,SAAU,EACfnP,KAAK2P,IAAIzQ,MAAMwH,QAAU,OACzB1G,KAAK8B,KAAK,QAAS9B,OAS3BgQ,aAEI,OAAOhQ,KAAKmP,QAOhBlK,QAAU,OAAOjF,KAAKtB,QAAQuG,EAC9BA,MAAMgL,GAEEA,IAAUjQ,KAAKtB,QAAQuG,IAEvBjF,KAAKtB,QAAQuG,EAAIgL,EACjBjQ,KAAK8B,KAAK,SAAU9B,MACpBA,KAAK+O,mBAIbpL,kBAEI3D,KAAK2P,IAAIzQ,MAAMgR,UAAY,aAAalQ,KAAKtB,QAAQuG,OAAOjF,KAAKtB,QAAQwG,OAO7EA,QAAU,OAAOlF,KAAKtB,QAAQwG,EAC9BA,MAAM+K,GAEEA,IAAUjQ,KAAKtB,QAAQwG,IAEvBlF,KAAKtB,QAAQwG,EAAI+K,EACjBjQ,KAAK+O,kBACL/O,KAAK8B,KAAK,SAAU9B,OAQ5B8G,YAAc,OAAO9G,KAAKtB,QAAQoI,OAAS9G,KAAK2P,IAAItD,YACpDvF,UAAUmJ,GAEFA,IAAUjQ,KAAKtB,QAAQoI,QAEnBmJ,GAEAjQ,KAAK2P,IAAIzQ,MAAM4H,MAAWmJ,EAAH,KACvBjQ,KAAKtB,QAAQoI,MAAQ9G,KAAK2P,IAAItD,cAI9BrM,KAAK2P,IAAIzQ,MAAM4H,MAAQ,OACvB9G,KAAKtB,QAAQoI,MAAQ,IAEzB9G,KAAK8B,KAAK,eAAgB9B,OAQlCmQ,aAAe,OAAOnQ,KAAKtB,QAAQyR,QAAUnQ,KAAK2P,IAAIvD,aACtD+D,WAAWF,GAEHA,IAAUjQ,KAAKtB,QAAQyR,SAEnBF,GAEAjQ,KAAK2P,IAAIzQ,MAAMiR,OAAYF,EAAH,KACxBjQ,KAAKtB,QAAQyR,OAASnQ,KAAK2P,IAAIvD,eAI/BpM,KAAK2P,IAAIzQ,MAAMiR,OAAS,OACxBnQ,KAAKtB,QAAQyR,OAAS,IAE1BnQ,KAAK8B,KAAK,gBAAiB9B,OASnC2D,OAAOmD,EAAOqJ,GAEVnQ,KAAK8G,MAAQA,EACb9G,KAAKmQ,OAASA,EAQlBxM,KAAKsB,EAAGC,GAEJ,MAAMkL,EAAapQ,KAAKoQ,WACxB,GAAIA,EACJ,CACI,IAAmB,IAAfA,GAAsC,eAAfA,EAC3B,CACI,MAAMtJ,EAAQ9G,KAAKqO,GAAGsB,IAAItD,YAE1BpH,GADAA,EAAIA,EAAIjF,KAAK8G,MAAQA,EAAQA,EAAQ9G,KAAK8G,MAAQ7B,GAC1C,EAAI,EAAIA,EAEpB,IAAmB,IAAfmL,GAAsC,aAAfA,EAC3B,CACI,MAAMD,EAASnQ,KAAKqO,GAAGsB,IAAIvD,aAC3BlH,EAAIA,EAAIlF,KAAKmQ,OAASA,EAASA,EAASnQ,KAAKmQ,OAASjL,EACtD,MAAMmB,EAAMyE,EAAKuF,uBACjBnL,EAAIA,EAAImB,EAAMA,EAAMnB,GAGxBD,IAAMjF,KAAKtB,QAAQuG,IAEnBjF,KAAKtB,QAAQuG,EAAIA,EACjBjF,KAAK8B,KAAK,SAAU9B,OAEpBkF,IAAMlF,KAAKtB,QAAQwG,IAEnBlF,KAAKtB,QAAQwG,EAAIA,EACjBlF,KAAK8B,KAAK,SAAU9B,OAExBA,KAAK+O,kBAMTpL,WAEI,GAAI3D,KAAKtB,QAAQ4R,YAEb,GAAItQ,KAAKkP,UAELlP,KAAKiF,EAAIjF,KAAKkP,UAAUjK,EACxBjF,KAAKkF,EAAIlF,KAAKkP,UAAUhK,EACxBlF,KAAK8G,MAAQ9G,KAAKkP,UAAUpI,MAC5B9G,KAAKmQ,OAASnQ,KAAKkP,UAAUiB,OAC7BnQ,KAAKkP,UAAY,KACjBlP,KAAK8B,KAAK,UAAW9B,MACrBA,KAAKuQ,QAAQC,SAASpR,UAAYY,KAAKtB,QAAQ+R,mBAGnD,CACI,MAAMxL,EAAIjF,KAAKiF,EAAGC,EAAIlF,KAAKkF,EAAG4B,EAAQ9G,KAAK2P,IAAItD,YAAa8D,EAASnQ,KAAK2P,IAAIvD,aAC9EpM,KAAKkP,UAAY,CAAEjK,EAAAA,EAAGC,EAAAA,EAAG4B,MAAAA,EAAOqJ,OAAAA,GAChCnQ,KAAKiF,EAAI,EACTjF,KAAKkF,EAAI,EACTlF,KAAK8G,MAAQ9G,KAAKqO,GAAGqC,UAAUrE,YAC/BrM,KAAKmQ,OAASnQ,KAAKqO,GAAGqC,UAAUtE,aAChCpM,KAAK8B,KAAK,WAAY9B,MACtBA,KAAKuQ,QAAQC,SAASpR,UAAYY,KAAKtB,QAAQiS,eAQ3DhN,aAEI3D,KAAKqO,GAAGuC,WAAW5Q,MAMvB2D,cAEI3D,KAAKqO,GAAGwC,YAAY7Q,MAOxB2D,OAEI,MAAMmN,EAAO,GACP5B,EAAYlP,KAAKkP,UAgBvB,OAfIA,IAEA4B,EAAK5B,UAAY,CAAE5I,KAAM4I,EAAU5I,KAAMD,IAAK6I,EAAU7I,IAAKS,MAAOoI,EAAUpI,MAAOqJ,OAAQjB,EAAUiB,SAE3GW,EAAK7L,EAAIjF,KAAKiF,EACd6L,EAAK5L,EAAIlF,KAAKkF,OACoB,IAAvBlF,KAAKtB,QAAQoI,QAEpBgK,EAAKhK,MAAQ9G,KAAKtB,QAAQoI,YAEK,IAAxB9G,KAAKtB,QAAQyR,SAEpBW,EAAKX,OAASnQ,KAAKtB,QAAQyR,QAE/BW,EAAKd,OAAShQ,KAAKmP,QACZ2B,EAOXnN,KAAKmN,GAEGA,EAAK5B,UAEAlP,KAAKkP,WAENlP,KAAKwQ,UAAS,GAGbxQ,KAAKkP,WAEVlP,KAAKwQ,UAAS,QAEQ,IAAfM,EAAKhK,MAEZ9G,KAAK8G,MAAQgK,EAAKhK,MAIlB9G,KAAK2P,IAAIzQ,MAAM4H,MAAQ,YAEA,IAAhBgK,EAAKX,OAEZnQ,KAAKmQ,OAASW,EAAKX,OAInBnQ,KAAK2P,IAAIzQ,MAAMiR,OAAS,OAE5BnQ,KAAKqJ,KAAKyH,EAAK7L,EAAG6L,EAAK5L,GACnB4L,EAAKd,OAELhQ,KAAK+Q,OAAM,GAEN/Q,KAAKgQ,QAEVhQ,KAAKgR,MAAK,GAAM,GAEpBhR,KAAK8B,KAAK,UAOdmP,YAAc,OAAOjR,KAAKkR,OAC1BD,UAAUhB,GAENjQ,KAAKmR,SAASC,UAAYnB,EAC1BjQ,KAAK8B,KAAK,eAAgB9B,MAQ9BqR,YAAc,OAAOrR,KAAKiF,EAAIjF,KAAK8G,MACnCuK,UAAUpB,GAENjQ,KAAKiF,EAAIgL,EAAQjQ,KAAK8G,MAO1BwK,aAAe,OAAOtR,KAAKkF,EAAIlF,KAAKmQ,OACpCmB,WAAWrB,GAEPjQ,KAAKkF,EAAI+K,EAAQjQ,KAAKmQ,OAO1BxM,OAAOgM,GAECA,EAEA3P,KAAKqJ,KACDsG,EAAI1K,EAAI0K,EAAI7I,MAAQ,EAAI9G,KAAK8G,MAAQ,EACrC6I,EAAIzK,EAAIyK,EAAIQ,OAAS,EAAInQ,KAAKmQ,OAAS,GAK3CnQ,KAAKqJ,KACD0D,OAAOC,WAAa,EAAIhN,KAAK8G,MAAQ,EACrCiG,OAAOE,YAAc,EAAIjN,KAAKmQ,OAAS,GAKnDxM,aAOI3D,KAAK2P,IAAMlR,EAAK,CACZY,OAAQW,KAAKqO,GAAGsB,IAChB5Q,OAAQ,CACJ2H,QAAW,OACX6K,gBAAiBvR,KAAKtB,QAAQ8S,aAC9BjL,cAAe,OACfkL,SAAY,SACZrL,SAAY,WACZsL,YAAa1R,KAAKtB,QAAQiT,SAC1BC,aAAc5R,KAAKtB,QAAQmT,UAC3BC,mBAAoB9R,KAAKtB,QAAQqT,iBACjCjL,MAASkL,MAAMhS,KAAKtB,QAAQoI,OAAS9G,KAAKtB,QAAQoI,MAAQ9G,KAAKtB,QAAQoI,MAAQ,KAC/EqJ,OAAU6B,MAAMhS,KAAKtB,QAAQyR,QAAUnQ,KAAKtB,QAAQyR,OAASnQ,KAAKtB,QAAQyR,OAAS,QAChFnQ,KAAKtB,QAAQK,UAK5B4E,gBAOI3D,KAAKiS,OAASxT,EAAK,CACfY,OAAQW,KAAK2P,IACb5Q,OAAQ,CACJ2H,QAAW,OACXC,iBAAkB,SAClBG,MAAS,OACTqJ,OAAU,OACVyB,aAAc5R,KAAKtB,QAAQmT,aAKvClO,iBAOI3D,KAAKkS,QAAUzT,EAAK,CAChBY,OAAQW,KAAKiS,OACbnT,KAAM,UACNC,OAAQ,CACJ2H,QAAW,QACXyL,KAAQ,EACRP,aAAc5R,KAAKtB,QAAQmT,UAC3BO,aAAc,SACdC,aAAc,UAK1B1O,iBAEI3D,KAAKsS,QAAU7T,EAAK,CAChBY,OAAQW,KAAK2P,IACb5Q,OAAQ,CACJ2H,QAAW,OACXN,SAAY,WACZE,KAAQ,EACRD,IAAO,EACPS,MAAS,OACTqJ,OAAU,UAGlBnQ,KAAKsS,QAAQhO,iBAAiB,YAAcR,IAAQ9D,KAAKuS,cAAczO,GAAIA,EAAEoF,oBAC7ElJ,KAAKsS,QAAQhO,iBAAiB,aAAeR,IAAQ9D,KAAKuS,cAAczO,GAAIA,EAAEoF,oBAGlFvF,cAAcG,GACL,MAAM3D,EAAQH,KAAKwS,kBAAkB1O,GAC1C9D,KAAKqP,QAAU,CACXpK,EAAG9E,EAAMsS,MAAQzS,KAAKiF,EACtBC,EAAG/E,EAAMuS,MAAQ1S,KAAKkF,GAE1BlF,KAAK8B,KAAK,aAAc9B,MACxBA,KAAK2S,QAAS,EAGlBhP,kBAEI,GAAI3D,KAAKtB,QAAQkR,SACjB,CACI5P,KAAK6P,YAAcpR,EAAK,CACpBY,OAAQW,KAAKiS,OAAQnT,KAAM,SAAUC,OAAQ,CACzCwH,cAAe,OACfG,QAAW,OACXC,iBAAkB,MAClBiM,cAAe,SACfC,kBAAmB,SACnB1C,OAAUnQ,KAAKtB,QAAQoU,eACvBlB,aAAc5R,KAAKtB,QAAQoU,eAC3B/L,OAAU,EACVI,QAAW,QACXsK,SAAY,YAGpB,MAAMsB,EAAiB,CACnBxM,cAAe,OACf4L,KAAQ,EACRzL,QAAW,OACXC,iBAAkB,MAClBiM,cAAe,SACfrM,cAAe,OACfyM,OAAU,UACV7L,QAAW,EACXC,OAAU,EACVZ,YAAa,OACbyM,cAAe,IACfrM,MAAS5G,KAAKtB,QAAQwU,iBAEtBlT,KAAKtB,QAAQyU,YAEbJ,EAAe,mBAAqB,SAIpCA,EAAe,gBAAkB,MAGrC/S,KAAKmR,SAAW1S,EAAK,CAAEY,OAAQW,KAAK6P,YAAa/Q,KAAM,OAAQL,KAAMuB,KAAKtB,QAAQuS,MAAOlS,OAAQgU,IACjG/S,KAAKoT,iBAEDpT,KAAKtB,QAAQ2U,UAEbrT,KAAK6P,YAAYvL,iBAAiB,YAAcR,GAAM9D,KAAKuS,cAAczO,IACzE9D,KAAK6P,YAAYvL,iBAAiB,aAAeR,GAAM9D,KAAKuS,cAAczO,KAE1E9D,KAAKtB,QAAQ4R,aAEbpN,EAAQlD,KAAK6P,YAAa,IAAM7P,KAAKwQ,WAAY,CAAErN,eAAe,EAAMD,SAAS,KAK7FS,iBAEI3D,KAAKsT,eAAiB7U,EAAK,CACvBY,OAAQW,KAAK6P,YAAa9Q,OAAQ,CAC9B2H,QAAW,OACXC,iBAAkB,MAClBiM,cAAe,SACfW,eAAgB,UAGxB,MAAMC,EAAS,CACX9M,QAAW,eACXK,OAAU,EACVK,OAAU,EACVqM,cAAe,OACftM,QAAW,EACXL,MAAS,OACTqJ,OAAU,OACV2B,mBAAoB,cACpB4B,kBAAmB,QACnBC,oBAAqB,YACrBjM,QAAW,GACXd,MAAS5G,KAAKtB,QAAQkV,iBACtB3M,QAAW,GAEfjH,KAAKuQ,QAAU,GACXvQ,KAAKtB,QAAQ4R,cAEbtQ,KAAKuQ,QAAQC,SAAW/R,EAAK,CAAEY,OAAQW,KAAKsT,eAAgB7U,KAAMuB,KAAKtB,QAAQ+R,eAAgB3R,KAAM,SAAUC,OAAQyU,IACvHtQ,EAAQlD,KAAKuQ,QAAQC,SAAU,IAAMxQ,KAAKwQ,aAE1CxQ,KAAKtB,QAAQmV,WAEb7T,KAAKuQ,QAAQQ,MAAQtS,EAAK,CAAEY,OAAQW,KAAKsT,eAAgB7U,KAAMuB,KAAKtB,QAAQoV,YAAahV,KAAM,SAAUC,OAAQyU,IACjHtQ,EAAQlD,KAAKuQ,QAAQQ,MAAO,IAAM/Q,KAAK+Q,UAE3C,IAAK,IAAInH,KAAO5J,KAAKuQ,QACrB,CACI,MAAMiD,EAASxT,KAAKuQ,QAAQ3G,GAC5B4J,EAAOlP,iBAAiB,YAAa,KAEjCkP,EAAOtU,MAAMwI,QAAU,IAE3B8L,EAAOlP,iBAAiB,WAAY,KAEhCkP,EAAOtU,MAAMwI,QAAU,MAKnC/D,gBAEI3D,KAAK+T,WAAatV,EAAK,CACnBY,OAAQW,KAAKiS,OAAQnT,KAAM,SAAUL,KAAMuB,KAAKtB,QAAQsV,iBAAkBjV,OAAQ,CAC9EqH,SAAY,WACZkL,OAAU,EACVD,MAAS,MACTtK,OAAU,EACVK,OAAU,EACVD,QAAW,EACX6L,OAAU,YACVzM,cAAe,OACf4J,OAAU,OACVrJ,MAAS,OACT4G,WAAc,UAGtB,MAAM/I,EAAQb,IAEV,MAAM3D,EAAQH,KAAKwS,kBAAkB1O,GAC/BgD,EAAQ9G,KAAK8G,OAAS9G,KAAK2P,IAAItD,YAC/B8D,EAASnQ,KAAKmQ,QAAUnQ,KAAK2P,IAAIvD,aACvCpM,KAAKsP,UAAY,CACbxI,MAAOA,EAAQ3G,EAAMsS,MACrBtC,OAAQA,EAAShQ,EAAMuS,OAE3B1S,KAAK8B,KAAK,gBACVgC,EAAE6B,kBAEN3F,KAAK+T,WAAWzP,iBAAiB,YAAaK,GAC9C3E,KAAK+T,WAAWzP,iBAAiB,aAAcK,GAGnDhB,MAAMG,GAEF,MAAM3D,EAAQH,KAAKwS,kBAAkB1O,GAEhC9D,KAAKiU,cAAcnQ,IAAkB,IAAZA,EAAEoQ,QAE5BlU,KAAKqP,SAAWrP,KAAKmU,YACrBnU,KAAKsP,WAAatP,KAAKoU,eAEvBpU,KAAKqP,UAELrP,KAAKqJ,KAAKlJ,EAAMsS,MAAQzS,KAAKqP,QAAQpK,EAAG9E,EAAMuS,MAAQ1S,KAAKqP,QAAQnK,GACnElF,KAAK8B,KAAK,OAAQ9B,MAClB8D,EAAE6B,kBAEF3F,KAAKsP,YAELtP,KAAKqU,OACDlU,EAAMsS,MAAQzS,KAAKsP,UAAUxI,MAC7B3G,EAAMuS,MAAQ1S,KAAKsP,UAAUa,QAEjCnQ,KAAKkP,UAAY,KACjBlP,KAAK8B,KAAK,SAAU9B,MACpB8D,EAAE6B,kBAIVhC,MAEQ3D,KAAKqP,SAELrP,KAAKmU,YAETnU,KAAKsP,WAAatP,KAAKoU,cAG3BzQ,aAEI3D,KAAK2P,IAAIrL,iBAAiB,YAAa,IAAMtE,KAAKkN,SAClDlN,KAAK2P,IAAIrL,iBAAiB,aAAc,IAAMtE,KAAKkN,SAGvDvJ,YAEI3D,KAAKqP,QAAU,KACfrP,KAAK8B,KAAK,WAAY9B,MAG1B2D,cAEI3D,KAAKoP,SAAWpP,KAAKsP,UAAY,KACjCtP,KAAK8B,KAAK,aAAc9B,MAG5B2D,cAAcG,GAEV,QAASiJ,OAAOuH,YAAexQ,aAAaiJ,OAAOuH,WAGvD3Q,kBAAkBG,GAEd,OAAO9D,KAAKiU,cAAcnQ,GAAKA,EAAEgB,eAAe,GAAKhB,EAQzDH,eAAegK,EAAW4G,GAEtBvU,KAAKuP,kBAAkB5B,GAAa4G,EAOxC5Q,WAAW6Q,EAAQpE,GAEfpQ,KAAKwU,OAASA,EACdxU,KAAKoQ,WAAaA,EAClB,IAAInL,EAAIjF,KAAKiF,EACTC,EAAIlF,KAAKkF,EACbD,EAA0C,UAAtCjF,KAAKuP,kBAAkBE,WAAyB+E,EAAOnD,MAAQrR,KAAK8G,MAAQ7B,EAChFA,EAA0C,SAAtCjF,KAAKuP,kBAAkBkF,WAAwBD,EAAOlO,KAAOrB,EACjEC,EAAwC,WAApClF,KAAKuP,kBAAkBC,SAAwBgF,EAAOlD,OAAStR,KAAKmQ,OAASjL,EACjFA,EAAwC,QAApClF,KAAKuP,kBAAkBC,SAAqBgF,EAAOnO,IAAMnB,EAC7DlF,KAAKqJ,KAAKpE,EAAGC,GAOjBvB,QAAQ+Q,GAEJ,OAAQA,IAAiB1U,KAAKmP,UAAYnP,KAAKtB,QAAQiW,MAI3DhR,WAEI,OAAO3D,KAAKmP,QAGhByF,QAEI,OAAOC,SAAS7U,KAAK2P,IAAIzQ,MAAM4V,QAEnCF,MAAM3E,GAEFjQ,KAAK2P,IAAIzQ,MAAM4V,OAAS7E,GAIhC7B,EAAOG,GAAK,ECtwBL,MCEMwG,EAAuB,CAChC9P,EAAG,EACHC,EAAG,EACH4B,WAAOtE,EACP2N,YAAQ3N,EACRmS,OAAO,EACPK,cAAc,EACdzG,GAAI,KAEJoD,SAAU,QACVE,UAAW,OACXL,aAAc,EACdzS,OAAQ,GAERsU,SAAS,EACTzE,WAAW,EACX0B,aAAa,EACbuD,UAAU,EAEVoB,QAAQ,EACRC,QAAQ,EAERtF,UAAU,EACVkD,eAAgB,OAEhBf,iBAAkB,UAClBjC,yBAA0B,UAC1BC,2BAA4B,UAC5B6D,iBAAkB,UAClBV,gBAAiB,UAEjBY,YDjCe,6rBCkCfrD,eDlCkuB,2rBCmCluBE,cDnCg9F,+2BCqCh9FqD,iBDrCohE,w6BCwC3gEmB,EAA8B,CACvCC,OAAO,EACPhF,YAAY,EACZiF,MAAM,EACNC,eAAe,EACfxM,MAAM,EACN/J,OAAQ,GACRwW,gBAAiB,sBCzCfC,EAAqB,CACvBC,QAAQ,EACRC,SAAS,EACTL,KAAM,GACNzO,MAPkB,UAQlB+O,QAAS,EACTC,UARiB,IAuBd,MAAMC,EAETlS,YAAY0K,EAAI3P,EAAQ,IAEpBsB,KAAKqO,GAAKA,EACVrO,KAAKtB,QAAU,IAAK8W,KAAuB9W,GAC3CsB,KAAK8V,WAAarX,EAAK,CAAEY,OAAQW,KAAKqO,GAAGqC,UAAW3R,OAAQ,CAAEqH,SAAU,cACxEpG,KAAKyU,WAAahW,EAAK,CACnBY,OAAQW,KAAK8V,WAAY/W,OAAQ,CAC7B2H,QAAS,OACTN,SAAU,WACV+J,OAAWnQ,KAAKtB,QAAQkX,UAAhB,KACRpE,aAAiBxR,KAAKtB,QAAQkX,UAAhB,KACd/O,gBAAiB7G,KAAKtB,QAAQkI,SAGtC5G,KAAKwP,SAAW/Q,EAAK,CACjBY,OAAQW,KAAK8V,WAAY/W,OAAQ,CAC7B2H,QAAS,OACTN,SAAU,WACVU,MAAU9G,KAAKtB,QAAQkX,UAAhB,KACPpE,aAAiBxR,KAAKtB,QAAQkX,UAAhB,KACd/O,gBAAiB7G,KAAKtB,QAAQkI,SAGtC5G,KAAKyU,WACLzU,KAAK2L,QAAU,GAGnBhI,OAEI3D,KAAK8V,WAAWlK,SAChB5L,KAAK+V,SAAU,EAGnBpS,UAAUgM,GAENA,EAAIhN,GAAG,OAAQ,IAAM3C,KAAKqJ,KAAKsG,IAC/BA,EAAIhN,GAAG,WAAY,IAAM3C,KAAKgW,QAAQrG,IAG1ChM,WAAWsS,EAAMxB,EAAYjF,GAEzB,MAAMnJ,EAAMyE,EAAKuF,uBACXvJ,EAAQ9G,KAAKqO,GAAGsB,IAAIuG,YACpB/F,EAASnQ,KAAKqO,GAAGsB,IAAIwG,aACvBF,EAAK3P,KAAOtG,KAAKtB,QAAQ2W,MAAQvO,GAASmP,EAAK5E,MAAQrR,KAAKtB,QAAQ2W,MAAQ,IAExElQ,KAAKC,IAAI6Q,EAAK5P,IAAMA,IAAQrG,KAAKtB,QAAQ2W,KAEzCZ,EAAWjU,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK5P,IAAMA,GAAMC,KAAM,EAAGQ,MAAAA,EAAOT,IAAKA,EAAKgQ,KAAM,MAAOZ,QAAQ,IAEhGtQ,KAAKC,IAAI6Q,EAAK3E,OAASnB,IAAWnQ,KAAKtB,QAAQ2W,MAEpDZ,EAAWjU,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK3E,OAASnB,GAAS7J,KAAM,EAAGQ,MAAAA,EAAOT,IAAK8J,EAAQkG,KAAM,SAAUZ,QAAQ,KAGrHQ,EAAK5P,IAAMrG,KAAKtB,QAAQ2W,MAAQlF,GAAU8F,EAAK3E,OAAStR,KAAKtB,QAAQ2W,MAAQ,IAEzElQ,KAAKC,IAAI6Q,EAAK3P,KAAO,IAAMtG,KAAKtB,QAAQ2W,KAExC7F,EAAShP,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK3P,KAAO,GAAID,IAAK,EAAG8J,OAAAA,EAAQ7J,KAAM,EAAG+P,KAAM,OAAQZ,QAAQ,IAE7FtQ,KAAKC,IAAI6Q,EAAK5E,MAAQvK,IAAU9G,KAAKtB,QAAQ2W,MAElD7F,EAAShP,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK5E,MAAQvK,GAAQT,IAAK,EAAG8J,OAAAA,EAAQ7J,KAAMQ,EAAOuP,KAAM,QAASZ,QAAQ,KAKxH9R,YAAY2S,EAAUL,EAAMxB,EAAYjF,GAEpC,IAAK,IAAIG,KAAO3P,KAAKqO,GAAGqH,QAEpB,IAAK/F,EAAIjR,QAAQuW,QAAUtF,IAAQ2G,EACnC,CACI,MAAMC,EAAQ5G,EAAIA,IAAI6G,wBAClBP,EAAK3P,KAAOtG,KAAKtB,QAAQ2W,MAAQkB,EAAMlF,OAAS4E,EAAK5E,MAAQrR,KAAKtB,QAAQ2W,MAAQkB,EAAMjQ,OAEpFnB,KAAKC,IAAI6Q,EAAK5P,IAAMkQ,EAAMjF,SAAWtR,KAAKtB,QAAQ2W,MAElDZ,EAAWjU,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK5P,IAAMkQ,EAAMjF,QAAShL,KAAMiQ,EAAMjQ,KAAMQ,MAAOyP,EAAMzP,MAAOT,IAAKkQ,EAAMjF,OAAQ+E,KAAM,QAC1HlR,KAAKC,IAAI6Q,EAAK3P,KAAOiQ,EAAMjQ,OAAStG,KAAKtB,QAAQ2W,KAEjD7F,EAAShP,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK3P,KAAOiQ,EAAMjQ,MAAOD,IAAKkQ,EAAMlQ,IAAK8J,OAAQoG,EAAMpG,OAAQ7J,KAAMiQ,EAAMjQ,KAAM+P,KAAM,OAAQI,WAAW,IAExItR,KAAKC,IAAI6Q,EAAK5E,MAAQkF,EAAMlF,QAAUrR,KAAKtB,QAAQ2W,MAExD7F,EAAShP,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK5E,MAAQkF,EAAMlF,OAAQhL,IAAKkQ,EAAMlQ,IAAK8J,OAAQoG,EAAMpG,OAAQ7J,KAAMiQ,EAAMlF,MAAOgF,KAAM,QAASI,WAAW,KAGhJtR,KAAKC,IAAI6Q,EAAK3E,OAASiF,EAAMlQ,MAAQrG,KAAKtB,QAAQ2W,OAEvDZ,EAAWjU,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK3E,OAASiF,EAAMlQ,KAAMC,KAAMiQ,EAAMjQ,KAAMQ,MAAOyP,EAAMzP,MAAOT,IAAKkQ,EAAMlQ,IAAKgQ,KAAM,WACvHlR,KAAKC,IAAI6Q,EAAK3P,KAAOiQ,EAAMjQ,OAAStG,KAAKtB,QAAQ2W,KAEjD7F,EAAShP,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK3P,KAAOiQ,EAAMjQ,MAAOD,IAAKkQ,EAAMlQ,IAAK8J,OAAQoG,EAAMpG,OAAQ7J,KAAMiQ,EAAMjQ,KAAM+P,KAAM,OAAQI,WAAW,IAExItR,KAAKC,IAAI6Q,EAAK5E,MAAQkF,EAAMlF,QAAUrR,KAAKtB,QAAQ2W,MAExD7F,EAAShP,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK5E,MAAQkF,EAAMlF,OAAQhL,IAAKkQ,EAAMlQ,IAAK8J,OAAQoG,EAAMpG,OAAQ7J,KAAMiQ,EAAMlF,MAAOgF,KAAM,QAASI,WAAW,MAIzJR,EAAK5P,IAAMrG,KAAKtB,QAAQ2W,MAAQkB,EAAMjF,QAAU2E,EAAK3E,OAAStR,KAAKtB,QAAQ2W,MAAQkB,EAAMlQ,MAErFlB,KAAKC,IAAI6Q,EAAK3P,KAAOiQ,EAAMlF,QAAUrR,KAAKtB,QAAQ2W,MAElD7F,EAAShP,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK3P,KAAOiQ,EAAMlF,OAAQhL,IAAKkQ,EAAMlQ,IAAK8J,OAAQoG,EAAMpG,OAAQ7J,KAAMiQ,EAAMlF,MAAOgF,KAAM,SACxHlR,KAAKC,IAAI6Q,EAAK5P,IAAMkQ,EAAMlQ,MAAQrG,KAAKtB,QAAQ2W,KAE/CZ,EAAWjU,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK5P,IAAMkQ,EAAMlQ,KAAMC,KAAMiQ,EAAMjQ,KAAMQ,MAAOyP,EAAMzP,MAAOT,IAAKkQ,EAAMlQ,IAAKgQ,KAAM,MAAOI,WAAW,IAErItR,KAAKC,IAAI6Q,EAAK3E,OAASiF,EAAMjF,SAAWtR,KAAKtB,QAAQ2W,MAE1DZ,EAAWjU,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK3E,OAASiF,EAAMjF,QAAShL,KAAMiQ,EAAMjQ,KAAMQ,MAAOyP,EAAMzP,MAAOT,IAAKkQ,EAAMjF,OAAQ+E,KAAM,SAAUI,WAAW,KAGrJtR,KAAKC,IAAI6Q,EAAK5E,MAAQkF,EAAMjQ,OAAStG,KAAKtB,QAAQ2W,OAEvD7F,EAAShP,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK5E,MAAQkF,EAAMjQ,MAAOD,IAAKkQ,EAAMlQ,IAAK8J,OAAQoG,EAAMpG,OAAQ7J,KAAMiQ,EAAMjQ,KAAM+P,KAAM,UACvHlR,KAAKC,IAAI6Q,EAAK5P,IAAMkQ,EAAMlQ,MAAQrG,KAAKtB,QAAQ2W,KAE/CZ,EAAWjU,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK5P,IAAMkQ,EAAMlQ,KAAMC,KAAMiQ,EAAMjQ,KAAMQ,MAAOyP,EAAMzP,MAAOT,IAAKkQ,EAAMlQ,IAAKgQ,KAAM,MAAOI,WAAW,IAErItR,KAAKC,IAAI6Q,EAAK3E,OAASiF,EAAMjF,SAAWtR,KAAKtB,QAAQ2W,MAE1DZ,EAAWjU,KAAK,CAAE4V,SAAUjR,KAAKC,IAAI6Q,EAAK3E,OAASiF,EAAMjF,QAAShL,KAAMiQ,EAAMjQ,KAAMQ,MAAOyP,EAAMzP,MAAOT,IAAKkQ,EAAMjF,OAAQ+E,KAAM,SAAUI,WAAW,OAQ9K9S,KAAKgM,GAED,GAAI3P,KAAK+V,SAAWpG,EAAIjR,QAAQuW,QAAUtF,EAAI+G,UAE1C,OAEJ1W,KAAKyU,WAAWvV,MAAMwH,QAAU,OAChC1G,KAAKwP,SAAStQ,MAAMwH,QAAU,OAC9B,MAAM+N,EAAa,GACbjF,EAAW,GACXyG,EAAOtG,EAAIA,IAAI6G,wBASrB,GARIxW,KAAKtB,QAAQ+W,QAEbzV,KAAK2W,WAAWV,EAAMxB,EAAYjF,GAElCxP,KAAKtB,QAAQgX,SAEb1V,KAAK4W,YAAYjH,EAAKsG,EAAMxB,EAAYjF,GAExCiF,EAAW/S,OACf,CACI+S,EAAWxK,KAAK,CAACC,EAAGC,IAAeD,EAAEkM,SAAWjM,EAAEiM,UAClD,MAAMS,EAAOpC,EAAW,GACxBzU,KAAKyU,WAAWvV,MAAMwH,QAAU,QAChC1G,KAAKyU,WAAWvV,MAAM4H,MAAQ+P,EAAK/P,MAAQ,KAC3C9G,KAAKyU,WAAWvP,EAAI2R,EAAKxQ,IAAMrG,KAAKtB,QAAQkX,UAAY,EACxD5V,KAAKyU,WAAWqC,UAAYD,EAAKxQ,IACjCrG,KAAKyU,WAAWvV,MAAMgR,UAAY,aAAa2G,EAAKvQ,UAAUtG,KAAKyU,WAAWvP,OAC9ElF,KAAKyU,WAAW4B,KAAOQ,EAAKR,KAC5BrW,KAAKyU,WAAWgC,UAAYI,EAAKJ,UACjCzW,KAAKyU,WAAWgB,OAASoB,EAAKpB,OAElC,GAAIjG,EAAS9N,OACb,CACI8N,EAASvF,KAAK,CAACC,EAAGC,IAAeD,EAAEkM,SAAWjM,EAAEiM,UAChD,MAAMS,EAAOrH,EAAS,GACtBxP,KAAKwP,SAAStQ,MAAMwH,QAAW,QAC/B1G,KAAKwP,SAAStQ,MAAMiR,OAAS0G,EAAK1G,OAAS,KAC3CnQ,KAAKwP,SAASvK,EAAI4R,EAAKvQ,KAAOtG,KAAKtB,QAAQkX,UAAY,EACvD5V,KAAKwP,SAASuH,UAAYF,EAAKvQ,KAC/BtG,KAAKwP,SAAStQ,MAAMgR,UAAY,aAAalQ,KAAKwP,SAASvK,OAAO4R,EAAKxQ,SACvErG,KAAKwP,SAAS6G,KAAOQ,EAAKR,KAC1BrW,KAAKwP,SAASiH,UAAYI,EAAKJ,UAC/BzW,KAAKwP,SAASiG,OAASoB,EAAKpB,QAIpC9R,QAAQgM,GAEJ,GAAI3P,KAAK+V,QAEL,OAEJ,MAAMvB,EAASxU,KAAKqO,GAAGmG,OACjBnO,EAAMyE,EAAKuF,uBACjB,GAAsC,UAAlCrQ,KAAKyU,WAAWvV,MAAMwH,QAC1B,CACI,MAAMiP,EAAU3V,KAAKyU,WAAWgC,UAAY,EAAIzW,KAAKtB,QAAQiX,QAC7D,OAAQ3V,KAAKyU,WAAW4B,MAEpB,IAAK,MACD1G,EAAIzK,EAAIlF,KAAKyU,WAAWqC,UAAYnB,EAAUnB,EAAOnO,IAAMA,EAC3D,MAEJ,IAAK,SACDsJ,EAAI2B,OAASnM,KAAK6R,MAAMhX,KAAKyU,WAAWqC,UAAYnB,EAAUnB,EAAOnO,IAAMA,GAGnFsJ,EAAIsH,eAAe,WAAYjX,KAAKyU,WAAWgB,OAASzV,KAAKyU,WAAW4B,KAAO,IAEnF,GAAoC,UAAhCrW,KAAKwP,SAAStQ,MAAMwH,QACxB,CACI,MAAMiP,EAAU3V,KAAKwP,SAASiH,UAAY,EAAIzW,KAAKtB,QAAQiX,QAC3D,OAAQ3V,KAAKwP,SAAS6G,MAElB,IAAK,OACD1G,EAAI1K,EAAIjF,KAAKwP,SAASuH,UAAYpB,EAAUnB,EAAOlO,KACnD,MAEJ,IAAK,QACDqJ,EAAI0B,MAAQlM,KAAK6R,MAAMhX,KAAKwP,SAASuH,UAAYpB,EAAUnB,EAAOlO,MAG1EqJ,EAAIsH,eAAe,aAAcjX,KAAKwP,SAASiG,OAASzV,KAAKwP,SAAS6G,KAAO,IAEjFrW,KAAKyU,WAAWvV,MAAMwH,QAAU1G,KAAKwP,SAAStQ,MAAMwH,QAAU,wBCpO/D,MAEH/C,YAAYjF,EAAU,GAAIwY,EAAgB,IAEtClX,KAAKtB,QAAU,IAAKyW,KAAgCzW,GACpDsB,KAAKtB,QAAQW,OAASW,KAAKtB,QAAQW,QAAUT,SAAS4J,KACjDxI,KAAKtB,QAAQ0W,OAEd5Q,QAAQ2S,IAAI,2CAA4C,kBAE5DnX,KAAK0V,QAAU,GACf1V,KAAKiP,OAAS,KACdjP,KAAKoX,YACLpX,KAAKqX,kBACLrX,KAAKsX,cACDtX,KAAKtB,QAAQ2W,MAEbrV,KAAKqV,MAA2B,IAAtBrV,KAAKtB,QAAQ2W,KAAgB,GAAKrV,KAAKtB,QAAQ2W,MAE7DrV,KAAKkX,cAAgB,IAAKnC,KAAyBmC,GACnDnK,OAAOzI,iBAAiB,SAAU,IAAMtE,KAAKqU,UACxCrU,KAAKtB,QAAQ4W,eAEdlN,EAAY2C,OAcpBpH,aAAajF,EAAU,IAEnB,MAAMiR,EAAM,IAAIvB,EAAOpO,KAAM,IAAKA,KAAKkX,iBAAkBxY,IAkBzD,OAjBAiR,EAAIhN,GAAG,OAAQ,IAAM3C,KAAKuX,MAAM5H,IAChCA,EAAIhN,GAAG,QAAS,IAAM3C,KAAKwX,OAAO7H,IAClCA,EAAIhN,GAAG,OAAQ,IAAM3C,KAAKyX,MAAM9H,IAChCA,EAAIhN,GAAG,QAAS,IAAM3C,KAAK0X,OAAO/H,IAClCA,EAAIA,IAAIrL,iBAAiB,YAAcR,GAAM9D,KAAK2X,MAAM7T,IACxD6L,EAAIA,IAAIrL,iBAAiB,YAAcR,GAAM9D,KAAK2X,MAAM7T,IACxD6L,EAAIA,IAAIrL,iBAAiB,UAAYR,GAAM9D,KAAK4X,IAAI9T,IACpD6L,EAAIA,IAAIrL,iBAAiB,WAAaR,GAAM9D,KAAK4X,IAAI9T,IACjD9D,KAAK6X,QAAUnZ,EAAQuW,QAEvBjV,KAAK6X,MAAMC,UAAUnI,GAEzBA,EAAIoI,WAAW/X,KAAKwU,OAAQxU,KAAKtB,QAAQ0R,YACrCT,EAAIjR,QAAQsW,cAEZrF,EAAIqB,OAEDrB,EAOXhM,KAAKjF,GAEDsB,KAAK6X,MAAQ,IAAIhC,EAAK7V,KAAMtB,GAC5B,IAAK,MAAMiR,KAAO3P,KAAK0V,QAEd/F,EAAIjR,QAAQuW,QAEbjV,KAAK6X,MAAMC,UAAUnI,GASjChM,YAAYgM,GAER,MAAMtC,EAAQrN,KAAK0V,QAAQhM,QAAQiG,GACnCnL,QAAQwT,QAAkB,IAAX3K,EAAc,kDACzBA,IAAUrN,KAAK0V,QAAQhU,OAAS,IAEhC1B,KAAK0V,QAAQjK,OAAO4B,EAAO,GAC3BrN,KAAK0V,QAAQlV,KAAKmP,GAClB3P,KAAKiY,YAQbtU,WAAWgM,GAEP,MAAMtC,EAAQrN,KAAK0V,QAAQhM,QAAQiG,GACnCnL,QAAQwT,QAAkB,IAAX3K,EAAc,kDACf,IAAVA,IAEArN,KAAK0V,QAAQjK,OAAO4B,EAAO,GAC3BrN,KAAK0V,QAAQwC,QAAQvI,GACrB3P,KAAKiY,YAQbtU,OAEI,MAAMmN,EAAO,GACb,IAAK,IAAItP,EAAI,EAAGA,EAAIxB,KAAK0V,QAAQhU,OAAQF,IACzC,CACI,MAAMmO,EAAM3P,KAAK0V,QAAQlU,GACzBsP,EAAKnB,EAAIpB,IAAMoB,EAAIwI,OACnBrH,EAAKnB,EAAIpB,IAAI6J,MAAQ5W,EAEzB,OAAOsP,EAQXnN,KAAKmN,GAED,IAAK,MAAMvC,KAAMuC,EACjB,CACI,MAAMnB,EAAM3P,KAAKqY,cAAc9J,GAC3BoB,GAEAA,EAAI2I,KAAKxH,EAAKvC,KAS1B5K,WAEI,IAAK,IAAIgM,KAAO3P,KAAK0V,QAEjB/F,EAAIoB,QAER/Q,KAAK0V,QAAU,GACf1V,KAAKiP,OAAS,KAQlBtL,WAEI,IAAInC,EAAI,EACR,IAAK,MAAMmO,KAAO3P,KAAK0V,QAEd/F,EAAI4I,aAEL5I,EAAIiF,EAAIpT,KAKpBmC,YAOI3D,KAAK2P,IAAMlR,EAAK,CACZY,OAAQW,KAAKtB,QAAQW,OACrBN,OAAQ,CAEAwH,cAAe,OACfO,MAAS,OACTqJ,OAAU,OACVsB,SAAY,SACZtL,WAAY,EACZ6M,OAAU,aAEXhT,KAAKtB,QAAQK,UAK5B4E,kBAOI3D,KAAK0Q,UAAYjS,EAAK,CAClBY,OAAQW,KAAK2P,IACb5Q,OAAQ,CAEAwH,cAAe,OACfH,SAAY,WACZC,IAAO,EACPC,KAAQ,EACRQ,MAAS,OACTqJ,OAAU,OACVsB,SAAY,YAIxBzR,KAAK0Q,UAAUpM,iBAAiB,YAAcR,GAAM9D,KAAK2X,MAAM7T,IAC/D9D,KAAK0Q,UAAUpM,iBAAiB,YAAcR,GAAM9D,KAAK2X,MAAM7T,IAC/D9D,KAAK0Q,UAAUpM,iBAAiB,UAAYR,GAAM9D,KAAK4X,IAAI9T,IAC3D9D,KAAK0Q,UAAUpM,iBAAiB,WAAaR,GAAM9D,KAAK4X,IAAI9T,IAGhEH,cAEI3D,KAAKwY,aAAe/Z,EAAK,CACrBY,OAAQW,KAAK2P,IACb5Q,OAAQ,CACJ2H,QAAW,OACXH,cAAe,OACfH,SAAY,WACZC,IAAO,EACPC,KAAQ,EACRQ,MAAS,OACTqJ,OAAU,OACVsB,SAAY,SACZ/D,WAAc1N,KAAKtB,QAAQ6W,mBAGnCvV,KAAKwY,aAAalU,iBAAiB,YAAcR,IAAQ9D,KAAK2X,MAAM7T,GAAIA,EAAE6B,iBAAkB7B,EAAEoF,oBAC9FlJ,KAAKwY,aAAalU,iBAAiB,YAAcR,IAAQ9D,KAAK2X,MAAM7T,GAAIA,EAAE6B,iBAAkB7B,EAAEoF,oBAC9FlJ,KAAKwY,aAAalU,iBAAiB,UAAYR,IAAQ9D,KAAK4X,IAAI9T,GAAIA,EAAE6B,iBAAkB7B,EAAEoF,oBAC1FlJ,KAAKwY,aAAalU,iBAAiB,WAAaR,IAAQ9D,KAAK4X,IAAI9T,GAAIA,EAAE6B,iBAAkB7B,EAAEoF,oBAC3FlJ,KAAKwY,aAAalU,iBAAiB,YAAcR,IAAQA,EAAE6B,iBAAkB7B,EAAEoF,oBAC/ElJ,KAAKwY,aAAalU,iBAAiB,aAAeR,IAAQA,EAAE6B,iBAAkB7B,EAAEoF,oBAGpFvF,MAAMgM,GAEF3P,KAAK0V,QAAQlV,KAAKmP,GAClB3P,KAAKiY,WACDtI,EAAIjR,QAAQiW,OAEZ3U,KAAKwY,aAAatZ,MAAMwH,QAAU,QAClC1G,KAAKwY,aAAatZ,MAAM4V,OAASnF,EAAIiF,GAIrC5U,KAAKwY,aAAatZ,MAAMwH,QAAU,OAI1C/C,OAAOgM,GAEH,GAAI3P,KAAKiP,SAAWU,EAEhB,OAEA3P,KAAKiP,QAELjP,KAAKiP,OAAOf,OAEhB,MAAMb,EAAQrN,KAAK0V,QAAQhM,QAAQiG,GACnCnL,QAAQwT,QAAkB,IAAX3K,EAAc,2DACzBA,IAAUrN,KAAK0V,QAAQhU,OAAS,IAEhC1B,KAAK0V,QAAQjK,OAAO4B,EAAO,GAC3BrN,KAAK0V,QAAQlV,KAAKmP,IAEtB3P,KAAKiY,WACLjY,KAAKiP,OAASjP,KAAK0V,QAAQ1V,KAAK0V,QAAQhU,OAAS,GAGrDiC,MAAMgM,GAEE3P,KAAKiP,SAAWU,IAEhB3P,KAAKiP,OAAS,MAItBtL,OAAOgM,GAECA,EAAI+G,SAAQ,KAER7K,MAAQA,KAAK6K,UAEb1W,KAAKwY,aAAatZ,MAAM4V,OAASjJ,KAAK+I,EAItC5U,KAAKwY,aAAatZ,MAAMwH,QAAU,QAK9C/C,MAAMG,GAEF,IAAK,MAAM8F,KAAO5J,KAAK0V,QAEnB1V,KAAK0V,QAAQ9L,GAAK+N,MAAM7T,GAIhCH,IAAIG,GAEA,IAAK,MAAM8F,KAAO5J,KAAK0V,QAEnB1V,KAAK0V,QAAQ9L,GAAKgO,IAAI9T,GAI9BH,WAAWgM,GAEP,OAAQ3P,KAAK2U,OAAS3U,KAAK2U,QAAUhF,EAIzC6E,aAEI,MAAMnO,EAAMyE,EAAKuF,uBACjB,MAAO,CACHhK,IAAKrG,KAAK2P,IAAIxD,UAAY9F,EAC1BiL,OAAQtR,KAAK2P,IAAIxD,UAAYnM,KAAK2P,IAAIvD,aACtC9F,KAAMtG,KAAK2P,IAAIzD,WACfmF,MAAOrR,KAAK2P,IAAIzD,WAAalM,KAAK2P,IAAItD,aAI9C1I,SAEI,MAAM6Q,EAASxU,KAAKwU,OACpB,IAAK,MAAM5K,KAAO5J,KAAK0V,QAEnB1V,KAAK0V,QAAQ9L,GAAKmO,WAAWvD,EAAQxU,KAAKtB,QAAQ0R,YAS1DzM,cAAc4K,GAEV,OAAOvO,KAAK0V,QAAQmB,KAAKlH,GAAOA,EAAIpB,KAAOA"}
|
|
1
|
+
{"version":3,"file":"simple-window-manager.min.js","sources":["../src/html.js","../node_modules/eventemitter3/index.js","../node_modules/clicked/clicked.js","../src/Menu/config.js","../src/accelerator.js","../src/Menu/Menu.js","../src/Window.js","../src/images.js","../src/defaults.js","../src/Snap.js","../src/WindowManager.js"],"sourcesContent":["/**\r\n * shortcut to create an html element\r\n * @param {object} options\r\n * @param {type} [options.type=div]\r\n * @param {string} [options.className]\r\n * @param {object} [options.styles]\r\n * @param {HTMLElement} [options.parent]\r\n * @param {string} [options.html]\r\n * @returns {HTMLElement}\r\n * @ignore\r\n */\r\nexport function html(options = {})\r\n{\r\n const element = document.createElement(options.type || 'div')\r\n if (options.styles)\r\n {\r\n Object.assign(element.style, options.styles)\r\n }\r\n if (options.className)\r\n {\r\n element.className = options.className\r\n }\r\n if (options.html)\r\n {\r\n element.innerHTML = options.html\r\n }\r\n if (options.parent)\r\n {\r\n options.parent.appendChild(element)\r\n }\r\n return element\r\n}","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","/**\n * Watcher for click, double-click, or long-click event for both mouse and touch\n * @example\n * import { clicked } from 'clicked'\n *\n * function handleClick()\n * {\n * console.log('I was clicked.')\n * }\n *\n * const div = document.getElementById('clickme')\n * const c = clicked(div, handleClick, { threshold: 15 })\n *\n * // change callback\n * c.callback = () => console.log('different clicker')\n *\n * // destroy\n * c.destroy()\n *\n * // using built-in querySelector\n * clicked('#clickme', handleClick2)\n *\n * // watching for all types of clicks\n * function handleAllClicks(e) {\n * switch (e.type)\n * {\n * case 'clicked': ...\n * case 'double-clicked': ...\n * case 'long-clicked': ...\n * }\n *\n * // view UIEvent that caused callback\n * console.log(e.event)\n * }\n * clicked('#clickme', handleAllClicks, { doubleClicked: true, longClicked: true })\n */\n\n/** @type {object} */\nconst defaultOptions = {\n threshold: 10,\n clicked: true,\n doubleClicked: false,\n doubleClickedTime: 300,\n longClicked: false,\n longClickedTime: 500,\n capture: false,\n clickDown: false\n}\n\n/**\n * @param {HTMLElement|string} element or querySelector entry (e.g., #id-name or .class-name)\n * @param {ClickedCallback} callback called after a click, double click, or long click is registered\n * @param {object} [options]\n * @param {number} [options.threshold=10] if touch moves threshhold-pixels then the touch-click is cancelled\n * @param {boolean} [options.clicked=true] disable watcher for default clicked event\n * @param {boolean} [options.doubleClicked] enable watcher for double click\n * @param {number} [options.doubleClickedTime=500] wait time in millseconds for double click\n * @param {boolean} [options.longClicked] enable watcher for long click\n * @param {number} [options.longClickedTime=500] wait time for long click\n * @param {boolean} [options.clickDown] enable watcher for click start\n * @param {boolean} [options.capture] events will be dispatched to this registered listener before being dispatched to any EventTarget beneath it in the DOM tree\n * @returns {Clicked}\n */\nexport function clicked(element, callback, options)\n{\n return new Clicked(element, callback, options)\n}\n\nclass Clicked\n{\n constructor(element, callback, options)\n {\n if (typeof element === 'string')\n {\n element = document.querySelector(element)\n if (!element)\n {\n console.warn(`Unknown element: document.querySelector(${element}) in clicked()`)\n return\n }\n }\n this.options = Object.assign({}, defaultOptions, options)\n this.events = {\n mousedown: (e) => this.mousedown(e),\n mouseup: (e) => this.mouseup(e),\n mousemove: (e) => this.mousemove(e),\n touchstart: (e) => this.touchstart(e),\n touchmove: (e) => this.touchmove(e),\n touchcancel: (e) => this.cancel(e),\n touchend: (e) => this.touchend(e)\n }\n element.addEventListener('mousedown', this.events.mousedown, { capture: this.options.capture })\n element.addEventListener('mouseup', this.events.mouseup, { capture: this.options.capture })\n element.addEventListener('mousemove', this.events.mousemove, { capture: this.options.capture })\n element.addEventListener('touchstart', this.events.touchstart, { passive: true, capture: this.options.capture })\n element.addEventListener('touchmove', this.events.touchmove, { passive: true, capture: this.options.capture })\n element.addEventListener('touchcancel', this.events.touchcancel, { capture: this.options.capture})\n element.addEventListener('touchend', this.events.touchend, { capture: this.options.capture })\n this.element = element\n this.callback = callback\n }\n\n /**\n * removes event listeners added by Clicked\n */\n destroy()\n {\n this.element.removeEventListener('mousedown', this.events.mousedown)\n this.element.removeEventListener('mouseup', this.events.mouseup)\n this.element.removeEventListener('mousemove', this.events.mousemove)\n this.element.removeEventListener('touchstart', this.events.touchstart, { passive: true })\n this.element.removeEventListener('touchmove', this.events.touchmove, { passive: true })\n this.element.removeEventListener('touchcancel', this.events.touchcancel)\n this.element.removeEventListener('touchend', this.events.touchend)\n }\n\n touchstart(e)\n {\n if (this.down === true)\n {\n this.cancel()\n }\n else\n {\n if (e.touches.length === 1)\n {\n this.handleDown(e.changedTouches[0].screenX, e.changedTouches[0].screenY)\n }\n }\n }\n\n pastThreshold(x, y)\n {\n return Math.abs(this.lastX - x) > this.options.threshold || Math.abs(this.lastY - y) > this.options.threshold\n }\n\n touchmove(e)\n {\n if (this.down)\n {\n if (e.touches.length !== 1)\n {\n this.cancel()\n }\n else\n {\n const x = e.changedTouches[0].screenX\n const y = e.changedTouches[0].screenY\n if (this.pastThreshold(x, y))\n {\n this.cancel()\n }\n }\n }\n }\n\n /** cancel current event */\n cancel()\n {\n this.down = false\n if (this.doubleClickedTimeout)\n {\n clearTimeout(this.doubleClickedTimeout)\n this.doubleClickedTimeout = null\n }\n if (this.longClickedTimeout)\n {\n clearTimeout(this.longClickedTimeout)\n this.longClickedTimeout = null\n }\n }\n\n touchend(e)\n {\n if (this.down)\n {\n e.preventDefault()\n this.handleClicks(e, e.pointerId)\n }\n }\n\n handleClicks(e)\n {\n if (this.options.doubleClicked)\n {\n this.doubleClickedTimeout = setTimeout(() => this.doubleClickedCancel(e), this.options.doubleClickedTime)\n }\n else if (this.options.clicked)\n {\n this.callback({ event: e, type: 'clicked' })\n }\n if (this.longClickedTimeout)\n {\n clearTimeout(this.longClickedTimeout)\n this.longClickedTimeout = null\n }\n this.down = false\n }\n\n handleDown(e, x, y)\n {\n if (this.doubleClickedTimeout)\n {\n if (this.pastThreshold(x, y))\n {\n if (this.options.clicked)\n {\n this.callback({ event: e, type: 'clicked' })\n }\n this.cancel()\n }\n else\n {\n this.callback({ event: e, type: 'double-clicked' })\n this.cancel()\n }\n }\n else\n {\n this.lastX = x\n this.lastY = y\n this.down = true\n if (this.options.longClicked)\n {\n this.longClickedTimeout = setTimeout(() => this.longClicked(e), this.options.longClickedTime)\n }\n if (this.options.clickDown) {\n this.callback({ event: e, type: 'click-down' })\n }\n }\n }\n\n longClicked(e)\n {\n this.longClikedTimeout = null\n this.down = false\n this.callback({ event: e, type: 'long-clicked' })\n }\n\n doubleClickedCancel(e)\n {\n this.doubleClickedTimeout = null\n if (this.options.clicked)\n {\n this.callback({ event: e, type: 'double-clicked' })\n }\n }\n\n mousedown(e)\n {\n if (this.down === true)\n {\n this.down = false\n }\n else\n {\n this.handleDown(e, e.screenX, e.screenY)\n }\n }\n\n mousemove(e)\n {\n if (this.down)\n {\n const x = e.screenX\n const y = e.screenY\n if (this.pastThreshold(x, y))\n {\n this.cancel()\n }\n }\n }\n\n mouseup(e)\n {\n if (this.down)\n {\n e.preventDefault()\n this.handleClicks(e)\n }\n }\n}\n\n/**\n * Callback for\n * @callback Clicked~ClickedCallback\n * @param {UIEvent} event\n * @param {('clicked'|'double-clicked'|'long-clicked'|'click-down')} type\n */","export const config = {\n\n /**\n * application menu container styles\n * @type {object}\n */\n ApplicationContainerStyle: {\n 'z-index': 999999,\n 'position': 'absolute',\n 'top': 0,\n 'left': 0,\n 'user-select': 'none',\n 'font-size': '0.85em'\n },\n\n /**\n * application menu-bar styles\n * @type {object}\n */\n ApplicationMenuStyle: {\n 'display': 'flex',\n 'position': 'relative',\n 'flex-direction': 'row',\n 'color': 'black',\n 'backgroundColor': 'rgb(230,230,230)',\n 'width': '100vw',\n 'border': 'none',\n 'box-shadow': 'unset',\n 'outline': 'none'\n },\n\n /**\n * application menu entry styles\n * @type {object}\n */\n ApplicationMenuRowStyle: {\n 'padding': '0.25em 0.5em',\n 'margin': 0,\n 'line-height': '1em'\n },\n\n /**\n * lower-level menu window styles\n * @type {object}\n */\n MenuStyle: {\n 'flex-direction': 'column',\n 'position': 'absolute',\n 'user-select': 'none',\n 'color': 'black',\n 'z-index': 999999,\n 'backgroundColor': 'white',\n 'border': '1px solid rgba(0,0,0,0.5)',\n 'boxShadow': '1px 3px 3px rgba(0,0,0,0.25)'\n },\n\n /**\n * lower-level menu row styles\n * @type {object}\n */\n RowStyle: {\n 'display': 'flex',\n 'padding': '0.25em 1.5em 0.25em',\n 'line-height': '1.5em'\n },\n\n /**\n * lower-level menu accelerator styles\n * @type {object}\n */\n AcceleratorStyle: {\n 'opacity': 0.5\n },\n\n /**\n * lower-level menu separator styles\n * @type {object}\n */\n SeparatorStyle: {\n 'border-bottom': '1px solid rgba(0,0,0,0.1)',\n 'margin': '0.5em 0'\n },\n\n /**\n * accelerator key styles\n * NOTE: accelerator keys must use text-decoration as its used as a toggle in the code\n * @type {object}\n */\n AcceleratorKeyStyle: {\n 'text-decoration': 'underline',\n 'text-decoration-color': 'rgba(0,0,0,0.5)'\n },\n\n /**\n * minimum column width in pixels for checked and arrow in the lower-level menus\n * @type {number}\n */\n MinimumColumnWidth: 20,\n\n /**\n * CSS background style for selected MenuItems\n * NOTE: unselected have 'transparent' style\n * @type {string}\n */\n SelectedBackgroundStyle: 'rgba(0,0,0,0.1)',\n\n /**\n * number of pixels to overlap child menus\n * @type {number}\n */\n Overlap: 5,\n\n /**\n * time in milliseconds to wait for submenu to open when mouse hovers\n * @param {number}\n */\n SubmenuOpenDelay: 500\n}","/**\n * Keyboard Accelerator support used by menu (if available) and user-registered keys. Also works for user-defined keys independent of the menu system. Automatically instantiated when used with WindowManager.\n */\nclass Accelerator {\n\n init()\n {\n // may be initialized by Menu or WindowManager in any order\n if (!this.initialized)\n {\n this.menuKeys = {}\n this.keys = {}\n document.body.addEventListener('keydown', e => this._keydown(e))\n document.body.addEventListener('keyup', e => this._keyup(e))\n this.initialized = true\n }\n }\n\n /** clears all menu keys */\n clearMenuKeys()\n {\n this.menuKeys = {}\n }\n\n /** clear all user-registered keys */\n clearKeys()\n {\n this.keys = {}\n }\n\n /**\n * Register a shortcut key for use by an open menu\n * @param {Accelerator~KeyCodes} letter\n * @param {MenuItem} menuItem\n * @param {boolean} applicationMenu\n */\n registerMenuShortcut(letter, menuItem)\n {\n if (letter)\n {\n const keyCode = (menuItem.menu.applicationMenu ? 'alt+' : '') + letter\n this.menuKeys[this._prepareKey(keyCode)] = e =>\n {\n menuItem.handleClick(e)\n e.stopPropagation()\n e.preventDefault()\n }\n }\n }\n\n /**\n * Register special shortcut keys for menu\n * @param {MenuItem} menuItem\n */\n registerMenuSpecial(menu)\n {\n this.menuKeys['escape'] = () => menu.closeAll()\n this.menuKeys['enter'] = e => menu.enter(e)\n this.menuKeys['space'] = e => menu.enter(e)\n this.menuKeys['arrowright'] = e => menu.move(e, 'right')\n this.menuKeys['arrowleft'] = e => menu.move(e, 'left')\n this.menuKeys['arrowup'] = e => menu.move(e, 'up')\n this.menuKeys['arrowdown'] = e => menu.move(e, 'down')\n }\n\n /**\n * special key registration for alt\n * @param {function} pressed\n * @param {function} released\n */\n registerAlt(pressed, released)\n {\n this.alt = { pressed, released }\n }\n\n /**\n * Removes menu shortcuts\n */\n unregisterMenuShortcuts()\n {\n this.menuKeys = {}\n }\n\n /**\n * Keycodes definition. In the form of modifier[+modifier...]+key\n * <p>For example: ctrl+shift+e</p>\n * <p>KeyCodes are case insensitive (i.e., shift+a is the same as Shift+A). And spaces are removed</p>\n * <p>You can assign more than one key to the same shortcut by using a | between the keys (e.g., 'shift+a | ctrl+a')</p>\n * <pre>\n * Modifiers:\n * ctrl, alt, shift, meta, (ctrl aliases: command, control, commandorcontrol)\n * </pre>\n * <pre>\n * Keys:\n * escape, 0-9, minus, equal, backspace, tab, a-z, backetleft, bracketright, semicolon, quote,\n * backquote, backslash, comma, period, slash, numpadmultiply, space, capslock, f1-f24, pause,\n * scrolllock, printscreen, home, arrowup, arrowleft, arrowright, arrowdown, pageup, pagedown,\n * end, insert, delete, enter, shiftleft, shiftright, ctrlleft, ctrlright, altleft, altright, shiftleft,\n * shiftright, numlock, numpad...\n * </pre>\n * For OS-specific codes and a more detailed explanation see {@link https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code}. Also note that 'Digit' and 'Key' are removed from the code to make it easier to type.\n *\n * @typedef {string} Accelerator~KeyCodes\n */\n\n /**\n * translate a user-provided keycode\n * @param {Accelerator~KeyCodes} keyCode\n * @return {Accelerator~KeyCodes} formatted and sorted keyCode\n * @private\n */\n _prepareKey(keyCode)\n {\n const keys = []\n let split\n keyCode += ''\n if (keyCode.length > 1 && keyCode.indexOf('|') !== -1)\n {\n split = keyCode.split('|')\n }\n else\n {\n split = [keyCode]\n }\n for (let code of split)\n {\n let key = ''\n let modifiers = []\n code = code.toLowerCase().replace(' ', '')\n if (code.indexOf('+') !== -1)\n {\n const split = code.split('+')\n for (let i = 0; i < split.length - 1; i++)\n {\n let modifier = split[i]\n modifier = modifier.replace('commandorcontrol', 'ctrl')\n modifier = modifier.replace('command', 'ctrl')\n modifier = modifier.replace('control', 'ctrl')\n modifiers.push(modifier)\n }\n modifiers = modifiers.sort((a, b) => { return a[0] > b[0] ? 1 : a[0] < b[0] ? -1 : 0 })\n for (let part of modifiers)\n {\n key += part + '+'\n }\n key += split[split.length - 1]\n }\n else\n {\n key = code\n }\n keys.push(key)\n }\n return keys\n }\n\n /**\n * Make the KeyCode pretty for printing on the menu\n * @param {KeyCode} keyCode\n * @return {string}\n */\n prettifyKey(keyCode)\n {\n let key = ''\n const codes = this._prepareKey(keyCode)\n for (let i = 0; i < codes.length; i++)\n {\n const keyCode = codes[i]\n if (keyCode.indexOf('+') !== -1)\n {\n const split = keyCode.toLowerCase().split('+')\n for (let i = 0; i < split.length - 1; i++)\n {\n let modifier = split[i]\n key += modifier[0].toUpperCase() + modifier.substr(1) + '+'\n }\n key += split[split.length - 1].toUpperCase()\n }\n else\n {\n key = keyCode.toUpperCase()\n }\n if (i !== codes.length - 1)\n {\n key += ' or '\n }\n }\n return key\n }\n\n /**\n * register a key as a global accelerator\n * @param {Accelerator~KeyCodes} keyCode (e.g., Ctrl+shift+E)\n * @param {function} callback\n */\n register(keyCode, callback)\n {\n const keys = this._prepareKey(keyCode)\n for (let key of keys)\n {\n this.keys[key] = e =>\n {\n callback(e)\n e.preventDefault()\n e.stopPropagation()\n }\n }\n }\n\n _keyup(e)\n {\n if (this.alt && (e.code === 'AltLeft' || e.code === 'AltRight'))\n {\n this.alt.released()\n this.alt.isPressed = false\n }\n }\n\n _keydown(e)\n {\n if (this.alt && !this.alt.isPressed && (e.code === 'AltLeft' || e.code === 'AltRight'))\n {\n this.alt.pressed()\n this.alt.isPressed = true\n e.preventDefault()\n }\n const modifiers = []\n if (e.altKey)\n {\n modifiers.push('alt')\n }\n if (e.ctrlKey)\n {\n modifiers.push('ctrl')\n }\n if (e.metaKey)\n {\n modifiers.push('meta')\n }\n if (e.shiftKey)\n {\n modifiers.push('shift')\n }\n let keyCode = ''\n for (let modifier of modifiers)\n {\n keyCode += modifier + '+'\n }\n let translate = e.code.toLowerCase()\n translate = translate.replace('digit', '')\n translate = translate.replace('key', '')\n keyCode += translate\n if (this.menuKeys[keyCode])\n {\n this.menuKeys[keyCode](e)\n }\n else if (this.keys[keyCode])\n {\n this.keys[keyCode](e)\n }\n }\n}\n\nexport const accelerator = new Accelerator()","import { config } from './config'\r\nimport { MenuItem } from './MenuItem'\r\nimport { accelerator } from '../accelerator'\r\nimport { html } from '../html'\r\n\r\n/**\r\n * creates a menu bar or a submenu within a menu\r\n * @param {object} [options]\r\n * @param {object} [options.styles] additional CSS styles for menu\r\n */\r\nexport class Menu\r\n{\r\n constructor(options)\r\n {\r\n accelerator.init()\r\n options = options || {}\r\n this.div = document.createElement('div')\r\n this.styles = options.styles\r\n this.children = []\r\n this.applyConfig(config.MenuStyle)\r\n this.div.tabIndex = -1\r\n }\r\n\r\n /**\r\n * append a MenuItem to the Menu\r\n * @param {MenuItem} menuItem\r\n */\r\n append(menuItem)\r\n {\r\n if (menuItem.submenu)\r\n {\r\n menuItem.submenu.menu = this\r\n }\r\n menuItem.menu = this\r\n this.div.appendChild(menuItem.div)\r\n if (menuItem.type !== 'separator')\r\n {\r\n this.children.push(menuItem)\r\n }\r\n }\r\n\r\n /**\r\n * inserts a MenuItem into the Menu\r\n * @param {number} pos\r\n * @param {MenuItem} menuItem\r\n */\r\n insert(pos, menuItem)\r\n {\r\n if (pos >= this.div.childNodes.length)\r\n {\r\n this.append(menuItem)\r\n }\r\n else\r\n {\r\n if (menuItem.submenu)\r\n {\r\n menuItem.submenu.menu = this\r\n }\r\n menuItem.menu = this\r\n this.div.insertBefore(menuItem.div, this.div.childNodes[pos])\r\n if (menuItem.type !== 'separator')\r\n {\r\n this.children.splice(pos, 0, menuItem)\r\n }\r\n }\r\n }\r\n\r\n hide()\r\n {\r\n let current = this.menu.showing\r\n while (current && current.submenu)\r\n {\r\n current.div.style.backgroundColor = 'transparent'\r\n current.submenu.div.remove()\r\n let next = current.submenu.showing\r\n if (next)\r\n {\r\n current.submenu.showing.div.style.backgroundColor = 'transparent'\r\n current.submenu.showing = null\r\n }\r\n current = next\r\n }\r\n }\r\n\r\n show(menuItem)\r\n {\r\n accelerator.unregisterMenuShortcuts()\r\n if (this.menu && this.menu.showing === menuItem)\r\n {\r\n this.hide()\r\n this.menu.showing = null\r\n this.div.remove()\r\n this.menu.showAccelerators()\r\n }\r\n else\r\n {\r\n if (this.menu)\r\n {\r\n if (this.menu.showing && this.menu.children.indexOf(menuItem) !== -1)\r\n {\r\n this.hide()\r\n }\r\n this.menu.showing = menuItem\r\n this.menu.hideAccelerators()\r\n }\r\n const div = menuItem.div\r\n const parent = this.menu.div\r\n if (this.menu.applicationMenu)\r\n {\r\n this.div.style.left = div.offsetLeft + 'px'\r\n this.div.style.top = div.offsetTop + div.offsetHeight + 'px'\r\n }\r\n else\r\n {\r\n this.div.style.left = parent.offsetLeft + parent.offsetWidth - config.Overlap + 'px'\r\n this.div.style.top = parent.offsetTop + div.offsetTop - config.Overlap + 'px'\r\n }\r\n this.attached = menuItem\r\n this.showAccelerators()\r\n Menu.application.appendChild(this.div)\r\n let label = 0, accelerator = 0, arrow = 0, checked = 0\r\n for (let child of this.children)\r\n {\r\n child.check.style.width = 'auto'\r\n child.label.style.width = 'auto'\r\n child.accelerator.style.width = 'auto'\r\n child.arrow.style.width = 'auto'\r\n if (child.type === 'checkbox')\r\n {\r\n checked = config.MinimumColumnWidth\r\n }\r\n if (child.submenu)\r\n {\r\n arrow = config.MinimumColumnWidth\r\n }\r\n }\r\n for (let child of this.children)\r\n {\r\n const childLabel = child.label.offsetWidth * 2\r\n label = childLabel > label ? childLabel : label\r\n const childAccelerator = child.accelerator.offsetWidth\r\n accelerator = childAccelerator > accelerator ? childAccelerator : accelerator\r\n if (child.submenu)\r\n {\r\n arrow = child.arrow.offsetWidth\r\n }\r\n }\r\n for (let child of this.children)\r\n {\r\n child.check.style.width = checked + 'px'\r\n child.label.style.width = label + 'px'\r\n child.accelerator.style.width = accelerator + 'px'\r\n child.arrow.style.width = arrow + 'px'\r\n }\r\n if (this.div.offsetLeft + this.div.offsetWidth > window.innerWidth)\r\n {\r\n this.div.style.left = window.innerWidth - this.div.offsetWidth + 'px'\r\n }\r\n if (this.div.offsetTop + this.div.offsetHeight > window.innerHeight)\r\n {\r\n this.div.style.top = window.innerHeight - this.div.offsetHeight + 'px'\r\n }\r\n Menu.application.menu.div.focus()\r\n }\r\n }\r\n\r\n applyConfig(base)\r\n {\r\n const styles = {}\r\n for (let style in base)\r\n {\r\n styles[style] = base[style]\r\n }\r\n if (this.styles)\r\n {\r\n for (let style in this.styles)\r\n {\r\n styles[style] = this.styles[style]\r\n }\r\n }\r\n for (let style in styles)\r\n {\r\n this.div.style[style] = styles[style]\r\n }\r\n }\r\n\r\n showAccelerators()\r\n {\r\n for (let child of this.children)\r\n {\r\n child.showShortcut()\r\n if (child.type !== 'separator')\r\n {\r\n const index = child.text.indexOf('&')\r\n if (index !== -1)\r\n {\r\n accelerator.registerMenuShortcut(child.text[index + 1], child)\r\n }\r\n }\r\n }\r\n if (!this.applicationMenu)\r\n {\r\n accelerator.registerMenuSpecial(this)\r\n }\r\n }\r\n\r\n hideAccelerators()\r\n {\r\n for (let child of this.children)\r\n {\r\n child.hideShortcut()\r\n }\r\n }\r\n\r\n closeAll()\r\n {\r\n accelerator.unregisterMenuShortcuts()\r\n let application = Menu.application.menu\r\n if (application.showing)\r\n {\r\n let menu = application\r\n while (menu.showing)\r\n {\r\n menu = menu.showing.submenu\r\n }\r\n while (menu && !menu.applicationMenu)\r\n {\r\n if (menu.showing)\r\n {\r\n menu.showing.div.style.backgroundColor = 'transparent'\r\n menu.showing = null\r\n }\r\n menu.div.remove()\r\n menu = menu.menu\r\n }\r\n if (menu)\r\n {\r\n menu.showing.div.style.background = 'transparent'\r\n menu.showing = null\r\n menu.hideAccelerators()\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * move selector to the next child pane\r\n * @param {string} direction (left or right)\r\n * @private\r\n */\r\n moveChild(direction)\r\n {\r\n let index\r\n if (direction === 'left')\r\n {\r\n const parent = this.selector.menu.menu\r\n index = parent.children.indexOf(parent.showing)\r\n index--\r\n index = (index < 0) ? parent.children.length - 1 : index\r\n parent.children[index].handleClick()\r\n }\r\n else\r\n {\r\n let parent = this.selector.menu.menu\r\n let selector = parent.showing\r\n while (!parent.applicationMenu)\r\n {\r\n selector.handleClick()\r\n selector.div.style.backgroundColor = 'transparent'\r\n parent = parent.menu\r\n selector = parent.showing\r\n }\r\n index = parent.children.indexOf(selector)\r\n index++\r\n index = (index === parent.children.length) ? 0 : index\r\n parent.children[index].handleClick()\r\n }\r\n this.selector = null\r\n }\r\n\r\n /**\r\n * move selector right and left\r\n * @param {MouseEvent} e\r\n * @param {string} direction\r\n * @private\r\n */\r\n horizontalSelector(e, direction)\r\n {\r\n if (direction === 'right')\r\n {\r\n if (this.selector.submenu)\r\n {\r\n this.selector.handleClick(e)\r\n this.selector.submenu.selector = this.selector.submenu.children[0]\r\n this.selector.submenu.selector.div.style.backgroundColor = config.SelectedBackgroundStyle\r\n this.selector = null\r\n }\r\n else\r\n {\r\n this.moveChild(direction)\r\n }\r\n }\r\n else if (direction === 'left')\r\n {\r\n if (!this.selector.menu.menu.applicationMenu)\r\n {\r\n this.selector.menu.attached.handleClick(e)\r\n this.selector.menu.menu.selector = this.selector.menu.attached\r\n this.selector = null\r\n }\r\n else\r\n {\r\n this.moveChild(direction)\r\n }\r\n }\r\n e.stopPropagation()\r\n e.preventDefault()\r\n }\r\n\r\n /**\r\n * move the selector in the menu\r\n * @param {KeyboardEvent} e\r\n * @param {string} direction (left, right, up, down)\r\n */\r\n move(e, direction)\r\n {\r\n if (this.selector)\r\n {\r\n this.selector.div.style.backgroundColor = 'transparent'\r\n let index = this.children.indexOf(this.selector)\r\n if (direction === 'down')\r\n {\r\n index++\r\n index = (index === this.children.length) ? 0 : index\r\n }\r\n else if (direction === 'up')\r\n {\r\n index--\r\n index = (index < 0) ? this.children.length - 1 : index\r\n }\r\n else\r\n {\r\n return this.horizontalSelector(e, direction)\r\n }\r\n this.selector = this.children[index]\r\n }\r\n else\r\n {\r\n if (direction === 'up')\r\n {\r\n this.selector = this.children[this.children.length - 1]\r\n }\r\n else\r\n {\r\n this.selector = this.children[0]\r\n }\r\n }\r\n if (this.selector)\r\n {\r\n this.selector.div.style.backgroundColor = config.SelectedBackgroundStyle\r\n }\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }\r\n\r\n /**\r\n * click the selector with keyboard\r\n * @private\r\n */\r\n enter(e)\r\n {\r\n if (this.selector)\r\n {\r\n this.selector.handleClick(e)\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }\r\n }\r\n\r\n /**\r\n * array containing the menu's items\r\n * @property {MenuItems[]} items\r\n * @readonly\r\n */\r\n get items()\r\n {\r\n return this.children\r\n }\r\n\r\n /**\r\n * show application menu accelerators when alt is pressed\r\n * @private\r\n */\r\n showApplicationAccelerators()\r\n {\r\n this.hideAccelerators()\r\n accelerator.registerAlt(() =>\r\n {\r\n if (!this.showing)\r\n {\r\n this.showAccelerators()\r\n }\r\n }, () =>\r\n {\r\n this.hideAccelerators()\r\n })\r\n }\r\n\r\n /**\r\n * use this to change the default config settings across all menus\r\n * @type {config}\r\n */\r\n static get config()\r\n {\r\n return config\r\n }\r\n\r\n /**\r\n * gets application menu height\r\n * @returns {number}\r\n */\r\n static getApplicationHeight()\r\n {\r\n return Menu.application ? Menu.application.offsetHeight : 0\r\n }\r\n\r\n /**\r\n * sets active application Menu (and removes any existing application menus)\r\n * @param {Menu} menu\r\n * @param {HTMLElement} [parent=document.body]\r\n */\r\n static setApplicationMenu(menu, parent=document.body)\r\n {\r\n accelerator.clearMenuKeys()\r\n if (Menu.application)\r\n {\r\n Menu.application.remove()\r\n }\r\n Menu.application = html({ parent, styles: config.ApplicationContainerStyle })\r\n Menu.application.menu = menu\r\n menu.applyConfig(config.ApplicationMenuStyle)\r\n for (let child of menu.children)\r\n {\r\n child.applyConfig(config.ApplicationMenuRowStyle)\r\n if (child.arrow)\r\n {\r\n child.arrow.style.display = 'none'\r\n }\r\n menu.div.appendChild(child.div)\r\n }\r\n\r\n Menu.application.appendChild(menu.div)\r\n menu.applicationMenu = true\r\n menu.div.tabIndex = -1\r\n\r\n // don't let menu bar focus unless windows are open (this fixes a focus bug)\r\n menu.div.addEventListener('focus', () =>\r\n {\r\n if (!menu.showing)\r\n {\r\n menu.div.blur()\r\n }\r\n })\r\n\r\n // close all windows if menu is no longer the focus\r\n menu.div.addEventListener('blur', () =>\r\n {\r\n if (menu.showing)\r\n {\r\n menu.closeAll()\r\n }\r\n })\r\n menu.showApplicationAccelerators()\r\n }\r\n}","import Events from 'eventemitter3'\r\nimport { clicked } from 'clicked'\r\n\r\nimport './events'\r\nimport { html } from './html'\r\nimport { Menu } from './Menu/Menu'\r\n\r\n/**\r\n * Window class returned by WindowManager.createWindow()\r\n * @param {WindowManager} [wm]\r\n * @param {Window~WindowOptions} [options]\r\n * @fires open\r\n * @fires focus\r\n * @fires blur\r\n * @fires close\r\n * @fires maximize\r\n * @fires maximize-restore\r\n * @fires move\r\n * @fires move-start\r\n * @fires move-end\r\n * @fires resize\r\n * @fires resize-start\r\n * @fires resize-end\r\n * @fires move-x\r\n * @fires move-y\r\n * @fires resize-width\r\n * @fires resize-height\r\n * @fires loaded\r\n */\r\nexport class Window extends Events\r\n{\r\n constructor(wm, options = {})\r\n {\r\n super()\r\n this.wm = wm\r\n this.options = options\r\n this.id = typeof this.options.id === 'undefined' ? Window.id++ : this.options.id\r\n\r\n this._createWin()\r\n this._createWinBox()\r\n this._createTitlebar()\r\n this._createContent()\r\n if (this.options.resizable)\r\n {\r\n this._createResize()\r\n }\r\n this._createOverlay()\r\n this._buildTransform()\r\n this._listeners()\r\n\r\n this.active = false\r\n this.maximized = false\r\n\r\n this._closed = true\r\n this._restore = null\r\n this._moving = null\r\n this._resizing = null\r\n this._attachedToScreen = { vertical: '', horziontal: '' }\r\n }\r\n\r\n /**\r\n * open the window\r\n * @param {boolean} [noFocus] do not focus window when opened\r\n */\r\n open(noFocus)\r\n {\r\n if (this._closed)\r\n {\r\n this.win.style.display = 'block'\r\n this._closed = false\r\n this.emit('open', this)\r\n if (!noFocus)\r\n {\r\n this.focus()\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * focus the window\r\n */\r\n focus()\r\n {\r\n this.active = true\r\n if (this.options.titlebar)\r\n {\r\n this.winTitlebar.style.backgroundColor = this.options.backgroundTitlebarActive\r\n }\r\n this.emit('focus', this)\r\n }\r\n\r\n /**\r\n * blur the window\r\n */\r\n blur()\r\n {\r\n this.active = false\r\n if (this.options.titlebar)\r\n {\r\n this.winTitlebar.style.backgroundColor = this.options.backgroundTitlebarInactive\r\n }\r\n this.emit('blur', this)\r\n }\r\n\r\n /**\r\n * closes the window (can be reopened with open)\r\n */\r\n close()\r\n {\r\n if (!this._closed)\r\n {\r\n this._closed = true\r\n this.win.style.display = 'none'\r\n this.emit('close', this)\r\n }\r\n }\r\n\r\n /**\r\n * is window closed?\r\n * @type {boolean}\r\n * @readonly\r\n */\r\n get closed()\r\n {\r\n return this._closed\r\n }\r\n\r\n /**\r\n * left coordinate\r\n * @type {number}\r\n */\r\n get x() { return this.options.x }\r\n set x(value)\r\n {\r\n if (value !== this.options.x)\r\n {\r\n this.options.x = value\r\n this.emit('move-x', this)\r\n this._buildTransform()\r\n }\r\n }\r\n\r\n _buildTransform()\r\n {\r\n this.win.style.transform = `translate(${this.options.x}px,${this.options.y}px)`\r\n }\r\n\r\n /**\r\n * top coordinate\r\n * @type {number}\r\n */\r\n get y() { return this.options.y }\r\n set y(value)\r\n {\r\n if (value !== this.options.y)\r\n {\r\n this.options.y = value\r\n this._buildTransform()\r\n this.emit('move-y', this)\r\n }\r\n }\r\n\r\n /**\r\n * width of window\r\n * @type {number}\r\n */\r\n get width() { return this.options.width || this.win.offsetWidth }\r\n set width(value)\r\n {\r\n if (value !== this.options.width)\r\n {\r\n if (value)\r\n {\r\n this.win.style.width = `${value}px`\r\n this.options.width = this.win.offsetWidth\r\n }\r\n else\r\n {\r\n this.win.style.width = 'auto'\r\n this.options.width = ''\r\n }\r\n this.emit('resize-width', this)\r\n }\r\n }\r\n\r\n /**\r\n * height of window\r\n * @type {number}\r\n */\r\n get height() { return this.options.height || this.win.offsetHeight }\r\n set height(value)\r\n {\r\n if (value !== this.options.height)\r\n {\r\n if (value)\r\n {\r\n this.win.style.height = `${value}px`\r\n this.options.height = this.win.offsetHeight\r\n }\r\n else\r\n {\r\n this.win.style.height = 'auto'\r\n this.options.height = ''\r\n }\r\n this.emit('resize-height', this)\r\n }\r\n }\r\n\r\n /**\r\n * resize the window\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n resize(width, height)\r\n {\r\n this.width = width\r\n this.height = height\r\n }\r\n\r\n /**\r\n * move window\r\n * @param {number} x\r\n * @param {number} y\r\n */\r\n move(x, y)\r\n {\r\n const keepInside = this.keepInside\r\n if (keepInside)\r\n {\r\n if (keepInside === true || keepInside === 'horizontal')\r\n {\r\n const width = this.wm.win.offsetWidth\r\n x = x + this.width > width ? width - this.width : x\r\n x = x < 0 ? 0 : x\r\n }\r\n if (keepInside === true || keepInside === 'vertical')\r\n {\r\n const height = this.wm.win.offsetHeight\r\n y = y + this.height > height ? height - this.height : y\r\n const top = Menu.getApplicationHeight()\r\n y = y < top ? top : y\r\n }\r\n }\r\n if (x !== this.options.x)\r\n {\r\n this.options.x = x\r\n this.emit('move-x', this)\r\n }\r\n if (y !== this.options.y)\r\n {\r\n this.options.y = y\r\n this.emit('move-y', this)\r\n }\r\n this._buildTransform()\r\n }\r\n\r\n /**\r\n * maximize the window\r\n */\r\n maximize()\r\n {\r\n if (this.options.maximizable)\r\n {\r\n if (this.maximized)\r\n {\r\n this.x = this.maximized.x\r\n this.y = this.maximized.y\r\n this.width = this.maximized.width\r\n this.height = this.maximized.height\r\n this.maximized = null\r\n this.emit('restore', this)\r\n this.buttons.maximize.innerHTML = this.options.maximizeButton\r\n }\r\n else\r\n {\r\n const x = this.x, y = this.y, width = this.win.offsetWidth, height = this.win.offsetHeight\r\n this.maximized = { x, y, width, height }\r\n this.x = 0\r\n this.y = 0\r\n this.width = this.wm.wallpaper.offsetWidth\r\n this.height = this.wm.wallpaper.offsetHeight\r\n this.emit('maximize', this)\r\n this.buttons.maximize.innerHTML = this.options.restoreButton\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * sends window to back of window-manager\r\n */\r\n sendToBack()\r\n {\r\n this.wm.sendToBack(this)\r\n }\r\n\r\n /**\r\n * send window to front of window-manager\r\n */\r\n sendToFront()\r\n {\r\n this.wm.sendToFront(this)\r\n }\r\n\r\n /**\r\n * save the state of the window\r\n * @return {Object} data\r\n */\r\n save()\r\n {\r\n const data = {}\r\n const maximized = this.maximized\r\n if (maximized)\r\n {\r\n data.maximized = { left: maximized.left, top: maximized.top, width: maximized.width, height: maximized.height }\r\n }\r\n data.x = this.x\r\n data.y = this.y\r\n if (typeof this.options.width !== 'undefined')\r\n {\r\n data.width = this.options.width\r\n }\r\n if (typeof this.options.height !== 'undefined')\r\n {\r\n data.height = this.options.height\r\n }\r\n data.closed = this._closed\r\n return data\r\n }\r\n\r\n /**\r\n * return the state of the window\r\n * @param {Object} data from save()\r\n */\r\n load(data)\r\n {\r\n if (data.maximized)\r\n {\r\n if (!this.maximized)\r\n {\r\n this.maximize(true)\r\n }\r\n }\r\n else if (this.maximized)\r\n {\r\n this.maximize(true)\r\n }\r\n if (typeof data.width !== 'undefined')\r\n {\r\n this.width = data.width\r\n }\r\n else\r\n {\r\n this.win.style.width = 'auto'\r\n }\r\n if (typeof data.height !== 'undefined')\r\n {\r\n this.height = data.height\r\n }\r\n else\r\n {\r\n this.win.style.height = 'auto'\r\n }\r\n this.move(data.x, data.y)\r\n if (data.closed)\r\n {\r\n this.close(true)\r\n }\r\n else if (this.closed)\r\n {\r\n this.open(true, true)\r\n }\r\n this.emit('loaded')\r\n }\r\n\r\n /**\r\n * change title\r\n * @type {string}\r\n */\r\n get title() { return this._title }\r\n set title(value)\r\n {\r\n this.winTitle.innerText = value\r\n this.emit('title-change', this)\r\n }\r\n\r\n\r\n /**\r\n * right coordinate of window\r\n * @type {number}\r\n */\r\n get right() { return this.x + this.width }\r\n set right(value)\r\n {\r\n this.x = value - this.width\r\n }\r\n\r\n /**\r\n * bottom coordinate of window\r\n * @type {number}\r\n */\r\n get bottom() { return this.y + this.height }\r\n set bottom(value)\r\n {\r\n this.y = value - this.height\r\n }\r\n\r\n /**\r\n * centers window in middle of other window or document.body\r\n * @param {Window} [win]\r\n */\r\n center(win)\r\n {\r\n if (win)\r\n {\r\n this.move(\r\n win.x + win.width / 2 - this.width / 2,\r\n win.y + win.height / 2 - this.height / 2\r\n )\r\n }\r\n else\r\n {\r\n this.move(\r\n window.innerWidth / 2 - this.width / 2,\r\n window.innerHeight / 2 - this.height / 2\r\n )\r\n }\r\n }\r\n\r\n _createWin()\r\n {\r\n /**\r\n * This is the top-level DOM element\r\n * @type {HTMLElement}\r\n * @readonly\r\n */\r\n this.win = html({\r\n parent: this.wm.win,\r\n styles: {\r\n 'display': 'none',\r\n 'border-radius': this.options.borderRadius,\r\n 'user-select': 'none',\r\n 'overflow': 'hidden',\r\n 'position': 'absolute',\r\n 'min-width': this.options.minWidth,\r\n 'min-height': this.options.minHeight,\r\n 'background-color': this.options.backgroundWindow,\r\n 'width': isNaN(this.options.width) ? this.options.width : this.options.width + 'px',\r\n 'height': isNaN(this.options.height) ? this.options.height : this.options.height + 'px',\r\n ...this.options.styles\r\n }\r\n })\r\n }\r\n\r\n _createWinBox()\r\n {\r\n /**\r\n * This is the container for the titlebar+content\r\n * @type {HTMLElement}\r\n * @readonly\r\n */\r\n this.winBox = html({\r\n parent: this.win,\r\n styles: {\r\n 'display': 'flex',\r\n 'flex-direction': 'column',\r\n 'width': '100%',\r\n 'height': '100%',\r\n 'min-height': this.options.minHeight\r\n }\r\n })\r\n }\r\n\r\n _createContent()\r\n {\r\n /**\r\n * This is the content DOM element. Use this to add content to the Window.\r\n * @type {HTMLElement}\r\n * @readonly\r\n */\r\n this.content = html({\r\n parent: this.winBox,\r\n type: 'section',\r\n styles: {\r\n 'display': 'block',\r\n 'flex': 1,\r\n 'min-height': this.options.minHeight,\r\n // leave room under the content for the resize handle, so it can't cover the scrollbar\r\n 'margin-bottom': this.options.resizable ? '15px' : 0,\r\n 'overflow-x': 'hidden',\r\n 'overflow-y': 'auto'\r\n }\r\n })\r\n }\r\n\r\n _createOverlay()\r\n {\r\n this.overlay = html({\r\n parent: this.win,\r\n styles: {\r\n 'display': 'none',\r\n 'position': 'absolute',\r\n 'left': 0,\r\n 'top': 0,\r\n 'width': '100%',\r\n 'height': '100%'\r\n }\r\n })\r\n this.overlay.addEventListener('mousedown', (e) => { this._downTitlebar(e); e.stopPropagation() })\r\n this.overlay.addEventListener('touchstart', (e) => { this._downTitlebar(e); e.stopPropagation() })\r\n }\r\n\r\n _downTitlebar(e)\r\n { const event = this._convertMoveEvent(e)\r\n this._moving = {\r\n x: event.pageX - this.x,\r\n y: event.pageY - this.y\r\n }\r\n this.emit('move-start', this)\r\n this._moved = false\r\n }\r\n\r\n _createTitlebar()\r\n {\r\n if (this.options.titlebar)\r\n {\r\n this.winTitlebar = html({\r\n parent: this.winBox, type: 'header', styles: {\r\n 'user-select': 'none',\r\n 'display': 'flex',\r\n 'flex-direction': 'row',\r\n 'align-items': 'center',\r\n 'justify-content': 'center',\r\n 'height': this.options.titlebarHeight,\r\n 'min-height': this.options.titlebarHeight,\r\n 'border': 0,\r\n 'padding': '0 8px',\r\n 'overflow': 'hidden',\r\n }\r\n })\r\n const winTitleStyles = {\r\n 'user-select': 'none',\r\n 'flex': 1,\r\n 'display': 'flex',\r\n 'flex-direction': 'row',\r\n 'align-items': 'center',\r\n 'user-select': 'none',\r\n 'cursor': 'default',\r\n 'padding': 0,\r\n 'margin': 0,\r\n 'font-size': '16px',\r\n 'font-weight': 400,\r\n 'color': this.options.foregroundTitle\r\n }\r\n if (this.options.titleCenter)\r\n {\r\n winTitleStyles['justify-content'] = 'center'\r\n }\r\n else\r\n {\r\n winTitleStyles['padding-left'] = '8px'\r\n\r\n }\r\n this.winTitle = html({ parent: this.winTitlebar, type: 'span', html: this.options.title, styles: winTitleStyles })\r\n this._createButtons()\r\n\r\n if (this.options.movable)\r\n {\r\n this.winTitlebar.addEventListener('mousedown', (e) => this._downTitlebar(e))\r\n this.winTitlebar.addEventListener('touchstart', (e) => this._downTitlebar(e))\r\n }\r\n if (this.options.maximizable)\r\n {\r\n clicked(this.winTitlebar, () => this.maximize(), { doubleClicked: true, clicked: false})\r\n }\r\n }\r\n }\r\n\r\n _createButtons()\r\n {\r\n this.winButtonGroup = html({\r\n parent: this.winTitlebar, styles: {\r\n 'display': 'flex',\r\n 'flex-direction': 'row',\r\n 'align-items': 'center',\r\n 'padding-left': '10px'\r\n }\r\n })\r\n const button = {\r\n 'display': 'inline-block',\r\n 'border': 0,\r\n 'margin': 0,\r\n 'margin-left': '15px',\r\n 'padding': 0,\r\n 'width': '12px',\r\n 'height': '12px',\r\n 'background-color': 'transparent',\r\n 'background-size': 'cover',\r\n 'background-repeat': 'no-repeat',\r\n 'opacity': .7,\r\n 'color': this.options.foregroundButton,\r\n 'outline': 0\r\n }\r\n this.buttons = {}\r\n if (this.options.maximizable)\r\n {\r\n this.buttons.maximize = html({ parent: this.winButtonGroup, html: this.options.maximizeButton, type: 'button', styles: button })\r\n clicked(this.buttons.maximize, () => this.maximize())\r\n }\r\n if (this.options.closable)\r\n {\r\n this.buttons.close = html({ parent: this.winButtonGroup, html: this.options.closeButton, type: 'button', styles: button })\r\n clicked(this.buttons.close, () => this.close())\r\n }\r\n for (let key in this.buttons)\r\n {\r\n const button = this.buttons[key]\r\n button.addEventListener('mousemove', () =>\r\n {\r\n button.style.opacity = 1\r\n })\r\n button.addEventListener('mouseout', () =>\r\n {\r\n button.style.opacity = 0.7\r\n })\r\n }\r\n }\r\n\r\n _createResize()\r\n {\r\n this.resizeEdge = html({\r\n parent: this.winBox, type: 'button', html: this.options.backgroundResize, styles: {\r\n 'position': 'absolute',\r\n 'bottom': 0,\r\n 'right': '4px',\r\n 'border': 0,\r\n 'margin': 0,\r\n 'padding': 0,\r\n 'cursor': 'se-resize',\r\n 'user-select': 'none',\r\n 'height': '15px',\r\n 'width': '10px',\r\n 'background': 'none'\r\n }\r\n })\r\n const down = (e) =>\r\n {\r\n const event = this._convertMoveEvent(e)\r\n const width = this.width || this.win.offsetWidth\r\n const height = this.height || this.win.offsetHeight\r\n this._resizing = {\r\n width: width - event.pageX,\r\n height: height - event.pageY\r\n }\r\n this.emit('resize-start')\r\n e.preventDefault()\r\n }\r\n this.resizeEdge.addEventListener('mousedown', down)\r\n this.resizeEdge.addEventListener('touchstart', down)\r\n }\r\n\r\n _move(e)\r\n {\r\n const event = this._convertMoveEvent(e)\r\n\r\n if (!this._isTouchEvent(e) && e.which !== 1)\r\n {\r\n this._moving && this._stopMove()\r\n this._resizing && this._stopResize()\r\n }\r\n if (this._moving)\r\n {\r\n this.move(event.pageX - this._moving.x, event.pageY - this._moving.y)\r\n this.emit('move', this)\r\n e.preventDefault()\r\n }\r\n if (this._resizing)\r\n {\r\n this.resize(\r\n event.pageX + this._resizing.width,\r\n event.pageY + this._resizing.height\r\n )\r\n this.maximized = null\r\n this.emit('resize', this)\r\n e.preventDefault()\r\n }\r\n }\r\n\r\n _up()\r\n {\r\n if (this._moving)\r\n {\r\n this._stopMove()\r\n }\r\n this._resizing && this._stopResize()\r\n }\r\n\r\n _listeners()\r\n {\r\n this.win.addEventListener('mousedown', () => this.focus())\r\n this.win.addEventListener('touchstart', () => this.focus())\r\n }\r\n\r\n _stopMove()\r\n {\r\n this._moving = null\r\n this.emit('move-end', this)\r\n }\r\n\r\n _stopResize()\r\n {\r\n this._restore = this._resizing = null\r\n this.emit('resize-end', this)\r\n }\r\n\r\n _isTouchEvent(e)\r\n {\r\n return !!window.TouchEvent && (e instanceof window.TouchEvent)\r\n }\r\n\r\n _convertMoveEvent(e)\r\n {\r\n return this._isTouchEvent(e) ? e.changedTouches[0] : e\r\n }\r\n\r\n /**\r\n * attaches window to a side of the screen\r\n * @param {('horizontal'|'vertical')} direction\r\n * @param {('left'|'right'|'top'|'bottom')} location\r\n */\r\n attachToScreen(direction, location)\r\n {\r\n this._attachedToScreen[direction] = location\r\n }\r\n\r\n /**\r\n * @param {WindowManager~Bounds} bounds\r\n * @param {(boolean|'horizontal'|'vertical')} keepInside\r\n */\r\n reposition(bounds, keepInside)\r\n {\r\n this.bounds = bounds\r\n this.keepInside = keepInside\r\n let x = this.x\r\n let y = this.y\r\n x = this._attachedToScreen.horziontal === 'right' ? bounds.right - this.width : x\r\n x = this._attachedToScreen.horizontal === 'left' ? bounds.left : x\r\n y = this._attachedToScreen.vertical === 'bottom' ? bounds.bottom - this.height : y\r\n y = this._attachedToScreen.vertical === 'top' ? bounds.top : y\r\n this.move(x, y)\r\n }\r\n\r\n /**\r\n * @param {boolean} [ignoreClosed]\r\n * @returns {boolean}\r\n */\r\n isModal(ignoreClosed)\r\n {\r\n return (ignoreClosed || !this._closed) && this.options.modal\r\n }\r\n\r\n /** @returns {boolean} */\r\n isClosed()\r\n {\r\n return this._closed\r\n }\r\n\r\n get z()\r\n {\r\n return parseInt(this.win.style.zIndex)\r\n }\r\n set z(value)\r\n {\r\n this.win.style.zIndex = value\r\n }\r\n}\r\n\r\nWindow.id = 0\r\n\r\n/**\r\n * @typedef {Object} Window~WindowOptions\r\n * @property {number} [x=0]\r\n * @property {number} [y=0]\r\n * @property {number} [width]\r\n * @property {number} [height]\r\n * @property {boolean} [modal]\r\n * @property {boolean} [openOnCreate=true]\r\n * @property {*} [id]\r\n * @property {boolean} [movable=true]\r\n * @property {boolean} [resizable=true]\r\n * @property {boolean} [maximizable=true]\r\n * @property {boolean} [closable=true]\r\n * @property {boolean} [noSnap] don't snap this window or use this window as a snap target\r\n * @property {boolean} [titlebar=true]\r\n * @property {string} [titlebarHeight=36px]\r\n * @property {boolean} [titleCenter]\r\n * @property {string} [minWidth=200px]\r\n * @property {string} [minHeight=60px]\r\n * @property {string} [borderRadius=4px]\r\n * @property {string} [backgroundModal=rgba(0,0,0,0.6)]\r\n * @property {string} [backgroundWindow=#fefefe]\r\n * @property {string} [backgroundTitlebarActive=#365d98]\r\n * @property {string} [backgroundTitlebarInactive=#888888]\r\n * @property {string} [foregroundButton=#ffffff]\r\n * @property {string} [foregroundTitle=#ffffff]\r\n * @property {Object} [styles]\r\n * @property {string} [maximizeButton=...] used to replace the graphics for the button\r\n * @property {string} [closeButton=...] used to replace the graphics for the button\r\n * @property {string} [resize=...] used to replace the graphics for the button\r\n */","export const close='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\"><rect id=\"close\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" style=\"fill:none;\"/><g><path d=\"M3.5,3.5l13,13\" style=\"fill:none;stroke:#fff;stroke-width:3px;\"/><path d=\"M16.5,3.5l-13,13\" style=\"fill:none;stroke:#fff;stroke-width:3px;\"/></g></svg>';export const maximize='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\"><rect id=\"maximize\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" style=\"fill:none;\"/><rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" style=\"fill:none;stroke:#fff;stroke-width:2px;\"/><rect x=\"2\" y=\"2\" width=\"16\" height=\"3.2\" style=\"fill:#fff;\"/></svg>';export const minimize='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><rect id=\"minimize\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" style=\"fill:none;\"/><rect x=\"2\" y=\"15.6\" width=\"16\" height=\"3.2\" style=\"fill:#fff;\"/></svg>';export const resize='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><rect id=\"resize\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" style=\"fill:none;\"/><clipPath id=\"_clip1\"><rect x=\"0\" y=\"0\" width=\"20\" height=\"20\"/></clipPath><g clip-path=\"url(#_clip1)\"><rect x=\"0\" y=\"16.8\" width=\"20\" height=\"3.2\" style=\"fill:#fff;\"/><path d=\"M17.737,3.595l-14.142,14.142l2.263,2.263l14.142,-14.142l-2.263,-2.263Z\" style=\"fill:#fff;\"/><path d=\"M16.8,0l0,20l3.2,0l0,-20l-3.2,0Z\" style=\"fill:#fff;\"/><path d=\"M7.099,18.4l11.301,-11.123l0,11.123l-11.301,0Z\" style=\"fill:#fff;\"/></g></svg>';export const restore='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg width=\"100%\" height=\"100%\" viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;\"><rect id=\"restore\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" style=\"fill:none;\"/><g><rect x=\"7\" y=\"2.5\" width=\"10\" height=\"10\" style=\"fill:none;stroke:#fff;stroke-width:1.5px;\"/><rect x=\"7\" y=\"2.5\" width=\"10\" height=\"2\" style=\"fill:#fff;\"/></g><g><rect x=\"3\" y=\"7.5\" width=\"10\" height=\"10\" style=\"fill:none;stroke:#fff;stroke-width:1.5px;\"/><g><rect x=\"3\" y=\"7.5\" width=\"10\" height=\"2\" style=\"fill:#fff;\"/></g></g></svg>';","import { close, maximize, restore, resize } from './images'\n\nexport const defaultWindowOptions = {\n x: 0,\n y: 0,\n width: undefined,\n height: undefined,\n modal: false,\n openOnCreate: true,\n id: null,\n\n minWidth: '200px',\n minHeight: '60px',\n borderRadius: 0,\n styles: {},\n\n movable: true,\n resizable: true,\n maximizable: true,\n closable: true,\n\n noSnap: false,\n noMenu: false,\n\n titlebar: true,\n titlebarHeight: '2rem',\n\n backgroundWindow: '#fefefe',\n backgroundTitlebarActive: '#365d98',\n backgroundTitlebarInactive: '#888888',\n foregroundButton: '#ffffff',\n foregroundTitle: '#ffffff',\n\n closeButton: close,\n maximizeButton: maximize,\n restoreButton: restore,\n\n backgroundResize: resize\n}\n\nexport const defaultWindowManagerOptions = {\n quiet: false,\n keepInside: true,\n snap: true,\n noAccelerator: false,\n menu: false,\n styles: {},\n backgroundModal: 'rgba(0, 0, 0, 0.6)',\n}","import { html } from './html'\nimport { Menu } from './Menu/Menu'\n\nconst DEFAULT_COLOR = '#a8f0f4'\nconst DEFAULT_SIZE = 10\n\nconst SnapOptionsDefault = {\n screen: true,\n windows: true,\n snap: 20,\n color: DEFAULT_COLOR,\n spacing: 0,\n indicator: DEFAULT_SIZE\n}\n\n/**\n * edge snapping plugin\n * @param {WindowManager} wm\n * @param {object} [options]\n * @param {boolean} [options.screen=true] snap to screen edges\n * @param {boolean} [options.windows=true] snap to window edges\n * @param {number} [options.snap=20] distance to edge in pixels before snapping and width/height of snap bars\n * @param {string} [options.color=#a8f0f4] color for snap bars\n * @param {number} [options.spacing=0] spacing distance between window and edges\n * @param {number} [options.indicator=10] size in pixels of snapping indicator (the indicator is actually twice the size of what is shown)\n * @ignore\n */\nexport class Snap\n{\n constructor(wm, options={})\n {\n this.wm = wm\n this.options = { ...SnapOptionsDefault, ...options }\n this.highlights = html({ parent: this.wm.wallpaper, styles: { position: 'absolute' } })\n this.horizontal = html({\n parent: this.highlights, styles: {\n display: 'none',\n position: 'absolute',\n height: `${this.options.indicator}px`,\n borderRadius: `${this.options.indicator}px`,\n backgroundColor: this.options.color\n }\n })\n this.vertical = html({\n parent: this.highlights, styles: {\n display: 'none',\n position: 'absolute',\n width: `${this.options.indicator}px`,\n borderRadius: `${this.options.indicator}px`,\n backgroundColor: this.options.color\n }\n })\n this.horizontal\n this.showing = []\n }\n\n stop()\n {\n this.highlights.remove()\n this.stopped = true\n }\n\n addWindow(win)\n {\n win.on('move', () => this.move(win))\n win.on('move-end', () => this.moveEnd(win))\n }\n\n screenMove(rect, horizontal, vertical)\n {\n const top = Menu.getApplicationHeight()\n const width = this.wm.win.clientWidth\n const height = this.wm.win.clientHeight\n if (rect.left - this.options.snap <= width && rect.right + this.options.snap >= 0)\n {\n if (Math.abs(rect.top - top) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.top - top), left: 0, width, top: top, side: 'top', screen: true })\n }\n else if (Math.abs(rect.bottom - height) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.bottom - height), left: 0, width, top: height, side: 'bottom', screen: true })\n }\n }\n if (rect.top - this.options.snap <= height && rect.bottom + this.options.snap >= 0)\n {\n if (Math.abs(rect.left - 0) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.left - 0), top: 0, height, left: 0, side: 'left', screen: true })\n }\n else if (Math.abs(rect.right - width) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.right - width), top: 0, height, left: width, side: 'right', screen: true })\n }\n }\n }\n\n windowsMove(original, rect, horizontal, vertical)\n {\n for (let win of this.wm.windows)\n {\n if (!win.options.noSnap && win !== original)\n {\n const rect2 = win.win.getBoundingClientRect()\n if (rect.left - this.options.snap <= rect2.right && rect.right + this.options.snap >= rect2.left)\n {\n if (Math.abs(rect.top - rect2.bottom) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.top - rect2.bottom), left: rect2.left, width: rect2.width, top: rect2.bottom, side: 'top' })\n if (Math.abs(rect.left - rect2.left) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.left - rect2.left), top: rect2.top, height: rect2.height, left: rect2.left, side: 'left', noSpacing: true })\n }\n else if (Math.abs(rect.right - rect2.right) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.right - rect2.right), top: rect2.top, height: rect2.height, left: rect2.right, side: 'right', noSpacing: true })\n }\n }\n else if (Math.abs(rect.bottom - rect2.top) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.bottom - rect2.top), left: rect2.left, width: rect2.width, top: rect2.top, side: 'bottom' })\n if (Math.abs(rect.left - rect2.left) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.left - rect2.left), top: rect2.top, height: rect2.height, left: rect2.left, side: 'left', noSpacing: true })\n }\n else if (Math.abs(rect.right - rect2.right) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.right - rect2.right), top: rect2.top, height: rect2.height, left: rect2.right, side: 'right', noSpacing: true })\n }\n }\n }\n if (rect.top - this.options.snap <= rect2.bottom && rect.bottom + this.options.snap >= rect2.top)\n {\n if (Math.abs(rect.left - rect2.right) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.left - rect2.right), top: rect2.top, height: rect2.height, left: rect2.right, side: 'left' })\n if (Math.abs(rect.top - rect2.top) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.top - rect2.top), left: rect2.left, width: rect2.width, top: rect2.top, side: 'top', noSpacing: true })\n }\n else if (Math.abs(rect.bottom - rect2.bottom) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.bottom - rect2.bottom), left: rect2.left, width: rect2.width, top: rect2.bottom, side: 'bottom', noSpacing: true })\n }\n }\n else if (Math.abs(rect.right - rect2.left) <= this.options.snap)\n {\n vertical.push({ distance: Math.abs(rect.right - rect2.left), top: rect2.top, height: rect2.height, left: rect2.left, side: 'right' })\n if (Math.abs(rect.top - rect2.top) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.top - rect2.top), left: rect2.left, width: rect2.width, top: rect2.top, side: 'top', noSpacing: true })\n }\n else if (Math.abs(rect.bottom - rect2.bottom) <= this.options.snap)\n {\n horizontal.push({ distance: Math.abs(rect.bottom - rect2.bottom), left: rect2.left, width: rect2.width, top: rect2.bottom, side: 'bottom', noSpacing: true })\n }\n }\n }\n }\n }\n }\n\n move(win)\n {\n if (this.stopped || win.options.noSnap || win.isModal())\n {\n return\n }\n this.horizontal.style.display = 'none'\n this.vertical.style.display = 'none'\n const horizontal = []\n const vertical = []\n const rect = win.win.getBoundingClientRect()\n if (this.options.screen)\n {\n this.screenMove(rect, horizontal, vertical)\n }\n if (this.options.windows)\n {\n this.windowsMove(win, rect, horizontal, vertical)\n }\n if (horizontal.length)\n {\n horizontal.sort((a, b) => { return a.distance - b.distance })\n const find = horizontal[0]\n this.horizontal.style.display = 'block'\n this.horizontal.style.width = find.width + 'px'\n this.horizontal.y = find.top - this.options.indicator / 2\n this.horizontal.yPosition = find.top\n this.horizontal.style.transform = `translate(${find.left}px,${this.horizontal.y}px)`\n this.horizontal.side = find.side\n this.horizontal.noSpacing = find.noSpacing\n this.horizontal.screen = find.screen\n }\n if (vertical.length)\n {\n vertical.sort((a, b) => { return a.distance - b.distance })\n const find = vertical[0]\n this.vertical.style.display = 'block'\n this.vertical.style.height = find.height + 'px'\n this.vertical.x = find.left - this.options.indicator / 2\n this.vertical.xPosition = find.left\n this.vertical.style.transform = `translate(${this.vertical.x}px,${find.top}px)`\n this.vertical.side = find.side\n this.vertical.noSpacing = find.noSpacing\n this.vertical.screen = find.screen\n }\n }\n\n moveEnd(win)\n {\n if (this.stopped)\n {\n return\n }\n const bounds = this.wm.bounds\n const top = Menu.getApplicationHeight()\n if (this.horizontal.style.display === 'block')\n {\n const spacing = this.horizontal.noSpacing ? 0 : this.options.spacing\n switch (this.horizontal.side)\n {\n case 'top':\n win.y = this.horizontal.yPosition + spacing - bounds.top + top\n break\n\n case 'bottom':\n win.bottom = Math.floor(this.horizontal.yPosition - spacing - bounds.top + top)\n break\n }\n win.attachToScreen('vertical', this.horizontal.screen ? this.horizontal.side : '')\n }\n if (this.vertical.style.display === 'block')\n {\n const spacing = this.vertical.noSpacing ? 0 : this.options.spacing\n switch (this.vertical.side)\n {\n case 'left':\n win.x = this.vertical.xPosition + spacing - bounds.left\n break\n\n case 'right':\n win.right = Math.floor(this.vertical.xPosition - spacing - bounds.left)\n break\n }\n win.attachToScreen('horziontal', this.vertical.screen ? this.vertical.side : '')\n }\n this.horizontal.style.display = this.vertical.style.display = 'none'\n }\n}\n\n\n/**\n * @typedef {Object} Snap~SnapOptions\n * @property {boolean} [screen=true] snap to screen edges\n * @property {boolean} [windows=true] snap to window edges\n * @property {number} [snap=20] distance to edge before snapping\n * @property {string} [color=#a8f0f4] color for snap bars\n * @property {number} [spacing=0] spacing distance between window and edges\n * @property {number} [options.indicator=10] size in pixels of snapping indicator (the indicator is actually twice the size of what is shown)\n */","import { html } from './html'\r\nimport { Window } from './Window'\r\nimport { defaultWindowManagerOptions, defaultWindowOptions } from './defaults'\r\nimport { Snap } from './Snap'\r\nimport { accelerator } from './accelerator'\r\nimport { Menu } from './Menu/Menu'\r\n\r\n/**\r\n * Create the WindowManager\r\n * @param {Object} [options]\r\n * @param {HTMLElement} [options.parent=document.body] parent to append WindowManager\r\n * @param {string} [options.backgroundModal=rgba(0, 0, 0, 0.6)] background color for window\r\n * @param {boolean} [options.quiet] suppress the simple-window-manager console message\r\n * @param {(boolean|WindowManager~SnapOptions)} [options.snap] initialize snap plugin\r\n * @param {boolean} [options.noAccelerator] do not initialize keyboard accelerators (needed for Menu)\r\n * @param {(boolean|'horizontal'|'vertical')} [options.keepInside=true] keep windows inside the parent in a certain direction\r\n * @param {Object} [options.styles] additional hard-coded styles for main container window (eg, { color: 'green' })\r\n * @param {Window~WindowOptions} [windowOptions] default options used when createWindow is called\r\n */\r\nexport class WindowManager\r\n{\r\n constructor(options = {}, windowOptions = {})\r\n {\r\n this.options = { ...defaultWindowManagerOptions, ...options }\r\n this.options.parent = this.options.parent || document.body\r\n if (!this.options.quiet)\r\n {\r\n console.log('%c ☕ simple-window-manager initialized ☕', 'color: #ff00ff')\r\n }\r\n this.windows = []\r\n this.active = null\r\n this._setupWin()\r\n this._setupWallpaper()\r\n this._setupModal()\r\n if (this.options.snap)\r\n {\r\n this.snap(this.options.snap === true ? {} : this.options.snap)\r\n }\r\n this.windowOptions = { ...defaultWindowOptions, ...windowOptions }\r\n window.addEventListener('resize', () => this.resize())\r\n if (!this.options.noAccelerator)\r\n {\r\n accelerator.init()\r\n }\r\n }\r\n\r\n /**\r\n * Create a window\r\n * @param {WindowOptions} [options]\r\n * @param {string} [options.title]\r\n * @param {number} [options.x] position\r\n * @param {number} [options.y] position\r\n * @param {boolean} [options.modal]\r\n * @param {(number|*)} [options.id] if not provide, id will be assigned in order of creation (0, 1, 2...)\r\n * @returns {Window} the created window\r\n */\r\n createWindow(options = {})\r\n {\r\n const win = new Window(this, { ...this.windowOptions, ...options })\r\n win.on('open', () => this._open(win))\r\n win.on('focus', () => this._focus(win))\r\n win.on('blur', () => this._blur(win))\r\n win.on('close', () => this._close(win))\r\n win.win.addEventListener('mousemove', (e) => this._move(e))\r\n win.win.addEventListener('touchmove', (e) => this._move(e))\r\n win.win.addEventListener('mouseup', (e) => this._up(e))\r\n win.win.addEventListener('touchend', (e) => this._up(e))\r\n if (this._snap && !options.noSnap)\r\n {\r\n this._snap.addWindow(win)\r\n }\r\n win.reposition(this.bounds, this.options.keepInside)\r\n if (win.options.openOnCreate)\r\n {\r\n win.open()\r\n }\r\n return win\r\n }\r\n\r\n /**\r\n * enable edge and/or screen snapping\r\n * @param {WindowManager~SnapOptions} [options]\r\n */\r\n snap(options)\r\n {\r\n this._snap = new Snap(this, options)\r\n for (const win of this.windows)\r\n {\r\n if (!win.options.noSnap)\r\n {\r\n this._snap.addWindow(win)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * send window to front\r\n * @param {Window} win\r\n */\r\n sendToFront(win)\r\n {\r\n const index = this.windows.indexOf(win)\r\n console.assert(index !== -1, 'sendToFront should find window in this.windows')\r\n if (index !== this.windows.length - 1)\r\n {\r\n this.windows.splice(index, 1)\r\n this.windows.push(win)\r\n this._reorder()\r\n }\r\n }\r\n\r\n /**\r\n * send window to back\r\n * @param {Window} win\r\n */\r\n sendToBack(win)\r\n {\r\n const index = this.windows.indexOf(win)\r\n console.assert(index !== -1, 'sendToFront should find window in this.windows')\r\n if (index !== 0)\r\n {\r\n this.windows.splice(index, 1)\r\n this.windows.unshift(win)\r\n this._reorder()\r\n }\r\n }\r\n\r\n /**\r\n * save the state of all the windows\r\n * @returns {Object} use this object in load() to restore the state of all windows\r\n */\r\n save()\r\n {\r\n const data = {}\r\n for (let i = 0; i < this.windows.length; i++)\r\n {\r\n const win = this.windows[i]\r\n data[win.id] = win.save()\r\n data[win.id].order = i\r\n }\r\n return data\r\n }\r\n\r\n /**\r\n * restores the state of all the windows\r\n * NOTE: this requires that the windows have the same id as when save() was called\r\n * @param {Object} data created by save()\r\n */\r\n load(data)\r\n {\r\n for (const id in data)\r\n {\r\n const win = this.getWindowById(id)\r\n if (win)\r\n {\r\n win.load(data[id])\r\n }\r\n }\r\n // reorder windows\r\n }\r\n\r\n /**\r\n * close all windows\r\n */\r\n closeAll()\r\n {\r\n for (let win of this.windows)\r\n {\r\n win.close()\r\n }\r\n this.windows = []\r\n this.active = null\r\n }\r\n\r\n /**\r\n * reorder windows\r\n * @private\r\n * @returns {number} available z-index for top window\r\n */\r\n _reorder()\r\n {\r\n let i = 0\r\n for (const win of this.windows)\r\n {\r\n if (!win.isClosed())\r\n {\r\n win.z = i++\r\n }\r\n }\r\n }\r\n\r\n _setupWin()\r\n {\r\n /**\r\n * This is the top-level DOM element\r\n * @type {HTMLElement}\r\n * @readonly\r\n */\r\n this.win = html({\r\n parent: this.options.parent,\r\n styles: {\r\n ...{\r\n 'user-select': 'none',\r\n 'width': '100%',\r\n 'height': '100%',\r\n 'overflow': 'hidden',\r\n 'z-index': -1,\r\n 'cursor': 'default',\r\n },\r\n ...this.options.styles\r\n }\r\n })\r\n }\r\n\r\n _setupWallpaper()\r\n {\r\n /**\r\n * This is the bottom DOM element. Use this to set a wallpaper or attach elements underneath the windows\r\n * @type {HTMLElement}\r\n * @readonly\r\n */\r\n this.wallpaper = html({\r\n parent: this.win,\r\n styles: {\r\n ...{\r\n 'user-select': 'none',\r\n 'position': 'absolute',\r\n 'top': 0,\r\n 'left': 0,\r\n 'width': '100%',\r\n 'height': '100%',\r\n 'overflow': 'hidden'\r\n }\r\n }\r\n })\r\n this.wallpaper.addEventListener('mousemove', (e) => this._move(e))\r\n this.wallpaper.addEventListener('touchmove', (e) => this._move(e))\r\n this.wallpaper.addEventListener('mouseup', (e) => this._up(e))\r\n this.wallpaper.addEventListener('touchend', (e) => this._up(e))\r\n }\r\n\r\n _setupModal()\r\n {\r\n this.modalOverlay = html({\r\n parent: this.win,\r\n styles: {\r\n 'display': 'none',\r\n 'user-select': 'none',\r\n 'position': 'absolute',\r\n 'top': 0,\r\n 'left': 0,\r\n 'width': '100%',\r\n 'height': '100%',\r\n 'overflow': 'hidden',\r\n 'background': this.options.backgroundModal\r\n }\r\n })\r\n this.modalOverlay.addEventListener('mousemove', (e) => { this._move(e); e.preventDefault(); e.stopPropagation() })\r\n this.modalOverlay.addEventListener('touchmove', (e) => { this._move(e); e.preventDefault(); e.stopPropagation() })\r\n this.modalOverlay.addEventListener('mouseup', (e) => { this._up(e); e.preventDefault(); e.stopPropagation() })\r\n this.modalOverlay.addEventListener('touchend', (e) => { this._up(e); e.preventDefault(); e.stopPropagation() })\r\n this.modalOverlay.addEventListener('mousedown', (e) => { e.preventDefault(); e.stopPropagation() })\r\n this.modalOverlay.addEventListener('touchstart', (e) => { e.preventDefault(); e.stopPropagation() })\r\n }\r\n\r\n _open(win)\r\n {\r\n this.windows.push(win)\r\n this._reorder()\r\n if (win.options.modal)\r\n {\r\n this.modalOverlay.style.display = 'block'\r\n this.modalOverlay.style.zIndex = win.z\r\n }\r\n else\r\n {\r\n this.modalOverlay.style.display = 'none'\r\n }\r\n }\r\n\r\n _focus(win)\r\n {\r\n if (this.active === win)\r\n {\r\n return\r\n }\r\n if (this.active)\r\n {\r\n this.active.blur()\r\n }\r\n const index = this.windows.indexOf(win)\r\n console.assert(index !== -1, 'WindowManager._focus should find window in this.windows')\r\n if (index !== this.windows.length - 1)\r\n {\r\n this.windows.splice(index, 1)\r\n this.windows.push(win)\r\n }\r\n this._reorder()\r\n this.active = this.windows[this.windows.length - 1]\r\n }\r\n\r\n _blur(win)\r\n {\r\n if (this.active === win)\r\n {\r\n this.active = null\r\n }\r\n }\r\n\r\n _close(win)\r\n {\r\n if (win.isModal(true))\r\n {\r\n const next = this.windows[this.windows.length - 1]\r\n if (next && next.isModal())\r\n {\r\n this.modalOverlay.style.zIndex = next.z\r\n }\r\n else\r\n {\r\n this.modalOverlay.style.display = 'none'\r\n }\r\n }\r\n }\r\n\r\n _move(e)\r\n {\r\n for (const key in this.windows)\r\n {\r\n this.windows[key]._move(e)\r\n }\r\n }\r\n\r\n _up(e)\r\n {\r\n for (const key in this.windows)\r\n {\r\n this.windows[key]._up(e)\r\n }\r\n }\r\n\r\n checkModal(win)\r\n {\r\n return !this.modal || this.modal === win\r\n }\r\n\r\n /** @type {WindowManager~Bounds} */\r\n get bounds()\r\n {\r\n const top = Menu.getApplicationHeight()\r\n return {\r\n top: this.win.offsetTop + top,\r\n bottom: this.win.offsetTop + this.win.offsetHeight,\r\n left: this.win.offsetLeft,\r\n right: this.win.offsetLeft + this.win.offsetWidth\r\n }\r\n }\r\n\r\n resize()\r\n {\r\n const bounds = this.bounds\r\n for (const key in this.windows)\r\n {\r\n this.windows[key].reposition(bounds, this.options.keepInside)\r\n }\r\n }\r\n\r\n /**\r\n * Find a window by id\r\n * @param {*} id\r\n * @returns {Window}\r\n */\r\n getWindowById(id)\r\n {\r\n return this.windows.find(win => win.id === id)\r\n }\r\n}\r\n\r\n/**\r\n * @typedef {Object} WindowManager~Bounds\r\n * @property {number} left\r\n * @property {number} right\r\n * @property {number} top\r\n * @property {number} bottom\r\n */\r\n\r\n /**\r\n * @typedef {Object} WindowManager~SnapOptions\r\n * @property {boolean} [screen=true] snap to screen edges\r\n * @property {boolean} [windows=true] snap to window edges\r\n * @property {number} [snap=20] distance to edge in pixels before snapping and width/height of snap bars\r\n * @property {string} [color=#a8f0f4] color for snap bars\r\n * @property {number} [spacing=0] spacing distance between window and edges\r\n * @property {number} [indicator=10] size in pixels of snapping indicator (the indicator is actually twice the size of what is shown)\r\n */"],"names":["html","options","element","document","createElement","type","styles","Object","assign","style","className","innerHTML","parent","appendChild","has","prototype","hasOwnProperty","prefix","Events","EE","fn","context","once","this","addListener","emitter","event","TypeError","listener","evt","_events","push","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","events","name","names","call","slice","getOwnPropertySymbols","concat","listeners","handlers","i","l","length","ee","Array","listenerCount","emit","a1","a2","a3","a4","a5","args","len","arguments","removeListener","undefined","apply","j","on","removeAllListeners","off","prefixed","module","defaultOptions","threshold","clicked","doubleClicked","doubleClickedTime","longClicked","longClickedTime","capture","clickDown","callback","Clicked","constructor","querySelector","mousedown","e","mouseup","mousemove","touchstart","touchmove","touchcancel","cancel","touchend","addEventListener","passive","console","warn","destroy","removeEventListener","down","touches","handleDown","changedTouches","screenX","screenY","pastThreshold","x","y","Math","abs","lastX","lastY","doubleClickedTimeout","clearTimeout","longClickedTimeout","preventDefault","handleClicks","pointerId","setTimeout","doubleClickedCancel","longClikedTimeout","config","ApplicationContainerStyle","position","top","left","ApplicationMenuStyle","display","color","backgroundColor","width","border","outline","ApplicationMenuRowStyle","padding","margin","MenuStyle","boxShadow","RowStyle","AcceleratorStyle","opacity","SeparatorStyle","AcceleratorKeyStyle","MinimumColumnWidth","SelectedBackgroundStyle","Overlap","SubmenuOpenDelay","accelerator","init","initialized","menuKeys","keys","body","_keydown","_keyup","clearMenuKeys","clearKeys","registerMenuShortcut","letter","menuItem","keyCode","menu","applicationMenu","_prepareKey","handleClick","stopPropagation","registerMenuSpecial","closeAll","enter","move","registerAlt","pressed","released","alt","unregisterMenuShortcuts","split","indexOf","code","key","modifiers","toLowerCase","replace","modifier","sort","a","b","part","prettifyKey","codes","toUpperCase","substr","register","isPressed","altKey","ctrlKey","metaKey","shiftKey","translate","Menu","div","children","applyConfig","tabIndex","append","submenu","insert","pos","childNodes","insertBefore","splice","hide","current","showing","remove","next","show","showAccelerators","hideAccelerators","offsetLeft","offsetTop","offsetHeight","offsetWidth","attached","application","label","arrow","checked","child","check","childLabel","childAccelerator","window","innerWidth","innerHeight","focus","base","showShortcut","index","text","hideShortcut","background","moveChild","direction","selector","horizontalSelector","items","showApplicationAccelerators","getApplicationHeight","setApplicationMenu","blur","Window","wm","super","id","_createWin","_createWinBox","_createTitlebar","_createContent","resizable","_createResize","_createOverlay","_buildTransform","_listeners","active","maximized","_closed","_restore","_moving","_resizing","_attachedToScreen","vertical","horziontal","open","noFocus","win","titlebar","winTitlebar","backgroundTitlebarActive","backgroundTitlebarInactive","close","closed","value","transform","height","resize","keepInside","maximize","maximizable","buttons","maximizeButton","wallpaper","restoreButton","sendToBack","sendToFront","save","data","load","title","_title","winTitle","innerText","right","bottom","center","borderRadius","overflow","minWidth","minHeight","backgroundWindow","isNaN","winBox","content","flex","overlay","_downTitlebar","_convertMoveEvent","pageX","pageY","_moved","titlebarHeight","winTitleStyles","cursor","foregroundTitle","titleCenter","_createButtons","movable","winButtonGroup","button","foregroundButton","closable","closeButton","resizeEdge","backgroundResize","_move","_isTouchEvent","which","_stopMove","_stopResize","_up","TouchEvent","attachToScreen","location","reposition","bounds","horizontal","isModal","ignoreClosed","modal","isClosed","z","parseInt","zIndex","defaultWindowOptions","openOnCreate","noSnap","noMenu","defaultWindowManagerOptions","quiet","snap","noAccelerator","backgroundModal","SnapOptionsDefault","screen","windows","spacing","indicator","Snap","highlights","stop","stopped","addWindow","moveEnd","screenMove","rect","clientWidth","clientHeight","distance","side","windowsMove","original","rect2","getBoundingClientRect","noSpacing","find","yPosition","xPosition","floor","windowOptions","log","_setupWin","_setupWallpaper","_setupModal","createWindow","_open","_focus","_blur","_close","_snap","assert","_reorder","unshift","order","getWindowById","modalOverlay","checkModal"],"mappings":"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","x_google_ignoreList":[1,2]}
|