diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 2abdcee..0000000 --- a/.babelrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "presets": [ - "env" - ], - "plugins": [ - "transform-object-rest-spread" - ] -} \ No newline at end of file diff --git a/.eslintrc b/.eslintrc index acbacb1..2e4820d 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,22 +1,20 @@ { - "extends": [ - "airbnb-base", - "eslint:recommended" - ], - "rules": { - "max-len": ["error", 100], - "indent": ["error", 2, {"SwitchCase": 1}], - "import/prefer-default-export": 0 - }, - "settings": { - "import/resolver": "webpack" - }, - "plugins": [ - "import" - ], - "parser": "babel-eslint", "env": { "browser": true, + "es2022": true, "node": true + }, + "extends": [ + "eslint:recommended" + ], + "parserOptions": { + "ecmaVersion": 2022, + "sourceType": "module" + }, + "rules": { + "indent": ["error", 2], + "linebreak-style": ["error", "unix"], + "quotes": ["error", "single"], + "semi": ["error", "always"] } } diff --git a/MODERNIZATION_SUMMARY.md b/MODERNIZATION_SUMMARY.md new file mode 100644 index 0000000..9201868 --- /dev/null +++ b/MODERNIZATION_SUMMARY.md @@ -0,0 +1,116 @@ +# Ventus Library Modernization - Migration to Vite + +## Overview +Successfully modernized the Ventus window manager library from Webpack 4 to Vite 5, updating the build system, dependencies, and module format to use modern JavaScript tooling. + +## Major Changes Made + +### 1. Build System Migration +- **Replaced Webpack 4** with **Vite 5** for faster development and building +- **Removed old configuration files:** + - `webpack.config.js` + - `webpack.dev.config.js` + - `webpack.prod.config.js` + - `karma.conf.js` (replaced with Vitest) + - `.babelrc` (Vite handles transpilation natively) + +### 2. Package.json Updates +- **Updated dependencies** to modern versions: + - Vite 5.4.10 + - Autoprefixer 10.4.20 + - ESLint 9.14.0 + - Less 4.2.0 + - PostCSS 8.4.47 + - Vitest 2.1.4 +- **Removed outdated dependencies:** + - All Webpack-related packages + - Babel packages (no longer needed) + - Karma test runner packages +- **Added module exports configuration** for both ESM and UMD builds +- **Updated scripts** for modern development workflow + +### 3. Module System Conversion +- **Converted all AMD modules to ES6 modules:** + - `src/ventus/core/emitter.js` + - `src/ventus/core/view.js` + - `src/ventus/wm/window.js` + - `src/ventus/wm/windowmanager.js` + - `src/ventus/wm/modes/default.js` + - `src/ventus/wm/modes/expose.js` +- **Updated main entry point** (`src/ventus.js`) to use ES6 export syntax +- **Fixed import paths** for LESS files and dependencies + +### 4. Configuration Files +- **Created `vite.config.js`** with: + - Library build configuration for UMD and ES module formats + - LESS preprocessing support + - PostCSS with autoprefixer integration + - Source map generation + - Terser minification +- **Updated `postcss.config.js`** to use ES6 module syntax +- **Modernized `.eslintrc`** for ES2022 and ES modules + +### 5. Development Environment +- **Added `index.html`** for development testing +- **Set up modern dev server** with hot reloading +- **Configured proper alias resolution** for internal modules + +### 6. Testing Migration +- **Migrated from Karma/Mocha/Chai to Vitest** +- **Updated test file** (`test/window.test.js`) to use: + - Modern ES6 import syntax + - Vitest's expect API + - Arrow functions instead of function expressions + +## Build Output +The modernized build generates: +- `dist/ventus.js` - ES module build (32KB) +- `dist/ventus.umd.cjs` - UMD build for legacy compatibility (18KB) +- `dist/style.css` - Compiled LESS styles (9.6KB) +- Source maps for debugging + +## Development Commands +```bash +# Install dependencies +npm install + +# Start development server +npm run dev + +# Build for production +npm run build + +# Preview production build +npm run preview + +# Run tests +npm test + +# Run tests once +npm run test:run + +# Lint code +npm run lint +``` + +## Benefits of Modernization +1. **Faster development** - Vite's dev server is significantly faster than Webpack +2. **Modern tooling** - Updated to latest versions of all build tools +3. **Better tree shaking** - ES modules enable better dead code elimination +4. **Improved DX** - Hot module replacement and instant updates +5. **Future-proof** - Uses modern JavaScript standards and tooling +6. **Smaller bundle size** - More efficient bundling with Rollup +7. **Better debugging** - Improved source maps and error reporting + +## Backward Compatibility +- UMD build maintains compatibility with older module systems +- Library API remains unchanged +- Both CommonJS (`require()`) and ES modules (`import`) are supported + +## Status +✅ **Completed Successfully** +- Build system fully migrated to Vite +- All modules converted to ES6 +- Development server working +- Production builds generating correctly +- Library maintains full functionality \ No newline at end of file diff --git a/README.md b/README.md index da34804..10166de 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,49 @@ -Ventus WM [![Build Status](https://travis-ci.org/rlamana/Ventus.svg?branch=master)](https://travis-ci.org/rlamana/Ventus) [![Join the chat at https://gitter.im/rlamana/Ventus](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/rlamana/Ventus?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +Ventus WM [![Join the chat at https://gitter.im/rlamana/Ventus](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/rlamana/Ventus?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) =========================== -A window manager written in Javascript, HTML5 and CSS3. +An experimental window manager built with JavaScript, HTML5, and CSS3, originally implemented in 2012. Live Demo! (http://www.rlamana.com/ventus) | Video Demo -This project started as an experiment and even though it was stable enough **it was never meant to be mantained over time**. However, feel free to fork and send PRs! +> [!CAUTION] +> This project started as an experiment and even though it was stable enough **it was never meant to be mantained over time**. However, feel free to fork and send PRs! -Version 0.3.0 migrates code to webpack and ES6 and is available in branch: https://github.com/rlamana/Ventus/tree/v0.3.0. +> [!NOTE] +> Version 0.4.0 has been modernized by automated AI agents to use Vite, ES6 modules, and contemporary tooling. While the code appears stable, it remains an experimental project and is not intended for production use. + +## Development Setup + +```bash +# Install dependencies +npm install + +# Start development server +npm run dev + +# Build for production +npm run build + +# Run tests +npm test + +# Preview production build +npm run preview +``` + +## Installation + +The library is built as both ES modules and UMD for compatibility: + +```javascript +// ES modules +import { WindowManager, Window } from 'ventus'; + +// CommonJS +const { WindowManager, Window } = require('ventus'); + +// UMD (browser) +const wm = new Ventus.WindowManager(); +``` ### Creating a new window manager diff --git a/dist/style.css b/dist/style.css new file mode 100644 index 0000000..1a1af9d --- /dev/null +++ b/dist/style.css @@ -0,0 +1 @@ +@keyframes wobbly{0%{transform:rotate(4deg)}50%{transform:rotate(-4deg)}to{transform:rotate(4deg)}}@keyframes appear{0%{transform:scale(0)}80%{transform:scale(1.2)}to{transform:rotate(1,1)}}@keyframes close{0%{transform:scale(1)}20%{transform:scale(1.2)}to{transform:scale(0)}}.wm-window{opacity:.98;display:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;overflow:hidden;position:absolute;min-width:200px;min-height:60px;background-color:#fff;box-shadow:0 0 12px 1px #0009;transform:translateZ(0)}.wm-window .wm-window-overlay{display:none}.wm-window .wm-window-box{display:flex;flex-direction:column;height:100%;min-height:60px;width:100%}.wm-window .wm-window-box .wm-window-title{display:flex;flex-direction:row;align-items:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;height:36px;min-height:36px;background-color:#365d98;border:0;padding:0 8px;overflow:hidden}.wm-window .wm-window-box .wm-window-title h1{flex:1;display:flex;flex-direction:row;align-items:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:default;padding:0 0 0 8px;margin:0;font-size:16px;font-weight:400;color:#fff}.wm-window .wm-window-box .wm-window-title .wm-button-group{display:flex;flex-direction:row;align-items:center;padding-left:2px}.wm-window .wm-window-box .wm-window-title button{display:inline-block;border:0;background-repeat:no-repeat;background-color:#365d98;color:#fff;margin:0 0 0 3px;padding:0;width:15px;height:15px;opacity:.7}.wm-window .wm-window-box .wm-window-title button:hover{opacity:1}.wm-window .wm-window-box .wm-window-title button.wm-close{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAABi8KSDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkIxOUQwNTEzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkIxOUQwNTIzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQjE5RDA0RjMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQjE5RDA1MDMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpFaWsQAAABxSURBVHjajJDRDcAgCERtJ2AER+oIjuZIHcER3IBCvDYX5KMklwg8lPNQ1fI3TjpfJgl9QX2F32yquuI2CWqCXNH/YFejgUpgexmGeUAjmMH+9AA4aKUN5h174qFkYEs8CMNuaMYdkc/sNySAW/0RYABjHiW8yydeWwAAAABJRU5ErkJggg==) no-repeat 1px 1px}.wm-window .wm-window-box .wm-window-title button.wm-maximize{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAABi8KSDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkIxOUQwNTUzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkIxOUQwNTYzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQjE5RDA1MzMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQjE5RDA1NDMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqAiG1YAAAA7SURBVHjaYvz//z8DsYAJSj8E4v948AdkxSSZDALyQMyIBQtgU0ySyQOomAWJ/RCPuo8ggpGUSAEIMACTWxDft/Hl3wAAAABJRU5ErkJggg==) no-repeat 1px 1px}.wm-window .wm-window-box .wm-window-title button.wm-minimize{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAABi8KSDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzYwRDNDRkMzMDM5MTFFMkI5MUFGMzlFMTgwOEI4ODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzYwRDNDRkQzMDM5MTFFMkI5MUFGMzlFMTgwOEI4ODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQjE5RDA1NzMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQjE5RDA1ODMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsZJjdUAAAAlSURBVHjaYvz//z8DsYCJgQQwqhgZsCCx8QU4I7piRkImAwQYAJ10BBYiYyqTAAAAAElFTkSuQmCC) no-repeat 1px 1px}.wm-window .wm-window-box header.wm-window-title.hide{display:none}.wm-window .wm-window-box section.wm-content{display:block;flex:1;min-height:60px;overflow-x:hidden;overflow-y:auto}.wm-window .wm-window-box button.wm-resize{position:absolute;bottom:0;right:4px;background:transparent;border:0;margin:0;padding:0;cursor:se-resize;-webkit-user-select:none;-moz-user-select:none;user-select:none;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzREODAwQzcyRjZDMTFFMjg5NkREMENBNjJERUE4Q0IiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzREODAwQzgyRjZDMTFFMjg5NkREMENBNjJERUE4Q0IiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNEQ4MDBDNTJGNkMxMUUyODk2REQwQ0E2MkRFQThDQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNEQ4MDBDNjJGNkMxMUUyODk2REQwQ0E2MkRFQThDQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuQy0VQAAACLSURBVHjaYpw9ezYDEUARiO8zEaHQHohPArEcCxEK1wGxPxA/wmeyDZLCIyABJjwKNwJxEFShIi7FyAoPArEZEB8DYi0mHFaHIikEaUwE4mtMWBRGAPE+NIU7kJ0BUxiNQyFInpMJKgFTuBuLQj8gXg3yJCicHyFZDQJfgDgOqhEE3gGxD8jNAAEGADlXJQUd3J75AAAAAElFTkSuQmCC) no-repeat;height:15px;width:10px}.wm-window.disabled *{-webkit-user-select:none;-moz-user-select:none;user-select:none}.wm-window.disabled .wm-window-overlay{display:block;position:absolute;top:0;left:0;width:100%;height:100%;background:#000;opacity:0;z-index:30000}.wm-window.inactive *{-webkit-user-select:none;-moz-user-select:none;user-select:none}.wm-window.inactive header.wm-window-title{background-color:#888}.wm-window.inactive header.wm-window-title h1{color:#bbb}.wm-window.active .wm-content *{-webkit-user-select:text;-moz-user-select:text;user-select:text}.wm-window.noresizable .wm-window-box header.wm-window-title button.wm-maximize,.wm-window.noresizable .wm-window-box header.wm-window-title button.wm-minimize{display:none}.wm-window.noresizable .wm-window-box section.wm-content{overflow-y:hidden}.wm-window.noresizable .wm-window-box button.wm-resize{display:none}.wm-window.animated.minimizing,.wm-window.animated.maximazing{transform:translateZ(0);transition:all .5s ease-out}.wm-window.animated.closing{animation:close .3s 1 ease-in forwards}.wm-window.closing{animation:close}.wm-window.animated.opening{animation:appear .4s 1 ease-out forwards}.wm-window.opening{animation:appear}.wm-window.animated.resizing{transition:none}.wm-window.animated.move{animation:wobbly .5s .2s infinite}.wm-window.animated.move *{-webkit-user-select:none;-moz-user-select:none;user-select:none}.wm-window.closed{display:none}.no-events .wm-content{pointer-events:none}.wm-space.expose .wm-window{transform:translateZ(0)}.wm-space.expose .wm-window section.wm-content{-webkit-user-select:none;-moz-user-select:none;user-select:none}.wm-space.expose .wm-window.wm-window.animated{transform:translateZ(0);transition:top .5s ease-out,left .5s ease-out}.wm-space.expose .wm-window:hover{box-shadow:0 0 40px #008}.wm-space{-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;height:100%;overflow:hidden;z-index:-1;cursor:default}.wm-space .wm-overlay{-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:#000;position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden;opacity:0;transition:opacity .5s ease-out} diff --git a/dist/ventus.css b/dist/ventus.css deleted file mode 100644 index 4a5ec9d..0000000 --- a/dist/ventus.css +++ /dev/null @@ -1,332 +0,0 @@ -.wm-space.expose .wm-window { - transform: translate3d(0, 0, 0); -} -.wm-space.expose .wm-window section.wm-content { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.wm-space.expose .wm-window.wm-window.animated { - transform: translate3d(0, 0, 0); - transition: top 0.5s ease-out, left 0.5s ease-out; -} -.wm-space.expose .wm-window:hover { - box-shadow: 0px 0px 40px #000088; -} - -.wm-space.fullscreen .wm-window { - transform: translate3d(0, 0, 0); -} -.wm-space.fullscreen .wm-window.animated { - transition: all 0.5s ease-out; -} -.wm-space.fullscreen .wm-window.animated .wm-window-title, -.wm-space.fullscreen .wm-window.animated .wm-window-title h1 { - transition: all 0.5s ease-out; -} -.wm-space.fullscreen .wm-window-title { - background: transparent; - font-size: 40px; - height: 50px; - padding: 40px 50px; -} -.wm-space.fullscreen .wm-window-title .wm-button-group { - display: none; -} -.wm-space.fullscreen .wm-window-title h1 { - font-size: 40px; -} -.wm-space.fullscreen .wm-content { - padding: 0 40px; -} -.wm-space.fullscreen .wm-content.animated { - transition: all 0.5s ease-out; -} -.wm-space.fullscreen .wm-resize { - display: none; -} - -/* Wobbly animation */ -@keyframes wobbly { - 0% { - transform: rotate(4deg); - } - 50% { - transform: rotate(-4deg); - } - 100% { - transform: rotate(4deg); - } -} -/* Appear animation */ -@keyframes appear { - 0% { - transform: scale(0, 0); - } - 80% { - transform: scale(1.2, 1.2); - } - 100% { - transform: rotate(1, 1); - } -} -/* Close animation */ -@keyframes close { - 0% { - transform: scale(1, 1); - } - 20% { - transform: scale(1.2, 1.2); - } - 100% { - transform: scale(0, 0); - } -} -/* Window styles */ -.wm-window { - opacity: 0.98; - display: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - overflow: hidden; - position: absolute; - min-width: 200px; - min-height: 60px; - background-color: #fff; - box-shadow: 0 0 12px 1px rgba(0, 0, 0, 0.6); - transform: translate3d(0, 0, 0); -} -.wm-window .wm-window-overlay { - display: none; -} -.wm-window .wm-window-box { - display: -ms-flexbox; - display: flex; - -ms-flex-direction: column; - flex-direction: column; - height: 100%; - min-height: 60px; - width: 100%; -} -.wm-window .wm-window-box .wm-window-title { - display: -ms-flexbox; - display: flex; - -ms-flex-direction: row; - flex-direction: row; - -ms-flex-align: center; - align-items: center; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - height: 36px; - min-height: 36px; - background-color: #365d98; - border: 0; - padding: 0 8px; - overflow: hidden; - /*button.wm-close { - background: no-repeat url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAA6NJREFUeAEAkwNs/AH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAP///wD///8AAgAAAAAAAAAAAAAAGQAAAIAAAAC6AAAABQAAAAAAAAAAAAAAAAAAAAUAAAC6AAAAgAAAABkAAAAAAAAAAAD///8A////AAAAALQAAAD/AAAA/wAAAL8AAAAFAAAAAAAAAAUAAAC/AAAA/wAAAP8AAAC0////AP///wAA////AP///wAAAABiAAAA/wAAAP8AAAD/AAAAvwAAAAoAAAC/AAAA/wAAAP8AAAD/AAAAYv///wD///8AAP///wD///8AAAAAAAAAAHAAAAD/AAAA/wAAAP8AAADvAAAA/wAAAP8AAAD/AAAAcAAAAAD///8A////AAD///8A////AAAAAAAAAAAAAAAAcAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAcAAAAAAAAAAA////AP///wAA////AP///wAAAAAAAAAAAAAAAAUAAADbAAAA/wAAAP8AAAD/AAAA2wAAAAUAAAAAAAAAAP///wD///8AAP///wD///8AAAAAAAAAAAUAAAC/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC/AAAABQAAAAD///8A////AAD///8A////AAAAAAUAAAC/AAAA/wAAAP8AAAD/AAAArwAAAP8AAAD/AAAA/wAAAL8AAAAF////AP///wAA////AP///wAAAADYAAAA/wAAAP8AAAD/AAAAcAAAAAAAAABwAAAA/wAAAP8AAAD/AAAA2P///wD///8AAP///wD///8AAAAAugAAAPMAAAD/AAAAcAAAAAAAAAAAAAAAAAAAAHAAAAD/AAAA8wAAALr///8A////AAD///8A////AAAAAAcAAACpAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAKkAAAAH////AP///wAA////AP///wAAAAAAAAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1AAAAAP///wD///8AAf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP//3IrZ3HU6n9QAAAAASUVORK5CYII=); - } - - button.wm-maximize { - background: no-repeat url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1QjVBNEU5QjQ4MjA2ODExODIyQUFEQUJGRDI2QzFCNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3MTM1RjQxMzRFRTAxMUUyODUwRjg1ODE1RkQxMDIxRCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3MTM1RjQxMjRFRTAxMUUyODUwRjg1ODE1RkQxMDIxRCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NUI1QTRFOUI0ODIwNjgxMTgyMkFBREFCRkQyNkMxQjYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NUI1QTRFOUI0ODIwNjgxMTgyMkFBREFCRkQyNkMxQjYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5/zPe0AAAAPUlEQVR42mL8//8/A7mAiYECwAIiGBkZSbYe6GJGimym3NnozsGlGN17A+fsQRRgpMT5wDmbccAyBkCAAQBGYQ8f7/o0HQAAAABJRU5ErkJggg==); - } - - button.wm-minimize { - background: no-repeat url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1QjVBNEU5QjQ4MjA2ODExODIyQUFEQUJGRDI2QzFCNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3MTM1RjQxNzRFRTAxMUUyODUwRjg1ODE1RkQxMDIxRCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3MTM1RjQxNjRFRTAxMUUyODUwRjg1ODE1RkQxMDIxRCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NUI1QTRFOUI0ODIwNjgxMTgyMkFBREFCRkQyNkMxQjYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NUI1QTRFOUI0ODIwNjgxMTgyMkFBREFCRkQyNkMxQjYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6V8bAdAAAALUlEQVR42mL8//8/A7mAiYECMBI1s4AIRkZGkoMcGEuMA+dsxtFEQkfNAAEGAAPWChlCSQpaAAAAAElFTkSuQmCC); - }*/ -} -.wm-window .wm-window-box .wm-window-title h1 { - -ms-flex: 1; - flex: 1; - display: -ms-flexbox; - display: flex; - -ms-flex-direction: row; - flex-direction: row; - -ms-flex-align: center; - align-items: center; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: default; - padding: 0; - padding-left: 8px; - margin: 0; - font-size: 16px; - font-weight: 400; - color: #fff; -} -.wm-window .wm-window-box .wm-window-title .wm-button-group { - display: -ms-flexbox; - display: flex; - -ms-flex-direction: row; - flex-direction: row; - -ms-flex-align: center; - align-items: center; - padding-left: 2px; -} -.wm-window .wm-window-box .wm-window-title button { - display: inline-block; - border: 0; - background-repeat: no-repeat; - background-color: #365d98; - color: #FFFFFF; - margin: 0; - margin-left: 3px; - padding: 0; - width: 15px; - height: 15px; - opacity: .7; -} -.wm-window .wm-window-box .wm-window-title button:hover { - opacity: 1; -} -.wm-window .wm-window-box .wm-window-title button.wm-close { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAABi8KSDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkIxOUQwNTEzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkIxOUQwNTIzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQjE5RDA0RjMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQjE5RDA1MDMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpFaWsQAAABxSURBVHjajJDRDcAgCERtJ2AER+oIjuZIHcER3IBCvDYX5KMklwg8lPNQ1fI3TjpfJgl9QX2F32yquuI2CWqCXNH/YFejgUpgexmGeUAjmMH+9AA4aKUN5h174qFkYEs8CMNuaMYdkc/sNySAW/0RYABjHiW8yydeWwAAAABJRU5ErkJggg==) no-repeat 1px 1px; -} -.wm-window .wm-window-box .wm-window-title button.wm-maximize { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAABi8KSDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkIxOUQwNTUzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkIxOUQwNTYzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQjE5RDA1MzMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQjE5RDA1NDMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqAiG1YAAAA7SURBVHjaYvz//z8DsYAJSj8E4v948AdkxSSZDALyQMyIBQtgU0ySyQOomAWJ/RCPuo8ggpGUSAEIMACTWxDft/Hl3wAAAABJRU5ErkJggg==) no-repeat 1px 1px; -} -.wm-window .wm-window-box .wm-window-title button.wm-minimize { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAABi8KSDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzYwRDNDRkMzMDM5MTFFMkI5MUFGMzlFMTgwOEI4ODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzYwRDNDRkQzMDM5MTFFMkI5MUFGMzlFMTgwOEI4ODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQjE5RDA1NzMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQjE5RDA1ODMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsZJjdUAAAAlSURBVHjaYvz//z8DsYCJgQQwqhgZsCCx8QU4I7piRkImAwQYAJ10BBYiYyqTAAAAAElFTkSuQmCC) no-repeat 1px 1px; -} -.wm-window .wm-window-box header.wm-window-title.hide { - display: none; -} -.wm-window .wm-window-box section.wm-content { - display: block; - -ms-flex: 1; - flex: 1; - min-height: 60px; - overflow-x: hidden; - overflow-y: auto; -} -.wm-window .wm-window-box button.wm-resize { - position: absolute; - bottom: 0; - right: 4px; - background: transparent; - border: 0; - margin: 0; - padding: 0; - cursor: se-resize; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzREODAwQzcyRjZDMTFFMjg5NkREMENBNjJERUE4Q0IiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzREODAwQzgyRjZDMTFFMjg5NkREMENBNjJERUE4Q0IiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNEQ4MDBDNTJGNkMxMUUyODk2REQwQ0E2MkRFQThDQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNEQ4MDBDNjJGNkMxMUUyODk2REQwQ0E2MkRFQThDQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuQy0VQAAACLSURBVHjaYpw9ezYDEUARiO8zEaHQHohPArEcCxEK1wGxPxA/wmeyDZLCIyABJjwKNwJxEFShIi7FyAoPArEZEB8DYi0mHFaHIikEaUwE4mtMWBRGAPE+NIU7kJ0BUxiNQyFInpMJKgFTuBuLQj8gXg3yJCicHyFZDQJfgDgOqhEE3gGxD8jNAAEGADlXJQUd3J75AAAAAElFTkSuQmCC) no-repeat; - height: 15px; - width: 10px; -} -.wm-window.disabled * { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.wm-window.disabled .wm-window-overlay { - display: block; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: black; - opacity: 0; - z-index: 30000; -} -.wm-window.inactive * { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.wm-window.inactive header.wm-window-title { - background-color: #888; -} -.wm-window.inactive header.wm-window-title h1 { - color: #bbb; -} -.wm-window.active .wm-content * { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} -.wm-window.noresizable .wm-window-box header.wm-window-title button.wm-maximize, -.wm-window.noresizable .wm-window-box header.wm-window-title button.wm-minimize { - display: none; -} -.wm-window.noresizable .wm-window-box section.wm-content { - overflow-y: hidden; -} -.wm-window.noresizable .wm-window-box button.wm-resize { - display: none; -} -.wm-window.animated.minimizing, -.wm-window.animated.maximazing { - transform: translate3d(0, 0, 0); - transition: all 0.5s ease-out; -} -.wm-window.animated.closing { - animation: close 0.3s 1 ease-in forwards; -} -.wm-window.closing { - animation: close; -} -.wm-window.animated.opening { - animation: appear 0.4s 1 ease-out forwards; -} -.wm-window.opening { - animation: appear; -} -.wm-window.animated.resizing { - transition: none; -} -.wm-window.animated.move { - animation: wobbly 0.5s 0.2s infinite; -} -.wm-window.animated.move * { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.wm-window.closed { - display: none; -} -.no-events .wm-content { - pointer-events: none; -} - -.wm-space { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - width: 100%; - height: 100%; - overflow: hidden; - z-index: -1; - cursor: default; -} -.wm-space .wm-overlay { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: #000; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - opacity: 0; - transition: opacity 0.5s ease-out; -} diff --git a/dist/ventus.js b/dist/ventus.js index 1b1fc86..16cbbd2 100644 --- a/dist/ventus.js +++ b/dist/ventus.js @@ -1,495 +1,878 @@ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["Ventus"] = factory(); - else - root["Ventus"] = factory(); -})(window, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./ventus.js"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "../node_modules/css-loader/index.js!../node_modules/postcss-loader/lib/index.js!../node_modules/less-loader/dist/cjs.js??ref--6-3!./ventus/less/expose.less": -/*!*************************************************************************************************************************************************!*\ - !*** ../node_modules/css-loader!../node_modules/postcss-loader/lib!../node_modules/less-loader/dist/cjs.js??ref--6-3!./ventus/less/expose.less ***! - \*************************************************************************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "../node_modules/css-loader/lib/css-base.js")(false); -// imports - - -// module -exports.push([module.i, "/**\n * Ventus\n * Copyright © 2012-2013 Ramón Lamana\n * https://github.com/rlamana\n */\n.wm-space.expose .wm-window {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n}\n.wm-space.expose .wm-window section.wm-content {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.wm-space.expose .wm-window.wm-window.animated {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n -webkit-transition: top 0.5s ease-out, left 0.5s ease-out;\n transition: top 0.5s ease-out, left 0.5s ease-out;\n}\n.wm-space.expose .wm-window:hover {\n box-shadow: 0px 0px 40px #000088;\n}\n", ""]); - -// exports - - -/***/ }), - -/***/ "../node_modules/css-loader/index.js!../node_modules/postcss-loader/lib/index.js!../node_modules/less-loader/dist/cjs.js??ref--6-3!./ventus/less/window.less": -/*!*************************************************************************************************************************************************!*\ - !*** ../node_modules/css-loader!../node_modules/postcss-loader/lib!../node_modules/less-loader/dist/cjs.js??ref--6-3!./ventus/less/window.less ***! - \*************************************************************************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "../node_modules/css-loader/lib/css-base.js")(false); -// imports - - -// module -exports.push([module.i, "/**\n * Ventus\n * Copyright © 2012-2013 Ramón Lamana\n * https://github.com/rlamana\n */\n/* Wobbly animation */\n@-webkit-keyframes wobbly {\n 0% {\n -webkit-transform: rotate(4deg);\n transform: rotate(4deg);\n }\n 50% {\n -webkit-transform: rotate(-4deg);\n transform: rotate(-4deg);\n }\n 100% {\n -webkit-transform: rotate(4deg);\n transform: rotate(4deg);\n }\n}\n@keyframes wobbly {\n 0% {\n -webkit-transform: rotate(4deg);\n transform: rotate(4deg);\n }\n 50% {\n -webkit-transform: rotate(-4deg);\n transform: rotate(-4deg);\n }\n 100% {\n -webkit-transform: rotate(4deg);\n transform: rotate(4deg);\n }\n}\n/* Appear animation */\n@-webkit-keyframes appear {\n 0% {\n -webkit-transform: scale(0, 0);\n transform: scale(0, 0);\n }\n 80% {\n -webkit-transform: scale(1.2, 1.2);\n transform: scale(1.2, 1.2);\n }\n 100% {\n -webkit-transform: rotate(1, 1);\n transform: rotate(1, 1);\n }\n}\n@keyframes appear {\n 0% {\n -webkit-transform: scale(0, 0);\n transform: scale(0, 0);\n }\n 80% {\n -webkit-transform: scale(1.2, 1.2);\n transform: scale(1.2, 1.2);\n }\n 100% {\n -webkit-transform: rotate(1, 1);\n transform: rotate(1, 1);\n }\n}\n/* Close animation */\n@-webkit-keyframes close {\n 0% {\n -webkit-transform: scale(1, 1);\n transform: scale(1, 1);\n }\n 20% {\n -webkit-transform: scale(1.2, 1.2);\n transform: scale(1.2, 1.2);\n }\n 100% {\n -webkit-transform: scale(0, 0);\n transform: scale(0, 0);\n }\n}\n@keyframes close {\n 0% {\n -webkit-transform: scale(1, 1);\n transform: scale(1, 1);\n }\n 20% {\n -webkit-transform: scale(1.2, 1.2);\n transform: scale(1.2, 1.2);\n }\n 100% {\n -webkit-transform: scale(0, 0);\n transform: scale(0, 0);\n }\n}\n/* Window styles */\n.wm-window {\n opacity: 0.98;\n display: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n overflow: hidden;\n position: absolute;\n min-width: 200px;\n min-height: 60px;\n background-color: #fff;\n box-shadow: 0 0 12px 1px rgba(0, 0, 0, 0.6);\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n}\n.wm-window .wm-window-overlay {\n display: none;\n}\n.wm-window .wm-window-box {\n display: -webkit-box;\n display: -webkit-flex;\n display: -moz-box;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -webkit-flex-direction: column;\n -moz-box-orient: vertical;\n -moz-box-direction: normal;\n flex-direction: column;\n height: 100%;\n min-height: 60px;\n width: 100%;\n}\n.wm-window .wm-window-box .wm-window-title {\n display: -webkit-box;\n display: -webkit-flex;\n display: -moz-box;\n display: flex;\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -webkit-flex-direction: row;\n -moz-box-orient: horizontal;\n -moz-box-direction: normal;\n flex-direction: row;\n -webkit-box-align: center;\n -webkit-align-items: center;\n -moz-box-align: center;\n align-items: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n height: 36px;\n min-height: 36px;\n background-color: #365d98;\n border: 0;\n padding: 0 8px;\n overflow: hidden;\n}\n.wm-window .wm-window-box .wm-window-title h1 {\n -webkit-box-flex: 1;\n -webkit-flex: 1;\n -moz-box-flex: 1;\n flex: 1;\n display: -webkit-box;\n display: -webkit-flex;\n display: -moz-box;\n display: flex;\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -webkit-flex-direction: row;\n -moz-box-orient: horizontal;\n -moz-box-direction: normal;\n flex-direction: row;\n -webkit-box-align: center;\n -webkit-align-items: center;\n -moz-box-align: center;\n align-items: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n cursor: default;\n padding: 0;\n padding-left: 8px;\n margin: 0;\n font-size: 16px;\n font-weight: 400;\n color: #fff;\n}\n.wm-window .wm-window-box .wm-window-title .wm-button-group {\n display: -webkit-box;\n display: -webkit-flex;\n display: -moz-box;\n display: flex;\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -webkit-flex-direction: row;\n -moz-box-orient: horizontal;\n -moz-box-direction: normal;\n flex-direction: row;\n -webkit-box-align: center;\n -webkit-align-items: center;\n -moz-box-align: center;\n align-items: center;\n padding-left: 2px;\n}\n.wm-window .wm-window-box .wm-window-title button {\n display: inline-block;\n border: 0;\n background-repeat: no-repeat;\n background-color: #365d98;\n color: #ffffff;\n margin: 0;\n margin-left: 3px;\n padding: 0;\n width: 15px;\n height: 15px;\n opacity: 0.7;\n}\n.wm-window .wm-window-box .wm-window-title button:hover {\n opacity: 1;\n}\n.wm-window .wm-window-box .wm-window-title button.wm-close {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAABi8KSDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkIxOUQwNTEzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkIxOUQwNTIzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQjE5RDA0RjMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQjE5RDA1MDMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpFaWsQAAABxSURBVHjajJDRDcAgCERtJ2AER+oIjuZIHcER3IBCvDYX5KMklwg8lPNQ1fI3TjpfJgl9QX2F32yquuI2CWqCXNH/YFejgUpgexmGeUAjmMH+9AA4aKUN5h174qFkYEs8CMNuaMYdkc/sNySAW/0RYABjHiW8yydeWwAAAABJRU5ErkJggg==) no-repeat 1px 1px;\n}\n.wm-window .wm-window-box .wm-window-title button.wm-maximize {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAABi8KSDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkIxOUQwNTUzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkIxOUQwNTYzMDM0MTFFMkI5MUFGMzlFMTgwOEI4ODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQjE5RDA1MzMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQjE5RDA1NDMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqAiG1YAAAA7SURBVHjaYvz//z8DsYAJSj8E4v948AdkxSSZDALyQMyIBQtgU0ySyQOomAWJ/RCPuo8ggpGUSAEIMACTWxDft/Hl3wAAAABJRU5ErkJggg==) no-repeat 1px 1px;\n}\n.wm-window .wm-window-box .wm-window-title button.wm-minimize {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAYAAABi8KSDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzYwRDNDRkMzMDM5MTFFMkI5MUFGMzlFMTgwOEI4ODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzYwRDNDRkQzMDM5MTFFMkI5MUFGMzlFMTgwOEI4ODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQjE5RDA1NzMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQjE5RDA1ODMwMzQxMUUyQjkxQUYzOUUxODA4Qjg4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsZJjdUAAAAlSURBVHjaYvz//z8DsYCJgQQwqhgZsCCx8QU4I7piRkImAwQYAJ10BBYiYyqTAAAAAElFTkSuQmCC) no-repeat 1px 1px;\n}\n.wm-window .wm-window-box header.wm-window-title.hide {\n display: none;\n}\n.wm-window .wm-window-box section.wm-content {\n display: block;\n -webkit-box-flex: 1;\n -webkit-flex: 1;\n -moz-box-flex: 1;\n flex: 1;\n min-height: 60px;\n overflow-x: hidden;\n overflow-y: auto;\n}\n.wm-window .wm-window-box button.wm-resize {\n position: absolute;\n bottom: 0;\n right: 4px;\n background: transparent;\n border: 0;\n margin: 0;\n padding: 0;\n cursor: se-resize;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzREODAwQzcyRjZDMTFFMjg5NkREMENBNjJERUE4Q0IiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzREODAwQzgyRjZDMTFFMjg5NkREMENBNjJERUE4Q0IiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNEQ4MDBDNTJGNkMxMUUyODk2REQwQ0E2MkRFQThDQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNEQ4MDBDNjJGNkMxMUUyODk2REQwQ0E2MkRFQThDQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuQy0VQAAACLSURBVHjaYpw9ezYDEUARiO8zEaHQHohPArEcCxEK1wGxPxA/wmeyDZLCIyABJjwKNwJxEFShIi7FyAoPArEZEB8DYi0mHFaHIikEaUwE4mtMWBRGAPE+NIU7kJ0BUxiNQyFInpMJKgFTuBuLQj8gXg3yJCicHyFZDQJfgDgOqhEE3gGxD8jNAAEGADlXJQUd3J75AAAAAElFTkSuQmCC) no-repeat;\n height: 15px;\n width: 10px;\n}\n.wm-window.disabled * {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.wm-window.disabled .wm-window-overlay {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: black;\n opacity: 0;\n z-index: 30000;\n}\n.wm-window.inactive * {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.wm-window.inactive header.wm-window-title {\n background-color: #888;\n}\n.wm-window.inactive header.wm-window-title h1 {\n color: #bbb;\n}\n.wm-window.active .wm-content * {\n -webkit-user-select: text;\n -moz-user-select: text;\n -ms-user-select: text;\n user-select: text;\n}\n.wm-window.noresizable .wm-window-box header.wm-window-title button.wm-maximize,\n.wm-window.noresizable .wm-window-box header.wm-window-title button.wm-minimize {\n display: none;\n}\n.wm-window.noresizable .wm-window-box section.wm-content {\n overflow-y: hidden;\n}\n.wm-window.noresizable .wm-window-box button.wm-resize {\n display: none;\n}\n.wm-window.animated.minimizing,\n.wm-window.animated.maximazing {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n -webkit-transition: all 0.5s ease-out;\n transition: all 0.5s ease-out;\n}\n.wm-window.animated.closing {\n -webkit-animation: close 0.3s 1 ease-in forwards;\n animation: close 0.3s 1 ease-in forwards;\n}\n.wm-window.closing {\n -webkit-animation: close;\n animation: close;\n}\n.wm-window.animated.opening {\n -webkit-animation: appear 0.4s 1 ease-out forwards;\n animation: appear 0.4s 1 ease-out forwards;\n}\n.wm-window.opening {\n -webkit-animation: appear;\n animation: appear;\n}\n.wm-window.animated.resizing {\n -webkit-transition: none;\n transition: none;\n}\n.wm-window.animated.move {\n -webkit-animation: wobbly 0.5s 0.2s infinite;\n animation: wobbly 0.5s 0.2s infinite;\n}\n.wm-window.animated.move * {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.wm-window.closed {\n display: none;\n}\n.no-events .wm-content {\n pointer-events: none;\n}\n", ""]); - -// exports - - -/***/ }), - -/***/ "../node_modules/css-loader/index.js!../node_modules/postcss-loader/lib/index.js!../node_modules/less-loader/dist/cjs.js??ref--6-3!./ventus/less/windowmanager.less": -/*!********************************************************************************************************************************************************!*\ - !*** ../node_modules/css-loader!../node_modules/postcss-loader/lib!../node_modules/less-loader/dist/cjs.js??ref--6-3!./ventus/less/windowmanager.less ***! - \********************************************************************************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "../node_modules/css-loader/lib/css-base.js")(false); -// imports - - -// module -exports.push([module.i, "/**\n * Ventus\n * Copyright © 2012-2013 Ramón Lamana\n * https://github.com/rlamana\n */\n.wm-space {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n z-index: -1;\n cursor: default;\n}\n.wm-space .wm-overlay {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-color: #000;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n opacity: 0;\n -webkit-transition: opacity 0.5s ease-out;\n transition: opacity 0.5s ease-out;\n}\n", ""]); - -// exports - - -/***/ }), - -/***/ "../node_modules/css-loader/lib/css-base.js": -/*!**************************************************!*\ - !*** ../node_modules/css-loader/lib/css-base.js ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -// css base code, injected by the css-loader -module.exports = function(useSourceMap) { - var list = []; - - // return the list of modules as css string - list.toString = function toString() { - return this.map(function (item) { - var content = cssWithMappingToString(item, useSourceMap); - if(item[2]) { - return "@media " + item[2] + "{" + content + "}"; - } else { - return content; - } - }).join(""); - }; - - // import a list of modules into the list - list.i = function(modules, mediaQuery) { - if(typeof modules === "string") - modules = [[null, modules, ""]]; - var alreadyImportedModules = {}; - for(var i = 0; i < this.length; i++) { - var id = this[i][0]; - if(typeof id === "number") - alreadyImportedModules[id] = true; - } - for(i = 0; i < modules.length; i++) { - var item = modules[i]; - // skip already imported module - // this implementation is not 100% perfect for weird media query combinations - // when a module is imported multiple times with different media queries. - // I hope this will never occur (Hey this way we have smaller bundles) - if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) { - if(mediaQuery && !item[2]) { - item[2] = mediaQuery; - } else if(mediaQuery) { - item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"; - } - list.push(item); - } - } - }; - return list; +function equals(slot, scope, expected) { + return function(item) { + return (item.funct === slot && item.scope === scope) === expected; + }; +} +function hasListener(listeners, signal, slot, scope) { + if (!listeners[signal]) { + return false; + } + return listeners[signal].some(equals(slot, scope, true)); +} +function Emitter() { + this._listeners = {}; +} +Emitter.prototype = { + /** + * Returns the count of listeners for a specific signal. + * + * @param signal The signal we want to count listeners from. + * @returns The count. + */ + listenersCount: function(signal) { + var list = this._listeners[signal]; + return list ? list.length : 0; + }, + /** + * Adds a listener to a signal, optionally a scope can be provided. + * NOTE: Calling this method with the same arguments will NOT add a new listener. + * + * @param signal The signal to listen. + * @param slot The callback function. + * @param scope The scope for the callback. + */ + on: function on(signal, slot, scope) { + var list = this._listeners; + if (hasListener(list, signal, slot, scope)) { + return; + } + if (!list[signal]) { + list[signal] = []; + } + list[signal].push({ + funct: slot, + scope + }); + }, + /** + * Removes the listener added with exactly the same arguments. + * + * @param signal The signal from we want to remove the listener. + * @param slot The callback passed to .on() method. + * @param scope The scope for the callback. + */ + off: function off(signal, slot, scope) { + var list = this._listeners[signal]; + if (!list) { + return; + } + this._listeners[signal] = list.filter(equals(slot, scope, false)); + }, + /** + * Adds a listener to be fired only the next time the signal is emitted. + * + * @param signal The signal to listen. + * @param slot The callback function. + * @param scope The scope for the callback. + */ + once: function once(signal, slot, scope) { + if (hasListener(this._listeners, signal, slot, scope)) { + return; + } + this.on( + signal, + function wrapper() { + this.off(signal, wrapper, this); + slot.apply(scope, arguments); + }, + this + ); + }, + /** + * Executes the callbacks for the given signal. + * Any extra argument will be passed to the callback. + * + * @param signal The signal of the listeners we want to invoke. + * @param var_args Any arguments we want the callbacks to recive. + */ + emit: function emit(signal) { + var list = this._listeners[signal]; + if (!list) { + return; + } + var data = Array.prototype.slice.call(arguments, 1); + list.forEach(function(item) { + item.funct.apply(item.scope, data); + }); + }, + /** + * Connects slots to a group of signals, + * optionally a scope can be provided. + * + * @param slots Map of signals and slots. + * @param scope The scope for the callback. + */ + connect: function connect(slots, scope) { + if (!slots) { + return; + } + for (var signal in slots) { + if (slots.hasOwnProperty(signal)) { + this.on(signal, slots[signal], scope); + } + } + }, + /** + * Disconnects slots to a group of signals, + * optionally a scope can be provided. + * + * @param slots Map of signals and slots. + * @param scope The scope for the callback. + */ + disconnect: function disconnect(slots, scope) { + if (!slots) { + return; + } + for (var signal in slots) { + if (slots.hasOwnProperty(signal)) { + this.off(signal, slots[signal], scope); + } + } + } }; - -function cssWithMappingToString(item, useSourceMap) { - var content = item[1] || ''; - var cssMapping = item[3]; - if (!cssMapping) { - return content; - } - - if (useSourceMap && typeof btoa === 'function') { - var sourceMapping = toComment(cssMapping); - var sourceURLs = cssMapping.sources.map(function (source) { - return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */' - }); - - return [content].concat(sourceURLs).concat([sourceMapping]).join('\n'); - } - - return [content].join('\n'); +const View = function(elementOrMarkup) { + if (typeof elementOrMarkup === "string") { + const wrapper = document.createElement("div"); + wrapper.innerHTML = elementOrMarkup; + this.el = wrapper.firstChild; + } else { + this.el = elementOrMarkup; + } +}; +View.prototype = { + listen(map, scope) { + const splitter = /^(?:(.*)\s)?(\w+)$/; + let handler, data, selector, event; + for (let key in map) { + if (!map.hasOwnProperty(key)) { + continue; + } + handler = map[key]; + data = key.match(splitter); + selector = data[1]; + event = data[2]; + if (event === "mousedown") { + event += " touchstart"; + } else if (event === "mousemove") { + event += " touchmove"; + } else if (event === "mouseup") { + event += " touchend"; + } else if (event === "click") { + event += " touchend"; + } + if (typeof handler === "string") { + handler = scope[handler]; + } + if (!handler) { + throw new Error("Handler not found"); + } + for (const eventName of event.split(" ").filter((e) => !!e.trim())) { + if (selector) { + const elements = this.el.querySelectorAll(selector); + for (let i = 0; i < elements.length; i++) { + elements[i].addEventListener( + eventName, + handler.bind(scope || this) + ); + } + } else { + this.el.addEventListener(eventName, handler.bind(scope || this)); + } + } + } + return this; + }, + on(name, handler) { + this.el.addEventListener(name, handler); + }, + off(name, handler) { + this.el.removeEventListener(name, handler); + }, + one(name, handler) { + const wrapper = () => { + this.el.removeEventListener(name, wrapper); + handler.apply(this, arguments); + }; + this.el.addEventListener(name, wrapper); + }, + onTransitionEnd(handler, scope) { + this.one("transitionend", () => { + handler.apply(scope || this); + }); + }, + onAnimationEnd(handler, scope) { + this.one("animationend", () => { + handler.apply(scope || this); + }); + }, + show() { + if (this.el.style.display === "none" || this.el.style.display === "") { + this.el.style.display = this._display || "block"; + } + }, + hide() { + if (this.el.style.display !== "none" && this.el.style.display !== "") { + this._display = this.el.style.display; + this.el.style.display = "none"; + } + }, + find(selector) { + const element = this.el.querySelector(selector); + return element ? new View(element) : null; + }, + set width(value) { + this.el.style.width = `${value}px`; + }, + get width() { + return this.el.offsetWidth; + }, + set height(value) { + this.el.style.height = `${value}px`; + }, + get height() { + return this.el.offsetHeight; + }, + set top(value) { + this.el.style.top = `${value || 0}px`; + }, + get top() { + return parseInt(this.el.style.top || 0, 10); + }, + set bottom(value) { + this.el.style.bottom = `${value || 0}px`; + }, + get bottom() { + return parseInt(this.el.style.top || 0, 10); + }, + set left(value) { + this.el.style.left = `${value || 0}px`; + }, + get left() { + return parseInt(this.el.style.left || 0, 10); + }, + set right(value) { + this.el.style.right = `${value || 0}px`; + }, + get right() { + return parseInt(this.el.style.right || 0, 10); + }, + set zIndex(value) { + this.el.style.zIndex = value; + }, + get zIndex() { + return parseInt(this.el.style.zIndex || 0, 10); + }, + set opacity(value) { + this.el.style.opacity = value; + }, + get opacity() { + return parseInt(this.el.style.opacity || 0, 10); + }, + append(content) { + const view = content instanceof View ? content : new View(content); + this.el.appendChild(view.el); + }, + empty() { + this.el.innerHTML = ""; + } +}; +function isTouchEvent(e) { + return !!window.TouchEvent && e.originalEvent instanceof window.TouchEvent; } - -// Adapted from convert-source-map (MIT) -function toComment(sourceMap) { - // eslint-disable-next-line no-undef - var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))); - var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64; - - return '/*# ' + data + ' */'; +function convertMoveEvent(e) { + return isTouchEvent(e) ? e.originalEvent.changedTouches[0] : e; } - - -/***/ }), - -/***/ "../node_modules/lodash.throttle/index.js": -/*!************************************************!*\ - !*** ../node_modules/lodash.throttle/index.js ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(global) {/** - * lodash (Custom Build) - * Build: `lodash modularize exports="npm" -o ./` - * Copyright jQuery Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ - -/** Used as the `TypeError` message for "Functions" methods. */ -var FUNC_ERROR_TEXT = 'Expected a function'; - -/** Used as references for various `Number` constants. */ +var Window = function(options) { + this.signals = new Emitter(); + options = options || { + title: "Untitle Window", + width: 400, + height: 200, + x: 0, + y: 0, + content: "", + movable: true, + resizable: true, + widget: false, + titlebar: true, + animations: true, + classname: "", + stayinspace: false + }; + if (options.animations) { + options.classname + " animated"; + } + this.view = new View(`
+
+
+

