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 [](https://travis-ci.org/rlamana/Ventus) [](https://gitter.im/rlamana/Ventus?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+Ventus WM [](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,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/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