${options.title}

+
+ + + +
+
+ +
+ + +
+
+
`); + this.view.listen(this.events.window, this); + if (options.opacity) { + this.view.el.style.opacity = options.opacity; + } + if (options.events) { + for (var eventName in options.events) { + if (options.events.hasOwnProperty(eventName) && typeof options.events[eventName] === "function") { + this.signals.on(eventName, options.events[eventName], this); + } + } + } + this.$content = this.view.find(".wm-content"); + if (options.content) { + this.$content.append(options.content); + } + this.$titlebar = this.view.find("header"); + this.width = options.width || 400; + this.height = options.height || 200; + this.x = options.x || 0; + this.y = options.y || 0; + this.z = 1e4; + this.enabled = true; + this.active = false; + this.maximized = false; + this.minimized = false; + this._closed = true; + this._destroyed = false; + this.widget = false; + this.movable = typeof options.movable !== "undefined" ? options.movable : true; + this.resizable = typeof options.resizable !== "undefined" ? options.resizable : true; + this.animations = typeof options.animations !== "undefined" ? options.animations : true; + this.titlebar = true; + this.stayinspace = typeof options.stayinspace !== "undefined" ? options.stayinspace : false; +}; +Window.prototype = { + _restore: null, + _moving: null, + _resizing: null, + slots: { + move(e) { + var event = convertMoveEvent(e); + if (!this.enabled || !this.movable) { + return; + } + this._moving = this.toLocal({ + x: event.pageX, + y: event.pageY + }); + this.view.el.classList.add("move"); + this._space.el.classList.add("no-events"); + e.preventDefault(); + } + }, + events: { + window: { + "click": function(e) { + this.signals.emit("select", this, e); + }, + "mousedown": function(e) { + this.focus(); + if (this.widget) { + this.slots.move.call(this, e); + } + }, + ".wm-content click": function(e) { + if (this.enabled) { + this.signals.emit("click", this, e); + } + }, + ".wm-window-title mousedown": function(e) { + if (!this.maximized) { + this.slots.move.call(this, e); + } + }, + ".wm-window-title dblclick": function() { + if (this.enabled && this.resizable) { + this.maximize(); + } + }, + ".wm-window-title button.wm-close click": function(e) { + e.stopPropagation(); + e.preventDefault(); + if (this.enabled) { + this.close(); + } + }, + ".wm-window-title button.wm-maximize click": function(e) { + e.stopPropagation(); + e.preventDefault(); + if (this.enabled && this.resizable) { + this.maximize(); + } + }, + ".wm-window-title button.wm-minimize click": function(e) { + e.stopPropagation(); + e.preventDefault(); + if (this.enabled) { + this.minimize(); + } + }, + ".wm-window-title button mousedown": function(e) { + this.focus(); + e.stopPropagation(); + e.preventDefault(); + }, + "button.wm-resize mousedown": function(e) { + var event = convertMoveEvent(e); + if (!this.enabled || !this.resizable) { + return; + } + this._resizing = { + width: this.width - event.pageX, + height: this.height - event.pageY + }; + this._space.el.classList.add("no-events"); + this.view.el.classList.add("resizing"); + e.preventDefault(); + } + }, + space: { + "mousemove": function(e) { + var event = convertMoveEvent(e); + if (!isTouchEvent(e) && e.which !== 1) { + this._moving && this._stopMove(); + this._resizing && this._stopResize(); + } + if (this._moving) { + if (this.stayinspace) { + if (this.view.el.clientWidth > this.space.el.clientWidth || this.view.el.clientHeight > this.space.el.clientHeight) { + this.resize( + Math.min(this.view.el.clientWidth, this.space.el.clientWidth), + Math.min(this.view.el.clientHeight, this.space.el.clientHeight) + ); + } + var movingX = Math.max(0, event.pageX - this._moving.x); + var minusX = 0; + var movingY = Math.max(0, event.pageY - this._moving.y); + var minusY = 0; + if (movingX + this.view.el.clientWidth > this.space.el.clientWidth) { + minusX = movingX + this.view.el.clientWidth - this.space.el.clientWidth; + } + if (movingY + this.view.el.clientHeight > this.space.el.clientHeight) { + minusY = movingY + this.view.el.clientHeight - this.space.el.clientHeight; + } + this.move( + movingX - minusX, + movingY - minusY + ); + } else { + this.move( + event.pageX - this._moving.x, + event.pageY - this._moving.y + ); + } + } + if (this._resizing) { + this.resize( + event.pageX + this._resizing.width, + event.pageY + this._resizing.height + ); + } + }, + "mouseup": function() { + this._moving && this._stopMove(); + this._resizing && this._stopResize(); + } + } + }, + _stopMove: function() { + this.view.el.classList.remove("move"); + this._space.el.classList.remove("no-events"); + this._moving = null; + }, + _stopResize: function() { + this._space.el.classList.remove("no-events"); + this.view.el.classList.remove("resizing"); + this._restore = null; + this._resizing = null; + }, + set space(el) { + if (el && !(el instanceof View)) { + console.error("The given space element is not a valid View."); + return; + } + this._space = el; + el.append(this.view); + el.listen(this.events.space, this); + }, + get space() { + return this._space; + }, + get maximized() { + return this._maximized; + }, + set maximized(value) { + if (value) { + this._restoreMaximized = this.stamp(); + this.view.el.classList.add("maximized"); + this.signals.emit("maximize", this, this._restoreMaximized); + } else { + this.view.el.classList.remove("maximized"); + this.signals.emit("restore", this, this._restoreMaximized); + } + this._maximized = value; + }, + get minimized() { + return this._minimized; + }, + set minimized(value) { + if (value) { + this._restoreMinimized = this.stamp(); + this.signals.emit("minimize", this, this._restoreMinimized); + } else { + this.signals.emit("restore", this, this._restoreMinimized); + } + this._minimized = value; + }, + set active(value) { + if (value) { + this.signals.emit("focus", this); + this.view.el.classList.add("active"); + this.view.el.classList.remove("inactive"); + } else { + this.signals.emit("blur", this); + this.view.el.classList.remove("active"); + this.view.el.classList.add("inactive"); + } + this._active = value; + }, + get active() { + return this._active; + }, + set enabled(value) { + if (!value) { + this.view.el.classList.add("disabled"); + } else { + this.view.el.classList.remove("disabled"); + } + this._enabled = value; + }, + get enabled() { + return this._enabled; + }, + set movable(value) { + this._movable = !!value; + }, + get movable() { + return this._movable; + }, + set resizable(value) { + if (!value) { + this.view.el.classList.add("noresizable"); + } else { + this.view.el.classList.remove("noresizable"); + } + this._resizable = !!value; + }, + get resizable() { + return this._resizable; + }, + set closed(value) { + }, + // jshint ignore:line + get closed() { + return this._closed; + }, + set destroyed(value) { + }, + // jshint ignore:line + get destroyed() { + return this._destroyed; + }, + set widget(value) { + this._widget = value; + }, + get widget() { + return this._widget; + }, + set titlebar(value) { + if (value) { + this.$titlebar.el.classList.remove("hide"); + } else { + this.$titlebar.el.classList.add("hide"); + } + this._titlebar = value; + }, + get titlebar() { + return this._titlebar; + }, + set animations(value) { + if (value) { + this.view.el.classList.add("animated"); + } else { + this.view.el.classList.remove("animated"); + } + this._animations = value; + }, + get animations() { + return this._animations; + }, + set width(value) { + this.view.width = value; + }, + get width() { + return parseInt(this.view.width, 10); + }, + set height(value) { + this.view.height = value; + }, + get height() { + return parseInt(this.view.height, 10); + }, + set x(value) { + this.view.el.style.left = `${value}px`; + }, + set y(value) { + this.view.el.style.top = `${value}px`; + }, + get x() { + return parseInt(this.view.el.style.left || 0, 10); + }, + get y() { + return parseInt(this.view.el.style.top || 0, 10); + }, + set z(value) { + this.view.el.style.zIndex = value; + }, + get z() { + return parseInt(this.view.el.style.zIndex || 0, 10); + }, + open() { + return new Promise((done) => { + this.signals.emit("open", this); + this.view.show(); + this.view.el.classList.add("opening"); + this.view.onAnimationEnd(() => { + this.view.el.classList.remove("opening"); + done(); + }, this); + this._closed = false; + }); + }, + close() { + return new Promise((done) => { + if (this.enabled) { + this.signals.emit("close", this); + this.view.el.classList.add("closing"); + this.view.onAnimationEnd(() => { + this.view.el.classList.remove("closing"); + this.view.hide(); + done(); + }, this); + this._closed = true; + } + }); + }, + destroy() { + const destroy = () => { + this.view.el.parentNode.removeChild(this.view.el); + this.view = null; + this._destroyed = true; + }; + if (this._closed) { + destroy(); + } else { + this.close().then(destroy); + } + }, + resize(w, h) { + this.width = w; + this.height = h; + this.signals.emit("resize", this); + }, + move(x, y) { + this.x = x; + this.y = y; + this.signals.emit("move", this); + return this; + }, + stamp() { + return { + x: this.x, + y: this.y, + width: this.width, + height: this.height, + maximized: this.maximized, + minimized: this.minimized, + animations: this.animations + }; + }, + restore(stamp) { + stamp = stamp || this._restore; + if (!stamp) { + return; + } + this.maximized = stamp.maximized; + this.minimized = stamp.minimized; + this.resize(stamp.width, stamp.height); + this.move(stamp.x, stamp.y); + this.animations = stamp.animations; + }, + maximize() { + if (this.maximized) { + this.maximized = false; + this.restore(); + } else { + this.maximized = true; + } + return this; + }, + minimize() { + if (this.minimized) { + this.minimized = false; + this.restore(); + } else { + this.minimized = true; + } + return this; + }, + focus() { + this.signals.emit("focus", this); + return this; + }, + blur() { + this.signals.emit("blur", this); + return this; + }, + toLocal(coord) { + return { + x: coord.x - this.x, + y: coord.y - this.y + }; + }, + toGlobal(coord) { + return { + x: coord.x + this.x, + y: coord.y + this.y + }; + }, + append(content) { + this.$content.append(content); + return this; + } +}; +const DefaultMode = { + register() { + console.log("Default mode registered."); + }, + actions: { + maximize(win) { + win.move(0, 0); + win.resize(this.view.width, this.view.height); + }, + restore(win, restore) { + restore.call(win); + }, + minimize(win) { + win.resize(0, 0); + } + } +}; +var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; +function getDefaultExportFromCjs(x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; +} +var FUNC_ERROR_TEXT = "Expected a function"; var NAN = 0 / 0; - -/** `Object#toString` result references. */ -var symbolTag = '[object Symbol]'; - -/** Used to match leading and trailing whitespace. */ +var symbolTag = "[object Symbol]"; var reTrim = /^\s+|\s+$/g; - -/** Used to detect bad signed hexadecimal string values. */ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; - -/** Used to detect binary string values. */ var reIsBinary = /^0b[01]+$/i; - -/** Used to detect octal string values. */ var reIsOctal = /^0o[0-7]+$/i; - -/** Built-in method references without a dependency on `root`. */ var freeParseInt = parseInt; - -/** Detect free variable `global` from Node.js. */ -var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; - -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; - -/** Used as a reference to the global object. */ -var root = freeGlobal || freeSelf || Function('return this')(); - -/** Used for built-in method references. */ +var freeGlobal = typeof commonjsGlobal == "object" && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; +var freeSelf = typeof self == "object" && self && self.Object === Object && self; +var root = freeGlobal || freeSelf || Function("return this")(); var objectProto = Object.prototype; - -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ var objectToString = objectProto.toString; - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max, - nativeMin = Math.min; - -/** - * Gets the timestamp of the number of milliseconds that have elapsed since - * the Unix epoch (1 January 1970 00:00:00 UTC). - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Date - * @returns {number} Returns the timestamp. - * @example - * - * _.defer(function(stamp) { - * console.log(_.now() - stamp); - * }, _.now()); - * // => Logs the number of milliseconds it took for the deferred invocation. - */ +var nativeMax = Math.max, nativeMin = Math.min; var now = function() { return root.Date.now(); }; - -/** - * Creates a debounced function that delays invoking `func` until after `wait` - * milliseconds have elapsed since the last time the debounced function was - * invoked. The debounced function comes with a `cancel` method to cancel - * delayed `func` invocations and a `flush` method to immediately invoke them. - * Provide `options` to indicate whether `func` should be invoked on the - * leading and/or trailing edge of the `wait` timeout. The `func` is invoked - * with the last arguments provided to the debounced function. Subsequent - * calls to the debounced function return the result of the last `func` - * invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the debounced function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.debounce` and `_.throttle`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to debounce. - * @param {number} [wait=0] The number of milliseconds to delay. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=false] - * Specify invoking on the leading edge of the timeout. - * @param {number} [options.maxWait] - * The maximum time `func` is allowed to be delayed before it's invoked. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new debounced function. - * @example - * - * // Avoid costly calculations while the window size is in flux. - * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); - * - * // Invoke `sendMail` when clicked, debouncing subsequent calls. - * jQuery(element).on('click', _.debounce(sendMail, 300, { - * 'leading': true, - * 'trailing': false - * })); - * - * // Ensure `batchLog` is invoked once after 1 second of debounced calls. - * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); - * var source = new EventSource('/stream'); - * jQuery(source).on('message', debounced); - * - * // Cancel the trailing debounced invocation. - * jQuery(window).on('popstate', debounced.cancel); - */ function debounce(func, wait, options) { - var lastArgs, - lastThis, - maxWait, - result, - timerId, - lastCallTime, - lastInvokeTime = 0, - leading = false, - maxing = false, - trailing = true; - - if (typeof func != 'function') { + var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true; + if (typeof func != "function") { throw new TypeError(FUNC_ERROR_TEXT); } wait = toNumber(wait) || 0; if (isObject(options)) { leading = !!options.leading; - maxing = 'maxWait' in options; + maxing = "maxWait" in options; maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; - trailing = 'trailing' in options ? !!options.trailing : trailing; + trailing = "trailing" in options ? !!options.trailing : trailing; } - function invokeFunc(time) { - var args = lastArgs, - thisArg = lastThis; - - lastArgs = lastThis = undefined; + var args = lastArgs, thisArg = lastThis; + lastArgs = lastThis = void 0; lastInvokeTime = time; result = func.apply(thisArg, args); return result; } - function leadingEdge(time) { - // Reset any `maxWait` timer. lastInvokeTime = time; - // Start the timer for the trailing edge. timerId = setTimeout(timerExpired, wait); - // Invoke the leading edge. return leading ? invokeFunc(time) : result; } - function remainingWait(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime, - result = wait - timeSinceLastCall; - - return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result; + var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, result2 = wait - timeSinceLastCall; + return maxing ? nativeMin(result2, maxWait - timeSinceLastInvoke) : result2; } - function shouldInvoke(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime; - - // Either this is the first call, activity has stopped and we're at the - // trailing edge, the system time has gone backwards and we're treating - // it as the trailing edge, or we've hit the `maxWait` limit. - return (lastCallTime === undefined || (timeSinceLastCall >= wait) || - (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime; + return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait; } - function timerExpired() { var time = now(); if (shouldInvoke(time)) { return trailingEdge(time); } - // Restart the timer. timerId = setTimeout(timerExpired, remainingWait(time)); } - function trailingEdge(time) { - timerId = undefined; - - // Only invoke if we have `lastArgs` which means `func` has been - // debounced at least once. + timerId = void 0; if (trailing && lastArgs) { return invokeFunc(time); } - lastArgs = lastThis = undefined; + lastArgs = lastThis = void 0; return result; } - function cancel() { - if (timerId !== undefined) { + if (timerId !== void 0) { clearTimeout(timerId); } lastInvokeTime = 0; - lastArgs = lastCallTime = lastThis = timerId = undefined; + lastArgs = lastCallTime = lastThis = timerId = void 0; } - function flush() { - return timerId === undefined ? result : trailingEdge(now()); + return timerId === void 0 ? result : trailingEdge(now()); } - function debounced() { - var time = now(), - isInvoking = shouldInvoke(time); - + var time = now(), isInvoking = shouldInvoke(time); lastArgs = arguments; lastThis = this; lastCallTime = time; - if (isInvoking) { - if (timerId === undefined) { + if (timerId === void 0) { return leadingEdge(lastCallTime); } if (maxing) { - // Handle invocations in a tight loop. timerId = setTimeout(timerExpired, wait); return invokeFunc(lastCallTime); } } - if (timerId === undefined) { + if (timerId === void 0) { timerId = setTimeout(timerExpired, wait); } return result; @@ -498,2306 +881,318 @@ function debounce(func, wait, options) { debounced.flush = flush; return debounced; } - -/** - * Creates a throttled function that only invokes `func` at most once per - * every `wait` milliseconds. The throttled function comes with a `cancel` - * method to cancel delayed `func` invocations and a `flush` method to - * immediately invoke them. Provide `options` to indicate whether `func` - * should be invoked on the leading and/or trailing edge of the `wait` - * timeout. The `func` is invoked with the last arguments provided to the - * throttled function. Subsequent calls to the throttled function return the - * result of the last `func` invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the throttled function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.throttle` and `_.debounce`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to throttle. - * @param {number} [wait=0] The number of milliseconds to throttle invocations to. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=true] - * Specify invoking on the leading edge of the timeout. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new throttled function. - * @example - * - * // Avoid excessively updating the position while scrolling. - * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); - * - * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. - * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); - * jQuery(element).on('click', throttled); - * - * // Cancel the trailing throttled invocation. - * jQuery(window).on('popstate', throttled.cancel); - */ function throttle(func, wait, options) { - var leading = true, - trailing = true; - - if (typeof func != 'function') { + var leading = true, trailing = true; + if (typeof func != "function") { throw new TypeError(FUNC_ERROR_TEXT); } if (isObject(options)) { - leading = 'leading' in options ? !!options.leading : leading; - trailing = 'trailing' in options ? !!options.trailing : trailing; + leading = "leading" in options ? !!options.leading : leading; + trailing = "trailing" in options ? !!options.trailing : trailing; } return debounce(func, wait, { - 'leading': leading, - 'maxWait': wait, - 'trailing': trailing + "leading": leading, + "maxWait": wait, + "trailing": trailing }); } - -/** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ function isObject(value) { var type = typeof value; - return !!value && (type == 'object' || type == 'function'); + return !!value && (type == "object" || type == "function"); } - -/** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ function isObjectLike(value) { - return !!value && typeof value == 'object'; + return !!value && typeof value == "object"; } - -/** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ function isSymbol(value) { - return typeof value == 'symbol' || - (isObjectLike(value) && objectToString.call(value) == symbolTag); + return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag; } - -/** - * Converts `value` to a number. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {number} Returns the number. - * @example - * - * _.toNumber(3.2); - * // => 3.2 - * - * _.toNumber(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toNumber(Infinity); - * // => Infinity - * - * _.toNumber('3.2'); - * // => 3.2 - */ function toNumber(value) { - if (typeof value == 'number') { + if (typeof value == "number") { return value; } if (isSymbol(value)) { return NAN; } if (isObject(value)) { - var other = typeof value.valueOf == 'function' ? value.valueOf() : value; - value = isObject(other) ? (other + '') : other; + var other = typeof value.valueOf == "function" ? value.valueOf() : value; + value = isObject(other) ? other + "" : other; } - if (typeof value != 'string') { + if (typeof value != "string") { return value === 0 ? value : +value; } - value = value.replace(reTrim, ''); + value = value.replace(reTrim, ""); var isBinary = reIsBinary.test(value); - return (isBinary || reIsOctal.test(value)) - ? freeParseInt(value.slice(2), isBinary ? 2 : 8) - : (reIsBadHex.test(value) ? NAN : +value); + return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; } - -module.exports = throttle; - -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "../node_modules/webpack/buildin/global.js"))) - -/***/ }), - -/***/ "../node_modules/style-loader/lib/addStyles.js": -/*!*****************************************************!*\ - !*** ../node_modules/style-loader/lib/addStyles.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - -var stylesInDom = {}; - -var memoize = function (fn) { - var memo; - - return function () { - if (typeof memo === "undefined") memo = fn.apply(this, arguments); - return memo; - }; -}; - -var isOldIE = memoize(function () { - // Test for IE <= 9 as proposed by Browserhacks - // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805 - // Tests for existence of standard globals is to allow style-loader - // to operate correctly into non-standard environments - // @see https://github.com/webpack-contrib/style-loader/issues/177 - return window && document && document.all && !window.atob; -}); - -var getTarget = function (target) { - return document.querySelector(target); +var lodash_throttle = throttle; +const throttle$1 = /* @__PURE__ */ getDefaultExportFromCjs(lodash_throttle); +const ExposeMode = { + // Launch when plugin is registered. + register() { + console.log("Expose mode registered."); + this.view.on( + "contextmenu", + throttle$1((event) => { + if (this.mode !== "expose") { + if (this.windows.length > 0) { + this.mode = "expose"; + } + } else if (this.mode === "expose") { + this.mode = "default"; + } + event.stopPropagation(); + event.preventDefault(); + }, 1e3) + ); + }, + // Launch when plugin is enabled. + plug() { + const grid = Math.ceil(this.windows.length / 2); + const maxWidth = Math.floor(this.view.width / grid); + const maxHeight = Math.floor(this.view.height / 2); + let scale, left, top, pos; + this.view.el.classList.add("expose"); + for (let win, i = 0, len = this.windows.length; i < len; i++) { + win = this.windows[i]; + win._exposeRestore = win.stamp(); + if (win.height > win.width) { + scale = win.height > maxHeight ? maxHeight / win.height : 1; + } else { + scale = win.width > maxWidth ? maxWidth / win.width : 1; + } + scale -= 0.15; + pos = { + x: i % grid * maxWidth, + y: (i < grid ? 0 : 1) * maxHeight + }; + left = pos.x + Math.floor((maxWidth - scale * win.width) / 2); + top = pos.y + Math.floor((maxHeight - scale * win.height) / 2); + win.enabled = false; + win.movable = false; + win.view.el.classList.add("exposing"); + win.view.el.style.transformOrigin = "0 0"; + win.view.el.style.transform = `scale(${scale})`; + win.view.top = top; + win.view.left = left; + const endExposing = () => { + win.view.el.classList.remove("exposing"); + }; + if (win.animations) { + win.view.on("transitionend", endExposing); + } else { + endExposing(); + } + } + this.overlay = true; + this.view.one("click", () => { + this.mode = "default"; + }); + }, + // Lauch when plugin is disabled + unplug() { + return new Promise((done) => { + if (this.windows.length === 0) { + done(); + } + for (let win, i = this.windows.length; i--; ) { + win = this.windows[i]; + win.restore(win._exposeRestore); + win.view.el.style.transform = "scale(1)"; + win.view.el.style.transformOrigin = "50% 50%"; + const removeTransform = /* @__PURE__ */ function(win2, windowIndex) { + return function() { + if (windowIndex === 0) { + done(); + } + win2.view.el.style.transform = ""; + win2._exposeRestore = null; + }; + }(win, i); + if (win.animations) { + this.view.onTransitionEnd(removeTransform, this); + } else { + removeTransform.call(this); + } + win.movable = true; + win.enabled = true; + } + this.overlay = false; + }).then(() => { + this.view.el.classList.remove("expose"); + }); + }, + actions: { + focus() { + }, + close() { + this.mode = "expose"; + }, + select(win) { + this.mode = "default"; + win.focus(); + } + } }; - -var getElement = (function (fn) { - var memo = {}; - - return function(target) { - // If passing function in options, then use it for resolve "head" element. - // Useful for Shadow Root style i.e - // { - // insertInto: function () { return document.querySelector("#foo").shadowRoot } - // } - if (typeof target === 'function') { - return target(); - } - if (typeof memo[target] === "undefined") { - var styleTarget = getTarget.call(this, target); - // Special case to return head of iframe instead of iframe itself - if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) { - try { - // This will throw an exception if access to iframe is blocked - // due to cross-origin restrictions - styleTarget = styleTarget.contentDocument.head; - } catch(e) { - styleTarget = null; - } - } - memo[target] = styleTarget; - } - return memo[target] - }; -})(); - -var singleton = null; -var singletonCounter = 0; -var stylesInsertedAtTop = []; - -var fixUrls = __webpack_require__(/*! ./urls */ "../node_modules/style-loader/lib/urls.js"); - -module.exports = function(list, options) { - if (typeof DEBUG !== "undefined" && DEBUG) { - if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment"); - } - - options = options || {}; - - options.attrs = typeof options.attrs === "object" ? options.attrs : {}; - - // Force single-tag solution on IE6-9, which has a hard limit on the # of