diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..c9e817d5 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,33 @@ +Contribution Policy for MagicMirror² +==================================== + +Thanks for contributing to MagicMirror²! + +We hold our code to standard, and these standards are documented below. + +First, before you run the linters, you will need to install them all **and** install the development dependencies: + +```bash +(sudo) npm install -g jscs stylelint html-validator-cli +npm install +``` + +### JavaScript: Run JSCS and ESLint + +We use [JSCS](http://jscs.info) and [ESLint](http://eslint.org) on our JavaScript files. + +Our JSCS configuration is in our .jscsrc file, and we use [eslint-config-google](https://www.npmjs.com/package/eslint-config-google) in ESLint. + +To run ESLint, use `npm run eslint`. To run JSCS, use `npm run jscs`. + +### CSS: Run StyleLint + +We use [StyleLint](http://stylelint.io) to lint our CSS. Our configuration is in our .stylelintrc file. + +To run StyleLint, use `npm run stylelint`. + +### HTML: Run HTML Validator + +We use [NU Validator](https://validator.w3.org/nu) to validate our HTML. The configuration is in the command in the package.json file. + +To run HTML Validator, use `npm run htmlvalidator`. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..1553010e --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,2 @@ +* **Platform** [ Raspberry Pi 2/3, Windows, Mac OS X, Linux]: +* **Node Version** [ 0.12.13 or later ]: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..35c40ef3 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,5 @@ +* Does the pull request solve a **related** issue? [yes | no] + +* If so, can you reference the issue? + +* What does the pull request accomplish? (please list) diff --git a/.github/header.png b/.github/header.png new file mode 100644 index 00000000..46c9e3e3 Binary files /dev/null and b/.github/header.png differ diff --git a/.github/header.psd b/.github/header.psd new file mode 100644 index 00000000..6b97142e Binary files /dev/null and b/.github/header.psd differ diff --git a/.gitignore b/.gitignore index c1294794..7deaa919 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ # Ignore all modules except the default modules. /modules/** !/modules/default/** +!/modules/README.md** # Ignore changes to the custom css files. /css/custom.css diff --git a/.jscsrc b/.jscsrc new file mode 100644 index 00000000..bc1fcea6 --- /dev/null +++ b/.jscsrc @@ -0,0 +1,8 @@ +{ + "preset": "google", + "validateIndentation": "\t", + "validateQuoteMarks": "\"", + "maximumLineLength": 250, + "requireCurlyBraces": [], + "requireCamelCaseOrUpperCaseIdentifiers": false +} \ No newline at end of file diff --git a/.snyk b/.snyk new file mode 100644 index 00000000..c126332f --- /dev/null +++ b/.snyk @@ -0,0 +1 @@ +version: v1 diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 00000000..02300404 --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,4 @@ +{ + "extends": "stylelint-config-standard", + "font-family-name-quotes": "double-where-recommended" +} \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index de5cf3da..00000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 - Michael Teeuw - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..d4765af2 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,18 @@ +The MIT License (MIT) +===================== + +Copyright © 2016 Michael Teeuw + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the “Software”), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +**The software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.** diff --git a/README.md b/README.md index 0ee8dc27..e4dc5238 100644 --- a/README.md +++ b/README.md @@ -1,51 +1,78 @@ -# MagicMirror² +![MagicMirror²: The open source modular smart mirror platform. ](.github/header.png) -[![Dependency Status](https://david-dm.org/MichMich/MagicMirror/v2-beta.svg)](https://david-dm.org/MichMich/MagicMirror/v2-beta) +

+ Dependency Status + devDependency Status + Node Version + License +

-[![devDependency Status](https://david-dm.org/MichMich/MagicMirror/v2-beta/dev-status.svg)](https://david-dm.org/MichMich/MagicMirror/v2-beta#info=devDependencies) +**MagicMirror²** is an open source modular smart mirror platform. With a growing list of installable modules, the **MagicMirror²** allows you to convert your hallway or bathroom mirror into your personal assistant. **MagicMirror²** is built by the creator of [the original MagicMirror](http://michaelteeuw.nl/tagged/magicmirror) with the incredible help of a [growing community of contributors](https://github.com/MichMich/MagicMirror/graphs/contributors). -This version of the Magic Mirror software focusses on a modular plugin system. Besides that, the Magic Mirror software now also uses [Electron](http://electron.atom.io/), so no more webserver or browser installs necessary. +MagicMirror² focuses on a modular plugin system and uses [Electron](http://electron.atom.io/) as an application wrapper. So no more web server or browser installs necessary! -**WARNING!** This version is in a *very* early stage. It is **not** completed yet. **Please** use the master branch. +**NOTE:** This version is in currently in beta stage. Please use the master branch if you need a thoroughly tested version. + +## Table Of Contents + +- [Usage](#usage) +- [Configuration](#configuration) +- [Modules](#modules) +- [Known Issues](#known-issues) +- [Contributing Guidelines](#contributing-guidelines) ## Usage -#### Automatic Installer - -1. Clone the repository: `git clone -b v2-beta https://github.com/MichMich/MagicMirror` -2. Enter the new directory: `cd MagicMirror` -3. Give the installer permission to run: `sudo chmod +x install.sh` -4. Start the installer: `sudo ./install.sh` +#### Automatic Installer (Raspberry Pi Only!) +Execute the following command on your Raspberry Pi to install MagicMirror²: +```` +curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/v2-beta/installers/raspberry.sh | bash +```` #### Manual Installation -1. Download the latest Node.js version: - - `wget https://nodejs.org/dist/latest/node-v5.10.0-linux-armv6l.tar.gz` for Raspberry Pi - - `wget https://nodejs.org/dist/latest/node-v5.10.0-linux-armv7l.tar.gz` for Raspberry Pi 2 - - `wget https://nodejs.org/dist/latest/node-v5.10.0-linux-arm64.tar.gz` for Raspberry Pi 3 -2. Unpack the archive file: `tar -xvf filename.tar.gz` -3. Install Node.js: `cd foldername && sudo cp -R * /usr/local/` -4. Set loglevel `npm config set loglevel info` -5. Clone the repository and check out the beta branch: `git clone -b v2-beta https://github.com/MichMich/MagicMirror` -6. Enter the repository: `cd MagicMirror` -7. `npm install && npm start` (You may have to restart your terminal before this works!) +1. Download and install the latest Node.js version. +2. Clone the repository and check out the beta branch: `git clone -b v2-beta https://github.com/MichMich/MagicMirror` +3. Enter the repository: `cd ~/MagicMirror` +4. Install and run the app: `npm install && npm start` (You may have to restart your terminal before this works!) -**Important:** `npm start` does **not** work via SSH! You will have to execute it in a terminal session running in a window manager. +**Important:** `npm start` does **not** work via SSH, use `DISPLAY=:0 nohup npm start &` instead. This starts the mirror on the remote display. + +#### Server Only + +In some cases, you want to start the application without an actual app window. In this case, execute the following command from the MagicMirror folder: `node serveronly`. This will start the server, after which you can open the application in your browser of choice. + +#### Raspberry Configuration & Auto Start. + +The following wiki links are helpful in the configuration of your MagicMirror² operating system: +- [Configuring the Raspberry Pi](https://github.com/MichMich/MagicMirror/wiki/Configuring-the-Raspberry-Pi) +- [Auto Starting MagicMirror](https://github.com/MichMich/MagicMirror/wiki/Auto-Starting-MagicMirror) ## Configuration 1. Duplicate `config/config.js.sample` to `config/config.js`. 2. Modify your required settings. -## Todo List +The following properties can be configured: -Here is a list of various things that still have to be implemented or changed. -- [ ] Allow show/hide animations to animate the height. This way, the other modules won't jump around. -- [ ] Allow vertical centering of alerts. -- [ ] Rewrite the [alert](modules/default/alert) module in vanilla JavaScript. -- [ ] Write all the documentation. +| **Option** | **Description** | +| --- | --- | +| `port` | The port on which the MagicMirror² server will run on. The default value is `8080`. | +| `language` | The language of the interface. (Note: Not all elements will be localized.) Possible values are `en`, `nl`, `ru`, `fr`, etc., but the default value is `en`. | +| `timeFormat` | The form of time notation that will be used. Possible values are `12` or `24`. The default is `24`. | +| `modules` | An array of active modules. **The array must contain objects. See the next table below for more information.** | + +Module configuration: + +| **Option** | **Description** | +| --- | --- | +| `module` | The name of the module. This can also contain the subfolder. Valid examples include `clock`, `default/calendar` and `custommodules/mymodule`. | +| `position` | The location of the module in which the module will be loaded. Possible values are `top_ bar`, `top_left`, `top_center`, `top_right`, `upper_third`, `middle_center`, `lower_third`, `bottom_left`, `bottom_center`, `bottom_right`, `bottom_bar`, `fullscreen_above`, and `fullscreen_below`. This field is optional but most modules require this field to set. Check the documentation of the module for more information. Multiple modules with the same position will be ordered based on the order in the configuration file. | +| `classes` | Additional classes which are passed to the module. The field is optional. | +| `header` | To display a header text above the module, add the header property. This field is optional. | +| `config` | An object with the module configuration properties. Check the documentation of the module for more information. This field is optional, unless the module requires extra configuration. | ## Modules @@ -67,16 +94,27 @@ The following modules are created by their respective authors. - **[MMM-Facial-Recognition by PaViRo](https://github.com/paviro/MMM-Facial-Recognition)**
Facial recognition and module swapping based on the current user ... - **[MMM-Wunderlist by PaViRo](https://github.com/paviro/MMM-Wunderlist)**
Displays your Wunderlist todos on your mirror ... + +- **[MMM-wordnik by Vendittelli](https://github.com/SVendittelli/MMM-wordnik)**
Get the word of the day, its definition, and origin ... -## Contributing +- **[MMM-SystemTemperature by MichMich](https://github.com/MichMich/mmm-systemtemperature)**
Display your Raspberry Pi's processor temperature on your MagicMirror. + +**Note:** If you want to build your own modules, check out the [MagicMirror² Module Development Documentation](modules) + +## Known issues + +- Electron seems to have some issues on certain Raspberry Pi 2's. See [#145](https://github.com/MichMich/MagicMirror/issues/145). +- MagicMirror² (Electron) sometimes quits without an error after an extended period of use. See [#150](https://github.com/MichMich/MagicMirror/issues/150). + +## Contributing Guidelines Contributions of all kinds are welcome, not only in the form of code but also with regards bug reports and documentation. Please keep the following in mind: - **Bug Reports**: Make sure you're running the latest version. If the issue(s) still persist: please open a clearly documented issue with a clear title. -- **Minor Bug Fixes**: Please send a pull request with a clear explanation of the issue or a link to the isssue it solves. +- **Minor Bug Fixes**: Please send a pull request with a clear explanation of the issue or a link to the issue it solves. - **Major Bug Fixes**: please discuss your approach in an GitHub issue before you start to alter a big part of the code. - **New Features**: please please discuss in a GitHub issue before you start to alter a big part of the code. Without discussion upfront, the pull request will not be accepted / merged. -Thanks for your help in making Magic Mirror better! +Thanks for your help in making MagicMirror² better! diff --git a/config/.gitignore b/config/.gitignore index 1bf4259a..d85e3bd4 100644 --- a/config/.gitignore +++ b/config/.gitignore @@ -1 +1,2 @@ -config.js +* +!config.js.sample diff --git a/config/config.js.sample b/config/config.js.sample index f6388249..ef3e9aef 100644 --- a/config/config.js.sample +++ b/config/config.js.sample @@ -1,6 +1,4 @@ -/* exported config */ - -/* Magic Mirror Config +/* Magic Mirror Config Sample * * By Michael Teeuw http://michaelteeuw.nl * MIT Licensed. @@ -66,6 +64,5 @@ var config = { }; - /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== 'undefined') {module.exports = config;} diff --git a/css/main.css b/css/main.css index de3e78ed..1d9a0de7 100644 --- a/css/main.css +++ b/css/main.css @@ -1,59 +1,108 @@ html { - cursor: none; + cursor: none; + overflow:hidden; } body { - margin: 60px; - position: absolute; - height: calc(100% - 120px); - width: calc(100% - 120px); - background: #000; - color: #aaa; - font-family: 'Roboto Condensed', sans-serif; - font-weight: 400; - font-size: 2em; - line-height: 1.5em; - -webkit-font-smoothing: antialiased; + overflow:hidden; + margin: 60px; + position: absolute; + height: calc(100% - 120px); + width: calc(100% - 120px); + background: #000; + color: #aaa; + font-family: "Roboto Condensed", sans-serif; + font-weight: 400; + font-size: 2em; + line-height: 1.5em; + -webkit-font-smoothing: antialiased; } /** * Default styles. */ -.dimmed {color: #555;} -.normal {color: #999;} -.bright {color: #fff;} +.dimmed { + color: #666; +} -.xsmall {font-size: 15px; line-height: 20px;} -.small {font-size: 20px; line-height: 25px;} -.medium {font-size: 30px; line-height: 35px;} -.large {font-size: 65px; line-height: 65px;} -.xlarge {font-size: 75px; line-height: 75px; letter-spacing: -3px;} +.normal { + color: #999; +} -.thin {font-family: 'Roboto', sans-serif; font-weight: 100;} -.light {font-family: 'Roboto Condensed', sans-serif; font-weight: 300;} -.regular {font-family: 'Roboto Condensed', sans-serif; font-weight: 400;} -.bold {font-family: 'Roboto Condensed', sans-serif; font-weight: 700;} +.bright { + color: #fff; +} -.align-right {text-align: right;} -.align-left {text-align: left;} +.xsmall { + font-size: 15px; + line-height: 20px; +} +.small { + font-size: 20px; + line-height: 25px; +} + +.medium { + font-size: 30px; + line-height: 35px; +} + +.large { + font-size: 65px; + line-height: 65px; +} + +.xlarge { + font-size: 75px; + line-height: 75px; + letter-spacing: -3px; +} + +.thin { + font-family: Roboto, sans-serif; + font-weight: 100; +} + +.light { + font-family: "Roboto Condensed", sans-serif; + font-weight: 300; +} + +.regular { + font-family: "Roboto Condensed", sans-serif; + font-weight: 400; +} + +.bold { + font-family: "Roboto Condensed", sans-serif; + font-weight: 700; +} + +.align-right { + text-align: right; +} + +.align-left { + text-align: left; +} header { - text-transform: uppercase; - font-size: 15px; - font-family: 'Roboto Condensed'; - font-weight: 400; - border-bottom: 1px solid #333; - line-height: 0.35em; - padding-bottom: 10px; - margin-bottom: 10px; - color: #666; + text-transform: uppercase; + font-size: 15px; + font-family: "Roboto Condensed"; + font-weight: 400; + border-bottom: 1px solid #666; + line-height: 0.35em; + padding-bottom: 10px; + margin-bottom: 10px; + color: #999; } sup { - font-size: 50%; - line-height: 50%; + font-size: 50%; + line-height: 50%; } /** @@ -61,10 +110,11 @@ sup { */ .module { - margin-top: 30px; + margin-top: 30px; } + .module:first-child { - margin-top: 0px; + margin-top: 0; } /** @@ -72,73 +122,105 @@ sup { */ .region { - position: absolute; + position: absolute; } + +.region.fullscreen { + position: absolute; + top: -60px; + left: -60px; + right: -60px; + bottom: -60px; +} + .region.right { - right: 0; + right: 0; } + .region.top { - top: 0; + top: 0; } -.region.top .container{ - margin-bottom: 25px; + +.region.top .container { + margin-bottom: 25px; } + .region.top .container:empty { - margin-bottom: 0px; + margin-bottom: 0; } -.region.top.center, .region.bottom.center { - left: 50%; - -moz-transform: translateX(-50%); - -o-transform: translateX(-50%); - -webkit-transform: translateX(-50%); - -ms-transform: translateX(-50%); - transform: translateX(-50%); + +.region.top.center, +.region.bottom.center { + left: 50%; + -moz-transform: translateX(-50%); + -o-transform: translateX(-50%); + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + transform: translateX(-50%); } -.region.top.right, .region.top.left, .region.top.center { - top: 100%; + +.region.top.right, +.region.top.left, +.region.top.center { + top: 100%; } + .region.bottom { - bottom: 0; + bottom: 0; } -.region.bottom .container{ - margin-top: 25px; + +.region.bottom .container { + margin-top: 25px; } + .region.bottom .container:empty { - margin-top: 0px; + margin-top: 0; } -.region.bottom.right, .region.bottom.center, .region.bottom.left { - bottom: 100%; + +.region.bottom.right, +.region.bottom.center, +.region.bottom.left { + bottom: 100%; } + .region.bar { - width: 100%; - text-align: center; -} -.region.third, .region.middle.center { - width: 100%; - text-align: center; - -moz-transform: translateY(-50%); - -o-transform: translateY(-50%); - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); -} -.region.upper.third { - top: 33%; + width: 100%; + text-align: center; } + +.region.third, .region.middle.center { - top: 50%; + width: 100%; + text-align: center; + -moz-transform: translateY(-50%); + -o-transform: translateY(-50%); + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); } + +.region.upper.third { + top: 33%; +} + +.region.middle.center { + top: 50%; +} + .region.lower.third { - top: 66%; + top: 66%; } + .region.left { - text-align: left; + text-align: left; } + .region.right { - text-align: right; + text-align: right; } -.region table { - width: 100%; - border-spacing: 0px; - border-collapse: separate; + +.region table { + width: 100%; + border-spacing: 0; + border-collapse: separate; } diff --git a/fonts/roboto.css b/fonts/roboto.css index e33b5ef7..ce9099da 100644 --- a/fonts/roboto.css +++ b/fonts/roboto.css @@ -1,87 +1,95 @@ @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), - local('Roboto-Thin'), - url('Roboto-Thin/Roboto-Thin.woff2') format('woff2'), - url('Roboto-Thin/Roboto-Thin.woff') format('woff'), - url('Roboto-Thin/Roboto-Thin.ttf') format('truetype'); + font-family: Roboto; + font-style: normal; + font-weight: 100; + src: + local("Roboto Thin"), + local("Roboto-Thin"), + url("Roboto-Thin/Roboto-Thin.woff2") format("woff2"), + url("Roboto-Thin/Roboto-Thin.woff") format("woff"), + url("Roboto-Thin/Roboto-Thin.ttf") format("truetype"); } @font-face { - font-family: 'Roboto Condensed'; - font-style: normal; - font-weight: 300; - src: local('Roboto Condensed Light'), - local('RobotoCondensed-Light'), - url('RobotoCondensed-Light/RobotoCondensed-Light.woff2') format('woff2'), - url('RobotoCondensed-Light/RobotoCondensed-Light.woff') format('woff'), - url('RobotoCondensed-Light/RobotoCondensed-Light.ttf') format('truetype'); + font-family: "Roboto Condensed"; + font-style: normal; + font-weight: 300; + src: + local("Roboto Condensed Light"), + local("RobotoCondensed-Light"), + url("RobotoCondensed-Light/RobotoCondensed-Light.woff2") format("woff2"), + url("RobotoCondensed-Light/RobotoCondensed-Light.woff") format("woff"), + url("RobotoCondensed-Light/RobotoCondensed-Light.ttf") format("truetype"); } @font-face { - font-family: 'Roboto Condensed'; - font-style: normal; - font-weight: 400; - src: local('Roboto Condensed'), - local('RobotoCondensed-Regular'), - url('RobotoCondensed-Regular/RobotoCondensed-Regular.woff2') format('woff2'), - url('RobotoCondensed-Regular/RobotoCondensed-Regular.woff') format('woff'), - url('RobotoCondensed-Regular/RobotoCondensed-Regular.ttf') format('truetype'); + font-family: "Roboto Condensed"; + font-style: normal; + font-weight: 400; + src: + local("Roboto Condensed"), + local("RobotoCondensed-Regular"), + url("RobotoCondensed-Regular/RobotoCondensed-Regular.woff2") format("woff2"), + url("RobotoCondensed-Regular/RobotoCondensed-Regular.woff") format("woff"), + url("RobotoCondensed-Regular/RobotoCondensed-Regular.ttf") format("truetype"); } @font-face { - font-family: 'Roboto Condensed'; - font-style: normal; - font-weight: 700; - src: local('Roboto Condensed Bold'), - local('RobotoCondensed-Bold'), - url('RobotoCondensed-Bold/RobotoCondensed-Bold.woff2') format('woff2'), - url('RobotoCondensed-Bold/RobotoCondensed-Bold.woff') format('woff'), - url('RobotoCondensed-Bold/RobotoCondensed-Bold.ttf') format('truetype'); + font-family: "Roboto Condensed"; + font-style: normal; + font-weight: 700; + src: + local("Roboto Condensed Bold"), + local("RobotoCondensed-Bold"), + url("RobotoCondensed-Bold/RobotoCondensed-Bold.woff2") format("woff2"), + url("RobotoCondensed-Bold/RobotoCondensed-Bold.woff") format("woff"), + url("RobotoCondensed-Bold/RobotoCondensed-Bold.ttf") format("truetype"); } @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), - local('Roboto-Regular'), - url('Roboto-Regular/Roboto-Regular.woff2') format('woff2'), - url('Roboto-Regular/Roboto-Regular.woff') format('woff'), - url('Roboto-Regular/Roboto-Regular.ttf') format('truetype'); + font-family: Roboto; + font-style: normal; + font-weight: 400; + src: + local("Roboto"), + local("Roboto-Regular"), + url("Roboto-Regular/Roboto-Regular.woff2") format("woff2"), + url("Roboto-Regular/Roboto-Regular.woff") format("woff"), + url("Roboto-Regular/Roboto-Regular.ttf") format("truetype"); } @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), - local('Roboto-Medium'), - url('Roboto-Medium/Roboto-Medium.woff2') format('woff2'), - url('Roboto-Medium/Roboto-Medium.woff') format('woff'), - url('Roboto-Medium/Roboto-Medium.ttf') format('truetype'); + font-family: Roboto; + font-style: normal; + font-weight: 500; + src: + local("Roboto Medium"), + local("Roboto-Medium"), + url("Roboto-Medium/Roboto-Medium.woff2") format("woff2"), + url("Roboto-Medium/Roboto-Medium.woff") format("woff"), + url("Roboto-Medium/Roboto-Medium.ttf") format("truetype"); } @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), - local('Roboto-Bold'), - url('Roboto-Bold/Roboto-Bold.woff2') format('woff2'), - url('Roboto-Bold/Roboto-Bold.woff') format('woff'), - url('Roboto-Bold/Roboto-Bold.ttf') format('truetype'); + font-family: Roboto; + font-style: normal; + font-weight: 700; + src: + local("Roboto Bold"), + local("Roboto-Bold"), + url("Roboto-Bold/Roboto-Bold.woff2") format("woff2"), + url("Roboto-Bold/Roboto-Bold.woff") format("woff"), + url("Roboto-Bold/Roboto-Bold.ttf") format("truetype"); } @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), - local('Roboto-Light'), - url('Roboto-Light/Roboto-Light.woff2') format('woff2'), - url('Roboto-Light/Roboto-Light.woff') format('woff'), - url('Roboto-Light/Roboto-Light.ttf') format('truetype'); + font-family: Roboto; + font-style: normal; + font-weight: 300; + src: + local("Roboto Light"), + local("Roboto-Light"), + url("Roboto-Light/Roboto-Light.woff2") format("woff2"), + url("Roboto-Light/Roboto-Light.woff") format("woff"), + url("Roboto-Light/Roboto-Light.ttf") format("truetype"); } diff --git a/index.html b/index.html index cfcffff5..a6d7265c 100644 --- a/index.html +++ b/index.html @@ -1,33 +1,32 @@ + Magic Mirror - + + - - +
-
- +

-
- +
diff --git a/install.sh b/install.sh deleted file mode 100644 index 00473f92..00000000 --- a/install.sh +++ /dev/null @@ -1,69 +0,0 @@ -# $$\ $$\ $$\ $$\ $$\ $$\ $$$$$$\ -# $$$\ $$$ | \__| $$$\ $$$ |\__| $$ __$$\ -# $$$$\ $$$$ | $$$$$$\ $$$$$$\ $$\ $$$$$$$\ $$$$\ $$$$ |$$\ $$$$$$\ $$$$$$\ $$$$$$\ $$$$$$\ \__/ $$ | -# $$\$$\$$ $$ | \____$$\ $$ __$$\ $$ |$$ _____|$$\$$\$$ $$ |$$ |$$ __$$\ $$ __$$\ $$ __$$\ $$ __$$\ $$$$$$ | -# $$ \$$$ $$ | $$$$$$$ |$$ / $$ |$$ |$$ / $$ \$$$ $$ |$$ |$$ | \__|$$ | \__|$$ / $$ |$$ | \__|$$ ____/ -# $$ |\$ /$$ |$$ __$$ |$$ | $$ |$$ |$$ | $$ |\$ /$$ |$$ |$$ | $$ | $$ | $$ |$$ | $$ | -# $$ | \_/ $$ |\$$$$$$$ |\$$$$$$$ |$$ |\$$$$$$$\ $$ | \_/ $$ |$$ |$$ | $$ | \$$$$$$ |$$ | $$$$$$$$\ -# \__| \__| \_______| \____$$ |\__| \_______|\__| \__|\__|\__| \__| \______/ \__| \________| -# $$\ $$ | -# \$$$$$$ | -# \______/ -# -# This is an installer script for MagicMirror2. It works well enough -# that it can detect if you have Node installed, run a binary script -# and then download and run MagicMirror2. -sudo apt-get install curl wget build-essential unzip -ARM=$(uname -m) # Determine which Pi is running. -NODE_LATEST="v5.10.0" # Set the latest version here. -6L_HASH="019a257faa5eebf6304686dfeffdbcb4c22f0547aa366f6e563aad39ab1b1ab1" # Set the armv6l hash here. -7L_HASH="3f7524d3db60175c2323bb2a0a13ad1ca7d47d4ede6f42834b6b8425be70e0a2" # Set the armv7l hash here. -8_HASH="df88803bda234b32240906b620315c8f6d6200332047a88cb0ec83009cf25dd5" # Set the arm64 hash here. -DOWNLOAD_URL="https://nodejs.org/dist/latest/node-$NODE_LATEST-linux-$ARM.tar.gz" # Construct the download URL. -wget $DOWNLOAD_URL # Download the file given. -if [ $ARM = "armv6l" ]; then - if [ -f "node-$NODE_LATEST-linux-armv6l.tar.gz"]; then - COMMAND256="sha256sum node-$NODE_LATEST-linux-armv6l.tar.gz" - if [ $($COMMAND256) = "019a257faa5eebf6304686dfeffdbcb4c22f0547aa366f6e563aad39ab1b1ab1" ]; then - echo "Node.js was downloaded and verified successfully." - else - echo "Node.js was downloaded, but verification failed. Make sure sha256sum works." - exit 1 - fi - fi -elif [ $ARM = "armv7l" ]; then - if [ -f "node-$NODE_LATEST-linux-armv7l.tar.gz" ]; then - COMMAND256="sha256sum node-$NODE_LATEST-linux-armv7l.tar.gz" - if [ $($COMMAND256) = "3f7524d3db60175c2323bb2a0a13ad1ca7d47d4ede6f42834b6b8425be70e0a2" ]; then - echo "Node.js was downloaded and verified successfully." - else - echo "Node.js was downloaded, but verification failed. Make sure sha256sum works." - exit 1 - fi - fi -elif [ $ARM = "arm64" ]; then - if [ -f "node-$NODE_LATEST-linux-arm64.tar.gz" ]; then - COMMAND256="sha256sum node-$NODE_LATEST-linux-arm64.tar.gz" - if [ $($COMMAND256) = "df88803bda234b32240906b620315c8f6d6200332047a88cb0ec83009cf25dd5" ]; then - echo "Node.js was downloaded and verified successfully." - else - echo "Node.js was downloaded, but verification failed. Make sure sha256sum works." - exit 1 - fi - fi -fi -tar xvf node-$NODE_LATEST-linux-$ARM.tar.gz -cd node* -sudo cp -R * /usr/local -cd .. -rm -rf node* -# Run Node checks to make sure Node works properly. -curl -sL https://deb.nodesource.com/test | bash - -npm config set loglevel info -if [ ! -f package.json ]; then - wget https://github.com/nhubbard/MagicMirror/archive/v2-beta.zip - unzip v2-beta.zip - cd MagicMirror-2-beta -fi -npm install -echo "We're ready! Run `npm start` from the MagicMirror-2-beta directory (not over SSH) and enjoy MagicMirror2!" diff --git a/installers/raspberry.sh b/installers/raspberry.sh new file mode 100644 index 00000000..26591329 --- /dev/null +++ b/installers/raspberry.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# $$\ $$\ $$\ $$\ $$\ $$\ $$$$$$\ +# $$$\ $$$ | \__| $$$\ $$$ |\__| $$ __$$\ +# $$$$\ $$$$ | $$$$$$\ $$$$$$\ $$\ $$$$$$$\ $$$$\ $$$$ |$$\ $$$$$$\ $$$$$$\ $$$$$$\ $$$$$$\ \__/ $$ | +# $$\$$\$$ $$ | \____$$\ $$ __$$\ $$ |$$ _____|$$\$$\$$ $$ |$$ |$$ __$$\ $$ __$$\ $$ __$$\ $$ __$$\ $$$$$$ | +# $$ \$$$ $$ | $$$$$$$ |$$ / $$ |$$ |$$ / $$ \$$$ $$ |$$ |$$ | \__|$$ | \__|$$ / $$ |$$ | \__|$$ ____/ +# $$ |\$ /$$ |$$ __$$ |$$ | $$ |$$ |$$ | $$ |\$ /$$ |$$ |$$ | $$ | $$ | $$ |$$ | $$ | +# $$ | \_/ $$ |\$$$$$$$ |\$$$$$$$ |$$ |\$$$$$$$\ $$ | \_/ $$ |$$ |$$ | $$ | \$$$$$$ |$$ | $$$$$$$$\ +# \__| \__| \_______| \____$$ |\__| \_______|\__| \__|\__|\__| \__| \______/ \__| \________| +# $$\ $$ | +# \$$$$$$ | +# \______/ +# +# This is an installer script for MagicMirror2. It works well enough +# that it can detect if you have Node installed, run a binary script +# and then download and run MagicMirror2. + +echo "Installing helper tools ..." +sudo apt-get install curl wget build-essential unzip || exit +ARM=$(uname -m) # Determine which Pi is running. +NODE_LATEST="v5.10.1" # Set the latest version here. +DOWNLOAD_URL="https://nodejs.org/dist/latest/node-$NODE_LATEST-linux-$ARM.tar.gz" # Construct the download URL. + +echo "Installing Latest Node.js ..." +mkdir ~/.MagicMirrorInstaller || exit +cd ~/.MagicMirrorInstaller || exit +wget $DOWNLOAD_URL || exit # Download the file given. +tar xvf node-$NODE_LATEST-linux-$ARM.tar.gz || exit +cd node* || exit +sudo cp -R * /usr/local || exit +cd ~ || exit +rm -Rf ~/.MagicMirrorInstaller || exit + +echo "Cloning MagicMirror ..." +git clone -b v2-beta https://github.com/MichMich/MagicMirror.git || exit +cd ~/MagicMirror || exit +npm install || exit +echo "We're ready! Run `DISPLAY=:0 npm start` from the MagicMirror directory." diff --git a/js/app.js b/js/app.js new file mode 100644 index 00000000..8257bcd0 --- /dev/null +++ b/js/app.js @@ -0,0 +1,133 @@ +/* Magic Mirror + * The Core App (Server) + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + */ + +var fs = require("fs"); +var Server = require(__dirname + "/server.js"); +var defaultModules = require(__dirname + "/../modules/default/defaultmodules.js"); +var path = require("path"); + +/* App - The core app. + */ +var App = function() { + var nodeHelpers = []; + + /* loadConfig(callback) + * Loads the config file. combines it with the defaults, + * and runs the callback with the found config as argument. + * + * argument callback function - The callback function. + */ + + var loadConfig = function(callback) { + console.log("Loading config ..."); + var defaults = require(__dirname + "/defaults.js"); + var configFilename = path.resolve(__dirname + "/../config/config.js"); + try { + fs.accessSync(configFilename, fs.F_OK); + var c = require(configFilename); + var config = Object.assign(defaults, c); + callback(config); + } catch (e) { + console.error('WARNING! Could not find config. Please create one.'); + callback(defaults); + } + }; + + /* loadModule(module) + * Loads a specific module. + * + * argument module string - The name of the module (including subpath). + */ + var loadModule = function(module) { + + var elements = module.split("/"); + var moduleName = elements[elements.length - 1]; + var moduleFolder = __dirname + "/../modules/" + module; + + if (defaultModules.indexOf(moduleName) !== -1) { + moduleFolder = __dirname + "/../modules/default/" + module; + } + + var helperPath = moduleFolder + "/node_helper.js"; + + var loadModule = true; + try { + fs.accessSync(helperPath, fs.R_OK); + } catch (e) { + loadModule = false; + console.log("No helper found for module: " + moduleName + "."); + } + + if (loadModule) { + var Module = require(helperPath); + var m = new Module(); + m.setName(moduleName); + m.setPath(path.resolve(moduleFolder)); + nodeHelpers.push(m); + } + }; + + /* loadModules(modules) + * Loads all modules. + * + * argument module string - The name of the module (including subpath). + */ + var loadModules = function(modules) { + console.log("Loading module helpers ..."); + + for (var m in modules) { + loadModule(modules[m]); + } + + console.log("All module helpers loaded."); + }; + + /* start(callback) + * This methods starts the core app. + * It loads the config, then it loads all modules. + * When it's done it executs the callback with the config as argument. + * + * argument callback function - The callback function. + */ + this.start = function(callback) { + + loadConfig(function(c) { + config = c; + + var modules = []; + + for (var m in config.modules) { + var module = config.modules[m]; + if (modules.indexOf(module.module) === -1) { + modules.push(module.module); + } + } + + loadModules(modules); + + var server = new Server(config, function(app, io) { + console.log("Server started ..."); + + for (var h in nodeHelpers) { + var nodeHelper = nodeHelpers[h]; + nodeHelper.setExpressApp(app); + nodeHelper.setSocketIO(io); + nodeHelper.start(); + } + + console.log("Sockets connected & modules started ..."); + + if (typeof callback === 'function') { + callback(config); + } + + }); + }); + }; +}; + +module.exports = new App(); \ No newline at end of file diff --git a/js/class.js b/js/class.js index 726e1abc..69b0cb09 100644 --- a/js/class.js +++ b/js/class.js @@ -4,66 +4,66 @@ */ // Inspired by base2 and Prototype -(function(){ - var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; +(function() { + var initializing = false; + var fnTest = /xyz/.test(function() {xyz;}) ? /\b_super\b/ : /.*/; - // The base Class implementation (does nothing) - this.Class = function(){}; + // The base Class implementation (does nothing) + this.Class = function() {}; - // Create a new Class that inherits from this class - Class.extend = function(prop) { - var _super = this.prototype; + // Create a new Class that inherits from this class + Class.extend = function(prop) { + var _super = this.prototype; - // Instantiate a base class (but only create the instance, - // don't run the init constructor) - initializing = true; - var prototype = new this(); - initializing = false; + // Instantiate a base class (but only create the instance, + // don't run the init constructor) + initializing = true; + var prototype = new this(); + initializing = false; - // Copy the properties over onto the new prototype - for (var name in prop) { - // Check if we're overwriting an existing function - prototype[name] = typeof prop[name] == "function" && - typeof _super[name] == "function" && fnTest.test(prop[name]) ? - (function(name, fn){ - return function() { - var tmp = this._super; + // Copy the properties over onto the new prototype + for (var name in prop) { + // Check if we're overwriting an existing function + prototype[name] = typeof prop[name] == "function" && + typeof _super[name] == "function" && fnTest.test(prop[name]) ? + (function(name, fn) { + return function() { + var tmp = this._super; - // Add a new ._super() method that is the same method - // but on the super-class - this._super = _super[name]; + // Add a new ._super() method that is the same method + // but on the super-class + this._super = _super[name]; - // The method only need to be bound temporarily, so we - // remove it when we're done executing - var ret = fn.apply(this, arguments); - this._super = tmp; + // The method only need to be bound temporarily, so we + // remove it when we're done executing + var ret = fn.apply(this, arguments); + this._super = tmp; - return ret; - }; + return ret; + }; })(name, prop[name]) : prop[name]; - } + } - // The dummy class constructor - function Class() { - // All construction is actually done in the init method - if ( !initializing && this.init ) - this.init.apply(this, arguments); - } + // The dummy class constructor + function Class() { + // All construction is actually done in the init method + if (!initializing && this.init) + this.init.apply(this, arguments); + } - // Populate our constructed prototype object - Class.prototype = prototype; + // Populate our constructed prototype object + Class.prototype = prototype; - // Enforce the constructor to be what we expect - Class.prototype.constructor = Class; + // Enforce the constructor to be what we expect + Class.prototype.constructor = Class; - // And make this class extendable - Class.extend = arguments.callee; + // And make this class extendable + Class.extend = arguments.callee; - return Class; - }; + return Class; + }; })(); - /*************** DO NOT EDIT THE LINE BELOW ***************/ -if (typeof module !== 'undefined') {module.exports = Class;} +if (typeof module !== "undefined") {module.exports = Class;} diff --git a/js/defaults.js b/js/defaults.js index 52df69fe..e3dc3d2b 100644 --- a/js/defaults.js +++ b/js/defaults.js @@ -10,49 +10,48 @@ var defaults = { port: 8080, - language: 'en', + language: "en", timeFormat: 24, modules: [ { - module: 'helloworld', - position: 'upper_third', + module: "helloworld", + position: "upper_third", + classes: "large thin", config: { - text: 'Magic Mirror V2', - classes: 'large thin' + text: "Magic Mirror2" } }, { - module: 'helloworld', - position: 'middle_center', + module: "helloworld", + position: "middle_center", config: { - text: 'Please create a config file.' + text: "Please create a config file." } }, { - module: 'helloworld', - position: 'middle_center', + module: "helloworld", + position: "middle_center", + classes: "small dimmed", config: { - text: 'See README for more information.', - classes: 'small dimmed' + text: "See README for more information." } }, { - module: 'helloworld', - position: 'bottom_bar', + module: "helloworld", + position: "bottom_bar", + classes: "xsmall dimmed", config: { - text: 'www.michaelteeuw.nl', - classes: 'xsmall dimmed' + text: "www.michaelteeuw.nl" } }, ], paths: { - modules: 'modules', - vendor: 'vendor' + modules: "modules", + vendor: "vendor" }, }; - /*************** DO NOT EDIT THE LINE BELOW ***************/ -if (typeof module !== 'undefined') {module.exports = defaults;} +if (typeof module !== "undefined") {module.exports = defaults;} diff --git a/js/electron.js b/js/electron.js index b3a857a4..5de41003 100755 --- a/js/electron.js +++ b/js/electron.js @@ -1,12 +1,8 @@ -'use strict'; +"use strict"; -//load modules -const walk = require('walk'); -const fs = require('fs'); -const Server = require(__dirname + '/server.js'); -const spawn = require('child_process').spawn; -const electron = require('electron'); -const defaultModules = require(__dirname + '/../modules/default/defaultmodules.js'); +const Server = require(__dirname + "/server.js"); +const electron = require("electron"); +const core = require(__dirname + "/app.js"); // Config var config = {}; @@ -15,25 +11,23 @@ const app = electron.app; // Module to create native browser window. const BrowserWindow = electron.BrowserWindow; -var nodeHelpers = []; - // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. let mainWindow; -function createWindow () { +function createWindow() { // Create the browser window. mainWindow = new BrowserWindow({width: 800, height: 600, fullscreen: true, autoHideMenuBar: true, webPreferences: {nodeIntegration: false}}); // and load the index.html of the app. //mainWindow.loadURL('file://' + __dirname + '../../index.html'); - mainWindow.loadURL('http://localhost:' + config.port); + mainWindow.loadURL("http://localhost:" + config.port); // Open the DevTools. //mainWindow.webContents.openDevTools(); // Emitted when the window is closed. - mainWindow.on('closed', function() { + mainWindow.on("closed", function() { // Dereference the window object, usually you would store windows // in an array if your app supports multi windows, this is the time // when you should delete the corresponding element. @@ -41,107 +35,32 @@ function createWindow () { }); } -function loadConfig (callback) { - console.log("Loading config ..."); - var defaults = require(__dirname + '/defaults.js'); - var configFilename = __dirname + '/../config/config.js'; - - try { - fs.accessSync(configFilename, fs.R_OK); - var c = require(configFilename); - var config = Object.assign(defaults, c); - callback(config); - } catch (e) { - callback(defaults); - } -} - -function loadModule(module) { - - var elements = module.split('/'); - var moduleName = elements[elements.length - 1]; - var moduleFolder = __dirname + '/../modules/' + module; - - if (defaultModules.indexOf(moduleName) !== -1) { - moduleFolder = __dirname + '/../modules/default/' + module; - } - - var helperPath = moduleFolder + '/node_helper.js'; - - var loadModule = true; - try { - fs.accessSync(helperPath, fs.R_OK); - } catch (e) { - loadModule = false; - console.log("No helper found for module: " + moduleName + "."); - } - - if (loadModule) { - var Module = require(helperPath); - var m = new Module(); - m.setName(moduleName); - nodeHelpers.push(m); - } -} - -function loadModules(modules) { - console.log("Loading module helpers ..."); - - for (var m in modules) { - loadModule(modules[m]); - } - - console.log("All module helpers loaded."); -} - -loadConfig(function(c) { - config = c; - - var modules = []; - - for (var m in config.modules) { - var module = config.modules[m]; - if (modules.indexOf(module.module) === -1) { - modules.push(module.module); - } - } - - loadModules(modules); - - var server = new Server(config, function(io) { - console.log('Server started ...'); - - for (var h in nodeHelpers) { - var nodeHelper = nodeHelpers[h]; - nodeHelper.setSocketIO(io); - nodeHelper.start(); - } - - console.log('Sockets connected & modules started ...'); - - }); -}); - // This method will be called when Electron has finished // initialization and is ready to create browser windows. -app.on('ready', function() { - console.log('Launching application.'); +app.on("ready", function() { + console.log("Launching application."); createWindow(); }); // Quit when all windows are closed. -app.on('window-all-closed', function () { +app.on("window-all-closed", function() { // On OS X it is common for applications and their menu bar // to stay active until the user quits explicitly with Cmd + Q - if (process.platform !== 'darwin') { + if (process.platform !== "darwin") { app.quit(); } }); -app.on('activate', function () { +app.on("activate", function() { // On OS X it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. if (mainWindow === null) { createWindow(); } }); + +// Start the core application. +// This starts all node helpers and starts the webserver. +core.start(function(c) { + config = c; +}); diff --git a/js/loader.js b/js/loader.js index 4f650ac6..2553a187 100644 --- a/js/loader.js +++ b/js/loader.js @@ -2,7 +2,6 @@ /* jshint unused:false */ /* jshint -W061 */ - /* Magic Mirror * Module and File loaders. * @@ -18,10 +17,8 @@ var Loader = (function() { var loadedFiles = []; var moduleObjects = []; - /* Private Methods */ - /* loadModules() * Loops thru all modules and requests load for every module. */ @@ -79,33 +76,31 @@ var Loader = (function() { var moduleData = modules[m]; var module = moduleData.module; - var elements = module.split('/'); + var elements = module.split("/"); var moduleName = elements[elements.length - 1]; - var moduleFolder = config.paths.modules + '/' + module; + var moduleFolder = config.paths.modules + "/" + module; if (defaultModules.indexOf(moduleName) !== -1) { - moduleFolder = config.paths.modules + '/default/' + module; + moduleFolder = config.paths.modules + "/default/" + module; } moduleFiles.push({ index: m, - identifier: 'module_' + m + '_' + module, + identifier: "module_" + m + "_" + module, name: moduleName, - path: moduleFolder + '/' , - file: moduleName + '.js', + path: moduleFolder + "/" , + file: moduleName + ".js", position: moduleData.position, header: moduleData.header, config: moduleData.config, - classes: (typeof moduleData.classes !== 'undefined') ? moduleData.classes + ' ' + module : module + classes: (typeof moduleData.classes !== "undefined") ? moduleData.classes + " " + module : module }); - } return moduleFiles; }; - /* loadModule(module) * Load modules via ajax request and create module objects. * @@ -113,7 +108,7 @@ var Loader = (function() { * argument module object - Information about the module we want to load. */ var loadModule = function(module, callback) { - var url = module.path + '/' + module.file; + var url = module.path + "/" + module.file; var afterLoad = function() { var moduleObject = Module.create(module.name); @@ -141,21 +136,20 @@ var Loader = (function() { * argument callback function - Function called when done. */ var bootstrapModule = function(module, mObj, callback) { - Log.info('Bootstrapping module: ' + module.name); + Log.info("Bootstrapping module: " + module.name); mObj.setData(module); mObj.loadScripts(function() { - Log.log('Scripts loaded for: ' + module.name); - mObj.loadStyles(function(){ - Log.log('Styles loaded for: ' + module.name); + Log.log("Scripts loaded for: " + module.name); + mObj.loadStyles(function() { + Log.log("Styles loaded for: " + module.name); moduleObjects.push(mObj); callback(); }); }); - }; /* loadFile(fileName) @@ -170,27 +164,27 @@ var Loader = (function() { switch (extension.toLowerCase()) { case "js": - Log.log('Load script: ' + fileName); + Log.log("Load script: " + fileName); var script = document.createElement("script"); script.type = "text/javascript"; script.src = fileName; script.onload = function() { - if (typeof callback === 'function') {callback();} + if (typeof callback === "function") {callback();} }; document.getElementsByTagName("body")[0].appendChild(script); break; case "css": - Log.log('Load stylesheet: ' + fileName); + Log.log("Load stylesheet: " + fileName); var stylesheet = document.createElement("link"); stylesheet.rel = "stylesheet"; stylesheet.type = "text/css"; stylesheet.href = fileName; stylesheet.onload = function() { - if (typeof callback === 'function') {callback();} + if (typeof callback === "function") {callback();} }; document.getElementsByTagName("head")[0].appendChild(stylesheet); @@ -220,12 +214,12 @@ var Loader = (function() { loadFile: function(fileName, module, callback) { if (loadedFiles.indexOf(fileName.toLowerCase()) !== -1) { - Log.log('File already loaded: ' + fileName); + Log.log("File already loaded: " + fileName); callback(); return; } - if (fileName.indexOf('http://') === 0 || fileName.indexOf('https://') === 0 || fileName.indexOf('/') !== -1) { + if (fileName.indexOf("http://") === 0 || fileName.indexOf("https://") === 0 || fileName.indexOf("/") !== -1) { // This is an absolute or relative path. // Load it and then return. loadedFiles.push(fileName.toLowerCase()); @@ -237,7 +231,7 @@ var Loader = (function() { // This file is available in the vendor folder. // Load it from this vendor folder. loadedFiles.push(fileName.toLowerCase()); - loadFile(config.paths.vendor+'/'+vendor[fileName], callback); + loadFile(config.paths.vendor + "/" + vendor[fileName], callback); return; } diff --git a/js/logger.js b/js/logger.js index 1389c5f9..994fe534 100644 --- a/js/logger.js +++ b/js/logger.js @@ -8,11 +8,9 @@ * MIT Licensed. */ - // This logger is very simple, but needs to be extended. // This system can eventually be used to push the log messages to an external target. - var Log = (function() { return { info: function(message) { diff --git a/js/main.js b/js/main.js index a45c56b1..ed89826e 100644 --- a/js/main.js +++ b/js/main.js @@ -22,7 +22,7 @@ var MM = (function() { for (var m in modules) { var module = modules[m]; - if (typeof module.data.position === 'string') { + if (typeof module.data.position === "string") { var wrapper = selectWrapper(module.data.position); @@ -30,14 +30,14 @@ var MM = (function() { dom.id = module.identifier; dom.className = module.name; - if (typeof module.data.classes === 'string') { - dom.className = 'module '+ dom.className + ' ' + module.data.classes; + if (typeof module.data.classes === "string") { + dom.className = "module " + dom.className + " " + module.data.classes; } dom.opacity = 0; wrapper.appendChild(dom); - if (typeof module.data.header !== 'undefined' && module.data.header !== '') { + if (typeof module.data.header !== "undefined" && module.data.header !== "") { var moduleHeader = document.createElement("header"); moduleHeader.innerHTML = module.data.header; dom.appendChild(moduleHeader); @@ -51,7 +51,7 @@ var MM = (function() { } } - sendNotification('DOM_OBJECTS_CREATED'); + sendNotification("DOM_OBJECTS_CREATED"); }; /* selectWrapper(position) @@ -60,10 +60,10 @@ var MM = (function() { * argument position string - The name of the position. */ var selectWrapper = function(position) { - var classes = position.replace('_',' '); + var classes = position.replace("_"," "); var parentWrapper = document.getElementsByClassName(classes); if (parentWrapper.length > 0) { - var wrapper = parentWrapper[0].getElementsByClassName('container'); + var wrapper = parentWrapper[0].getElementsByClassName("container"); if (wrapper.length > 0) { return wrapper[0]; } @@ -117,7 +117,6 @@ var MM = (function() { } }; - /* moduleNeedsUpdate(module, newContent) * Check if the content has changed. * @@ -128,9 +127,9 @@ var MM = (function() { */ var moduleNeedsUpdate = function(module, newContent) { var moduleWrapper = document.getElementById(module.identifier); - var contentWrapper = moduleWrapper.getElementsByClassName('module-content')[0]; + var contentWrapper = moduleWrapper.getElementsByClassName("module-content")[0]; - var tempWrapper = document.createElement('div'); + var tempWrapper = document.createElement("div"); tempWrapper.appendChild(newContent); return tempWrapper.innerHTML !== contentWrapper.innerHTML; @@ -144,7 +143,7 @@ var MM = (function() { */ var updateModuleContent = function(module, content) { var moduleWrapper = document.getElementById(module.identifier); - var contentWrapper = moduleWrapper.getElementsByClassName('module-content')[0]; + var contentWrapper = moduleWrapper.getElementsByClassName("module-content")[0]; contentWrapper.innerHTML = null; contentWrapper.appendChild(content); @@ -163,14 +162,15 @@ var MM = (function() { moduleWrapper.style.transition = "opacity " + speed / 1000 + "s"; moduleWrapper.style.opacity = 0; - setTimeout(function() { + clearTimeout(module.showHideTimer); + module.showHideTimer = setTimeout(function() { // To not take up any space, we just make the position absolute. // since it's fade out anyway, we can see it lay above or // below other modules. This works way better than adjusting // the .display property. - moduleWrapper.style.position = 'absolute'; + moduleWrapper.style.position = "absolute"; - if (typeof callback === 'function') { callback(); } + if (typeof callback === "function") { callback(); } }, speed); } }; @@ -187,11 +187,12 @@ var MM = (function() { if (moduleWrapper !== null) { moduleWrapper.style.transition = "opacity " + speed / 1000 + "s"; // Restore the postition. See hideModule() for more info. - moduleWrapper.style.position = 'static'; + moduleWrapper.style.position = "static"; moduleWrapper.style.opacity = 1; - setTimeout(function() { - if (typeof callback === 'function') { callback(); } + clearTimeout(module.showHideTimer); + module.showHideTimer = setTimeout(function() { + if (typeof callback === "function") { callback(); } }, speed); } @@ -201,9 +202,9 @@ var MM = (function() { * Loads the core config and combines it with de system defaults. */ var loadConfig = function() { - if (typeof config === 'undefined') { + if (typeof config === "undefined") { config = defaults; - Log.error('Config file is missing! Please create a config file.'); + Log.error("Config file is missing! Please create a config file."); return; } @@ -228,13 +229,13 @@ var MM = (function() { var newModules = []; var searchClasses = className; - if (typeof className === 'string') { - searchClasses = className.split(' '); + if (typeof className === "string") { + searchClasses = className.split(" "); } for (var m in modules) { var module = modules[m]; - var classes = module.data.classes.toLowerCase().split(' '); + var classes = module.data.classes.toLowerCase().split(" "); for (var c in searchClasses) { var searchClass = searchClasses[c]; @@ -259,13 +260,13 @@ var MM = (function() { var newModules = []; var searchClasses = className; - if (typeof className === 'string') { - searchClasses = className.split(' '); + if (typeof className === "string") { + searchClasses = className.split(" "); } for (var m in modules) { var module = modules[m]; - var classes = module.data.classes.toLowerCase().split(' '); + var classes = module.data.classes.toLowerCase().split(" "); var foundClass = false; for (var c in searchClasses) { var searchClass = searchClasses[c]; @@ -316,13 +317,12 @@ var MM = (function() { } }; - if (typeof modules.withClass === 'undefined') { Object.defineProperty(modules, 'withClass', {value: withClass, enumerable: false}); } - if (typeof modules.exceptWithClass === 'undefined') { Object.defineProperty(modules, 'exceptWithClass', {value: exceptWithClass, enumerable: false}); } - if (typeof modules.exceptModule === 'undefined') { Object.defineProperty(modules, 'exceptModule', {value: exceptModule, enumerable: false}); } - if (typeof modules.enumerate === 'undefined') { Object.defineProperty(modules, 'enumerate', {value: enumerate, enumerable: false}); } + if (typeof modules.withClass === "undefined") { Object.defineProperty(modules, "withClass", {value: withClass, enumerable: false}); } + if (typeof modules.exceptWithClass === "undefined") { Object.defineProperty(modules, "exceptWithClass", {value: exceptWithClass, enumerable: false}); } + if (typeof modules.exceptModule === "undefined") { Object.defineProperty(modules, "exceptModule", {value: exceptModule, enumerable: false}); } + if (typeof modules.enumerate === "undefined") { Object.defineProperty(modules, "enumerate", {value: enumerate, enumerable: false}); } }; - return { /* Public Methods */ @@ -330,7 +330,7 @@ var MM = (function() { * Main init method. */ init: function() { - Log.info('Initializing MagicMirror.'); + Log.info("Initializing MagicMirror."); loadConfig(); Loader.loadModules(); }, @@ -347,8 +347,8 @@ var MM = (function() { modules[module.data.index] = module; } - Log.info('All modules started!'); - sendNotification('ALL_MODULES_STARTED'); + Log.info("All modules started!"); + sendNotification("ALL_MODULES_STARTED"); createDomObjects(); }, @@ -362,17 +362,17 @@ var MM = (function() { */ sendNotification: function(notification, payload, sender) { if (arguments.length < 3) { - Log.error('sendNotification: Missing arguments.'); + Log.error("sendNotification: Missing arguments."); return; } - if (typeof notification !== 'string') { - Log.error('sendNotification: Notification should be a string.'); + if (typeof notification !== "string") { + Log.error("sendNotification: Notification should be a string."); return; } if (!(sender instanceof Module)) { - Log.error('sendNotification: Sender should be a module.'); + Log.error("sendNotification: Sender should be a module."); return; } @@ -388,7 +388,7 @@ var MM = (function() { */ updateDom: function(module, speed) { if (!(module instanceof Module)) { - Log.error('updateDom: Sender should be a module.'); + Log.error("updateDom: Sender should be a module."); return; } diff --git a/js/module.js b/js/module.js index 2c2c18d2..9be652bf 100644 --- a/js/module.js +++ b/js/module.js @@ -17,6 +17,9 @@ var Module = Class.extend({ // Module config defaults. defaults: {}, + // Timer reference used for showHide animation callbacks. + showHideTimer: null, + /* init() * Is called when the module is instantiated. */ @@ -28,7 +31,7 @@ var Module = Class.extend({ * Is called when the module is started. */ start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); }, /* getScripts() @@ -82,9 +85,9 @@ var Module = Class.extend({ */ notificationReceived: function(notification, payload, sender) { if (sender) { - Log.log(this.name + ' received a module notification: ' + notification + ' from sender: ' + sender.name); + Log.log(this.name + " received a module notification: " + notification + " from sender: " + sender.name); } else { - Log.log(this.name + ' received a system notification: ' + notification); + Log.log(this.name + " received a system notification: " + notification); } }, @@ -95,10 +98,9 @@ var Module = Class.extend({ * argument payload mixed - The payload of the notification. */ socketNotificationReceived: function(notification, payload) { - Log.log(this.name + ' received a socket notification: ' + notification + ' - Payload: ' + payload); + Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload); }, - /********************************************* * The methods below don't need subclassing. * *********************************************/ @@ -131,7 +133,7 @@ var Module = Class.extend({ * It also registers the notification callback. */ socket: function() { - if (typeof this._socket === 'undefined') { + if (typeof this._socket === "undefined") { this._socket = this._socket = new MMSocket(this.name); } @@ -151,7 +153,7 @@ var Module = Class.extend({ * return string - File path. */ file: function(file) { - return this.data.path + '/' + file; + return this.data.path + "/" + file; }, /* loadStyles() @@ -258,16 +260,16 @@ Module.create = function(name) { //Define the clone method for later use. function cloneObject(obj) { - if (obj === null || typeof obj !== 'object') { - return obj; - } + if (obj === null || typeof obj !== "object") { + return obj; + } - var temp = obj.constructor(); // give temp the original obj's constructor - for (var key in obj) { - temp[key] = cloneObject(obj[key]); - } + var temp = obj.constructor(); // give temp the original obj's constructor + for (var key in obj) { + temp[key] = cloneObject(obj[key]); + } - return temp; + return temp; } var moduleDefinition = Module.definitions[name]; @@ -281,6 +283,6 @@ Module.create = function(name) { }; Module.register = function(name, moduleDefinition) { - Log.log('Module registered: ' + name); + Log.log("Module registered: " + name); Module.definitions[name] = moduleDefinition; }; diff --git a/js/server.js b/js/server.js index aac4d839..b5eab036 100644 --- a/js/server.js +++ b/js/server.js @@ -5,29 +5,29 @@ * MIT Licensed. */ -var express = require('express'); -var app = require('express')(); -var server = require('http').Server(app); -var io = require('socket.io')(server); -var path = require('path'); +var express = require("express"); +var app = require("express")(); +var server = require("http").Server(app); +var io = require("socket.io")(server); +var path = require("path"); var Server = function(config, callback) { console.log("Starting server op port " + config.port + " ... "); server.listen(config.port); - app.use('/js', express.static(__dirname)); - app.use('/config', express.static(path.resolve(__dirname + '/../config'))); - app.use('/css', express.static(path.resolve(__dirname + '/../css'))); - app.use('/fonts', express.static(path.resolve(__dirname + '/../fonts'))); - app.use('/modules', express.static(path.resolve(__dirname + '/../modules'))); - app.use('/vendor', express.static(path.resolve(__dirname + '/../vendor'))); + app.use("/js", express.static(__dirname)); + app.use("/config", express.static(path.resolve(__dirname + "/../config"))); + app.use("/css", express.static(path.resolve(__dirname + "/../css"))); + app.use("/fonts", express.static(path.resolve(__dirname + "/../fonts"))); + app.use("/modules", express.static(path.resolve(__dirname + "/../modules"))); + app.use("/vendor", express.static(path.resolve(__dirname + "/../vendor"))); - app.get('/', function (req, res) { - res.sendFile(path.resolve(__dirname + '/../index.html')); + app.get("/", function(req, res) { + res.sendFile(path.resolve(__dirname + "/../index.html")); }); - if (typeof callback === 'function') { - callback(io); + if (typeof callback === "function") { + callback(app, io); } }; diff --git a/js/socket.js b/js/socket.js index 8f3abaf1..c62c24da 100644 --- a/js/socket.js +++ b/js/socket.js @@ -11,22 +11,21 @@ var MMSocket = function(moduleName) { var self = this; - if (typeof moduleName !== 'string') { - throw new Error('Please set the module name for the MMSocket.'); + if (typeof moduleName !== "string") { + throw new Error("Please set the module name for the MMSocket."); } self.moduleName = moduleName; - - self.socket = io('http://localhost:8080'); - self.socket.on('notification', function (data) { + self.socket = io("http://localhost:8080"); + self.socket.on("notification", function(data) { MM.sendNotification(data.notification, data.payload, Socket); }); return { sendMessage: function(notification, payload, sender) { - Log.log('Send socket message: ' + notification); - self.socket.emit('notification', { + Log.log("Send socket message: " + notification); + self.socket.emit("notification", { notification: notification, sender: sender, payload: payload diff --git a/js/socketclient.js b/js/socketclient.js index c834679a..f7d1843a 100644 --- a/js/socketclient.js +++ b/js/socketclient.js @@ -1,40 +1,39 @@ var MMSocket = function(moduleName) { var self = this; - if (typeof moduleName !== 'string') { - throw new Error('Please set the module name for the MMSocket.'); + if (typeof moduleName !== "string") { + throw new Error("Please set the module name for the MMSocket."); } self.moduleName = moduleName; // Private Methods - socket = io.connect('/' + self.moduleName); + socket = io.connect("/" + self.moduleName); var notificationCallback = function() {}; var onevent = socket.onevent; - socket.onevent = function (packet) { + socket.onevent = function(packet) { var args = packet.data || []; - onevent.call (this, packet); // original call + onevent.call(this, packet); // original call packet.data = ["*"].concat(args); onevent.call(this, packet); // additional call to catch-all }; // register catch all. - socket.on('*', function (notification, payload) { - if (notification !== '*') { + socket.on("*", function(notification, payload) { + if (notification !== "*") { //console.log('Received notification: ' + notification +', payload: ' + payload); notificationCallback(notification, payload); } }); - // Public Methods this.setNotificationCallback = function(callback) { notificationCallback = callback; }; this.sendNotification = function(notification, payload) { - if (typeof payload === 'undefined') { + if (typeof payload === "undefined") { payload = {}; } socket.emit(notification, payload); diff --git a/modules/README.md b/modules/README.md new file mode 100644 index 00000000..965051b0 --- /dev/null +++ b/modules/README.md @@ -0,0 +1,461 @@ +# MagicMirror² Module Development Documentation + +This document describes the way to develop your own MagicMirror² modules. + +## Module structure + +All modules are loaded in de `modules` folder. The default modules are grouped together in the `modules/default` folder. Your module should be placed in a subfolder of `modules`. Note that any file or folder your create in the `modules` folder will be ignored by git, allowing you to upgrade the MagicMirror² without the loss of your files. + +A module can be placed in one single folder. Or multiple modules can be grouped in a subfoler. Note that name of the module must be unique. Even when a module with a similar name is placed in a different folder, they can't be loaded at the same time. + +### Files +- **modulename/modulename.js** - This is your core module script. +- **modulename/node_helper.js** - This is an optional helper that whill be loaded by the node script. The node helper and module script can communicate with each other using an intergrated socket system. +- **modulename/public** - Any files in this folder can be accesed via the browser on `/modulename/filename.ext`. +- **modulename/anyfileorfolder** Any other file or folder in the module folder can be used by the core module script. For example: *modulename/css/modulename.css* would be a good path for your additional module styles. + +## Core module file: modulename.js +This is the script in which the module will be defined. This script is required in order for the module to be used. In it's most simple form, the core module file must contain: +````javascript +Module.register("modulename",{}); +```` +Of course, the above module would not do anything fancy, so it's good to look at one of the simplest modules: **helloworld**: + +````javascript +//helloworld.js: + +Module.register("helloworld",{ + // Default module config. + defaults: { + text: "Hello World!" + }, + + // Override dom generator. + getDom: function() { + var wrapper = document.createElement("div"); + wrapper.innerHTML = this.config.text; + return wrapper; + } +}); +```` + +As you can see, the `Module.register()` method takes two arguments: the name of the module and an object with the module properties. + +### Available module instance properties +After the module is initialized, the module instance has a few available module properties: + +####`this.name` +**String** + +The name of the module. + +####`this.identifier` +**String** + +This is a unique identifier for the module instance. + +####`this.hidden` +**Boolean** + +This represents if the module is currently hidden (faded away). + +####`this.config` +**Boolean** + +The configuration of the module instance as set in the user's config.js file. This config will also contain the module's defaults if these properties are not over written by the user config. + +####`this.data` +**Object** + +The data object contains additional metadata about the module instance: +- `data.classes` - The classes which are added to the module dom wrapper. +- `data.file` - The filename of the core module file. +- `data.path` - The path of the module folder. +- `data.header` - The header added to the module. +- `data.position` - The position in which the instance will be shown. + + +####`defaults: {}` +Any properties defined in the defaults object, will be merged with the module config as defined in the user's config.js file. This is the best place to set your modules's configuration defaults. Any of the module configuration properties can be accessed using `this.config.propertyName`, but more about that later. + +### Subclassable module methods + +####`init()` +This method is called when a module gets instantiated. In most cases you do not need to subclass this method. + +####`start()` +This method is called when all modules are loaded an the system is ready to boot up. Keep in mind that the dom object for the module is not yet created. The start method is a perfect place to define any additional module properties: + +**Example:** +````javascript +start: function() { + this.mySpecialProperty = "So much wow!"; + Log.log(this.name + ' is started!'); +} +```` + +####`getScripts()` +**Should return: Array** + +The getScripts method is called to request any additional scripts that need to be loaded. This method should therefor return an array with strings. If you want to return a full path to a file in the module folder, use the `this.file('filename.js')` method. In all cases the loader will only load a file once. It even checks if the file is available in the default vendor folder. + +**Example:** +````javascript +getScripts: function() { + return [ + 'script.js', // will try to load it from the vendor folder, otherwise it will load is from the module folder. + 'moment.js', // this file is available in the vendor folder, so it doesn't need to be avialable in the module folder. + this.file('anotherfile.js'), // this file will be loaded straight from the module folder. + 'https://code.jquery.com/jquery-2.2.3.min.js', // this file will be loaded from the jquery servers. + ] +} + +```` +**Note:** If a file can not be loaded, the boot up of the mirror will stall. Therefore it's advised not to use any external urls. + + +####`getStyles()` +**Should return: Array** + +The getStyles method is called to request any additional scripts that need to be loaded. This method should therefor return an array with strings. If you want to return a full path to a file in the module folder, use the `this.file('filename.css')` method. In all cases the loader will only load a file once. It even checks if the file is available in the default vendor folder. + +**Example:** +````javascript +getStyles: function() { + return [ + 'script.css', // will try to load it from the vendor folder, otherwise it will load is from the module folder. + 'font-awesome.css', // this file is available in the vendor folder, so it doesn't need to be avialable in the module folder. + this.file('anotherfile.css'), // this file will be loaded straight from the module folder. + 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css', // this file will be loaded from the bootstrapcdn servers. + ] +} + +```` +**Note:** If a file can not be loaded, the boot up of the mirror will stall. Therefore it's advised not to use any external urls. + +####`getDom()` +**Should return:** Dom Object + +Whenever the MagicMirror needs to update the information on screen (because it starts, or because your module asked a refresh using `this.updateDom()`), the system calls the getDom method. This method should therefor return a dom object. + +**Example:** +````javascript +getDom: function() { + var wrapper = document.createElement("div"); + wrapper.innerHTML = 'Hello world!'; + return wrapper; +} + +```` + +####`notificationReceived(notification, payload, sender)` + +That MagicMirror core has the ability to send notifications to modules. Or even better: the modules have the possibility to send notifications to other modules. When this module is called, it has 3 arguments: + +- `notification` - String - The notification identifier. +- `payload` - AnyType - The payload of a notification. +- `sender` - Module - The sender of the notification. If this argument is `undefined`, the sender of the notififiction is the core system. + +**Example:** +````javascript +notificationReceived: function(notification, payload, sender) { + if (sender) { + Log.log(this.name + " received a module notification: " + notification + " from sender: " + sender.name); + } else { + Log.log(this.name + " received a system notification: " + notification); + } +} +```` + +**Note:** the system sends two notifiations when starting up. These notifications could come in handy! + + +- `ALL_MODULES_STARTED` - All modules are started. You can now send notifications to other modules. +- `DOM_OBJECTS_CREATED` - All dom objects are created. The system is now ready to perform visual changes. + + +####`socketNotificationReceived: function(notification, payload)` +When using a node_helper, the node helper can send your module notifications. When this module is called, it has 2 arguments: + +- `notification` - String - The notification identifier. +- `payload` - AnyType - The payload of a notification. + +**Note 1:** When a node helper send a notification, all modules of that module type receive the same notifications.
+**Note 2:** The socket connection is established as soon as the module sends it's first message using [sendSocketNotification](thissendsocketnotificationnotification-payload). + +**Example:** +````javascript +socketNotificationReceived: function(notification, payload) { + Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload); +}, +```` + +### Module instance methods + +Each module instance has some handy methods which can be helpfull building your module. + + +####`this.file(filename)` +***filename* String** - The name of the file you want to create the path for.
+**Returns String** + +If you want to create a path to a file in your module folder, use the `file()` method. It returns the path to the filename given as the attribute. Is method comes in handy when configuring the [getScripts](#getscripts) and [getStyles](#getstyles) methods. + +####`this.updateDom(speed)` +***speed* Number** - Optional. Animation speed in milliseconds.
+ +Whenever your module need to be updated, call the `updateDom(speed)` method. It requests the MagicMirror core to update it's dom object. If you define the speed, the content update will be animated, but only if the content will realy change. + +As an example: the clock modules calls this method every second: + +````javascript +... +start: function() { + var self = this; + setInterval(function() { + self.updateDom(); // no speed defined, so it updates instantly. + }, 1000); //perform every 1000 milliseconds. +}, +... +```` + +####`this.sendNotification(notification, payload)` +***notification* String** - The notification identifier.
+***payload* AnyType** - Optional. A notification payload.
+ +If you want to send a notification to all other modules, use the `sendNotification(notification, payload)`. All other modules will receive the message via the [notificationReceived](#notificationreceivednotification-payload-sender) method. In that case, the sender is automaticly set to the instance calling the sendNotification method. + +**Example:** +````javascript +this.sendNotification('MYMODULE_READY_FOR_ACTION', {foo:bar}); +```` + +####`this.sendSocketNotification(notification, payload)` +***notification* String** - The notification identifier.
+***payload* AnyType** - Optional. A notification payload.
+ +If you want to send a notification to the node_helper, use the `sendSocketNotification(notification, payload)`. Only the node_helper of this module will recieve the socket notification. + +**Example:** +````javascript +this.sendSocketNotification('SET_CONFIG', this.config); +```` + +####`this.hide(speed, callback)` +***speed* Number** - Optional, The speed of the hide animation in milliseconds. +***callback* Function** - Optional, The callback after the hide animation is finished. + +To hide a module, you can call the `hide(speed, callback)` method. You can call the hide method on the module instance itselve using `this.hide()`, but of course you can also hide an other module using `anOtherModule.hide()`. + +**Note 1:** If the hide animation is canceled, for instance because the show method is called before the hide animation was finished, the callback will not be called.
+**Note 2:** If the hide animation is hijacked (an other method calls hide on the same module), the callback will not be called.
+**Note 3:** If the dom is not yet created, the hide method won't work. Wait for the `DOM_OBJECTS_CREATED` [notification](#notificationreceivednotification-payload-sender). + +####`this.show(speed, callback)` +***speed* Number** - Optional, The speed of the show animation in milliseconds. +***callback* Function** - Optional, The callback after the show animation is finished. + +To show a module, you can call the `show(speed, callback)` method. You can call the show method on the module instance itselve using `this.show()`, but of course you can also show an other module using `anOtherModule.show()`. + +**Note 1:** If the show animation is canceled, for instance because the hide method is called before the show animation was finished, the callback will not be called.
+**Note 2:** If the show animation is hijacked (an other method calls show on the same module), the callback will not be called.
+**Note 3:** If the dom is not yet created, the show method won't work. Wait for the `DOM_OBJECTS_CREATED` [notification](#notificationreceivednotification-payload-sender). + + +## The Node Helper: node_helper.js + +The node helper is a Node.js script that is able to do some backend task to support your module. For every module type, only one node helper instance will be created. For example: if your MagicMirror uses two calendar modules, there will be only one calendar node helper instantiated. + +**Note:** Because there is only one node helper per module type, there is no default config available within your module. It's your task to send the desired config from your module to your node helper. + +In it's most simple form, the node_helper.js file must contain: + +````javascript +var NodeHelper = require("node_helper"); +module.exports = NodeHelper.create({}); +```` + +Of course, the above helper would not do anything usefull. So with the information above, you should be able to make it a bit more sophisticated. + +### Available module instance properties + +####`this.name` +**String** + +The name of the module + +####`this.path` +**String** + +The path of the module + +####`this.expressApp` +**Express App Instance** + +This is a link to the express instance. It will allow you to define extra routes. + +**Example:** +````javascript +start: function() { + this.expressApp.get('/foobar', function (req, res) { + res.send('GET request to /foobar'); + }); +} +```` + +**Note: ** By default, a public path to your module's public folder will be created: +````javascript +this.expressApp.use("/" + this.name, express.static(this.path + "/public")); +```` + +####`this.io` +**Socket IO Instance** + +This is a link to the IO instance. It will allow you to do some Socket.IO magic. In most cases you won't need this, since the Node Helper has a few convenience methods to make this simple. + +### Subclassable module methods + +####`init()` +This method is called when a node helper gets instantiated. In most cases you do not need to subclass this method. + +####`start()` +This method is called when all node helper are loaded an the system is ready to boot up. The start method is a perfect place to define any additional module properties: + +**Example:** +````javascript +start: function() { + this.mySpecialProperty = "So much wow!"; + Log.log(this.name + ' is started!'); +} +```` + +####`socketNotificationReceived: function(notification, payload)` +With this method, your node helper can receive notifications form your modules. When this method is called, it has 2 arguments: + +- `notification` - String - The notification identifier. +- `payload` - AnyType - The payload of a notification. + +**Note:** The socket connection is established as soon as the module sends it's first message using [sendSocketNotification](thissendsocketnotificationnotification-payload). + +**Example:** +````javascript +socketNotificationReceived: function(notification, payload) { + Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload); +}, +```` + +### Module instance methods + +Each node helper has some handy methods which can be helpfull building your module. + +####`this.sendSocketNotification(notification, payload)` +***notification* String** - The notification identifier.
+***payload* AnyType** - Optional. A notification payload.
+ +If you want to send a notification to all your modules, use the `sendSocketNotification(notification, payload)`. Only the module of your module type will recieve the socket notification. + +**Note:** Since all instances of you module will receive the notifications, it's your task to make sure the right module responds to your messages. + +**Example:** +````javascript +this.sendSocketNotification('SET_CONFIG', this.config); +```` + +## MagicMirror Helper Methods + +The core Magic Mirror object: `MM` has some handy method that will help you in controlling your and other modules. Most of the `MM` methods are available via convenience methods on the Module instance. + +### Module selection +The only additional method available for your module, is the feature to retrieve references to other modules. This can be used to hide and show other modules. + +####`MM.getModules()` +**Returns Array** - An array with module instances.
+ +To make a selection of all currently loaded module instances, run the `MM.getModules()` method. It will return an array with all currently loaded module instances. The returned array has a lot of filtering methods. See below for more info. + +**Note:** This method returns an empty array if not all modules are started yet. Wait for the `ALL_MODULES_STARTED` [notification](#notificationreceivednotification-payload-sender). + + +#####`.withClass(classnames)` +***classnames* String or Array** - The class names on which you want to filer. +**Returns Array** - An array with module instances.
+ +If you want to make a selection based on one ore more class names, use the withClass method on a result of the `MM.getModules()` method. The argument of the `withClass(classname)` method can be an array, or space separated string. + +**Examples:** +````javascript +var modules = MM.getModules().withClass('classname'); +var modules = MM.getModules().withClass('classname1 classname2'); +var modules = MM.getModules().withClass(['classname1','classname2']); +```` + +#####`.exceptWithClass(classnames)` +***classnames* String or Array** - The class names of the modules you want to remove from the results. +**Returns Array** - An array with module instances.
+ +If you to remove some modules from a selection based on a classname, use the exceptWithClass method on a result of the `MM.getModules()` method. The argument of the `exceptWithClass(classname)` method can be an array, or space separated string. + +**Examples:** +````javascript +var modules = MM.getModules().exceptWithClass('classname'); +var modules = MM.getModules().exceptWithClass('classname1 classname2'); +var modules = MM.getModules().exceptWithClass(['classname1','classname2']); +```` + +#####`.exceptModule(module)` +***module* Module Object** - The reference to a module you want to remove from the results. +**Returns Array** - An array with module instances.
+ +If you to remove a specific module instance from a selection based on a classname, use the exceptWithClass method on a result of the `MM.getModules()` method. This can be helpfull if you want to select all module instances except the instance of your module. + +**Examples:** +````javascript +var modules = MM.getModules().exceptModule(this); +```` + +Of course, you can combine all of the above filters: + +**Example:** +````javascript +var modules = MM.getModules().withClass('classname1').exceptwithClass('classname2').exceptModule(aModule); +```` + +#####`.enumerate(callback)` +***callback* Function(module)** - The callback run on every instance. + +If you want to perform an action on all selected modules, you can use the `enumerate` function: + +````javascript +MM.getModules().enumerate(function(module) { + Log.log(module.name); +}); +```` + +**Example:** +To hide all modules except the your module instance, you could write something like: +````javascript +Module.register("modulename",{ + //... + notificationReceived: function(notification, payload, sender) { + if (notification === 'DOM_OBJECTS_CREATED') { + MM.getModules().exceptModule(this).enumerate(function(module) { + module.hide(1000, function() { + //Module hidden. + }); + }); + } + }, + //... +}); +```` + +## MagicMirror Logger + +The Magic Mirror contains a convenience wrapper for logging. Currently, this logger is a simple proxy to the original `console.log` methods. But it might get additional features in the future. The Loggers is currently only available in the core module file (not in the node_helper). + +**Examples:** +````javascript +Log.info('error'); +Log.log('log'); +Log.error('info'); +``` \ No newline at end of file diff --git a/modules/default/alert/alert.js b/modules/default/alert/alert.js index 7ba47a86..1a8c55dd 100644 --- a/modules/default/alert/alert.js +++ b/modules/default/alert/alert.js @@ -7,114 +7,111 @@ * MIT Licensed. */ -Module.register('alert',{ +Module.register("alert",{ defaults: { // scale|slide|genie|jelly|flip|bouncyflip|exploader effect: "slide", // scale|slide|genie|jelly|flip|bouncyflip|exploader - alert_effect:"jelly", + alert_effect: "jelly", //time a notification is displayed in seconds display_time: 3500, //Position position: "center", //shown at startup - welcome_message: "Welcome, start was successfull!" + welcome_message: "Welcome, start was successful!" }, getScripts: function() { - return ["classie.js", "modernizr.custom.js", 'notificationFx.js']; + return ["classie.js", "modernizr.custom.js", "notificationFx.js"]; }, getStyles: function() { - return ['ns-default.css']; + return ["ns-default.css"]; }, - show_notification: function (message) { - if (this.config.effect == "slide"){this.config.effect=this.config.effect + "-" + this.config.position} - message = "" + message.title + "
" + message.message + "" + show_notification: function(message) { + if (this.config.effect == "slide") {this.config.effect = this.config.effect + "-" + this.config.position;} + message = "" + message.title + "
" + message.message + ""; new NotificationFx({ - message : message, - layout : "growl", - effect : this.config.effect, + message: message, + layout: "growl", + effect: this.config.effect, ttl: this.config.display_time }).show(); }, - show_alert: function (params, sender) { - var self = this + show_alert: function(params, sender) { + var self = this; //Set standard params if not provided by module - if (typeof params.timer === 'undefined') { params.timer = null; } - if (typeof params.imageHeight === 'undefined') { params.imageHeight = "80px"; } - if (typeof params.imageUrl === 'undefined') { + if (typeof params.timer === "undefined") { params.timer = null; } + if (typeof params.imageHeight === "undefined") { params.imageHeight = "80px"; } + if (typeof params.imageUrl === "undefined") { params.imageUrl = null; - image = "" - } - else { - image = "
" + image = ""; + } else { + image = "
"; } //Create overlay var overlay = document.createElement("div"); - overlay.id = "overlay" - overlay.innerHTML += '
'; + overlay.id = "overlay"; + overlay.innerHTML += "
"; document.body.insertBefore(overlay, document.body.firstChild); - + //If module already has an open alert close it - if (this.alerts[sender.name]){ - this.hide_alert(sender) + if (this.alerts[sender.name]) { + this.hide_alert(sender); } - - message = "" + params.title + "
" + params.message + "" + + message = "" + params.title + "
" + params.message + ""; //Store alert in this.alerts this.alerts[sender.name] = new NotificationFx({ - message : image + message, - effect : this.config.alert_effect, + message: image + message, + effect: this.config.alert_effect, ttl: params.timer, al_no: "ns-alert" }); //Show alert - this.alerts[sender.name].show() + this.alerts[sender.name].show(); //Add timer to dismiss alert and overlay if (params.timer) { - setTimeout( function() { - self.hide_alert(sender) - }, params.timer ); + setTimeout(function() { + self.hide_alert(sender); + }, params.timer); } - + }, - hide_alert: function (sender) { + hide_alert: function(sender) { //Dismiss alert and remove from this.alerts - this.alerts[sender.name].dismiss() - this.alerts[sender.name] = null + this.alerts[sender.name].dismiss(); + this.alerts[sender.name] = null; //Remove overlay var overlay = document.getElementById("overlay"); overlay.parentNode.removeChild(overlay); }, - setPosition: function (pos) { + setPosition: function(pos) { //Add css to body depending on the set position for notifications - var sheet = document.createElement('style') - if (pos == "center"){sheet.innerHTML = ".ns-box {margin-left: auto; margin-right: auto;text-align: center;}";} - if (pos == "right"){sheet.innerHTML = ".ns-box {margin-left: auto;text-align: right;}";} - if (pos == "left"){sheet.innerHTML = ".ns-box {margin-right: auto;text-align: left;}";} + var sheet = document.createElement("style"); + if (pos == "center") {sheet.innerHTML = ".ns-box {margin-left: auto; margin-right: auto;text-align: center;}";} + if (pos == "right") {sheet.innerHTML = ".ns-box {margin-left: auto;text-align: right;}";} + if (pos == "left") {sheet.innerHTML = ".ns-box {margin-right: auto;text-align: left;}";} document.body.appendChild(sheet); - + }, notificationReceived: function(notification, payload, sender) { - if (notification === 'SHOW_ALERT') { - if (typeof payload.type === 'undefined') { payload.type = "alert"; } - if (payload.type == "alert"){ - this.show_alert(payload, sender) + if (notification === "SHOW_ALERT") { + if (typeof payload.type === "undefined") { payload.type = "alert"; } + if (payload.type == "alert") { + this.show_alert(payload, sender); + } else if (payload.type = "notification") { + this.show_notification(payload); } - else if (payload.type = "notification"){ - this.show_notification(payload) - } - } - else if (notification === 'HIDE_ALERT') { - this.hide_alert(sender) + } else if (notification === "HIDE_ALERT") { + this.hide_alert(sender); } }, start: function() { - this.alerts = {} - this.setPosition(this.config.position) - if (this.config.welcome_message){ - this.show_notification({title: "MagicMirror Notification", message: this.config.welcome_message}) + this.alerts = {}; + this.setPosition(this.config.position); + if (this.config.welcome_message) { + this.show_notification({title: "MagicMirror Notification", message: this.config.welcome_message}); } - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); } -}); \ No newline at end of file +}); diff --git a/modules/default/alert/classie.js b/modules/default/alert/classie.js index a9675548..4a096f1e 100755 --- a/modules/default/alert/classie.js +++ b/modules/default/alert/classie.js @@ -1,80 +1,79 @@ /*! * classie - class helper functions * from bonzo https://github.com/ded/bonzo - * + * * classie.has( elem, 'my-class' ) -> true/false * classie.add( elem, 'my-new-class' ) * classie.remove( elem, 'my-unwanted-class' ) * classie.toggle( elem, 'my-class' ) */ - +// jscs:disable /*jshint browser: true, strict: true, undef: true */ /*global define: false */ -( function( window ) { +(function(window) { -'use strict'; +"use strict"; // class helper functions from bonzo https://github.com/ded/bonzo -function classReg( className ) { - return new RegExp("(^|\\s+)" + className + "(\\s+|$)"); +function classReg(className) { + return new RegExp("(^|\\s+)" + className + "(\\s+|$)"); } // classList support for class management // altho to be fair, the api sucks because it won't accept multiple classes at once var hasClass, addClass, removeClass; -if ( 'classList' in document.documentElement ) { - hasClass = function( elem, c ) { - return elem.classList.contains( c ); - }; - addClass = function( elem, c ) { - elem.classList.add( c ); - }; - removeClass = function( elem, c ) { - elem.classList.remove( c ); - }; -} -else { - hasClass = function( elem, c ) { - return classReg( c ).test( elem.className ); - }; - addClass = function( elem, c ) { - if ( !hasClass( elem, c ) ) { - elem.className = elem.className + ' ' + c; - } - }; - removeClass = function( elem, c ) { - elem.className = elem.className.replace( classReg( c ), ' ' ); - }; +if ("classList" in document.documentElement) { + hasClass = function(elem, c) { + return elem.classList.contains(c); + }; + addClass = function(elem, c) { + elem.classList.add(c); + }; + removeClass = function(elem, c) { + elem.classList.remove(c); + }; +} else { + hasClass = function(elem, c) { + return classReg(c).test(elem.className); + }; + addClass = function(elem, c) { + if (!hasClass(elem, c)) { + elem.className = elem.className + " " + c; + } + }; + removeClass = function(elem, c) { + elem.className = elem.className.replace(classReg(c), " "); + }; } -function toggleClass( elem, c ) { - var fn = hasClass( elem, c ) ? removeClass : addClass; - fn( elem, c ); +function toggleClass(elem, c) { + var fn = hasClass(elem, c) ? removeClass : addClass; + fn(elem, c); } var classie = { - // full names - hasClass: hasClass, - addClass: addClass, - removeClass: removeClass, - toggleClass: toggleClass, - // short names - has: hasClass, - add: addClass, - remove: removeClass, - toggle: toggleClass + // full names + hasClass: hasClass, + addClass: addClass, + removeClass: removeClass, + toggleClass: toggleClass, + // short names + has: hasClass, + add: addClass, + remove: removeClass, + toggle: toggleClass }; // transport -if ( typeof define === 'function' && define.amd ) { - // AMD - define( classie ); +if (typeof define === "function" && define.amd) { + // AMD + define(classie); } else { - // browser global - window.classie = classie; + // browser global + window.classie = classie; } -})( window ); +})(window); diff --git a/modules/default/alert/modernizr.custom.js b/modules/default/alert/modernizr.custom.js index adf2df7e..3d33a8be 100755 --- a/modules/default/alert/modernizr.custom.js +++ b/modules/default/alert/modernizr.custom.js @@ -1,4 +1,5 @@ /* Modernizr 2.8.3 (Custom Build) | MIT & BSD * Build: http://modernizr.com/download/#-cssanimations-shiv-cssclasses-prefixed-testprop-testallprops-domprefixes-load */ -;window.Modernizr=function(a,b,c){function x(a){j.cssText=a}function y(a,b){return x(prefixes.join(a+";")+(b||""))}function z(a,b){return typeof a===b}function A(a,b){return!!~(""+a).indexOf(b)}function B(a,b){for(var d in a){var e=a[d];if(!A(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function C(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:z(f,"function")?f.bind(d||b):f}return!1}function D(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+n.join(d+" ")+d).split(" ");return z(b,"string")||z(b,"undefined")?B(e,b):(e=(a+" "+o.join(d+" ")+d).split(" "),C(e,b,c))}var d="2.8.3",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m="Webkit Moz O ms",n=m.split(" "),o=m.toLowerCase().split(" "),p={},q={},r={},s=[],t=s.slice,u,v={}.hasOwnProperty,w;!z(v,"undefined")&&!z(v.call,"undefined")?w=function(a,b){return v.call(a,b)}:w=function(a,b){return b in a&&z(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=t.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(t.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(t.call(arguments)))};return e}),p.cssanimations=function(){return D("animationName")};for(var E in p)w(p,E)&&(u=E.toLowerCase(),e[u]=p[E](),s.push((e[u]?"":"no-")+u));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)w(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},x(""),i=k=null,function(a,b){function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));var g;return d.cache[a]?g=d.cache[a].cloneNode():f.test(a)?g=(d.cache[a]=d.createElem(a)).cloneNode():g=d.createElem(a),g.canHaveChildren&&!e.test(a)&&!g.tagUrn?d.frag.appendChild(g):g}function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a);var d=c.frag.cloneNode(),e=0,f=m(),g=f.length;for(;e",g="hidden"in a,k=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){g=!0,k=!0}})();var s={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:c,shivCSS:d.shivCSS!==!1,supportsUnknownElements:k,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:r,createElement:o,createDocumentFragment:p};a.html5=s,r(b)}(this,b),e._version=d,e._domPrefixes=o,e._cssomPrefixes=n,e.testProp=function(a){return B([a])},e.testAllProps=D,e.prefixed=function(a,b,c){return b?D(a,b,c):D(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+s.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f",d.insertBefore(c.lastChild,d.firstChild);}function m() {var a = s.elements;return typeof a == "string" ? a.split(" ") : a;}function n(a) {var b = j[a[h]];return b || (b = {},i++,a[h] = i,j[i] = b),b;}function o(a, c, d) {c || (c = b);if (k)return c.createElement(a);d || (d = n(c));var g;return d.cache[a] ? g = d.cache[a].cloneNode() : f.test(a) ? g = (d.cache[a] = d.createElem(a)).cloneNode() : g = d.createElem(a),g.canHaveChildren && !e.test(a) && !g.tagUrn ? d.frag.appendChild(g) : g;}function p(a, c) {a || (a = b);if (k)return a.createDocumentFragment();c = c || n(a);var d = c.frag.cloneNode(),e = 0,f = m(),g = f.length;for (; e < g; e++)d.createElement(f[e]);return d;}function q(a, b) {b.cache || (b.cache = {},b.createElem = a.createElement,b.createFrag = a.createDocumentFragment,b.frag = b.createFrag()),a.createElement = function(c) {return s.shivMethods ? o(c,a,b) : b.createElem(c);},a.createDocumentFragment = Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(" + m().join().replace(/[\w\-]+/g,function(a) {return b.createElem(a),b.frag.createElement(a),"c(\"" + a + "\")";}) + ");return n}")(s,b.frag);}function r(a) {a || (a = b);var c = n(a);return s.shivCSS && !g && !c.hasCSS && (c.hasCSS = !!l(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),k || q(a,c),a;}var c = "3.7.0",d = a.html5 || {},e = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,f = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g,h = "_html5shiv",i = 0,j = {},k;(function() {try {var a = b.createElement("a");a.innerHTML = "",g = "hidden"in a,k = a.childNodes.length == 1 || function() {b.createElement("a");var a = b.createDocumentFragment();return typeof a.cloneNode == "undefined" || typeof a.createDocumentFragment == "undefined" || typeof a.createElement == "undefined";}();}catch (c) {g = !0,k = !0;}})();var s = {elements: d.elements || "abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version: c,shivCSS: d.shivCSS !== !1,supportsUnknownElements: k,shivMethods: d.shivMethods !== !1,type: "default",shivDocument: r,createElement: o,createDocumentFragment: p};a.html5 = s,r(b);}(this,b),e._version = d,e._domPrefixes = o,e._cssomPrefixes = n,e.testProp = function(a) {return B([a]);},e.testAllProps = D,e.prefixed = function(a, b, c) {return b ? D(a,b,c) : D(a,"pfx");},g.className = g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2") + (f ? " js " + s.join(" ") : ""),e;}(this,this.document),function(a, b, c) {function d(a) {return "[object Function]" == o.call(a);}function e(a) {return "string" == typeof a;}function f() {}function g(a) {return !a || "loaded" == a || "complete" == a || "uninitialized" == a;}function h() {var a = p.shift();q = 1,a ? a.t ? m(function() {("c" == a.t ? B.injectCss : B.injectJs)(a.s,0,a.a,a.x,a.e,1);},0) : (a(),h()) : q = 0;}function i(a, c, d, e, f, i, j) {function k(b) {if (!o && g(l.readyState) && (u.r = o = 1,!q && h(),l.onload = l.onreadystatechange = null,b)) {"img" != a && m(function() {t.removeChild(l);},50);for (var d in y[c])y[c].hasOwnProperty(d) && y[c][d].onload();}}var j = j || B.errorTimeout,l = b.createElement(a),o = 0,r = 0,u = {t: d,s: c,e: f,a: i,x: j};1 === y[c] && (r = 1,y[c] = []),"object" == a ? l.data = c : (l.src = c,l.type = a),l.width = l.height = "0",l.onerror = l.onload = l.onreadystatechange = function() {k.call(this,r);},p.splice(e,0,u),"img" != a && (r || 2 === y[c] ? (t.insertBefore(l,s ? null : n),m(k,j)) : y[c].push(l));}function j(a, b, c, d, f) {return q = 0,b = b || "j",e(a) ? i("c" == b ? v : u,a,b,this.i++,c,d,f) : (p.splice(this.i++,0,a),1 == p.length && h()),this;}function k() {var a = B;return a.loader = {load: j,i: 0},a;}var l = b.documentElement,m = a.setTimeout,n = b.getElementsByTagName("script")[0],o = {}.toString,p = [],q = 0,r = "MozAppearance"in l.style,s = r && !!b.createRange().compareNode,t = s ? l : n.parentNode,l = a.opera && "[object Opera]" == o.call(a.opera),l = !!b.attachEvent && !l,u = r ? "object" : l ? "script" : "img",v = l ? "script" : u,w = Array.isArray || function(a) {return "[object Array]" == o.call(a);},x = [],y = {},z = {timeout: function(a, b) {return b.length && (a.timeout = b[0]),a;}},A,B;B = function(a) {function b(a) {var a = a.split("!"),b = x.length,c = a.pop(),d = a.length,c = {url: c,origUrl: c,prefixes: a},e,f,g;for (f = 0; f < d; f++)g = a[f].split("="),(e = z[g.shift()]) && (c = e(c,g));for (f = 0; f < b; f++)c = x[f](c);return c;}function g(a, e, f, g, h) {var i = b(a),j = i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass || (e && (e = d(e) ? e : e[a] || e[g] || e[a.split("/").pop().split("?")[0]]),i.instead ? i.instead(a,e,f,g,h) : (y[i.url] ? i.noexec = !0 : y[i.url] = 1,f.load(i.url,i.forceCSS || !i.forceJS && "css" == i.url.split(".").pop().split("?").shift() ? "c" : c,i.noexec,i.attrs,i.timeout),(d(e) || d(j)) && f.load(function() {k(),e && e(i.origUrl,h,g),j && j(i.origUrl,h,g),y[i.url] = 2;})));}function h(a, b) {function c(a, c) {if (a) {if (e(a))c || (j = function() {var a = [].slice.call(arguments);k.apply(this,a),l();}),g(a,j,b,0,h);else if (Object(a) === a)for (n in m = function() {var b = 0,c;for (c in a)a.hasOwnProperty(c) && b++;return b;}(),a)a.hasOwnProperty(n) && (!c && !--m && (d(j) ? j = function() {var a = [].slice.call(arguments);k.apply(this,a),l();} : j[n] = function(a) {return function() {var b = [].slice.call(arguments);a && a.apply(this,b),l();};}(k[n])),g(a[n],j,b,n,h));}else !c && l();}var h = !!a.test,i = a.load || a.both,j = a.callback || f,k = j,l = a.complete || f,m,n;c(h ? a.yep : a.nope,!!i),i && c(i);}var i,j,l = this.yepnope.loader;if (e(a))g(a,0,l,0);else if (w(a))for (i = 0; i < a.length; i++)j = a[i],e(j) ? g(j,0,l,0) : w(j) ? B(j) : Object(j) === j && h(j,l);else Object(a) === a && h(a,l);},B.addPrefix = function(a, b) {z[a] = b;},B.addFilter = function(a) {x.push(a);},B.errorTimeout = 1e4,null == b.readyState && b.addEventListener && (b.readyState = "loading",b.addEventListener("DOMContentLoaded",A = function() {b.removeEventListener("DOMContentLoaded",A,0),b.readyState = "complete";},0)),a.yepnope = k(),a.yepnope.executeStack = h,a.yepnope.injectJs = function(a, c, d, e, i, j) {var k = b.createElement("script"),l,o,e = e || B.errorTimeout;k.src = a;for (o in d)k.setAttribute(o,d[o]);c = j ? h : c || f,k.onreadystatechange = k.onload = function() {!l && g(k.readyState) && (l = 1,c(),k.onload = k.onreadystatechange = null);},m(function() {l || (l = 1,c(1));},e),i ? k.onload() : n.parentNode.insertBefore(k,n);},a.yepnope.injectCss = function(a, c, d, e, g, i) {var e = b.createElement("link"),j,c = i ? h : c || f;e.href = a,e.rel = "stylesheet",e.type = "text/css";for (j in d)e.setAttribute(j,d[j]);g || (n.parentNode.insertBefore(e,n),m(c,0));};}(this,document),Modernizr.load = function() {yepnope.apply(window,[].slice.call(arguments,0));}; diff --git a/modules/default/alert/notificationFx.js b/modules/default/alert/notificationFx.js index 9f7c7207..b74c9d14 100644 --- a/modules/default/alert/notificationFx.js +++ b/modules/default/alert/notificationFx.js @@ -4,31 +4,32 @@ * * Licensed under the MIT license. * http://www.opensource.org/licenses/mit-license.php - * + * * Copyright 2014, Codrops * http://www.codrops.com */ -;( function( window ) { - - 'use strict'; +// jscs:disable +;(function(window) { + + "use strict"; var docElem = window.document.documentElement, - support = { animations : Modernizr.cssanimations }, + support = {animations: Modernizr.cssanimations}, animEndEventNames = { - 'WebkitAnimation' : 'webkitAnimationEnd', - 'OAnimation' : 'oAnimationEnd', - 'msAnimation' : 'MSAnimationEnd', - 'animation' : 'animationend' + "WebkitAnimation": "webkitAnimationEnd", + "OAnimation": "oAnimationEnd", + "msAnimation": "MSAnimationEnd", + "animation": "animationend" }, // animation end event name - animEndEventName = animEndEventNames[ Modernizr.prefixed( 'animation' ) ]; - + animEndEventName = animEndEventNames[ Modernizr.prefixed("animation") ]; + /** * extend obj function */ - function extend( a, b ) { - for( var key in b ) { - if( b.hasOwnProperty( key ) ) { + function extend(a, b) { + for (var key in b) { + if (b.hasOwnProperty(key)) { a[key] = b[key]; } } @@ -38,9 +39,9 @@ /** * NotificationFx function */ - function NotificationFx( options ) { - this.options = extend( {}, this.options ); - extend( this.options, options ); + function NotificationFx(options) { + this.options = extend({}, this.options); + extend(this.options, options); this._init(); } @@ -50,28 +51,28 @@ NotificationFx.prototype.options = { // element to which the notification will be appended // defaults to the document.body - wrapper : document.body, + wrapper: document.body, // the message - message : 'yo!', + message: "yo!", // layout type: growl|attached|bar|other - layout : 'growl', + layout: "growl", // effects for the specified layout: // for growl layout: scale|slide|genie|jelly // for attached layout: flip|bouncyflip // for other layout: boxspinner|cornerexpand|loadingcircle|thumbslider // ... - effect : 'slide', + effect: "slide", // notice, warning, error, success // will add class ns-type-warning, ns-type-error or ns-type-success - type : 'notice', - // if the user doesn´t close the notification then we remove it + type: "notice", + // if the user doesn´t close the notification then we remove it // after the following time - ttl : 6000, + ttl: 6000, al_no: "ns-box", // callbacks - onClose : function() { return false; }, - onOpen : function() { return false; } - } + onClose: function() { return false; }, + onOpen: function() { return false; } + }; /** * init function @@ -79,29 +80,29 @@ */ NotificationFx.prototype._init = function() { // create HTML structure - this.ntf = document.createElement( 'div' ); - this.ntf.className = this.options.al_no + ' ns-' + this.options.layout + ' ns-effect-' + this.options.effect + ' ns-type-' + this.options.type; - var strinner = '
'; + this.ntf = document.createElement("div"); + this.ntf.className = this.options.al_no + " ns-" + this.options.layout + " ns-effect-" + this.options.effect + " ns-type-" + this.options.type; + var strinner = "
"; strinner += this.options.message; - strinner += '
'; + strinner += "
"; this.ntf.innerHTML = strinner; // append to body or the element specified in options.wrapper - this.options.wrapper.insertBefore( this.ntf, this.options.wrapper.nextSibling ); + this.options.wrapper.insertBefore(this.ntf, this.options.wrapper.nextSibling); // dismiss after [options.ttl]ms var self = this; - if (this.options.ttl){ - this.dismissttl = setTimeout( function() { - if( self.active ) { + if (this.options.ttl) { + this.dismissttl = setTimeout(function() { + if (self.active) { self.dismiss(); } - }, this.options.ttl ); + }, this.options.ttl); } // init events this._initEvents(); - } + }; /** * init events @@ -109,18 +110,18 @@ NotificationFx.prototype._initEvents = function() { var self = this; // dismiss notification by tapping on it if someone has a touchscreen - this.ntf.querySelector( '.ns-box-inner' ).addEventListener( 'click', function() { self.dismiss(); } ); - } + this.ntf.querySelector(".ns-box-inner").addEventListener("click", function() { self.dismiss(); }); + }; /** * show the notification */ NotificationFx.prototype.show = function() { this.active = true; - classie.remove( this.ntf, 'ns-hide' ); - classie.add( this.ntf, 'ns-show' ); + classie.remove(this.ntf, "ns-hide"); + classie.add(this.ntf, "ns-show"); this.options.onOpen(); - } + }; /** * dismiss the notification @@ -128,35 +129,34 @@ NotificationFx.prototype.dismiss = function() { var self = this; this.active = false; - clearTimeout( this.dismissttl ); - classie.remove( this.ntf, 'ns-show' ); - setTimeout( function() { - classie.add( self.ntf, 'ns-hide' ); - + clearTimeout(this.dismissttl); + classie.remove(this.ntf, "ns-show"); + setTimeout(function() { + classie.add(self.ntf, "ns-hide"); + // callback self.options.onClose(); - }, 25 ); + }, 25); // after animation ends remove ntf from the DOM - var onEndAnimationFn = function( ev ) { - if( support.animations ) { - if( ev.target !== self.ntf ) return false; - this.removeEventListener( animEndEventName, onEndAnimationFn ); + var onEndAnimationFn = function(ev) { + if (support.animations) { + if (ev.target !== self.ntf) return false; + this.removeEventListener(animEndEventName, onEndAnimationFn); } - self.options.wrapper.removeChild( this ); + self.options.wrapper.removeChild(this); }; - if( support.animations ) { - this.ntf.addEventListener( animEndEventName, onEndAnimationFn ); - } - else { + if (support.animations) { + this.ntf.addEventListener(animEndEventName, onEndAnimationFn); + } else { onEndAnimationFn(); } - } + }; /** * add to global namespace */ window.NotificationFx = NotificationFx; -} )( window ); \ No newline at end of file +})(window); diff --git a/modules/default/alert/ns-default.css b/modules/default/alert/ns-default.css index 8c4927a6..db3ba3a3 100755 --- a/modules/default/alert/ns-default.css +++ b/modules/default/alert/ns-default.css @@ -1,746 +1,1739 @@ /* Based on work by http://tympanus.net/codrops/licensing/ */ -/* Common, default styles for the notification box */ .ns-box { - background: #fff; - padding: 17px; - line-height: 1.4; - margin-bottom: 10px; - z-index: 1; - color: black; - font-size: 70%; - position: relative; - display: table; - word-wrap:break-word; - max-width: 100%; - border-radius: 5px; + background: #fff; + padding: 17px; + line-height: 1.4; + margin-bottom: 10px; + z-index: 1; + color: black; + font-size: 70%; + position: relative; + display: table; + word-wrap: break-word; + max-width: 100%; + border-radius: 5px; } .ns-alert { - /*background: #fff;*/ - border-style: solid; - border-color: #fff; - padding: 17px; - line-height: 1.4; - margin-bottom: 10px; - z-index: 3; - color: white; - font-size: 70%; - position: fixed; - text-align: center; - /* center the element */ - right: 0; - left: 0; - margin-right: auto; - margin-left: auto; - top:40%; - width: 40%; - height: auto; - word-wrap:break-word; - border-radius: 20px; + border-style: solid; + border-color: #fff; + padding: 17px; + line-height: 1.4; + margin-bottom: 10px; + z-index: 3; + color: white; + font-size: 70%; + position: fixed; + text-align: center; + right: 0; + left: 0; + margin-right: auto; + margin-left: auto; + top: 40%; + width: 40%; + height: auto; + word-wrap: break-word; + border-radius: 20px; } .black_overlay { - position: fixed; - z-index:2; - background-color: rgba(0,0,0, 0.93); - width: 100%; - height: 100%; + position: fixed; + z-index: 2; + background-color: rgba(0, 0, 0, 0.93); + width: 100%; + height: 100%; } [class^="ns-effect-"].ns-growl.ns-hide, [class*=" ns-effect-"].ns-growl.ns-hide { - -webkit-animation-direction: reverse; - animation-direction: reverse; + -webkit-animation-direction: reverse; + animation-direction: reverse; } -/* Flip */ .ns-effect-flip { - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; - backface-visibility: hidden; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + backface-visibility: hidden; } .ns-effect-flip.ns-show, .ns-effect-flip.ns-hide { - -webkit-animation-name: animFlipFront; - animation-name: animFlipFront; - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; + -webkit-animation-name: animFlipFront; + animation-name: animFlipFront; + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; } .ns-effect-flip.ns-hide { - -webkit-animation-name: animFlipBack; - animation-name: animFlipBack; + -webkit-animation-name: animFlipBack; + animation-name: animFlipBack; } @-webkit-keyframes animFlipFront { - 0% { -webkit-transform: perspective(1000px) rotate3d(1,0,0,-90deg); } - 100% { -webkit-transform: perspective(1000px); } + 0% { + -webkit-transform: perspective(1000px) rotate3d(1, 0, 0, -90deg); + } + 100% { + -webkit-transform: perspective(1000px); + } } @keyframes animFlipFront { - 0% { -webkit-transform: perspective(1000px) rotate3d(1,0,0,-90deg); transform: perspective(1000px) rotate3d(1,0,0,-90deg); } - 100% { -webkit-transform: perspective(1000px); transform: perspective(1000px); } + 0% { + -webkit-transform: perspective(1000px) rotate3d(1, 0, 0, -90deg); + transform: perspective(1000px) rotate3d(1, 0, 0, -90deg); + } + 100% { + -webkit-transform: perspective(1000px); + transform: perspective(1000px); + } } @-webkit-keyframes animFlipBack { - 0% { -webkit-transform: perspective(1000px) rotate3d(1,0,0,90deg); } - 100% { -webkit-transform: perspective(1000px); } + 0% { + -webkit-transform: perspective(1000px) rotate3d(1, 0, 0, 90deg); + } + 100% { + -webkit-transform: perspective(1000px); + } } @keyframes animFlipBack { - 0% { -webkit-transform: perspective(1000px) rotate3d(1,0,0,90deg); transform: perspective(1000px) rotate3d(1,0,0,90deg); } - 100% { -webkit-transform: perspective(1000px); transform: perspective(1000px); } + 0% { + -webkit-transform: perspective(1000px) rotate3d(1, 0, 0, 90deg); + transform: perspective(1000px) rotate3d(1, 0, 0, 90deg); + } + 100% { + -webkit-transform: perspective(1000px); + transform: perspective(1000px); + } } -/* Bouncy Flip adapted from animate.css by Dan Eden: http://daneden.github.io/animate.css/ */ - .ns-effect-bouncyflip.ns-show, .ns-effect-bouncyflip.ns-hide { - -webkit-animation-name: flipInX; - animation-name: flipInX; - -webkit-animation-duration: 0.8s; - animation-duration: 0.8s; + -webkit-animation-name: flipInX; + animation-name: flipInX; + -webkit-animation-duration: 0.8s; + animation-duration: 0.8s; } @-webkit-keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotate3d(1,0,0,-90deg); - -webkit-transition-timing-function: ease-in; - } - - 40% { - -webkit-transform: perspective(400px) rotate3d(1,0,0,20deg); - -webkit-transition-timing-function: ease-out; - } - - 60% { - -webkit-transform: perspective(400px) rotate3d(1,0,0,-10deg); - -webkit-transition-timing-function: ease-in; - opacity: 1; - } - - 80% { - -webkit-transform: perspective(400px) rotate3d(1,0,0,5deg); - -webkit-transition-timing-function: ease-out; - } - - 100% { - -webkit-transform: perspective(400px); - } + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); + -webkit-transition-timing-function: ease-in; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 20deg); + -webkit-transition-timing-function: ease-out; + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -10deg); + -webkit-transition-timing-function: ease-in; + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 5deg); + -webkit-transition-timing-function: ease-out; + } + 100% { + -webkit-transform: perspective(400px); + } } @keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotate3d(1,0,0,-90deg); - transform: perspective(400px) rotate3d(1,0,0,-90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; - } - - 40% { - -webkit-transform: perspective(400px) rotate3d(1,0,0,20deg); - transform: perspective(400px) rotate3d(1,0,0,20deg); - -webkit-transition-timing-function: ease-out; - transition-timing-function: ease-out; - } - - 60% { - -webkit-transform: perspective(400px) rotate3d(1,0,0,-10deg); - transform: perspective(400px) rotate3d(1,0,0,-10deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; - opacity: 1; - } - - 80% { - -webkit-transform: perspective(400px) rotate3d(1,0,0,5deg); - transform: perspective(400px) rotate3d(1,0,0,5deg); - -webkit-transition-timing-function: ease-out; - transition-timing-function: ease-out; - } - - 100% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); + transform: perspective(400px) rotate3d(1, 0, 0, -90deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 20deg); + transform: perspective(400px) rotate3d(1, 0, 0, 20deg); + -webkit-transition-timing-function: ease-out; + transition-timing-function: ease-out; + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -10deg); + transform: perspective(400px) rotate3d(1, 0, 0, -10deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 5deg); + transform: perspective(400px) rotate3d(1, 0, 0, 5deg); + -webkit-transition-timing-function: ease-out; + transition-timing-function: ease-out; + } + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } } .ns-effect-bouncyflip.ns-hide { - -webkit-animation-name: flipInXSimple; - animation-name: flipInXSimple; - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; + -webkit-animation-name: flipInXSimple; + animation-name: flipInXSimple; + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; } @-webkit-keyframes flipInXSimple { - 0% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); - -webkit-transition-timing-function: ease-in; - } - 100% { - -webkit-transform: perspective(400px); - } + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); + -webkit-transition-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px); + } } @keyframes flipInXSimple { - 0% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); - transform: perspective(400px) rotate3d(1, 0, 0, -90deg); - -webkit-transition-timing-function: ease-in; - transition-timing-function: ease-in; - } - 100% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); + transform: perspective(400px) rotate3d(1, 0, 0, -90deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } } - -/* Expanding Loader */ .ns-effect-exploader { - -webkit-transform-origin: 0 0; - transform-origin: 0 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; } .ns-effect-exploader p { - padding: 0.25em 2em 0.25em 3em; + padding: 0.25em 2em 0.25em 3em; } .ns-effect-exploader.ns-show { - -webkit-animation-name: animLoad; - animation-name: animLoad; - -webkit-animation-duration: 1s; - animation-duration: 1s; + -webkit-animation-name: animLoad; + animation-name: animLoad; + -webkit-animation-duration: 1s; + animation-duration: 1s; } @-webkit-keyframes animLoad { - 0% { opacity: 1; -webkit-transform: scale3d(0,0.3,1); } - 100% { opacity: 1; -webkit-transform: scale3d(1,1,1); } + 0% { + opacity: 1; + -webkit-transform: scale3d(0, 0.3, 1); + } + 100% { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + } } @keyframes animLoad { - 0% { opacity: 1; -webkit-transform: scale3d(0,0.3,1); transform: scale3d(0,0.3,1); } - 100% { opacity: 1; -webkit-transform: scale3d(1,1,1); transform: scale3d(1,1,1); } + 0% { + opacity: 1; + -webkit-transform: scale3d(0, 0.3, 1); + transform: scale3d(0, 0.3, 1); + } + 100% { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } } .ns-effect-exploader.ns-hide { - -webkit-animation-name: animFade; - animation-name: animFade; - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; + -webkit-animation-name: animFade; + animation-name: animFade; + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; } .ns-effect-exploader.ns-show .ns-box-inner, .ns-effect-exploader.ns-show .ns-close { - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-delay: 0.6s; - animation-delay: 0.6s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; + -webkit-animation-delay: 0.6s; + animation-delay: 0.6s; } .ns-effect-exploader.ns-show .ns-close { - -webkit-animation-name: animFade; - animation-name: animFade; + -webkit-animation-name: animFade; + animation-name: animFade; } .ns-effect-exploader.ns-show .ns-box-inner { - -webkit-animation-name: animFadeMove; - animation-name: animFadeMove; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; + -webkit-animation-name: animFadeMove; + animation-name: animFadeMove; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; } @-webkit-keyframes animFadeMove { - 0% { opacity: 0; -webkit-transform: translate3d(0,10px,0); } - 100% { opacity: 1; -webkit-transform: translate3d(0,0,0); } + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 10px, 0); + } + 100% { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + } } @keyframes animFadeMove { - 0% { opacity: 0; -webkit-transform: translate3d(0,10px,0); transform: translate3d(0,10px,0); } - 100% { opacity: 1; -webkit-transform: translate3d(0,0,0); transform: translate3d(0,0,0); } + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + 100% { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } } @-webkit-keyframes animFade { - 0% { opacity: 0; } - 100% { opacity: 1; } + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } } @keyframes animFade { - 0% { opacity: 0; } - 100% { opacity: 1; } + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } } -/* Scale */ .ns-effect-scale.ns-show, .ns-effect-scale.ns-hide { - -webkit-animation-name: animScale; - animation-name: animScale; - -webkit-animation-duration: 0.25s; - animation-duration: 0.25s; + -webkit-animation-name: animScale; + animation-name: animScale; + -webkit-animation-duration: 0.25s; + animation-duration: 0.25s; } @-webkit-keyframes animScale { - 0% { opacity: 0; -webkit-transform: translate3d(0,40px,0) scale3d(0.1,0.6,1); } - 100% { opacity: 1; -webkit-transform: translate3d(0,0,0) scale3d(1,1,1); } + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 40px, 0) scale3d(0.1, 0.6, 1); + } + 100% { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); + } } @keyframes animScale { - 0% { opacity: 0; -webkit-transform: translate3d(0,40px,0) scale3d(0.1,0.6,1); transform: translate3d(0,40px,0) scale3d(0.1,0.6,1); } - 100% { opacity: 1; -webkit-transform: translate3d(0,0,0) scale3d(1,1,1); transform: translate3d(0,0,0) scale3d(1,1,1); } + 0% { + opacity: 0; + -webkit-transform: translate3d(0, 40px, 0) scale3d(0.1, 0.6, 1); + transform: translate3d(0, 40px, 0) scale3d(0.1, 0.6, 1); + } + 100% { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); + transform: translate3d(0, 0, 0) scale3d(1, 1, 1); + } } -/* Jelly */ .ns-effect-jelly.ns-show { - -webkit-animation-name: animJelly; - animation-name: animJelly; - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-timing-function: linear; - animation-timing-function: linear; + -webkit-animation-name: animJelly; + animation-name: animJelly; + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; } .ns-effect-jelly.ns-hide { - -webkit-animation-name: animFade; - animation-name: animFade; - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; + -webkit-animation-name: animFade; + animation-name: animFade; + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; } @-webkit-keyframes animFade { - 0% { opacity: 0; } - 100% { opacity: 1; } + 0% { opacity: 0; } + 100% { opacity: 1; } } @keyframes animFade { - 0% { opacity: 0; } - 100% { opacity: 1; } + 0% { opacity: 0; } + 100% { opacity: 1; } } -/* Generated with Bounce.js. Edit at http://goo.gl/6iLZu5 */ - -@-webkit-keyframes animJelly { - 0% { -webkit-transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 2.083333% { -webkit-transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 4.166667% { -webkit-transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 6.25% { -webkit-transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 8.333333% { -webkit-transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 10.416667% { -webkit-transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 12.5% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 14.583333% { -webkit-transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 16.666667% { -webkit-transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 18.75% { -webkit-transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 20.833333% { -webkit-transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 22.916667% { -webkit-transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 25% { -webkit-transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 27.083333% { -webkit-transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 29.166667% { -webkit-transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 31.25% { -webkit-transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 33.333333% { -webkit-transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 35.416667% { -webkit-transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 37.5% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 39.583333% { -webkit-transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 41.666667% { -webkit-transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 43.75% { -webkit-transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 45.833333% { -webkit-transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 47.916667% { -webkit-transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 50% { -webkit-transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 52.083333% { -webkit-transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 54.166667% { -webkit-transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 56.25% { -webkit-transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 58.333333% { -webkit-transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 60.416667% { -webkit-transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 62.5% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 64.583333% { -webkit-transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 66.666667% { -webkit-transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 68.75% { -webkit-transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 70.833333% { -webkit-transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 72.916667% { -webkit-transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 75% { -webkit-transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 77.083333% { -webkit-transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 79.166667% { -webkit-transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 81.25% { -webkit-transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 83.333333% { -webkit-transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 85.416667% { -webkit-transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 87.5% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 89.583333% { -webkit-transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 91.666667% { -webkit-transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 93.75% { -webkit-transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 95.833333% { -webkit-transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 97.916667% { -webkit-transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 100% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } +@-webkit-keyframes animJelly { + 0% { + -webkit-transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 2.083333% { + -webkit-transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 4.166667% { + -webkit-transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 6.25% { + -webkit-transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 8.333333% { + -webkit-transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 10.416667% { + -webkit-transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 12.5% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 14.583333% { + -webkit-transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 16.666667% { + -webkit-transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 18.75% { + -webkit-transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 20.833333% { + -webkit-transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 22.916667% { + -webkit-transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 25% { + -webkit-transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 27.083333% { + -webkit-transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 29.166667% { + -webkit-transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 31.25% { + -webkit-transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 33.333333% { + -webkit-transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 35.416667% { + -webkit-transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 37.5% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 39.583333% { + -webkit-transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 41.666667% { + -webkit-transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 43.75% { + -webkit-transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 45.833333% { + -webkit-transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 47.916667% { + -webkit-transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 50% { + -webkit-transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 52.083333% { + -webkit-transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 54.166667% { + -webkit-transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 56.25% { + -webkit-transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 58.333333% { + -webkit-transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 60.416667% { + -webkit-transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 62.5% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 64.583333% { + -webkit-transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 66.666667% { + -webkit-transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 68.75% { + -webkit-transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 70.833333% { + -webkit-transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 72.916667% { + -webkit-transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 75% { + -webkit-transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 77.083333% { + -webkit-transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 79.166667% { + -webkit-transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 81.25% { + -webkit-transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 83.333333% { + -webkit-transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 85.416667% { + -webkit-transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 87.5% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 89.583333% { + -webkit-transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 91.666667% { + -webkit-transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 93.75% { + -webkit-transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 95.833333% { + -webkit-transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 97.916667% { + -webkit-transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 100% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } } -@keyframes animJelly { - 0% { -webkit-transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 2.083333% { -webkit-transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 4.166667% { -webkit-transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 6.25% { -webkit-transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 8.333333% { -webkit-transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 10.416667% { -webkit-transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 12.5% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 14.583333% { -webkit-transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 16.666667% { -webkit-transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 18.75% { -webkit-transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 20.833333% { -webkit-transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 22.916667% { -webkit-transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 25% { -webkit-transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 27.083333% { -webkit-transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 29.166667% { -webkit-transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 31.25% { -webkit-transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 33.333333% { -webkit-transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 35.416667% { -webkit-transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 37.5% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 39.583333% { -webkit-transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 41.666667% { -webkit-transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 43.75% { -webkit-transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 45.833333% { -webkit-transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 47.916667% { -webkit-transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 50% { -webkit-transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 52.083333% { -webkit-transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 54.166667% { -webkit-transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 56.25% { -webkit-transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 58.333333% { -webkit-transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 60.416667% { -webkit-transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 62.5% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 64.583333% { -webkit-transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 66.666667% { -webkit-transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 68.75% { -webkit-transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 70.833333% { -webkit-transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 72.916667% { -webkit-transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 75% { -webkit-transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 77.083333% { -webkit-transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 79.166667% { -webkit-transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 81.25% { -webkit-transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 83.333333% { -webkit-transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 85.416667% { -webkit-transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 87.5% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 89.583333% { -webkit-transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 91.666667% { -webkit-transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 93.75% { -webkit-transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 95.833333% { -webkit-transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 97.916667% { -webkit-transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 100% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } +@keyframes animJelly { + 0% { + -webkit-transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 2.083333% { + -webkit-transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 4.166667% { + -webkit-transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 6.25% { + -webkit-transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 8.333333% { + -webkit-transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 10.416667% { + -webkit-transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 12.5% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 14.583333% { + -webkit-transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 16.666667% { + -webkit-transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 18.75% { + -webkit-transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 20.833333% { + -webkit-transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 22.916667% { + -webkit-transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 25% { + -webkit-transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 27.083333% { + -webkit-transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 29.166667% { + -webkit-transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 31.25% { + -webkit-transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 33.333333% { + -webkit-transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 35.416667% { + -webkit-transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 37.5% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 39.583333% { + -webkit-transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 41.666667% { + -webkit-transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 43.75% { + -webkit-transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 45.833333% { + -webkit-transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 47.916667% { + -webkit-transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 50% { + -webkit-transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 52.083333% { + -webkit-transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 54.166667% { + -webkit-transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 56.25% { + -webkit-transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 58.333333% { + -webkit-transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 60.416667% { + -webkit-transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 62.5% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 64.583333% { + -webkit-transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 66.666667% { + -webkit-transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 68.75% { + -webkit-transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 70.833333% { + -webkit-transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 72.916667% { + -webkit-transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 75% { + -webkit-transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 77.083333% { + -webkit-transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 79.166667% { + -webkit-transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 81.25% { + -webkit-transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 83.333333% { + -webkit-transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 85.416667% { + -webkit-transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 87.5% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 89.583333% { + -webkit-transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 91.666667% { + -webkit-transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 93.75% { + -webkit-transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 95.833333% { + -webkit-transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 97.916667% { + -webkit-transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 100% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } } -/* Slide */ .ns-effect-slide-left.ns-show { - -webkit-animation-name: animSlideElasticLeft; - animation-name: animSlideElasticLeft; - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-timing-function: linear; - animation-timing-function: linear; + -webkit-animation-name: animSlideElasticLeft; + animation-name: animSlideElasticLeft; + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; } -/* Generated with Bounce.js. Edit at http://goo.gl/akZHSq */ - -@-webkit-keyframes animSlideElasticLeft { - 0% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1000, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1000, 0, 0, 1); } - 1.666667% { -webkit-transform: matrix3d(1.92933, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -739.26805, 0, 0, 1); transform: matrix3d(1.92933, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -739.26805, 0, 0, 1); } - 3.333333% { -webkit-transform: matrix3d(1.96989, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -521.82545, 0, 0, 1); transform: matrix3d(1.96989, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -521.82545, 0, 0, 1); } - 5% { -webkit-transform: matrix3d(1.70901, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -349.26115, 0, 0, 1); transform: matrix3d(1.70901, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -349.26115, 0, 0, 1); } - 6.666667% { -webkit-transform: matrix3d(1.4235, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -218.3238, 0, 0, 1); transform: matrix3d(1.4235, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -218.3238, 0, 0, 1); } - 8.333333% { -webkit-transform: matrix3d(1.21065, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -123.29848, 0, 0, 1); transform: matrix3d(1.21065, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -123.29848, 0, 0, 1); } - 10% { -webkit-transform: matrix3d(1.08167, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -57.59273, 0, 0, 1); transform: matrix3d(1.08167, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -57.59273, 0, 0, 1); } - 11.666667% { -webkit-transform: matrix3d(1.0165, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.72371, 0, 0, 1); transform: matrix3d(1.0165, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.72371, 0, 0, 1); } - 13.333333% { -webkit-transform: matrix3d(0.99057, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.12794, 0, 0, 1); transform: matrix3d(0.99057, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.12794, 0, 0, 1); } - 15% { -webkit-transform: matrix3d(0.98478, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 24.86339, 0, 0, 1); transform: matrix3d(0.98478, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 24.86339, 0, 0, 1); } - 16.666667% { -webkit-transform: matrix3d(0.98719, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.40503, 0, 0, 1); transform: matrix3d(0.98719, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.40503, 0, 0, 1); } - 18.333333% { -webkit-transform: matrix3d(0.9916, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.75275, 0, 0, 1); transform: matrix3d(0.9916, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.75275, 0, 0, 1); } - 20% { -webkit-transform: matrix3d(0.99541, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 28.10141, 0, 0, 1); transform: matrix3d(0.99541, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 28.10141, 0, 0, 1); } - 21.666667% { -webkit-transform: matrix3d(0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 23.98271, 0, 0, 1); transform: matrix3d(0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 23.98271, 0, 0, 1); } - 23.333333% { -webkit-transform: matrix3d(0.99936, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 19.40752, 0, 0, 1); transform: matrix3d(0.99936, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 19.40752, 0, 0, 1); } - 25% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 14.99558, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 14.99558, 0, 0, 1); } - 26.666667% { -webkit-transform: matrix3d(1.00021, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.08575, 0, 0, 1); transform: matrix3d(1.00021, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.08575, 0, 0, 1); } - 28.333333% { -webkit-transform: matrix3d(1.00022, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 7.82507, 0, 0, 1); transform: matrix3d(1.00022, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 7.82507, 0, 0, 1); } - 30% { -webkit-transform: matrix3d(1.00016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5.23737, 0, 0, 1); transform: matrix3d(1.00016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5.23737, 0, 0, 1); } - 31.666667% { -webkit-transform: matrix3d(1.0001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3.27389, 0, 0, 1); transform: matrix3d(1.0001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3.27389, 0, 0, 1); } - 33.333333% { -webkit-transform: matrix3d(1.00005, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.84893, 0, 0, 1); transform: matrix3d(1.00005, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.84893, 0, 0, 1); } - 35% { -webkit-transform: matrix3d(1.00002, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.86364, 0, 0, 1); transform: matrix3d(1.00002, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.86364, 0, 0, 1); } - 36.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.22079, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.22079, 0, 0, 1); } - 38.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16687, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16687, 0, 0, 1); } - 40% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.37284, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.37284, 0, 0, 1); } - 41.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.45594, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.45594, 0, 0, 1); } - 43.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.46116, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.46116, 0, 0, 1); } - 45% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.4214, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.4214, 0, 0, 1); } - 46.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.35963, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.35963, 0, 0, 1); } - 48.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.29103, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.29103, 0, 0, 1); } - 50% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.22487, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.22487, 0, 0, 1); } - 51.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16624, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16624, 0, 0, 1); } - 53.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.11734, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.11734, 0, 0, 1); } - 55% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.07854, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.07854, 0, 0, 1); } - 56.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.04909, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.04909, 0, 0, 1); } - 58.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.02773, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.02773, 0, 0, 1); } - 60% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.01295, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.01295, 0, 0, 1); } - 61.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00331, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00331, 0, 0, 1); } - 63.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.0025, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.0025, 0, 0, 1); } - 65% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00559, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00559, 0, 0, 1); } - 66.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00684, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00684, 0, 0, 1); } - 68.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00692, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00692, 0, 0, 1); } - 70% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00632, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00632, 0, 0, 1); } - 71.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00539, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00539, 0, 0, 1); } - 73.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00436, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00436, 0, 0, 1); } - 75% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00337, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00337, 0, 0, 1); } - 76.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00249, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00249, 0, 0, 1); } - 78.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00176, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00176, 0, 0, 1); } - 80% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00118, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00118, 0, 0, 1); } - 81.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00074, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00074, 0, 0, 1); } - 83.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00042, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00042, 0, 0, 1); } - 85% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00019, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00019, 0, 0, 1); } - 86.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00005, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00005, 0, 0, 1); } - 88.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00004, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00004, 0, 0, 1); } - 90% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); } - 91.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); } - 93.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); } - 95% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00009, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00009, 0, 0, 1); } - 96.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); } - 98.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00007, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00007, 0, 0, 1); } - 100% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } +@-webkit-keyframes animSlideElasticLeft { + 0% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1000, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1000, 0, 0, 1); + } + 1.666667% { + -webkit-transform: matrix3d(1.92933, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -739.26805, 0, 0, 1); + transform: matrix3d(1.92933, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -739.26805, 0, 0, 1); + } + 3.333333% { + -webkit-transform: matrix3d(1.96989, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -521.82545, 0, 0, 1); + transform: matrix3d(1.96989, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -521.82545, 0, 0, 1); + } + 5% { + -webkit-transform: matrix3d(1.70901, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -349.26115, 0, 0, 1); + transform: matrix3d(1.70901, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -349.26115, 0, 0, 1); + } + 6.666667% { + -webkit-transform: matrix3d(1.4235, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -218.3238, 0, 0, 1); + transform: matrix3d(1.4235, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -218.3238, 0, 0, 1); + } + 8.333333% { + -webkit-transform: matrix3d(1.21065, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -123.29848, 0, 0, 1); + transform: matrix3d(1.21065, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -123.29848, 0, 0, 1); + } + 10% { + -webkit-transform: matrix3d(1.08167, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -57.59273, 0, 0, 1); + transform: matrix3d(1.08167, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -57.59273, 0, 0, 1); + } + 11.666667% { + -webkit-transform: matrix3d(1.0165, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.72371, 0, 0, 1); + transform: matrix3d(1.0165, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.72371, 0, 0, 1); + } + 13.333333% { + -webkit-transform: matrix3d(0.99057, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.12794, 0, 0, 1); + transform: matrix3d(0.99057, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.12794, 0, 0, 1); + } + 15% { + -webkit-transform: matrix3d(0.98478, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 24.86339, 0, 0, 1); + transform: matrix3d(0.98478, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 24.86339, 0, 0, 1); + } + 16.666667% { + -webkit-transform: matrix3d(0.98719, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.40503, 0, 0, 1); + transform: matrix3d(0.98719, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.40503, 0, 0, 1); + } + 18.333333% { + -webkit-transform: matrix3d(0.9916, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.75275, 0, 0, 1); + transform: matrix3d(0.9916, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.75275, 0, 0, 1); + } + 20% { + -webkit-transform: matrix3d(0.99541, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 28.10141, 0, 0, 1); + transform: matrix3d(0.99541, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 28.10141, 0, 0, 1); + } + 21.666667% { + -webkit-transform: matrix3d(0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 23.98271, 0, 0, 1); + transform: matrix3d(0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 23.98271, 0, 0, 1); + } + 23.333333% { + -webkit-transform: matrix3d(0.99936, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 19.40752, 0, 0, 1); + transform: matrix3d(0.99936, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 19.40752, 0, 0, 1); + } + 25% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 14.99558, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 14.99558, 0, 0, 1); + } + 26.666667% { + -webkit-transform: matrix3d(1.00021, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.08575, 0, 0, 1); + transform: matrix3d(1.00021, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.08575, 0, 0, 1); + } + 28.333333% { + -webkit-transform: matrix3d(1.00022, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 7.82507, 0, 0, 1); + transform: matrix3d(1.00022, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 7.82507, 0, 0, 1); + } + 30% { + -webkit-transform: matrix3d(1.00016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5.23737, 0, 0, 1); + transform: matrix3d(1.00016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5.23737, 0, 0, 1); + } + 31.666667% { + -webkit-transform: matrix3d(1.0001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3.27389, 0, 0, 1); + transform: matrix3d(1.0001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3.27389, 0, 0, 1); + } + 33.333333% { + -webkit-transform: matrix3d(1.00005, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.84893, 0, 0, 1); + transform: matrix3d(1.00005, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.84893, 0, 0, 1); + } + 35% { + -webkit-transform: matrix3d(1.00002, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.86364, 0, 0, 1); + transform: matrix3d(1.00002, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.86364, 0, 0, 1); + } + 36.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.22079, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.22079, 0, 0, 1); + } + 38.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16687, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16687, 0, 0, 1); + } + 40% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.37284, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.37284, 0, 0, 1); + } + 41.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.45594, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.45594, 0, 0, 1); + } + 43.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.46116, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.46116, 0, 0, 1); + } + 45% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.4214, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.4214, 0, 0, 1); + } + 46.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.35963, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.35963, 0, 0, 1); + } + 48.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.29103, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.29103, 0, 0, 1); + } + 50% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.22487, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.22487, 0, 0, 1); + } + 51.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16624, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16624, 0, 0, 1); + } + 53.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.11734, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.11734, 0, 0, 1); + } + 55% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.07854, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.07854, 0, 0, 1); + } + 56.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.04909, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.04909, 0, 0, 1); + } + 58.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.02773, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.02773, 0, 0, 1); + } + 60% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.01295, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.01295, 0, 0, 1); + } + 61.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00331, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00331, 0, 0, 1); + } + 63.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.0025, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.0025, 0, 0, 1); + } + 65% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00559, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00559, 0, 0, 1); + } + 66.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00684, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00684, 0, 0, 1); + } + 68.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00692, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00692, 0, 0, 1); + } + 70% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00632, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00632, 0, 0, 1); + } + 71.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00539, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00539, 0, 0, 1); + } + 73.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00436, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00436, 0, 0, 1); + } + 75% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00337, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00337, 0, 0, 1); + } + 76.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00249, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00249, 0, 0, 1); + } + 78.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00176, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00176, 0, 0, 1); + } + 80% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00118, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00118, 0, 0, 1); + } + 81.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00074, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00074, 0, 0, 1); + } + 83.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00042, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00042, 0, 0, 1); + } + 85% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00019, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00019, 0, 0, 1); + } + 86.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00005, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00005, 0, 0, 1); + } + 88.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00004, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00004, 0, 0, 1); + } + 90% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); + } + 91.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); + } + 93.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); + } + 95% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00009, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00009, 0, 0, 1); + } + 96.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); + } + 98.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00007, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00007, 0, 0, 1); + } + 100% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } } -@keyframes animSlideElasticLeft { - 0% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1000, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1000, 0, 0, 1); } - 1.666667% { -webkit-transform: matrix3d(1.92933, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -739.26805, 0, 0, 1); transform: matrix3d(1.92933, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -739.26805, 0, 0, 1); } - 3.333333% { -webkit-transform: matrix3d(1.96989, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -521.82545, 0, 0, 1); transform: matrix3d(1.96989, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -521.82545, 0, 0, 1); } - 5% { -webkit-transform: matrix3d(1.70901, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -349.26115, 0, 0, 1); transform: matrix3d(1.70901, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -349.26115, 0, 0, 1); } - 6.666667% { -webkit-transform: matrix3d(1.4235, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -218.3238, 0, 0, 1); transform: matrix3d(1.4235, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -218.3238, 0, 0, 1); } - 8.333333% { -webkit-transform: matrix3d(1.21065, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -123.29848, 0, 0, 1); transform: matrix3d(1.21065, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -123.29848, 0, 0, 1); } - 10% { -webkit-transform: matrix3d(1.08167, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -57.59273, 0, 0, 1); transform: matrix3d(1.08167, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -57.59273, 0, 0, 1); } - 11.666667% { -webkit-transform: matrix3d(1.0165, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.72371, 0, 0, 1); transform: matrix3d(1.0165, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.72371, 0, 0, 1); } - 13.333333% { -webkit-transform: matrix3d(0.99057, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.12794, 0, 0, 1); transform: matrix3d(0.99057, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.12794, 0, 0, 1); } - 15% { -webkit-transform: matrix3d(0.98478, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 24.86339, 0, 0, 1); transform: matrix3d(0.98478, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 24.86339, 0, 0, 1); } - 16.666667% { -webkit-transform: matrix3d(0.98719, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.40503, 0, 0, 1); transform: matrix3d(0.98719, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.40503, 0, 0, 1); } - 18.333333% { -webkit-transform: matrix3d(0.9916, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.75275, 0, 0, 1); transform: matrix3d(0.9916, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.75275, 0, 0, 1); } - 20% { -webkit-transform: matrix3d(0.99541, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 28.10141, 0, 0, 1); transform: matrix3d(0.99541, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 28.10141, 0, 0, 1); } - 21.666667% { -webkit-transform: matrix3d(0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 23.98271, 0, 0, 1); transform: matrix3d(0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 23.98271, 0, 0, 1); } - 23.333333% { -webkit-transform: matrix3d(0.99936, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 19.40752, 0, 0, 1); transform: matrix3d(0.99936, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 19.40752, 0, 0, 1); } - 25% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 14.99558, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 14.99558, 0, 0, 1); } - 26.666667% { -webkit-transform: matrix3d(1.00021, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.08575, 0, 0, 1); transform: matrix3d(1.00021, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.08575, 0, 0, 1); } - 28.333333% { -webkit-transform: matrix3d(1.00022, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 7.82507, 0, 0, 1); transform: matrix3d(1.00022, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 7.82507, 0, 0, 1); } - 30% { -webkit-transform: matrix3d(1.00016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5.23737, 0, 0, 1); transform: matrix3d(1.00016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5.23737, 0, 0, 1); } - 31.666667% { -webkit-transform: matrix3d(1.0001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3.27389, 0, 0, 1); transform: matrix3d(1.0001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3.27389, 0, 0, 1); } - 33.333333% { -webkit-transform: matrix3d(1.00005, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.84893, 0, 0, 1); transform: matrix3d(1.00005, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.84893, 0, 0, 1); } - 35% { -webkit-transform: matrix3d(1.00002, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.86364, 0, 0, 1); transform: matrix3d(1.00002, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.86364, 0, 0, 1); } - 36.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.22079, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.22079, 0, 0, 1); } - 38.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16687, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16687, 0, 0, 1); } - 40% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.37284, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.37284, 0, 0, 1); } - 41.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.45594, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.45594, 0, 0, 1); } - 43.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.46116, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.46116, 0, 0, 1); } - 45% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.4214, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.4214, 0, 0, 1); } - 46.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.35963, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.35963, 0, 0, 1); } - 48.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.29103, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.29103, 0, 0, 1); } - 50% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.22487, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.22487, 0, 0, 1); } - 51.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16624, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16624, 0, 0, 1); } - 53.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.11734, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.11734, 0, 0, 1); } - 55% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.07854, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.07854, 0, 0, 1); } - 56.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.04909, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.04909, 0, 0, 1); } - 58.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.02773, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.02773, 0, 0, 1); } - 60% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.01295, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.01295, 0, 0, 1); } - 61.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00331, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00331, 0, 0, 1); } - 63.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.0025, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.0025, 0, 0, 1); } - 65% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00559, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00559, 0, 0, 1); } - 66.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00684, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00684, 0, 0, 1); } - 68.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00692, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00692, 0, 0, 1); } - 70% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00632, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00632, 0, 0, 1); } - 71.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00539, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00539, 0, 0, 1); } - 73.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00436, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00436, 0, 0, 1); } - 75% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00337, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00337, 0, 0, 1); } - 76.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00249, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00249, 0, 0, 1); } - 78.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00176, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00176, 0, 0, 1); } - 80% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00118, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00118, 0, 0, 1); } - 81.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00074, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00074, 0, 0, 1); } - 83.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00042, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00042, 0, 0, 1); } - 85% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00019, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00019, 0, 0, 1); } - 86.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00005, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00005, 0, 0, 1); } - 88.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00004, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00004, 0, 0, 1); } - 90% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); } - 91.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); } - 93.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); } - 95% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00009, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00009, 0, 0, 1); } - 96.666667% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); } - 98.333333% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00007, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00007, 0, 0, 1); } - 100% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } +@keyframes animSlideElasticLeft { + 0% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1000, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1000, 0, 0, 1); + } + 1.666667% { + -webkit-transform: matrix3d(1.92933, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -739.26805, 0, 0, 1); + transform: matrix3d(1.92933, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -739.26805, 0, 0, 1); + } + 3.333333% { + -webkit-transform: matrix3d(1.96989, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -521.82545, 0, 0, 1); + transform: matrix3d(1.96989, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -521.82545, 0, 0, 1); + } + 5% { + -webkit-transform: matrix3d(1.70901, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -349.26115, 0, 0, 1); + transform: matrix3d(1.70901, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -349.26115, 0, 0, 1); + } + 6.666667% { + -webkit-transform: matrix3d(1.4235, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -218.3238, 0, 0, 1); + transform: matrix3d(1.4235, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -218.3238, 0, 0, 1); + } + 8.333333% { + -webkit-transform: matrix3d(1.21065, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -123.29848, 0, 0, 1); + transform: matrix3d(1.21065, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -123.29848, 0, 0, 1); + } + 10% { + -webkit-transform: matrix3d(1.08167, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -57.59273, 0, 0, 1); + transform: matrix3d(1.08167, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -57.59273, 0, 0, 1); + } + 11.666667% { + -webkit-transform: matrix3d(1.0165, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.72371, 0, 0, 1); + transform: matrix3d(1.0165, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -14.72371, 0, 0, 1); + } + 13.333333% { + -webkit-transform: matrix3d(0.99057, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.12794, 0, 0, 1); + transform: matrix3d(0.99057, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.12794, 0, 0, 1); + } + 15% { + -webkit-transform: matrix3d(0.98478, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 24.86339, 0, 0, 1); + transform: matrix3d(0.98478, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 24.86339, 0, 0, 1); + } + 16.666667% { + -webkit-transform: matrix3d(0.98719, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.40503, 0, 0, 1); + transform: matrix3d(0.98719, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.40503, 0, 0, 1); + } + 18.333333% { + -webkit-transform: matrix3d(0.9916, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.75275, 0, 0, 1); + transform: matrix3d(0.9916, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 30.75275, 0, 0, 1); + } + 20% { + -webkit-transform: matrix3d(0.99541, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 28.10141, 0, 0, 1); + transform: matrix3d(0.99541, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 28.10141, 0, 0, 1); + } + 21.666667% { + -webkit-transform: matrix3d(0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 23.98271, 0, 0, 1); + transform: matrix3d(0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 23.98271, 0, 0, 1); + } + 23.333333% { + -webkit-transform: matrix3d(0.99936, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 19.40752, 0, 0, 1); + transform: matrix3d(0.99936, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 19.40752, 0, 0, 1); + } + 25% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 14.99558, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 14.99558, 0, 0, 1); + } + 26.666667% { + -webkit-transform: matrix3d(1.00021, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.08575, 0, 0, 1); + transform: matrix3d(1.00021, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 11.08575, 0, 0, 1); + } + 28.333333% { + -webkit-transform: matrix3d(1.00022, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 7.82507, 0, 0, 1); + transform: matrix3d(1.00022, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 7.82507, 0, 0, 1); + } + 30% { + -webkit-transform: matrix3d(1.00016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5.23737, 0, 0, 1); + transform: matrix3d(1.00016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5.23737, 0, 0, 1); + } + 31.666667% { + -webkit-transform: matrix3d(1.0001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3.27389, 0, 0, 1); + transform: matrix3d(1.0001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3.27389, 0, 0, 1); + } + 33.333333% { + -webkit-transform: matrix3d(1.00005, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.84893, 0, 0, 1); + transform: matrix3d(1.00005, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.84893, 0, 0, 1); + } + 35% { + -webkit-transform: matrix3d(1.00002, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.86364, 0, 0, 1); + transform: matrix3d(1.00002, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.86364, 0, 0, 1); + } + 36.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.22079, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.22079, 0, 0, 1); + } + 38.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16687, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16687, 0, 0, 1); + } + 40% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.37284, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.37284, 0, 0, 1); + } + 41.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.45594, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.45594, 0, 0, 1); + } + 43.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.46116, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.46116, 0, 0, 1); + } + 45% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.4214, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.4214, 0, 0, 1); + } + 46.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.35963, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.35963, 0, 0, 1); + } + 48.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.29103, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.29103, 0, 0, 1); + } + 50% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.22487, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.22487, 0, 0, 1); + } + 51.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16624, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.16624, 0, 0, 1); + } + 53.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.11734, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.11734, 0, 0, 1); + } + 55% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.07854, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.07854, 0, 0, 1); + } + 56.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.04909, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.04909, 0, 0, 1); + } + 58.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.02773, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.02773, 0, 0, 1); + } + 60% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.01295, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.01295, 0, 0, 1); + } + 61.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00331, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00331, 0, 0, 1); + } + 63.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.0025, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.0025, 0, 0, 1); + } + 65% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00559, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00559, 0, 0, 1); + } + 66.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00684, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00684, 0, 0, 1); + } + 68.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00692, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00692, 0, 0, 1); + } + 70% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00632, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00632, 0, 0, 1); + } + 71.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00539, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00539, 0, 0, 1); + } + 73.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00436, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00436, 0, 0, 1); + } + 75% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00337, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00337, 0, 0, 1); + } + 76.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00249, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00249, 0, 0, 1); + } + 78.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00176, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00176, 0, 0, 1); + } + 80% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00118, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00118, 0, 0, 1); + } + 81.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00074, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00074, 0, 0, 1); + } + 83.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00042, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00042, 0, 0, 1); + } + 85% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00019, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00019, 0, 0, 1); + } + 86.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00005, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.00005, 0, 0, 1); + } + 88.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00004, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00004, 0, 0, 1); + } + 90% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); + } + 91.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); + } + 93.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.0001, 0, 0, 1); + } + 95% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00009, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00009, 0, 0, 1); + } + 96.666667% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00008, 0, 0, 1); + } + 98.333333% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00007, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.00007, 0, 0, 1); + } + 100% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } } .ns-effect-slide-left.ns-hide { - -webkit-animation-name: animSlideLeft; - animation-name: animSlideLeft; - -webkit-animation-duration: 0.25s; - animation-duration: 0.25s; + -webkit-animation-name: animSlideLeft; + animation-name: animSlideLeft; + -webkit-animation-duration: 0.25s; + animation-duration: 0.25s; } @-webkit-keyframes animSlideLeft { - 0% { -webkit-transform: translate3d(-30px,0,0) translate3d(-100%,0,0); } - 100% { -webkit-transform: translate3d(0,0,0); } + 0% { + -webkit-transform: translate3d(-30px, 0, 0) translate3d(-100%, 0, 0); + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + } } @keyframes animSlideLeft { - 0% { -webkit-transform: translate3d(-30px,0,0) translate3d(-100%,0,0); transform: translate3d(-30px,0,0) translate3d(-100%,0,0); } - 100% { -webkit-transform: translate3d(0,0,0); transform: translate3d(0,0,0); } + 0% { + -webkit-transform: translate3d(-30px, 0, 0) translate3d(-100%, 0, 0); + transform: translate3d(-30px, 0, 0) translate3d(-100%, 0, 0); + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } } -/*Slide Right */ .ns-effect-slide-right.ns-show { - -webkit-animation: animSlideElasticRight 2000ms linear both; - animation: animSlideElasticRight 2000ms linear both; + -webkit-animation: animSlideElasticRight 2000ms linear both; + animation: animSlideElasticRight 2000ms linear both; } -/* Generated with Bounce.js. Edit at http://goo.gl/akZHSq */ - -@-webkit-keyframes animSlideElasticRight { - 0% { -webkit-transform: matrix3d(2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1000, 0, 0, 1); transform: matrix3d(2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1000, 0, 0, 1); } - 2.15% { -webkit-transform: matrix3d(1.486, 0, 0, 0, 0, 0.514, 0, 0, 0, 0, 1, 0, 664.594, 0, 0, 1); transform: matrix3d(1.486, 0, 0, 0, 0, 0.514, 0, 0, 0, 0, 1, 0, 664.594, 0, 0, 1); } - 4.1% { -webkit-transform: matrix3d(1.147, 0, 0, 0, 0, 0.853, 0, 0, 0, 0, 1, 0, 419.708, 0, 0, 1); transform: matrix3d(1.147, 0, 0, 0, 0, 0.853, 0, 0, 0, 0, 1, 0, 419.708, 0, 0, 1); } - 4.3% { -webkit-transform: matrix3d(1.121, 0, 0, 0, 0, 0.879, 0, 0, 0, 0, 1, 0, 398.136, 0, 0, 1); transform: matrix3d(1.121, 0, 0, 0, 0, 0.879, 0, 0, 0, 0, 1, 0, 398.136, 0, 0, 1); } - 6.46% { -webkit-transform: matrix3d(0.948, 0, 0, 0, 0, 1.052, 0, 0, 0, 0, 1, 0, 206.714, 0, 0, 1); transform: matrix3d(0.948, 0, 0, 0, 0, 1.052, 0, 0, 0, 0, 1, 0, 206.714, 0, 0, 1); } - 8.11% { -webkit-transform: matrix3d(0.908, 0, 0, 0, 0, 1.092, 0, 0, 0, 0, 1, 0, 105.491, 0, 0, 1); transform: matrix3d(0.908, 0, 0, 0, 0, 1.092, 0, 0, 0, 0, 1, 0, 105.491, 0, 0, 1); } - 8.61% { -webkit-transform: matrix3d(0.907, 0, 0, 0, 0, 1.093, 0, 0, 0, 0, 1, 0, 81.572, 0, 0, 1); transform: matrix3d(0.907, 0, 0, 0, 0, 1.093, 0, 0, 0, 0, 1, 0, 81.572, 0, 0, 1); } - 12.11% { -webkit-transform: matrix3d(0.95, 0, 0, 0, 0, 1.05, 0, 0, 0, 0, 1, 0, -18.434, 0, 0, 1); transform: matrix3d(0.95, 0, 0, 0, 0, 1.05, 0, 0, 0, 0, 1, 0, -18.434, 0, 0, 1); } - 14.16% { -webkit-transform: matrix3d(0.979, 0, 0, 0, 0, 1.021, 0, 0, 0, 0, 1, 0, -38.734, 0, 0, 1); transform: matrix3d(0.979, 0, 0, 0, 0, 1.021, 0, 0, 0, 0, 1, 0, -38.734, 0, 0, 1); } - 16.12% { -webkit-transform: matrix3d(0.997, 0, 0, 0, 0, 1.003, 0, 0, 0, 0, 1, 0, -43.356, 0, 0, 1); transform: matrix3d(0.997, 0, 0, 0, 0, 1.003, 0, 0, 0, 0, 1, 0, -43.356, 0, 0, 1); } - 19.72% { -webkit-transform: matrix3d(1.006, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, -34.155, 0, 0, 1); transform: matrix3d(1.006, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, -34.155, 0, 0, 1); } - 27.23% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -7.839, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -7.839, 0, 0, 1); } - 30.83% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1.951, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1.951, 0, 0, 1); } - 38.34% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.037, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.037, 0, 0, 1); } - 41.99% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.812, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.812, 0, 0, 1); } - 50% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.159, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.159, 0, 0, 1); } - 60.56% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.025, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.025, 0, 0, 1); } - 82.78% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.001, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.001, 0, 0, 1); } - 100% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } +@-webkit-keyframes animSlideElasticRight { + 0% { + -webkit-transform: matrix3d(2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1000, 0, 0, 1); + transform: matrix3d(2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1000, 0, 0, 1); + } + 2.15% { + -webkit-transform: matrix3d(1.486, 0, 0, 0, 0, 0.514, 0, 0, 0, 0, 1, 0, 664.594, 0, 0, 1); + transform: matrix3d(1.486, 0, 0, 0, 0, 0.514, 0, 0, 0, 0, 1, 0, 664.594, 0, 0, 1); + } + 4.1% { + -webkit-transform: matrix3d(1.147, 0, 0, 0, 0, 0.853, 0, 0, 0, 0, 1, 0, 419.708, 0, 0, 1); + transform: matrix3d(1.147, 0, 0, 0, 0, 0.853, 0, 0, 0, 0, 1, 0, 419.708, 0, 0, 1); + } + 4.3% { + -webkit-transform: matrix3d(1.121, 0, 0, 0, 0, 0.879, 0, 0, 0, 0, 1, 0, 398.136, 0, 0, 1); + transform: matrix3d(1.121, 0, 0, 0, 0, 0.879, 0, 0, 0, 0, 1, 0, 398.136, 0, 0, 1); + } + 6.46% { + -webkit-transform: matrix3d(0.948, 0, 0, 0, 0, 1.052, 0, 0, 0, 0, 1, 0, 206.714, 0, 0, 1); + transform: matrix3d(0.948, 0, 0, 0, 0, 1.052, 0, 0, 0, 0, 1, 0, 206.714, 0, 0, 1); + } + 8.11% { + -webkit-transform: matrix3d(0.908, 0, 0, 0, 0, 1.092, 0, 0, 0, 0, 1, 0, 105.491, 0, 0, 1); + transform: matrix3d(0.908, 0, 0, 0, 0, 1.092, 0, 0, 0, 0, 1, 0, 105.491, 0, 0, 1); + } + 8.61% { + -webkit-transform: matrix3d(0.907, 0, 0, 0, 0, 1.093, 0, 0, 0, 0, 1, 0, 81.572, 0, 0, 1); + transform: matrix3d(0.907, 0, 0, 0, 0, 1.093, 0, 0, 0, 0, 1, 0, 81.572, 0, 0, 1); + } + 12.11% { + -webkit-transform: matrix3d(0.95, 0, 0, 0, 0, 1.05, 0, 0, 0, 0, 1, 0, -18.434, 0, 0, 1); + transform: matrix3d(0.95, 0, 0, 0, 0, 1.05, 0, 0, 0, 0, 1, 0, -18.434, 0, 0, 1); + } + 14.16% { + -webkit-transform: matrix3d(0.979, 0, 0, 0, 0, 1.021, 0, 0, 0, 0, 1, 0, -38.734, 0, 0, 1); + transform: matrix3d(0.979, 0, 0, 0, 0, 1.021, 0, 0, 0, 0, 1, 0, -38.734, 0, 0, 1); + } + 16.12% { + -webkit-transform: matrix3d(0.997, 0, 0, 0, 0, 1.003, 0, 0, 0, 0, 1, 0, -43.356, 0, 0, 1); + transform: matrix3d(0.997, 0, 0, 0, 0, 1.003, 0, 0, 0, 0, 1, 0, -43.356, 0, 0, 1); + } + 19.72% { + -webkit-transform: matrix3d(1.006, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, -34.155, 0, 0, 1); + transform: matrix3d(1.006, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, -34.155, 0, 0, 1); + } + 27.23% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -7.839, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -7.839, 0, 0, 1); + } + 30.83% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1.951, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1.951, 0, 0, 1); + } + 38.34% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.037, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.037, 0, 0, 1); + } + 41.99% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.812, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.812, 0, 0, 1); + } + 50% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.159, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.159, 0, 0, 1); + } + 60.56% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.025, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.025, 0, 0, 1); + } + 82.78% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.001, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.001, 0, 0, 1); + } + 100% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } } -@keyframes animSlideElasticRight { - 0% { -webkit-transform: matrix3d(2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1000, 0, 0, 1); transform: matrix3d(2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1000, 0, 0, 1); } - 2.15% { -webkit-transform: matrix3d(1.486, 0, 0, 0, 0, 0.514, 0, 0, 0, 0, 1, 0, 664.594, 0, 0, 1); transform: matrix3d(1.486, 0, 0, 0, 0, 0.514, 0, 0, 0, 0, 1, 0, 664.594, 0, 0, 1); } - 4.1% { -webkit-transform: matrix3d(1.147, 0, 0, 0, 0, 0.853, 0, 0, 0, 0, 1, 0, 419.708, 0, 0, 1); transform: matrix3d(1.147, 0, 0, 0, 0, 0.853, 0, 0, 0, 0, 1, 0, 419.708, 0, 0, 1); } - 4.3% { -webkit-transform: matrix3d(1.121, 0, 0, 0, 0, 0.879, 0, 0, 0, 0, 1, 0, 398.136, 0, 0, 1); transform: matrix3d(1.121, 0, 0, 0, 0, 0.879, 0, 0, 0, 0, 1, 0, 398.136, 0, 0, 1); } - 6.46% { -webkit-transform: matrix3d(0.948, 0, 0, 0, 0, 1.052, 0, 0, 0, 0, 1, 0, 206.714, 0, 0, 1); transform: matrix3d(0.948, 0, 0, 0, 0, 1.052, 0, 0, 0, 0, 1, 0, 206.714, 0, 0, 1); } - 8.11% { -webkit-transform: matrix3d(0.908, 0, 0, 0, 0, 1.092, 0, 0, 0, 0, 1, 0, 105.491, 0, 0, 1); transform: matrix3d(0.908, 0, 0, 0, 0, 1.092, 0, 0, 0, 0, 1, 0, 105.491, 0, 0, 1); } - 8.61% { -webkit-transform: matrix3d(0.907, 0, 0, 0, 0, 1.093, 0, 0, 0, 0, 1, 0, 81.572, 0, 0, 1); transform: matrix3d(0.907, 0, 0, 0, 0, 1.093, 0, 0, 0, 0, 1, 0, 81.572, 0, 0, 1); } - 12.11% { -webkit-transform: matrix3d(0.95, 0, 0, 0, 0, 1.05, 0, 0, 0, 0, 1, 0, -18.434, 0, 0, 1); transform: matrix3d(0.95, 0, 0, 0, 0, 1.05, 0, 0, 0, 0, 1, 0, -18.434, 0, 0, 1); } - 14.16% { -webkit-transform: matrix3d(0.979, 0, 0, 0, 0, 1.021, 0, 0, 0, 0, 1, 0, -38.734, 0, 0, 1); transform: matrix3d(0.979, 0, 0, 0, 0, 1.021, 0, 0, 0, 0, 1, 0, -38.734, 0, 0, 1); } - 16.12% { -webkit-transform: matrix3d(0.997, 0, 0, 0, 0, 1.003, 0, 0, 0, 0, 1, 0, -43.356, 0, 0, 1); transform: matrix3d(0.997, 0, 0, 0, 0, 1.003, 0, 0, 0, 0, 1, 0, -43.356, 0, 0, 1); } - 19.72% { -webkit-transform: matrix3d(1.006, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, -34.155, 0, 0, 1); transform: matrix3d(1.006, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, -34.155, 0, 0, 1); } - 27.23% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -7.839, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -7.839, 0, 0, 1); } - 30.83% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1.951, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1.951, 0, 0, 1); } - 38.34% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.037, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.037, 0, 0, 1); } - 41.99% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.812, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.812, 0, 0, 1); } - 50% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.159, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.159, 0, 0, 1); } - 60.56% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.025, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.025, 0, 0, 1); } - 82.78% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.001, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.001, 0, 0, 1); } - 100% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } +@keyframes animSlideElasticRight { + 0% { + -webkit-transform: matrix3d(2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1000, 0, 0, 1); + transform: matrix3d(2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1000, 0, 0, 1); + } + 2.15% { + -webkit-transform: matrix3d(1.486, 0, 0, 0, 0, 0.514, 0, 0, 0, 0, 1, 0, 664.594, 0, 0, 1); + transform: matrix3d(1.486, 0, 0, 0, 0, 0.514, 0, 0, 0, 0, 1, 0, 664.594, 0, 0, 1); + } + 4.1% { + -webkit-transform: matrix3d(1.147, 0, 0, 0, 0, 0.853, 0, 0, 0, 0, 1, 0, 419.708, 0, 0, 1); + transform: matrix3d(1.147, 0, 0, 0, 0, 0.853, 0, 0, 0, 0, 1, 0, 419.708, 0, 0, 1); + } + 4.3% { + -webkit-transform: matrix3d(1.121, 0, 0, 0, 0, 0.879, 0, 0, 0, 0, 1, 0, 398.136, 0, 0, 1); + transform: matrix3d(1.121, 0, 0, 0, 0, 0.879, 0, 0, 0, 0, 1, 0, 398.136, 0, 0, 1); + } + 6.46% { + -webkit-transform: matrix3d(0.948, 0, 0, 0, 0, 1.052, 0, 0, 0, 0, 1, 0, 206.714, 0, 0, 1); + transform: matrix3d(0.948, 0, 0, 0, 0, 1.052, 0, 0, 0, 0, 1, 0, 206.714, 0, 0, 1); + } + 8.11% { + -webkit-transform: matrix3d(0.908, 0, 0, 0, 0, 1.092, 0, 0, 0, 0, 1, 0, 105.491, 0, 0, 1); + transform: matrix3d(0.908, 0, 0, 0, 0, 1.092, 0, 0, 0, 0, 1, 0, 105.491, 0, 0, 1); + } + 8.61% { + -webkit-transform: matrix3d(0.907, 0, 0, 0, 0, 1.093, 0, 0, 0, 0, 1, 0, 81.572, 0, 0, 1); + transform: matrix3d(0.907, 0, 0, 0, 0, 1.093, 0, 0, 0, 0, 1, 0, 81.572, 0, 0, 1); + } + 12.11% { + -webkit-transform: matrix3d(0.95, 0, 0, 0, 0, 1.05, 0, 0, 0, 0, 1, 0, -18.434, 0, 0, 1); + transform: matrix3d(0.95, 0, 0, 0, 0, 1.05, 0, 0, 0, 0, 1, 0, -18.434, 0, 0, 1); + } + 14.16% { + -webkit-transform: matrix3d(0.979, 0, 0, 0, 0, 1.021, 0, 0, 0, 0, 1, 0, -38.734, 0, 0, 1); + transform: matrix3d(0.979, 0, 0, 0, 0, 1.021, 0, 0, 0, 0, 1, 0, -38.734, 0, 0, 1); + } + 16.12% { + -webkit-transform: matrix3d(0.997, 0, 0, 0, 0, 1.003, 0, 0, 0, 0, 1, 0, -43.356, 0, 0, 1); + transform: matrix3d(0.997, 0, 0, 0, 0, 1.003, 0, 0, 0, 0, 1, 0, -43.356, 0, 0, 1); + } + 19.72% { + -webkit-transform: matrix3d(1.006, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, -34.155, 0, 0, 1); + transform: matrix3d(1.006, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, -34.155, 0, 0, 1); + } + 27.23% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -7.839, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -7.839, 0, 0, 1); + } + 30.83% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1.951, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1.951, 0, 0, 1); + } + 38.34% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.037, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1.037, 0, 0, 1); + } + 41.99% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.812, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.812, 0, 0, 1); + } + 50% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.159, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.159, 0, 0, 1); + } + 60.56% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.025, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.025, 0, 0, 1); + } + 82.78% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.001, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.001, 0, 0, 1); + } + 100% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } } .ns-effect-slide-right.ns-hide { - -webkit-animation-name: animSlideRight; - animation-name: animSlideRight; - -webkit-animation-duration: 0.25s; - animation-duration: 0.25s; + -webkit-animation-name: animSlideRight; + animation-name: animSlideRight; + -webkit-animation-duration: 0.25s; + animation-duration: 0.25s; } @-webkit-keyframes animSlideRight { - 0% { -webkit-transform: translate3d(30px,0,0) translate3d(100%,0,0); } - 100% { -webkit-transform: translate3d(0,0,0); } + 0% { + -webkit-transform: translate3d(30px, 0, 0) translate3d(100%, 0, 0); + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + } } @keyframes animSlideRight { - 0% { -webkit-transform: translate3d(30px,0,0) translate3d(100%,0,0); transform: translate3d(30px,0,0) translate3d(100%,0,0); } - 100% { -webkit-transform: translate3d(0,0,0); transform: translate3d(0,0,0); } + 0% { + -webkit-transform: translate3d(30px, 0, 0) translate3d(100%, 0, 0); + transform: translate3d(30px, 0, 0) translate3d(100%, 0, 0); + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } } -/*Slide top */ .ns-effect-slide-center.ns-show { - -webkit-animation: animSlideElasticCenter 2000ms linear both; - animation: animSlideElasticCenter 2000ms linear both; + -webkit-animation: animSlideElasticCenter 2000ms linear both; + animation: animSlideElasticCenter 2000ms linear both; } -/* Generated with Bounce.js. Edit at http://goo.gl/akZHSq */ - -@-webkit-keyframes animSlideElasticCenter { - 0% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, -300, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, -300, 0, 1); } - 2.15% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.971, 0, 0, 0, 0, 1, 0, 0, -199.378, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.971, 0, 0, 0, 0, 1, 0, 0, -199.378, 0, 1); } - 4.1% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.294, 0, 0, 0, 0, 1, 0, 0, -125.912, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.294, 0, 0, 0, 0, 1, 0, 0, -125.912, 0, 1); } - 4.3% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.243, 0, 0, 0, 0, 1, 0, 0, -119.441, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.243, 0, 0, 0, 0, 1, 0, 0, -119.441, 0, 1); } - 6.46% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.895, 0, 0, 0, 0, 1, 0, 0, -62.014, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.895, 0, 0, 0, 0, 1, 0, 0, -62.014, 0, 1); } - 8.11% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.817, 0, 0, 0, 0, 1, 0, 0, -31.647, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.817, 0, 0, 0, 0, 1, 0, 0, -31.647, 0, 1); } - 8.61% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.813, 0, 0, 0, 0, 1, 0, 0, -24.472, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.813, 0, 0, 0, 0, 1, 0, 0, -24.472, 0, 1); } - 12.11% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 1, 0, 0, 5.53, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 1, 0, 0, 5.53, 0, 1); } - 14.16% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.959, 0, 0, 0, 0, 1, 0, 0, 11.62, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.959, 0, 0, 0, 0, 1, 0, 0, 11.62, 0, 1); } - 16.12% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, 0, 13.007, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, 0, 13.007, 0, 1); } - 19.72% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.012, 0, 0, 0, 0, 1, 0, 0, 10.247, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.012, 0, 0, 0, 0, 1, 0, 0, 10.247, 0, 1); } - 27.23% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 2.352, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 2.352, 0, 1); } - 30.83% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.999, 0, 0, 0, 0, 1, 0, 0, 0.585, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.999, 0, 0, 0, 0, 1, 0, 0, 0.585, 0, 1); } - 38.34% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.311, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.311, 0, 1); } - 41.99% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.244, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.244, 0, 1); } - 50% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.048, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.048, 0, 1); } - 60.56% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0.007, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0.007, 0, 1); } - 82.78% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 100% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } +@-webkit-keyframes animSlideElasticCenter { + 0% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, -300, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, -300, 0, 1); + } + 2.15% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.971, 0, 0, 0, 0, 1, 0, 0, -199.378, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.971, 0, 0, 0, 0, 1, 0, 0, -199.378, 0, 1); + } + 4.1% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.294, 0, 0, 0, 0, 1, 0, 0, -125.912, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.294, 0, 0, 0, 0, 1, 0, 0, -125.912, 0, 1); + } + 4.3% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.243, 0, 0, 0, 0, 1, 0, 0, -119.441, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.243, 0, 0, 0, 0, 1, 0, 0, -119.441, 0, 1); + } + 6.46% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.895, 0, 0, 0, 0, 1, 0, 0, -62.014, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.895, 0, 0, 0, 0, 1, 0, 0, -62.014, 0, 1); + } + 8.11% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.817, 0, 0, 0, 0, 1, 0, 0, -31.647, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.817, 0, 0, 0, 0, 1, 0, 0, -31.647, 0, 1); + } + 8.61% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.813, 0, 0, 0, 0, 1, 0, 0, -24.472, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.813, 0, 0, 0, 0, 1, 0, 0, -24.472, 0, 1); + } + 12.11% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 1, 0, 0, 5.53, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 1, 0, 0, 5.53, 0, 1); + } + 14.16% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.959, 0, 0, 0, 0, 1, 0, 0, 11.62, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.959, 0, 0, 0, 0, 1, 0, 0, 11.62, 0, 1); + } + 16.12% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, 0, 13.007, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, 0, 13.007, 0, 1); + } + 19.72% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.012, 0, 0, 0, 0, 1, 0, 0, 10.247, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.012, 0, 0, 0, 0, 1, 0, 0, 10.247, 0, 1); + } + 27.23% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 2.352, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 2.352, 0, 1); + } + 30.83% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.999, 0, 0, 0, 0, 1, 0, 0, 0.585, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.999, 0, 0, 0, 0, 1, 0, 0, 0.585, 0, 1); + } + 38.34% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.311, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.311, 0, 1); + } + 41.99% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.244, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.244, 0, 1); + } + 50% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.048, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.048, 0, 1); + } + 60.56% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0.007, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0.007, 0, 1); + } + 82.78% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 100% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } } -@keyframes animSlideElasticCenter { - 0% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, -300, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, -300, 0, 1); } - 2.15% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.971, 0, 0, 0, 0, 1, 0, 0, -199.378, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.971, 0, 0, 0, 0, 1, 0, 0, -199.378, 0, 1); } - 4.1% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.294, 0, 0, 0, 0, 1, 0, 0, -125.912, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.294, 0, 0, 0, 0, 1, 0, 0, -125.912, 0, 1); } - 4.3% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.243, 0, 0, 0, 0, 1, 0, 0, -119.441, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.243, 0, 0, 0, 0, 1, 0, 0, -119.441, 0, 1); } - 6.46% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.895, 0, 0, 0, 0, 1, 0, 0, -62.014, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.895, 0, 0, 0, 0, 1, 0, 0, -62.014, 0, 1); } - 8.11% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.817, 0, 0, 0, 0, 1, 0, 0, -31.647, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.817, 0, 0, 0, 0, 1, 0, 0, -31.647, 0, 1); } - 8.61% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.813, 0, 0, 0, 0, 1, 0, 0, -24.472, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.813, 0, 0, 0, 0, 1, 0, 0, -24.472, 0, 1); } - 12.11% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 1, 0, 0, 5.53, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 1, 0, 0, 5.53, 0, 1); } - 14.16% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.959, 0, 0, 0, 0, 1, 0, 0, 11.62, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.959, 0, 0, 0, 0, 1, 0, 0, 11.62, 0, 1); } - 16.12% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, 0, 13.007, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, 0, 13.007, 0, 1); } - 19.72% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.012, 0, 0, 0, 0, 1, 0, 0, 10.247, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1.012, 0, 0, 0, 0, 1, 0, 0, 10.247, 0, 1); } - 27.23% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 2.352, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 2.352, 0, 1); } - 30.83% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.999, 0, 0, 0, 0, 1, 0, 0, 0.585, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 0.999, 0, 0, 0, 0, 1, 0, 0, 0.585, 0, 1); } - 38.34% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.311, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.311, 0, 1); } - 41.99% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.244, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.244, 0, 1); } - 50% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.048, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.048, 0, 1); } - 60.56% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0.007, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0.007, 0, 1); } - 82.78% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } - 100% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } +@keyframes animSlideElasticCenter { + 0% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, -300, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, -300, 0, 1); + } + 2.15% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.971, 0, 0, 0, 0, 1, 0, 0, -199.378, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.971, 0, 0, 0, 0, 1, 0, 0, -199.378, 0, 1); + } + 4.1% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.294, 0, 0, 0, 0, 1, 0, 0, -125.912, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.294, 0, 0, 0, 0, 1, 0, 0, -125.912, 0, 1); + } + 4.3% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.243, 0, 0, 0, 0, 1, 0, 0, -119.441, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.243, 0, 0, 0, 0, 1, 0, 0, -119.441, 0, 1); + } + 6.46% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.895, 0, 0, 0, 0, 1, 0, 0, -62.014, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.895, 0, 0, 0, 0, 1, 0, 0, -62.014, 0, 1); + } + 8.11% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.817, 0, 0, 0, 0, 1, 0, 0, -31.647, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.817, 0, 0, 0, 0, 1, 0, 0, -31.647, 0, 1); + } + 8.61% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.813, 0, 0, 0, 0, 1, 0, 0, -24.472, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.813, 0, 0, 0, 0, 1, 0, 0, -24.472, 0, 1); + } + 12.11% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 1, 0, 0, 5.53, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.9, 0, 0, 0, 0, 1, 0, 0, 5.53, 0, 1); + } + 14.16% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.959, 0, 0, 0, 0, 1, 0, 0, 11.62, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.959, 0, 0, 0, 0, 1, 0, 0, 11.62, 0, 1); + } + 16.12% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, 0, 13.007, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.994, 0, 0, 0, 0, 1, 0, 0, 13.007, 0, 1); + } + 19.72% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1.012, 0, 0, 0, 0, 1, 0, 0, 10.247, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1.012, 0, 0, 0, 0, 1, 0, 0, 10.247, 0, 1); + } + 27.23% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 2.352, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 2.352, 0, 1); + } + 30.83% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 0.999, 0, 0, 0, 0, 1, 0, 0, 0.585, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 0.999, 0, 0, 0, 0, 1, 0, 0, 0.585, 0, 1); + } + 38.34% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.311, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.311, 0, 1); + } + 41.99% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.244, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.244, 0, 1); + } + 50% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.048, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -0.048, 0, 1); + } + 60.56% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0.007, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0.007, 0, 1); + } + 82.78% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } + 100% { + -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); + } } .ns-effect-slide-center.ns-hide { - -webkit-animation-name: animSlideCenter; - animation-name: animSlideCenter; - -webkit-animation-duration: 0.25s; - animation-duration: 0.25s; + -webkit-animation-name: animSlideCenter; + animation-name: animSlideCenter; + -webkit-animation-duration: 0.25s; + animation-duration: 0.25s; } @-webkit-keyframes animSlideCenter { - 0% { -webkit-transform: translate3d(0,-30px,0) translate3d(0,-100%,0); } - 100% { -webkit-transform: translate3d(0,0,0); } + 0% { -webkit-transform: translate3d(0, -30px, 0) translate3d(0, -100%, 0); } + 100% { -webkit-transform: translate3d(0, 0, 0); } } @keyframes animSlideCenter { - 0% { -webkit-transform: translate3d(0,-30px,0) translate3d(0,-100%,0); transform: translate3d(0,-30px,0) translate3d(0,-100%,0); } - 100% { -webkit-transform: translate3d(0,0,0); transform: translate3d(0,0,0); } + 0% { + -webkit-transform: translate3d(0, -30px, 0) translate3d(0, -100%, 0); + transform: translate3d(0, -30px, 0) translate3d(0, -100%, 0); + } + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } } -/* Fly up */ - .ns-effect-genie.ns-show, .ns-effect-genie.ns-hide { - -webkit-animation-name: animGenie; - animation-name: animGenie; - -webkit-animation-duration: 0.4s; - animation-duration: 0.4s; + -webkit-animation-name: animGenie; + animation-name: animGenie; + -webkit-animation-duration: 0.4s; + animation-duration: 0.4s; } @-webkit-keyframes animGenie { - 0% { opacity:0; -webkit-transform: translate3d(0,calc(200% + 30px),0) scale3d(0,1,1); -webkit-animation-timing-function: ease-in; } - 40% { opacity:0.5; -webkit-transform: translate3d(0,0,0) scale3d(0.02,1.1,1); -webkit-animation-timing-function: ease-out; } - 70% { opacity:0.6; -webkit-transform: translate3d(0,-40px,0) scale3d(0.8,1.1,1); } - 100% { opacity:1; -webkit-transform: translate3d(0,0,0) scale3d(1,1,1); } + 0% { + opacity: 0; + -webkit-transform: translate3d(0, calc(200% + 30px), 0) scale3d(0, 1, 1); + -webkit-animation-timing-function: ease-in; + } + + 40% { + opacity: 0.5; + -webkit-transform: translate3d(0, 0, 0) scale3d(0.02, 1.1, 1); + -webkit-animation-timing-function: ease-out; + } + + 70% { + opacity: 0.6; + -webkit-transform: translate3d(0, -40px, 0) scale3d(0.8, 1.1, 1); + } + + 100% { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); + } } @keyframes animGenie { - 0% { opacity:0; -webkit-transform: translate3d(0,calc(200% + 30px),0) scale3d(0,1,1); -webkit-animation-timing-function: ease-in; transform: translate3d(0,calc(200% + 30px),0) scale3d(0,1,1); animation-timing-function: ease-in; } - 40% { opacity:0.5; -webkit-transform: translate3d(0,0,0) scale3d(0.02,1.1,1); -webkit-animation-timing-function: ease-out; transform: translate3d(0,0,0) scale3d(0.02,1.1,1); animation-timing-function: ease-out; } - 70% { opacity:0.6; -webkit-transform: translate3d(0,-40px,0) scale3d(0.8,1.1,1); transform: translate3d(0,-40px,0) scale3d(0.8,1.1,1); } - 100% { opacity:1; -webkit-transform: translate3d(0,0,0) scale3d(1,1,1); transform: translate3d(0,0,0) scale3d(1,1,1); } -} \ No newline at end of file + 0% { + opacity: 0; + -webkit-transform: translate3d(0, calc(200% + 30px), 0) scale3d(0, 1, 1); + -webkit-animation-timing-function: ease-in; + transform: translate3d(0, calc(200% + 30px), 0) scale3d(0, 1, 1); + animation-timing-function: ease-in; + } + + 40% { + opacity: 0.5; + -webkit-transform: translate3d(0, 0, 0) scale3d(0.02, 1.1, 1); + -webkit-animation-timing-function: ease-out; + transform: translate3d(0, 0, 0) scale3d(0.02, 1.1, 1); + animation-timing-function: ease-out; + } + + 70% { + opacity: 0.6; + -webkit-transform: translate3d(0, -40px, 0) scale3d(0.8, 1.1, 1); + transform: translate3d(0, -40px, 0) scale3d(0.8, 1.1, 1); + } + + 100% { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); + transform: translate3d(0, 0, 0) scale3d(1, 1, 1); + } +} diff --git a/modules/default/calendar/calendar.css b/modules/default/calendar/calendar.css index a292a707..26b1e93d 100644 --- a/modules/default/calendar/calendar.css +++ b/modules/default/calendar/calendar.css @@ -1,23 +1,22 @@ .calendar .symbol { - padding-left: 0px; - padding-right: 10px; - font-size: 80%; + padding-left: 0; + padding-right: 10px; + font-size: 80%; } .calendar .symbol span { - display: inline-block; - - -ms-transform: translate(0px,2px); /* IE 9 */ - -webkit-transform: translate(0px,2px); /* Safari */ - transform: translate(0px,2px); + display: inline-block; + -ms-transform: translate(0, 2px); /* IE 9 */ + -webkit-transform: translate(0, 2px); /* Safari */ + transform: translate(0, 2px); } .calendar .title { - padding-left: 0px; - padding-right: 0px; + padding-left: 0; + padding-right: 0; } .calendar .time { - padding-left: 30px; - text-align: right; + padding-left: 30px; + text-align: right; } diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index a9c54022..253ea708 100644 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -7,55 +7,55 @@ * MIT Licensed. */ -Module.register('calendar',{ +Module.register("calendar",{ // Define module defaults defaults: { maximumEntries: 10, // Total Maximum Entries maximumNumberOfDays: 365, displaySymbol: true, - defaultSymbol: 'calendar', // Fontawsome Symbol see http://fontawesome.io/cheatsheet/ + defaultSymbol: "calendar", // Fontawsome Symbol see http://fontawesome.io/cheatsheet/ maxTitleLength: 25, fetchInterval: 5 * 60 * 1000, // Update every 5 minutes. animationSpeed: 2000, fade: true, fadePoint: 0.25, // Start on 1/4th of the list. - calendars: [ + calendars: [ { - symbol: 'calendar', - url: 'http://www.calendarlabs.com/templates/ical/US-Holidays.ics', + symbol: "calendar", + url: "http://www.calendarlabs.com/templates/ical/US-Holidays.ics", }, ], titleReplace: { - 'De verjaardag van ' : '' + "De verjaardag van ": "" }, - loadingText: 'Loading events …', - emptyCalendarText: 'No upcoming events.', + loadingText: "Loading events …", + emptyCalendarText: "No upcoming events.", // TODO: It would be nice if there is a way to get this from the Moment.js locale. - todayText: 'Today' + todayText: "Today" }, // Define required scripts. getStyles: function() { - return ['calendar.css', 'font-awesome.css']; + return ["calendar.css", "font-awesome.css"]; }, // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Override start method. start: function() { - Log.log('Starting module: ' + this.name); + Log.log("Starting module: " + this.name); // Set locale. moment.locale(config.language); for (var c in this.config.calendars) { var calendar = this.config.calendars[c]; - calendar.url = calendar.url.replace('webcal://', 'http://'); + calendar.url = calendar.url.replace("webcal://", "http://"); this.addCalendar(calendar.url); } @@ -65,17 +65,17 @@ Module.register('calendar',{ // Override socket notification handler. socketNotificationReceived: function(notification, payload) { - if (notification === 'CALENDAR_EVENTS') { + if (notification === "CALENDAR_EVENTS") { if (this.hasCalendarURL(payload.url)) { this.calendarData[payload.url] = payload.events; this.loaded = true; } - } else if(notification === 'FETCH_ERROR') { - Log.error('Calendar Error. Could not fetch calendar: ' + payload.url); - } else if(notification === 'INCORRECT_URL') { - Log.error('Calendar Error. Incorrect url: ' + payload.url); + } else if (notification === "FETCH_ERROR") { + Log.error("Calendar Error. Could not fetch calendar: " + payload.url); + } else if (notification === "INCORRECT_URL") { + Log.error("Calendar Error. Incorrect url: " + payload.url); } else { - Log.log('Calendar received an unknown socket notification: '+notification); + Log.log("Calendar received an unknown socket notification: " + notification); } this.updateDom(this.config.animationSpeed); @@ -115,7 +115,7 @@ Module.register('calendar',{ eventWrapper.appendChild(titleWrapper); var timeWrapper = document.createElement("td"); - timeWrapper.innerHTML = (event.today) ? this.config.todayText : moment(event.startDate,'x').fromNow(); + timeWrapper.innerHTML = (event.today) ? this.config.todayText : moment(event.startDate,"x").fromNow(); // timeWrapper.innerHTML = moment(event.startDate,'x').format('lll'); timeWrapper.className = "time light"; eventWrapper.appendChild(timeWrapper); @@ -164,7 +164,7 @@ Module.register('calendar',{ */ createEventList: function() { var events = []; - var today = moment().startOf('day'); + var today = moment().startOf("day"); for (var c in this.calendarData) { var calendar = this.calendarData[c]; for (var e in calendar) { @@ -175,7 +175,7 @@ Module.register('calendar',{ } } - events.sort(function(a,b) { + events.sort(function(a, b) { return a.startDate - b.startDate; }); @@ -188,7 +188,7 @@ Module.register('calendar',{ * argument url sting - Url to add. */ addCalendar: function(url) { - this.sendSocketNotification('ADD_CALENDAR', { + this.sendSocketNotification("ADD_CALENDAR", { url: url, maximumEntries: this.config.maximumEntries, maximumNumberOfDays: this.config.maximumNumberOfDays, @@ -206,7 +206,7 @@ Module.register('calendar',{ symbolForUrl: function(url) { for (var c in this.config.calendars) { var calendar = this.config.calendars[c]; - if (calendar.url === url && typeof calendar.symbol === 'string') { + if (calendar.url === url && typeof calendar.symbol === "string") { return calendar.symbol; } } diff --git a/modules/default/calendar/node_helper.js b/modules/default/calendar/node_helper.js index 215f60ee..89df6ec5 100644 --- a/modules/default/calendar/node_helper.js +++ b/modules/default/calendar/node_helper.js @@ -5,10 +5,10 @@ * MIT Licensed. */ -var NodeHelper = require('node_helper'); -var ical = require('ical'); -var moment = require('moment'); -var validUrl = require('valid-url'); +var NodeHelper = require("node_helper"); +var ical = require("ical"); +var moment = require("moment"); +var validUrl = require("valid-url"); var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumberOfDays) { var self = this; @@ -27,7 +27,6 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe clearTimeout(reloadTimer); reloadTimer = null; - ical.fromURL(url, {}, function(err, data) { if (err) { fetchFailedCallback(self, err); @@ -38,66 +37,65 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe //console.log(data); newEvents = []; - var limitFunction = function (date, i){return i < maximumEntries;}; + var limitFunction = function(date, i) {return i < maximumEntries;}; for (var e in data) { var event = data[e]; var now = new Date(); - var today = moment().startOf('day'); + var today = moment().startOf("day"); //console.log(event); - // FIXME: + // FIXME: // Ugly fix to solve the facebook birthday issue. // Otherwise, the recurring events only show the birthday for next year. var isFacebookBirthday = false; - if (typeof event.uid !== 'undefined') { - if (event.uid.indexOf('@facebook.com') !== -1) { + if (typeof event.uid !== "undefined") { + if (event.uid.indexOf("@facebook.com") !== -1) { isFacebookBirthday = true; } } - if (event.type === 'VEVENT') { - var startDate = (event.start.length === 8) ? moment(event.start, 'YYYYMMDD') : moment(new Date(event.start)); + if (event.type === "VEVENT") { + var startDate = (event.start.length === 8) ? moment(event.start, "YYYYMMDD") : moment(new Date(event.start)); if (event.start.length === 8) { - startDate = startDate.startOf('day'); + startDate = startDate.startOf("day"); } - if (typeof event.rrule != 'undefined' && !isFacebookBirthday) { + if (typeof event.rrule != "undefined" && !isFacebookBirthday) { var rule = event.rrule; // Check if the timeset is set to this current time. // If so, the RRULE line does not contain any BYHOUR, BYMINUTE, BYSECOND params. // This causes the times of the recurring event to be incorrect. // By adjusting the timeset property, this issue is solved. - if (rule.timeset[0].hour == now.getHours(), rule.timeset[0].minute == now.getMinutes(), rule.timeset[0].second == now.getSeconds()) { - rule.timeset[0].hour = startDate.format('H'); - rule.timeset[0].minute = startDate.format('m'); - rule.timeset[0].second = startDate.format('s'); + rule.timeset[0].hour = startDate.format("H"); + rule.timeset[0].minute = startDate.format("m"); + rule.timeset[0].second = startDate.format("s"); } - var dates = rule.between(today, today.add(maximumNumberOfDays, 'days') , true, limitFunction); - console.log(dates); + var dates = rule.between(today, today.add(maximumNumberOfDays, "days") , true, limitFunction); + //console.log(dates); for (var d in dates) { startDate = moment(new Date(dates[d])); newEvents.push({ - title: (typeof event.summary.val !== 'undefined') ? event.summary.val : event.summary, - startDate: startDate.format('x'), + title: (typeof event.summary.val !== "undefined") ? event.summary.val : event.summary, + startDate: startDate.format("x"), fullDayEvent: (event.start.length === 8) - + }); } } else { // Single event. - if (startDate >= today && startDate <= today.add(maximumNumberOfDays, 'days')) { + if (startDate >= today && startDate <= today.add(maximumNumberOfDays, "days")) { newEvents.push({ - title: (typeof event.summary.val !== 'undefined') ? event.summary.val : event.summary, - startDate: startDate.format('x'), + title: (typeof event.summary.val !== "undefined") ? event.summary.val : event.summary, + startDate: startDate.format("x"), fullDayEvent: (event.start.length === 8) }); } @@ -105,7 +103,7 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe } } - newEvents.sort(function(a,b) { + newEvents.sort(function(a, b) { return a.startDate - b.startDate; }); @@ -190,14 +188,13 @@ module.exports = NodeHelper.create({ this.fetchers = []; - console.log('Starting node helper for: ' + this.name); - + console.log("Starting node helper for: " + this.name); }, // Override socketNotificationReceived method. socketNotificationReceived: function(notification, payload) { - if (notification === 'ADD_CALENDAR') { + if (notification === "ADD_CALENDAR") { //console.log('ADD_CALENDAR: '); this.createFetcher(payload.url, payload.fetchInterval, payload.maximumEntries, payload.maximumNumberOfDays); } @@ -214,28 +211,28 @@ module.exports = NodeHelper.create({ createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays) { var self = this; - if (!validUrl.isUri(url)){ - self.sendSocketNotification('INCORRECT_URL', {url:url}); + if (!validUrl.isUri(url)) { + self.sendSocketNotification("INCORRECT_URL", {url: url}); return; } var fetcher; - if (typeof self.fetchers[url] === 'undefined') { - console.log('Create new calendar fetcher for url: ' + url + ' - Interval: ' + fetchInterval); + if (typeof self.fetchers[url] === "undefined") { + console.log("Create new calendar fetcher for url: " + url + " - Interval: " + fetchInterval); fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays); fetcher.onReceive(function(fetcher) { //console.log('Broadcast events.'); //console.log(fetcher.events()); - self.sendSocketNotification('CALENDAR_EVENTS', { + self.sendSocketNotification("CALENDAR_EVENTS", { url: fetcher.url(), events: fetcher.events() }); }); fetcher.onError(function(fetcher, error) { - self.sendSocketNotification('FETCH_ERROR', { + self.sendSocketNotification("FETCH_ERROR", { url: fetcher.url(), error: error }); diff --git a/modules/default/clock/clock.js b/modules/default/clock/clock.js index b71f4313..3acdf53d 100644 --- a/modules/default/clock/clock.js +++ b/modules/default/clock/clock.js @@ -7,7 +7,7 @@ * MIT Licensed. */ -Module.register('clock',{ +Module.register("clock",{ // Module config defaults. defaults: { @@ -17,12 +17,12 @@ Module.register('clock',{ // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Define start sequence. start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); // Schedule update interval. var self = this; @@ -34,7 +34,6 @@ Module.register('clock',{ moment.locale(config.language); }, - // Override dom generator. getDom: function() { // Create wrappers. @@ -49,9 +48,9 @@ Module.register('clock',{ secondsWrapper.className = "dimmed"; // Set content of wrappers. - dateWrapper.innerHTML = moment().format('dddd, LL'); - timeWrapper.innerHTML = moment().format((this.config.timeFormat === 24) ? 'HH:mm' : ('hh:mm')); - secondsWrapper.innerHTML = moment().format('ss'); + dateWrapper.innerHTML = moment().format("dddd, LL"); + timeWrapper.innerHTML = moment().format((this.config.timeFormat === 24) ? "HH:mm" : ("hh:mm")); + secondsWrapper.innerHTML = moment().format("ss"); // Combine wrappers. wrapper.appendChild(dateWrapper); diff --git a/modules/default/compliments/compliments.js b/modules/default/compliments/compliments.js index d018680d..61f9ec5f 100644 --- a/modules/default/compliments/compliments.js +++ b/modules/default/compliments/compliments.js @@ -7,26 +7,26 @@ * MIT Licensed. */ -Module.register('compliments',{ +Module.register("compliments",{ // Module config defaults. defaults: { compliments: { morning: [ - 'Good morning, handsome!', - 'Enjoy your day!', - 'How was your sleep?' - ], - afternoon: [ - 'Hello, beauty!', - 'You look sexy!', - 'Looking good today!' - ], - evening: [ - 'Wow, you look hot!', - 'You look nice!', - 'Hi, sexy!' - ] + "Good morning, handsome!", + "Enjoy your day!", + "How was your sleep?" + ], + afternoon: [ + "Hello, beauty!", + "You look sexy!", + "Looking good today!" + ], + evening: [ + "Wow, you look hot!", + "You look nice!", + "Hi, sexy!" + ] }, updateInterval: 30000, fadeSpeed: 4000 @@ -34,12 +34,12 @@ Module.register('compliments',{ // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Define start sequence. start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); this.lastComplimentIndex = -1; @@ -50,7 +50,6 @@ Module.register('compliments',{ }, this.config.updateInterval); }, - /* randomIndex(compliments) * Generate a random index for a list of compliments. * @@ -113,7 +112,7 @@ Module.register('compliments',{ var compliment = document.createTextNode(complimentText); var wrapper = document.createElement("div"); - wrapper.className = 'thin xlarge bright'; + wrapper.className = "thin xlarge bright"; wrapper.appendChild(compliment); return wrapper; diff --git a/modules/default/currentweather/currentweather.css b/modules/default/currentweather/currentweather.css index cf0649dc..9e9d9ed3 100644 --- a/modules/default/currentweather/currentweather.css +++ b/modules/default/currentweather/currentweather.css @@ -1,9 +1,8 @@ .currentweather .weathericon { - font-size: 75%; - line-height: 65px; - display: inline-block; - - -ms-transform: translate(0px,-3px); /* IE 9 */ - -webkit-transform: translate(0px,-3px); /* Safari */ - transform: translate(0px,-3px); + font-size: 75%; + line-height: 65px; + display: inline-block; + -ms-transform: translate(0, -3px); /* IE 9 */ + -webkit-transform: translate(0, -3px); /* Safari */ + transform: translate(0, -3px); } diff --git a/modules/default/currentweather/currentweather.js b/modules/default/currentweather/currentweather.js index 17b23bce..103a1d78 100644 --- a/modules/default/currentweather/currentweather.js +++ b/modules/default/currentweather/currentweather.js @@ -7,61 +7,60 @@ * MIT Licensed. */ -Module.register('currentweather',{ +Module.register("currentweather",{ // Default module config. defaults: { - location: '', - appid: '', - units: 'metric', - updateInterval: 10 * 60 * 1000, // every 10 minutes - animationSpeed: 1000, - timeFormat: config.timeFormat, + location: "", + appid: "", + units: "metric", + updateInterval: 10 * 60 * 1000, // every 10 minutes + animationSpeed: 1000, + timeFormat: config.timeFormat, lang: config.language, initialLoadDelay: 0, // 0 seconds delay retryDelay: 2500, - apiVersion: '2.5', - apiBase: 'http://api.openweathermap.org/data/', - weatherEndpoint: 'weather', + apiVersion: "2.5", + apiBase: "http://api.openweathermap.org/data/", + weatherEndpoint: "weather", iconTable: { - '01d':'wi-day-sunny', - '02d':'wi-day-cloudy', - '03d':'wi-cloudy', - '04d':'wi-cloudy-windy', - '09d':'wi-showers', - '10d':'wi-rain', - '11d':'wi-thunderstorm', - '13d':'wi-snow', - '50d':'wi-fog', - '01n':'wi-night-clear', - '02n':'wi-night-cloudy', - '03n':'wi-night-cloudy', - '04n':'wi-night-cloudy', - '09n':'wi-night-showers', - '10n':'wi-night-rain', - '11n':'wi-night-thunderstorm', - '13n':'wi-night-snow', - '50n':'wi-night-alt-cloudy-windy' + "01d": "wi-day-sunny", + "02d": "wi-day-cloudy", + "03d": "wi-cloudy", + "04d": "wi-cloudy-windy", + "09d": "wi-showers", + "10d": "wi-rain", + "11d": "wi-thunderstorm", + "13d": "wi-snow", + "50d": "wi-fog", + "01n": "wi-night-clear", + "02n": "wi-night-cloudy", + "03n": "wi-night-cloudy", + "04n": "wi-night-cloudy", + "09n": "wi-night-showers", + "10n": "wi-night-rain", + "11n": "wi-night-thunderstorm", + "13n": "wi-night-snow", + "50n": "wi-night-alt-cloudy-windy" }, }, // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Define required scripts. getStyles: function() { - return ['weather-icons.css', 'currentweather.css']; + return ["weather-icons.css", "currentweather.css"]; }, - // Define start sequence. start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); // Set locale. moment.locale(config.language); @@ -83,13 +82,13 @@ Module.register('currentweather',{ getDom: function() { var wrapper = document.createElement("div"); - if (this.config.appid === '') { + if (this.config.appid === "") { wrapper.innerHTML = "Please set the correct openweather appid in the config for module: " + this.name + "."; wrapper.className = "dimmed light small"; return wrapper; } - if (this.config.location === '') { + if (this.config.location === "") { wrapper.innerHTML = "Please set the openweather location in the config for module: " + this.name + "."; wrapper.className = "dimmed light small"; return wrapper; @@ -101,7 +100,6 @@ Module.register('currentweather',{ return wrapper; } - var small = document.createElement("div"); small.className = "normal medium"; @@ -134,7 +132,7 @@ Module.register('currentweather',{ var temperature = document.createElement("span"); temperature.className = "bright"; - temperature.innerHTML = " " + this.temperature + '°'; + temperature.innerHTML = " " + this.temperature + "°"; large.appendChild(temperature); wrapper.appendChild(small); @@ -142,36 +140,35 @@ Module.register('currentweather',{ return wrapper; }, - /* updateWeather(compliments) * Requests new data from openweather.org. * Calls processWeather on succesfull response. */ updateWeather: function() { - var url = this.config.apiBase + this.config.apiVersion + '/' + this.config.weatherEndpoint + this.getParams(); + var url = this.config.apiBase + this.config.apiVersion + "/" + this.config.weatherEndpoint + this.getParams(); var self = this; var retry = true; var weatherRequest = new XMLHttpRequest(); weatherRequest.open("GET", url, true); weatherRequest.onreadystatechange = function() { - if(this.readyState === 4) { - if(this.status === 200) { - self.processWeather(JSON.parse(this.response)); - } else if (this.status === 401) { - self.config.appid = ''; - self.updateDom(self.config.animationSpeed); + if (this.readyState === 4) { + if (this.status === 200) { + self.processWeather(JSON.parse(this.response)); + } else if (this.status === 401) { + self.config.appid = ""; + self.updateDom(self.config.animationSpeed); - Log.error(self.name + ": Incorrect APPID."); - retry = false; - } else { - Log.error(self.name + ": Could not load weather."); - } + Log.error(self.name + ": Incorrect APPID."); + retry = false; + } else { + Log.error(self.name + ": Could not load weather."); + } - if (retry) { - self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay); + if (retry) { + self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay); + } } - } }; weatherRequest.send(); }, @@ -183,10 +180,10 @@ Module.register('currentweather',{ */ getParams: function() { var params = "?"; - params += 'q=' + this.config.location; - params += '&units=' + this.config.units; - params += '&lang=' + this.config.lang; - params += '&APPID=' + this.config.appid; + params += "q=" + this.config.location; + params += "&units=" + this.config.units; + params += "&lang=" + this.config.lang; + params += "&APPID=" + this.config.appid; return params; }, @@ -201,19 +198,16 @@ Module.register('currentweather',{ this.windSpeed = this.ms2Beaufort(this.roundValue(data.wind.speed)); this.weatherType = this.config.iconTable[data.weather[0].icon]; - - - var now = moment().format('x'); - var sunrise = moment(data.sys.sunrise*1000).format('x'); - var sunset = moment(data.sys.sunset*1000).format('x'); - + var now = moment().format("x"); + var sunrise = moment(data.sys.sunrise * 1000).format("x"); + var sunset = moment(data.sys.sunset * 1000).format("x"); if (sunrise < now && sunset > now) { - this.sunriseSunsetTime = moment(data.sys.sunset*1000).format((this.config.timeFormat === 24) ? 'HH:mm' : 'hh:mm a'); - this.sunriseSunsetIcon = 'wi-sunset'; + this.sunriseSunsetTime = moment(data.sys.sunset * 1000).format((this.config.timeFormat === 24) ? "HH:mm" : "hh:mm a"); + this.sunriseSunsetIcon = "wi-sunset"; } else { - this.sunriseSunsetTime = moment(data.sys.sunrise*1000).format((this.config.timeFormat === 24) ? 'HH:mm' : 'hh:mm a'); - this.sunriseSunsetIcon = 'wi-sunrise'; + this.sunriseSunsetTime = moment(data.sys.sunrise * 1000).format((this.config.timeFormat === 24) ? "HH:mm" : "hh:mm a"); + this.sunriseSunsetIcon = "wi-sunrise"; } @@ -228,7 +222,7 @@ Module.register('currentweather',{ */ scheduleUpdate: function(delay) { var nextLoad = this.config.updateInterval; - if (typeof delay !== 'undefined' && delay >= 0) { + if (typeof delay !== "undefined" && delay >= 0) { nextLoad = delay; } @@ -264,7 +258,7 @@ Module.register('currentweather',{ * * return number - Rounded Temperature. */ - roundValue: function (temperature) { + roundValue: function(temperature) { return parseFloat(temperature).toFixed(1); } }); diff --git a/modules/default/defaultmodules.js b/modules/default/defaultmodules.js index 8545dd9a..42e89ee0 100644 --- a/modules/default/defaultmodules.js +++ b/modules/default/defaultmodules.js @@ -8,16 +8,15 @@ // Modules listed below can be loaded without the 'default/' prefix. Omitting the default folder name. var defaultModules = [ - 'alert', - 'calendar', - 'clock', - 'compliments', - 'currentweather', - 'helloworld', - 'newsfeed', - 'weatherforecast' + "alert", + "calendar", + "clock", + "compliments", + "currentweather", + "helloworld", + "newsfeed", + "weatherforecast" ]; - /*************** DO NOT EDIT THE LINE BELOW ***************/ -if (typeof module !== 'undefined') {module.exports = defaultModules;} +if (typeof module !== "undefined") {module.exports = defaultModules;} diff --git a/modules/default/helloworld/README.md b/modules/default/helloworld/README.md index dfbddeb1..d97726db 100644 --- a/modules/default/helloworld/README.md +++ b/modules/default/helloworld/README.md @@ -38,14 +38,5 @@ The following properties can be configured:
Default value: 'Hello world!' - - classes - Classes to apply to the text.
-
Example: 'xsmall bold' -
Default value: 'normal medium' - - - - diff --git a/modules/default/helloworld/helloworld.js b/modules/default/helloworld/helloworld.js index 4dc51eaf..bdd5356b 100644 --- a/modules/default/helloworld/helloworld.js +++ b/modules/default/helloworld/helloworld.js @@ -7,20 +7,17 @@ * MIT Licensed. */ -Module.register('helloworld',{ +Module.register("helloworld",{ // Default module config. defaults: { - text: "Hello World!", - classes: "normal medium" + text: "Hello World!" }, // Override dom generator. getDom: function() { var wrapper = document.createElement("div"); - wrapper.className = this.config.classes; wrapper.innerHTML = this.config.text; - return wrapper; } }); diff --git a/modules/default/newsfeed/README.md b/modules/default/newsfeed/README.md index eaaf2032..ae6ee061 100644 --- a/modules/default/newsfeed/README.md +++ b/modules/default/newsfeed/README.md @@ -44,8 +44,15 @@ The following properties can be configured: showPublishDate Display the publish date of an headline.
+
Possible values: true or false
Default value: true -
Default value: true or false + + + + showDescription + Display the description of an item.
+
Possible values: true or false +
Default value: false @@ -60,7 +67,7 @@ The following properties can be configured: updateInterval How often do you want to display a new headline? (Milliseconds)

Possible values:1000 - 60000 -
Default value: 7500 (7.5 seconds) +
Default value: 10000 (10 seconds) diff --git a/modules/default/newsfeed/fetcher.js b/modules/default/newsfeed/fetcher.js index 427d198f..32081457 100644 --- a/modules/default/newsfeed/fetcher.js +++ b/modules/default/newsfeed/fetcher.js @@ -5,7 +5,9 @@ * MIT Licensed. */ -var NewsFetcher = require('./newsfetcher.js'); +var FeedMe = require("feedme"); +var request = require("request"); +var iconv = require("iconv-lite"); /* Fetcher * Responsible for requesting an update on the set interval and broadcasting the data. @@ -16,7 +18,6 @@ var NewsFetcher = require('./newsfetcher.js'); var Fetcher = function(url, reloadInterval, encoding) { var self = this; - var newsFetcher = new NewsFetcher(); if (reloadInterval < 1000) { reloadInterval = 1000; } @@ -30,21 +31,40 @@ var Fetcher = function(url, reloadInterval, encoding) { /* private methods */ /* fetchNews() - * Request the new items from the newsFetcher. + * Request the new items. */ var fetchNews = function() { - //console.log('Fetch news.'); clearTimeout(reloadTimer); reloadTimer = null; - newsFetcher.fetchNews(url, function(fetchedItems) { - items = fetchedItems; + items = []; + + var parser = new FeedMe(); + + parser.on("item", function(item) { + var description = item.description || ''; + var regex = /(<([^>]+)>)/ig; + description = description.replace(regex, ""); + + items.push({ + title: item.title, + description: description, + pubdate: item.pubdate, + }); + }); + + parser.on("end", function() { self.broadcastItems(); scheduleTimer(); - }, function(error) { + }); + + parser.on("error", function(error) { fetchFailedCallback(self, error); scheduleTimer(); - }, encoding); + }); + + request({uri: url, encoding: null}).pipe(iconv.decodeStream(encoding)).pipe(parser); + }; /* scheduleTimer() diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index b643a000..ef0073e6 100644 --- a/modules/default/newsfeed/newsfeed.js +++ b/modules/default/newsfeed/newsfeed.js @@ -7,26 +7,27 @@ * MIT Licensed. */ -Module.register('newsfeed',{ +Module.register("newsfeed",{ // Default module config. defaults: { - feedUrl: 'http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml', + feedUrl: "http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml", showPublishDate: true, + showDescription: false, reloadInterval: 5 * 60 * 1000, // every 5 minutes - updateInterval: 7.5 * 1000, - animationSpeed: 2.5 * 1000, - encoding: 'UTF-8' //ISO-8859-1 + updateInterval: 10 * 1000, + animationSpeed: 2.5 * 1000, + encoding: "UTF-8" //ISO-8859-1 }, // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Define start sequence. start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); // Set locale. moment.locale(config.language); @@ -41,7 +42,7 @@ Module.register('newsfeed',{ // Override socket notification handler. socketNotificationReceived: function(notification, payload) { - if (notification === 'NEWS_ITEMS') { + if (notification === "NEWS_ITEMS") { if (payload.url === this.config.feedUrl) { this.newsItems = payload.items; if (!this.loaded) { @@ -73,7 +74,7 @@ Module.register('newsfeed',{ if (this.config.showPublishDate) { var timestamp = document.createElement("div"); timestamp.className = "light small dimmed"; - timestamp.innerHTML = this.capitalizeFirstLetter(moment(new Date(this.newsItems[this.activeItem].pubdate)).fromNow() + ':'); + timestamp.innerHTML = this.capitalizeFirstLetter(moment(new Date(this.newsItems[this.activeItem].pubdate)).fromNow() + ":"); //timestamp.innerHTML = this.config.feedUrl; wrapper.appendChild(timestamp); } @@ -83,6 +84,13 @@ Module.register('newsfeed',{ title.innerHTML = this.newsItems[this.activeItem].title; wrapper.appendChild(title); + if (this.config.showDescription) { + var description = document.createElement("div"); + description.className = "small light"; + description.innerHTML = this.newsItems[this.activeItem].description; + wrapper.appendChild(description); + } + } else { wrapper.innerHTML = "Loading news ..."; wrapper.className = "small dimmed"; @@ -95,8 +103,8 @@ Module.register('newsfeed',{ * Requests new data from news proxy. */ fetchNews: function() { - Log.log('Add news feed to fetcher: ' + this.config.feedUrl); - this.sendSocketNotification('ADD_FEED', { + Log.log("Add news feed to fetcher: " + this.config.feedUrl); + this.sendSocketNotification("ADD_FEED", { url: this.config.feedUrl, reloadInterval: this.config.reloadInterval, encoding: this.config.encoding @@ -125,6 +133,6 @@ Module.register('newsfeed',{ * return string - Capitalized output string. */ capitalizeFirstLetter: function(string) { - return string.charAt(0).toUpperCase() + string.slice(1); + return string.charAt(0).toUpperCase() + string.slice(1); } }); diff --git a/modules/default/newsfeed/newsfetcher.js b/modules/default/newsfeed/newsfetcher.js deleted file mode 100644 index 145e4cb0..00000000 --- a/modules/default/newsfeed/newsfetcher.js +++ /dev/null @@ -1,53 +0,0 @@ -/* Magic Mirror - * NewsFetcher - * - * By Michael Teeuw http://michaelteeuw.nl - * MIT Licensed. - */ - -var FeedMe = require('feedme'); -var request = require('request'); -var iconv = require('iconv-lite'); - -var NewsFetcher = function() { - var self = this; - - self.successCallback = function(){}; - self.errorCallback = function(){}; - - self.items = []; - - var parser = new FeedMe(); - - parser.on('item', function(item) { - self.items.push({ - title: item.title, - pubdate: item.pubdate, - }); - }); - - parser.on('end', function(item) { - self.successCallback(self.items); - }); - - parser.on('error', function(error) { - self.errorCallback(error); - }); - - /* public methods */ - - /* fetchNews() - * Fetch the new news items. - * - * attribute url string - The url to fetch. - * attribute success function(items) - Callback on succes. - * attribute error function(error) - Callback on error. - */ - self.fetchNews = function(url, success, error, encoding) { - self.successCallback = success; - self.errorCallback = error; - request({uri:url, encoding:null}).pipe(iconv.decodeStream(encoding)).pipe(parser); - }; -}; - -module.exports = NewsFetcher; diff --git a/modules/default/newsfeed/node_helper.js b/modules/default/newsfeed/node_helper.js index 12328607..4233ead3 100644 --- a/modules/default/newsfeed/node_helper.js +++ b/modules/default/newsfeed/node_helper.js @@ -5,21 +5,21 @@ * MIT Licensed. */ -var NodeHelper = require('node_helper'); -var validUrl = require('valid-url'); -var Fetcher = require('./fetcher.js'); +var NodeHelper = require("node_helper"); +var validUrl = require("valid-url"); +var Fetcher = require("./fetcher.js"); module.exports = NodeHelper.create({ // Subclass start method. start: function() { - console.log('Starting module: ' + this.name); + console.log("Starting module: " + this.name); this.fetchers = []; }, // Subclass socketNotificationReceived received. socketNotificationReceived: function(notification, payload) { - if(notification === 'ADD_FEED') { + if (notification === "ADD_FEED") { this.createFetcher(payload.url, payload.reloadInterval, payload.encoding); } }, @@ -35,25 +35,25 @@ module.exports = NodeHelper.create({ createFetcher: function(url, reloadInterval, encoding) { var self = this; - if (!validUrl.isUri(url)){ - self.sendSocketNotification('INCORRECT_URL', url); + if (!validUrl.isUri(url)) { + self.sendSocketNotification("INCORRECT_URL", url); return; } var fetcher; - if (typeof self.fetchers[url] === 'undefined') { - console.log('Create new news fetcher for url: ' + url + ' - Interval: ' + reloadInterval); + if (typeof self.fetchers[url] === "undefined") { + console.log("Create new news fetcher for url: " + url + " - Interval: " + reloadInterval); fetcher = new Fetcher(url, reloadInterval, encoding); fetcher.onReceive(function(fetcher) { - self.sendSocketNotification('NEWS_ITEMS', { + self.sendSocketNotification("NEWS_ITEMS", { url: fetcher.url(), items: fetcher.items() }); }); fetcher.onError(function(fetcher, error) { - self.sendSocketNotification('FETCH_ERROR', { + self.sendSocketNotification("FETCH_ERROR", { url: fetcher.url(), error: error }); @@ -61,7 +61,7 @@ module.exports = NodeHelper.create({ self.fetchers[url] = fetcher; } else { - console.log('Use exsisting news fetcher for url: ' + url); + console.log("Use exsisting news fetcher for url: " + url); fetcher = self.fetchers[url]; fetcher.setReloadInterval(reloadInterval); fetcher.broadcastItems(); diff --git a/modules/default/weatherforecast/weatherforecast.css b/modules/default/weatherforecast/weatherforecast.css index 6c511d11..7b12c42d 100644 --- a/modules/default/weatherforecast/weatherforecast.css +++ b/modules/default/weatherforecast/weatherforecast.css @@ -1,14 +1,14 @@ .weatherforecast .day { - padding-left: 0px; - padding-right: 25px; + padding-left: 0; + padding-right: 25px; } .weatherforecast .weather-icon { - padding-right: 30px; - text-align: center; + padding-right: 30px; + text-align: center; } .weatherforecast .min-temp { - padding-left: 20px; - padding-right: 0px; + padding-left: 20px; + padding-right: 0; } diff --git a/modules/default/weatherforecast/weatherforecast.js b/modules/default/weatherforecast/weatherforecast.js index d000680b..ff7c4190 100644 --- a/modules/default/weatherforecast/weatherforecast.js +++ b/modules/default/weatherforecast/weatherforecast.js @@ -7,16 +7,16 @@ * MIT Licensed. */ -Module.register('weatherforecast',{ +Module.register("weatherforecast",{ // Default module config. defaults: { - location: '', - appid: '', - units: 'metric', - updateInterval: 10 * 60 * 1000, // every 10 minutes - animationSpeed: 1000, - timeFormat: config.timeFormat, + location: "", + appid: "", + units: "metric", + updateInterval: 10 * 60 * 1000, // every 10 minutes + animationSpeed: 1000, + timeFormat: config.timeFormat, lang: config.language, fade: true, fadePoint: 0.25, // Start on 1/4th of the list. @@ -24,46 +24,45 @@ Module.register('weatherforecast',{ initialLoadDelay: 2500, // 2.5 seconds delay. This delay is used to keep the OpenWeather API happy. retryDelay: 2500, - apiVersion: '2.5', - apiBase: 'http://api.openweathermap.org/data/', - forecastEndpoint: 'forecast/daily', + apiVersion: "2.5", + apiBase: "http://api.openweathermap.org/data/", + forecastEndpoint: "forecast/daily", iconTable: { - '01d':'wi-day-sunny', - '02d':'wi-day-cloudy', - '03d':'wi-cloudy', - '04d':'wi-cloudy-windy', - '09d':'wi-showers', - '10d':'wi-rain', - '11d':'wi-thunderstorm', - '13d':'wi-snow', - '50d':'wi-fog', - '01n':'wi-night-clear', - '02n':'wi-night-cloudy', - '03n':'wi-night-cloudy', - '04n':'wi-night-cloudy', - '09n':'wi-night-showers', - '10n':'wi-night-rain', - '11n':'wi-night-thunderstorm', - '13n':'wi-night-snow', - '50n':'wi-night-alt-cloudy-windy' + "01d": "wi-day-sunny", + "02d": "wi-day-cloudy", + "03d": "wi-cloudy", + "04d": "wi-cloudy-windy", + "09d": "wi-showers", + "10d": "wi-rain", + "11d": "wi-thunderstorm", + "13d": "wi-snow", + "50d": "wi-fog", + "01n": "wi-night-clear", + "02n": "wi-night-cloudy", + "03n": "wi-night-cloudy", + "04n": "wi-night-cloudy", + "09n": "wi-night-showers", + "10n": "wi-night-rain", + "11n": "wi-night-thunderstorm", + "13n": "wi-night-snow", + "50n": "wi-night-alt-cloudy-windy" }, }, // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Define required scripts. getStyles: function() { - return ['weather-icons.css', 'weatherforecast.css']; + return ["weather-icons.css", "weatherforecast.css"]; }, - // Define start sequence. start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); // Set locale. moment.locale(config.language); @@ -80,13 +79,13 @@ Module.register('weatherforecast',{ getDom: function() { var wrapper = document.createElement("div"); - if (this.config.appid === '') { + if (this.config.appid === "") { wrapper.innerHTML = "Please set the correct openweather appid in the config for module: " + this.name + "."; wrapper.className = "dimmed light small"; return wrapper; } - if (this.config.location === '') { + if (this.config.location === "") { wrapper.innerHTML = "Please set the openweather location in the config for module: " + this.name + "."; wrapper.className = "dimmed light small"; return wrapper; @@ -98,7 +97,6 @@ Module.register('weatherforecast',{ return wrapper; } - var table = document.createElement("table"); table.className = "small"; @@ -109,7 +107,7 @@ Module.register('weatherforecast',{ table.appendChild(row); var dayCell = document.createElement("td"); - dayCell.className = 'day'; + dayCell.className = "day"; dayCell.innerHTML = forecast.day; row.appendChild(dayCell); @@ -123,15 +121,14 @@ Module.register('weatherforecast',{ var maxTempCell = document.createElement("td"); maxTempCell.innerHTML = forecast.maxTemp; - maxTempCell.className = 'align-right bright max-temp'; + maxTempCell.className = "align-right bright max-temp"; row.appendChild(maxTempCell); var minTempCell = document.createElement("td"); minTempCell.innerHTML = forecast.minTemp; - minTempCell.className = 'align-right min-temp'; + minTempCell.className = "align-right min-temp"; row.appendChild(minTempCell); - if (this.config.fade && this.config.fadePoint < 1) { if (this.config.fadePoint < 0) { this.config.fadePoint = 0; @@ -144,45 +141,40 @@ Module.register('weatherforecast',{ } } - - } - - return table; }, - /* updateWeather(compliments) * Requests new data from openweather.org. * Calls processWeather on succesfull response. */ updateWeather: function() { - var url = this.config.apiBase + this.config.apiVersion + '/' + this.config.forecastEndpoint + this.getParams(); + var url = this.config.apiBase + this.config.apiVersion + "/" + this.config.forecastEndpoint + this.getParams(); var self = this; var retry = true; var weatherRequest = new XMLHttpRequest(); weatherRequest.open("GET", url, true); weatherRequest.onreadystatechange = function() { - if(this.readyState === 4) { - if(this.status === 200) { - self.processWeather(JSON.parse(this.response)); - } else if (this.status === 401) { - self.config.appid = ''; - self.updateDom(self.config.animationSpeed); + if (this.readyState === 4) { + if (this.status === 200) { + self.processWeather(JSON.parse(this.response)); + } else if (this.status === 401) { + self.config.appid = ""; + self.updateDom(self.config.animationSpeed); - Log.error(self.name + ": Incorrect APPID."); - retry = false; - } else { - Log.error(self.name + ": Could not load weather."); - } + Log.error(self.name + ": Incorrect APPID."); + retry = false; + } else { + Log.error(self.name + ": Could not load weather."); + } - if (retry) { - self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay); + if (retry) { + self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay); + } } - } }; weatherRequest.send(); }, @@ -194,10 +186,10 @@ Module.register('weatherforecast',{ */ getParams: function() { var params = "?"; - params += 'q=' + this.config.location; - params += '&units=' + this.config.units; - params += '&lang=' + this.config.lang; - params += '&APPID=' + this.config.appid; + params += "q=" + this.config.location; + params += "&units=" + this.config.units; + params += "&lang=" + this.config.lang; + params += "&APPID=" + this.config.appid; return params; }, @@ -215,7 +207,7 @@ Module.register('weatherforecast',{ var forecast = data.list[i]; this.forecast.push({ - day: moment(forecast.dt, 'X').format('ddd.'), + day: moment(forecast.dt, "X").format("ddd"), icon: this.config.iconTable[forecast.weather[0].icon], maxTemp: this.roundValue(forecast.temp.max), minTemp: this.roundValue(forecast.temp.min) @@ -236,7 +228,7 @@ Module.register('weatherforecast',{ */ scheduleUpdate: function(delay) { var nextLoad = this.config.updateInterval; - if (typeof delay !== 'undefined' && delay >= 0) { + if (typeof delay !== "undefined" && delay >= 0) { nextLoad = delay; } @@ -273,7 +265,7 @@ Module.register('weatherforecast',{ * * return number - Rounded Temperature. */ - roundValue: function (temperature) { + roundValue: function(temperature) { return parseFloat(temperature).toFixed(1); } }); diff --git a/modules/node_modules/node_helper/index.js b/modules/node_modules/node_helper/index.js index 4bc7130e..dc57ef36 100644 --- a/modules/node_modules/node_helper/index.js +++ b/modules/node_modules/node_helper/index.js @@ -5,15 +5,17 @@ * MIT Licensed. */ -var Class = require('../../../js/class.js'); +var Class = require("../../../js/class.js"); +var express = require("express"); +var path = require("path"); NodeHelper = Class.extend({ init: function() { - console.log('Initializing new module helper ...'); + console.log("Initializing new module helper ..."); }, start: function() { - console.log('Staring module helper: ' + this.name); + console.log("Staring module helper: " + this.name); }, /* socketNotificationReceived(notification, payload) @@ -23,10 +25,10 @@ NodeHelper = Class.extend({ * argument payload mixed - The payload of the notification. */ socketNotificationReceived: function(notification, payload) { - console.log(this.name + ' received a socket notification: ' + notification + ' - Payload: ' + payload); + console.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload); }, - /* setName(data) + /* setName(name) * Set the module name. * * argument name string - Module name. @@ -35,6 +37,15 @@ NodeHelper = Class.extend({ this.name = name; }, + /* setPath(path) + * Set the module path. + * + * argument name string - Module name. + */ + setPath: function(path) { + this.path = path; + }, + /* sendSocketNotification(notification, payload) * Send a socket notification to the node helper. * @@ -45,6 +56,19 @@ NodeHelper = Class.extend({ this.io.of(this.name).emit(notification, payload); }, + /* setExpressApp(app) + * Sets the express app object for this module. + * This allows you to host files from the created webserver. + * + * argument app Express app - The Express app object. + */ + setExpressApp: function(app) { + this.expressApp = app; + + var publicPath = this.path + "/public"; + app.use("/" + this.name, express.static(publicPath)); + }, + /* setSocketIO(io) * Sets the socket io object for this module. * Binds message receiver. @@ -55,21 +79,21 @@ NodeHelper = Class.extend({ var self = this; self.io = io; - console.log('Connecting socket for: ' + this.name); + console.log("Connecting socket for: " + this.name); var namespace = this.name; - io.of(namespace).on('connection', function (socket) { + io.of(namespace).on("connection", function(socket) { // add a catch all event. var onevent = socket.onevent; - socket.onevent = function (packet) { + socket.onevent = function(packet) { var args = packet.data || []; - onevent.call (this, packet); // original call + onevent.call(this, packet); // original call packet.data = ["*"].concat(args); onevent.call(this, packet); // additional call to catch-all }; // register catch all. - socket.on('*', function (notification, payload) { - if (notification !== '*') + socket.on("*", function(notification, payload) { + if (notification !== "*") //console.log('received message in namespace: ' + namespace); self.socketNotificationReceived(notification, payload); }); @@ -82,4 +106,4 @@ NodeHelper.create = function(moduleDefinition) { return NodeHelper.extend(moduleDefinition); }; -module.exports = NodeHelper; \ No newline at end of file +module.exports = NodeHelper; diff --git a/old_version/README.md b/old_version/README.md deleted file mode 100644 index 5a721fee..00000000 --- a/old_version/README.md +++ /dev/null @@ -1,52 +0,0 @@ -MagicMirror -=========== - -##Introduction - -The super magic interface of my personal Magic Mirror. More information about this project can be found on my [blog](http://michaelteeuw.nl/tagged/magicmirror). - -Runs as a php script on a web server with basically no external dependencies. *Can use socket.io for XBEE integration, but isn't required for basic functionality*. - - -##Configuration - -Modify `js/config.js` to change some general variables (language, weather location, compliments, news feed RSS and to add your own ICS calendar) - -To use the OpenWeatherMap API, you'll need a free API key. Checkout [this blogpost](http://michaelteeuw.nl/post/131504229357/what-happened-to-the-weather) for more information. - -##Code - -###[main.js](js/main.js) - -This file initiates the separate pieces of functionality that will appear in the view. It also includes various utility functions that are used to update what is visible. - -###[Calendar](js/calendar) - -Parsing functionality for the calendar that retrieves and updates the calendar based on the interval set at the top of the [calendar.js](js/calendar/calendar.js) file. This was actually a straight pull from the original main.js file but the parsing code may deserve an upgrade. - -###[Compliments](js/compliments) - -Functionality related to inserting compliments into the view and rotating them based on a specific interval set at the top of the [compliments.js](js/compliments/compliments.js) file. - -###[News](js/news) - -Takes an array of news feeds (or a single string) from the config file and retrieves each one so that it can be displayed in a loop based on the interval set at the top of the [news.js](js/news/news.js) file. - -###[Time](js/time) - -Updates the time on the screen on one second interval. - -###[Version](js/version) - -Checks the git version and refreshes if a new version has been pulled. - -###[Weather](js/weather) - -Takes the user's inserted location, language, unit type, and OpenWeatherMap API key and grabs the five day weather forecast from OpenWeatherMap. You need to set the API key in the config for this to work. (See *configuration*.) - -##Extensions - -###[MagicMirror-Extensions by PaViRo](https://github.com/paviro/MagicMirror-Extensions) - -**Current features:** FRITZ!Box Callmonitor
-**Future features:** Faceregognition, personalized views, online banking through HBCI and multiple calenders based on faceregognition. \ No newline at end of file diff --git a/old_version/controllers/calendar.php b/old_version/controllers/calendar.php deleted file mode 100644 index 65f6fa8a..00000000 --- a/old_version/controllers/calendar.php +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/old_version/controllers/functions/gzip.php b/old_version/controllers/functions/gzip.php deleted file mode 100644 index ee7b4518..00000000 --- a/old_version/controllers/functions/gzip.php +++ /dev/null @@ -1,42 +0,0 @@ - array( - "method" => "GET", - "header" => "Accept-Language: en-US,en;q=0.8rn" . "Accept-Encoding: gzip,deflate,sdchrn" . "Accept-Charset:UTF-8,*;q=0.5rn" . "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 FirePHP/0.4rn", - "ignore_errors" => true - ), - /* - * @array - * Put a Band-Aid over some SSL issues. - */ - "ssl" => array( - "verify_peer" => false, - "verify_peer_name" => false - ) - ); - $context = stream_context_create($opts); - $content = file_get_contents($url, false, $context); - /* - * @note If http response header mentions that content is gzipped, then uncompress it. - */ - foreach($http_response_header as $c => $h) { - if(stristr($h, "content-encoding") and stristr($h, "gzip")) { - /* - * @note Now, let's begin the actual purpose of this function: - */ - $content = gzinflate(substr($content, 10, -8)); - } - } - return $content; - } -?> diff --git a/old_version/controllers/hash.php b/old_version/controllers/hash.php deleted file mode 100644 index dca1e80e..00000000 --- a/old_version/controllers/hash.php +++ /dev/null @@ -1,7 +0,0 @@ - trim(`git rev-parse HEAD`) - ) - ); -?> diff --git a/old_version/css/main.css b/old_version/css/main.css deleted file mode 100644 index 86a00c83..00000000 --- a/old_version/css/main.css +++ /dev/null @@ -1,224 +0,0 @@ -body, -html { - background: #000; - padding: 0px; - margin: 0px; - width: 100%; - height: 100%; - font-family: "HelveticaNeue-Light", sans-serif; - letter-spacing: -2px; - color: #fff; - font-size: 75px; - -webkit-font-smoothing: antialiased; - text-rendering: geometricprecision; -} - -.wi { - line-height: 75px; -} - -.top { - position: absolute; - top: 50px; -} - -.left { - position: absolute; - left: 50px; -} - -.right { - position: absolute; - right: 50px; - text-align: right; -} - -.center-ver { - position: absolute; - top: 50%; - height: 200px; - margin-top: -100px; - line-height: 100px; -} - -.lower-third { - position: absolute; - top: 66.666%; - height: 200px; - margin-top: -100px; - line-height: 100px; -} - -.center-hor { - position: absolute; - right: 50px; - left: 50px; - text-align: center; -} - -.bottom { - position: absolute; - bottom: 50px; -} - -.xxsmall, -.xsmall, -.small { - font-family: "HelveticaNeue-Medium", sans-serif; - letter-spacing: 0; -} - -.xxsmall { - font-size: 15px; -} - -.xxsmall .wi { - line-height: 15px; -} - -.xsmall { - font-size: 20px; -} - -.xsmall .wi { - line-height: 20px; -} - -.small { - font-size: 25px; -} - -.small .wi { - line-height: 25px; -} - -.medium { - font-size: 35px; - letter-spacing: -1px; - font-family: "HelveticaNeue-Light", sans-serif; -} - -.medium .wi { - line-height: 35px; -} - -.xdimmed { - color: #666; -} - -.dimmed { - color: #aaa; -} - -.light { - font-family: "HelveticaNeue-UltraLight", sans-serif; -} - -.icon { - position: relative; - top: -10px; - display: inline-block; - font-size: 45px; - padding-right: 5px; - font-weight: 100; - margin-right: 10px; -} - -.icon-small { - position: relative; - display: inline-block; - font-size: 20px; - padding-left: 10px; - padding-right: -10px; - font-weight: 100; -} - -.time .sec { - font-size: 25px; - color: #666; - padding-left: 5px; - position: relative; - top: -35px; -} - -.forecast-table { - float: right; - text-align: right; - font-size: 20px; - line-height: 20px; -} - -.forecast-table .day, -.forecast-table .temp-min, -.forecast-table .temp-max { - width: 50px; - text-align: right; -} - -.forecast-table .temp-max { - width: 60px; -} - -.forecast-table .day { - color: #999; -} - -.calendar-table { - font-size: 14px; - line-height: 20px; - margin-top: 10px; -} - -.calendar-table .days { - padding-left: 20px; - text-align: right; -} - -.dishwasher { - background-color: white; - color: black; - margin: 0 200px; - font-size: 60px; - border-radius: 1000px; - border-radius: 1200px; - display: none; -} - -@font-face { - font-family: 'HelveticaNeue-UltraLight'; - src: url('font/HelveticaNeue-UltraLight.eot'); - /* IE9 Compat Modes */ - src: url('font/HelveticaNeue-UltraLight.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('font/HelveticaNeue-UltraLight.woff') format('woff'), /* Modern Browsers */ - url('font/HelveticaNeue-UltraLight.ttf') format('truetype'), /* Safari, Android, iOS */ - url('font/HelveticaNeue-UltraLight.svg#9453ea8da727d260bcdbfa605bdbb5d2') format('svg'); - /* Legacy iOS */ - font-style: normal; - font-weight: 100; -} - -@font-face { - font-family: 'HelveticaNeue-Medium'; - src: url('font/HelveticaNeue-Medium.eot'); - /* IE9 Compat Modes */ - src: url('font/HelveticaNeue-Medium.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('font/HelveticaNeue-Medium.woff') format('woff'), /* Modern Browsers */ - url('font/HelveticaNeue-Medium.ttf') format('truetype'), /* Safari, Android, iOS */ - url('font/HelveticaNeue-Medium.svg#d7af0fd9278f330eed98b60dddea7bd6') format('svg'); - /* Legacy iOS */ - font-style: normal; - font-weight: 400; -} - -@font-face { - font-family: 'HelveticaNeue-Light'; - src: url('font/HelveticaNeue-Light.eot'); - /* IE9 Compat Modes */ - src: url('font/HelveticaNeue-Light.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('font/HelveticaNeue-Light.woff') format('woff'), /* Modern Browsers */ - url('font/HelveticaNeue-Light.ttf') format('truetype'), /* Safari, Android, iOS */ - url('font/HelveticaNeue-Light.svg#7384ecabcada72f0e077cd45d8e1c705') format('svg'); - /* Legacy iOS */ - font-style: normal; - font-weight: 200; -} \ No newline at end of file diff --git a/old_version/css/weather-icons.css b/old_version/css/weather-icons.css deleted file mode 100755 index 2fc851d9..00000000 --- a/old_version/css/weather-icons.css +++ /dev/null @@ -1,327 +0,0 @@ -/*! - * Weather Icons Beta 1 - * Weather themed icons for Bootstrap - * ------------------------------------------------------------------------------ - * Maintained at http://erikflowers.github.io/weather-icons - * http://twitter.com/Erik_UX - * - * License - * ------------------------------------------------------------------------------ - * - Fpmt licensed under SIL OFL 1.1 - - * http://scripts.sil.org/OFL - * - CSS and LESS are licensed under MIT License - - * http://opensource.org/licenses/mit-license.html - * - Documentation licensed under CC BY 3.0 - - * http://creativecommons.org/licenses/by/3.0/ - * - Inspired by and works great as a companion with Font Aweosme - * "Font Awesome by Dave Gandy - http://fontawesome.io" - * - * Weather Icons Bootstrap Package Author - Erik Flowers - erik@helloerik.com - * Weather Icons gives full credit for inspiration to Font Awesome and makes no - * claim to invention, intellectual property, or ownership of methodology. - * - * Support Open Source! - * - * ------------------------------------------------------------------------------ - * Email: erik@helloerik.com - * Twitter: http://twitter.com/Erik_UX - */ -@font-face { - font-family: 'weather'; - src: url('../font/weathericons-regular-webfont.eot'); - src: url('../font/weathericons-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../font/weathericons-regular-webfont.woff') format('woff'), url('../font/weathericons-regular-webfont.ttf') format('truetype'), url('../font/weathericons-regular-webfont.svg#weathericons-regular-webfontRg') format('svg'); - font-weight: normal; - font-style: normal; -} -[class^="wi-"], -[class*=" wi-"] { - font-family: weather; - font-weight: normal; - font-style: normal; - text-decoration: inherit; - text-transform: none; - -webkit-font-smoothing: antialiased; - *margin-right: .3em; -} -[class^="wi-"]:before, -[class*=" wi-"]:before { - text-decoration: inherit; - display: inline-block; - speak: none; -} -.wi-day-cloudy-gusts:before { - content: "\f000"; -} -.wi-day-cloudy-windy:before { - content: "\f001"; -} -.wi-day-cloudy:before { - content: "\f002"; -} -.wi-day-fog:before { - content: "\f003"; -} -.wi-day-hail:before { - content: "\f004"; -} -.wi-day-lightning:before { - content: "\f005"; -} -.wi-day-rain-mix:before { - content: "\f006"; -} -.wi-day-rain-wind:before { - content: "\f007"; -} -.wi-day-rain:before { - content: "\f008"; -} -.wi-day-showers:before { - content: "\f009"; -} -.wi-day-snow:before { - content: "\f00a"; -} -.wi-day-sprinkle:before { - content: "\f00b"; -} -.wi-day-sunny-overcast:before { - content: "\f00c"; -} -.wi-day-sunny:before { - content: "\f00d"; -} -.wi-day-storm-showers:before { - content: "\f00e"; -} -.wi-day-thunderstorm:before { - content: "\f010"; -} -.wi-cloudy-gusts:before { - content: "\f011"; -} -.wi-cloudy-windy:before { - content: "\f012"; -} -.wi-cloudy:before { - content: "\f013"; -} -.wi-fog:before { - content: "\f014"; -} -.wi-hail:before { - content: "\f015"; -} -.wi-lightning:before { - content: "\f016"; -} -.wi-rain-mix:before { - content: "\f017"; -} -.wi-rain-wind:before { - content: "\f018"; -} -.wi-rain:before { - content: "\f019"; -} -.wi-showers:before { - content: "\f01a"; -} -.wi-snow:before { - content: "\f01b"; -} -.wi-sprinkle:before { - content: "\f01c"; -} -.wi-storm-showers:before { - content: "\f01d"; -} -.wi-thunderstorm:before { - content: "\f01e"; -} -.wi-windy:before { - content: "\f021"; -} -.wi-night-alt-cloudy-gusts:before { - content: "\f022"; -} -.wi-night-alt-cloudy-windy:before { - content: "\f023"; -} -.wi-night-alt-hail:before { - content: "\f024"; -} -.wi-night-alt-lightning:before { - content: "\f025"; -} -.wi-night-alt-rain-mix:before { - content: "\f026"; -} -.wi-night-alt-rain-wind:before { - content: "\f027"; -} -.wi-night-alt-rain:before { - content: "\f028"; -} -.wi-night-alt-showers:before { - content: "\f029"; -} -.wi-night-alt-snow:before { - content: "\f02a"; -} -.wi-night-alt-sprinkle:before { - content: "\f02b"; -} -.wi-night-alt-storm-showers:before { - content: "\f02c"; -} -.wi-night-alt-thunderstorm:before { - content: "\f02d"; -} -.wi-night-clear:before { - content: "\f02e"; -} -.wi-night-cloudy-gusts:before { - content: "\f02f"; -} -.wi-night-cloudy-windy:before { - content: "\f030"; -} -.wi-night-cloudy:before { - content: "\f031"; -} -.wi-night-hail:before { - content: "\f032"; -} -.wi-night-lightning:before { - content: "\f033"; -} -.wi-night-rain-mix:before { - content: "\f034"; -} -.wi-night-rain-wind:before { - content: "\f035"; -} -.wi-night-rain:before { - content: "\f036"; -} -.wi-night-showers:before { - content: "\f037"; -} -.wi-night-snow:before { - content: "\f038"; -} -.wi-night-sprinkle:before { - content: "\f039"; -} -.wi-night-storm-showers:before { - content: "\f03a"; -} -.wi-night-thunderstorm:before { - content: "\f03b"; -} -.wi-celcius:before { - content: "\f03c"; -} -.wi-cloud-down:before { - content: "\f03d"; -} -.wi-cloud-refresh:before { - content: "\f03e"; -} -.wi-cloud-up:before { - content: "\f040"; -} -.wi-cloud:before { - content: "\f041"; -} -.wi-degrees:before { - content: "\f042"; -} -.wi-down-left:before { - content: "\f043"; -} -.wi-down:before { - content: "\f044"; -} -.wi-fahrenheit:before { - content: "\f045"; -} -.wi-horizon-alt:before { - content: "\f046"; -} -.wi-horizon:before { - content: "\f047"; -} -.wi-left:before { - content: "\f048"; -} -.wi-lightning:before { - content: "\f016"; -} -.wi-night-fog:before { - content: "\f04a"; -} -.wi-refresh-alt:before { - content: "\f04b"; -} -.wi-refresh:before { - content: "\f04c"; -} -.wi-right:before { - content: "\f04d"; -} -.wi-sprinkles:before { - content: "\f04e"; -} -.wi-strong-wind:before { - content: "\f050"; -} -.wi-sunrise:before { - content: "\f051"; -} -.wi-sunset:before { - content: "\f052"; -} -.wi-thermometer-exterior:before { - content: "\f053"; -} -.wi-thermometer-internal:before { - content: "\f054"; -} -.wi-thermometer:before { - content: "\f055"; -} -.wi-tornado:before { - content: "\f056"; -} -.wi-up-right:before { - content: "\f057"; -} -.wi-up:before { - content: "\f058"; -} -.wi-wind-east:before { - content: "\f059"; -} -.wi-wind-north-east:before { - content: "\f05a"; -} -.wi-wind-north-west:before { - content: "\f05b"; -} -.wi-wind-north:before { - content: "\f05c"; -} -.wi-wind-south-east:before { - content: "\f05d"; -} -.wi-wind-south-west:before { - content: "\f05e"; -} -.wi-wind-south:before { - content: "\f060"; -} -.wi-wind-west:before { - content: "\f061"; -} diff --git a/old_version/font/HelveticaNeue-Light.eot b/old_version/font/HelveticaNeue-Light.eot deleted file mode 100644 index e14f235f..00000000 Binary files a/old_version/font/HelveticaNeue-Light.eot and /dev/null differ diff --git a/old_version/font/HelveticaNeue-Light.svg b/old_version/font/HelveticaNeue-Light.svg deleted file mode 100644 index f1b5b0dd..00000000 --- a/old_version/font/HelveticaNeue-Light.svg +++ /dev/null @@ -1,2938 +0,0 @@ - - - - -Created by FontPrep 20130207 at Tue Feb 25 16:00:33 2014 - By Michael Teeuw -Copyright (c) 1981, 1982, 1983, 1989 and 1993, Linotype Library GmbH or its affiliated Linotype-Hell companies. All rights reserved. - -The digitally encoded machine readable software for producing the Typefaces licensed to you is now the property of Heidelberger Druckmaschinen AG and its licensors, and may not be reproduced, used, displayed, modified, disclosed or transferred without the express written approval of Heidelberger Druckmaschinen AG. - -Copyright (c) 1988, 1990, 1993 Adobe Systems Incorporated. All Rights Reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/old_version/font/HelveticaNeue-Light.ttf b/old_version/font/HelveticaNeue-Light.ttf deleted file mode 100644 index 2ddea173..00000000 Binary files a/old_version/font/HelveticaNeue-Light.ttf and /dev/null differ diff --git a/old_version/font/HelveticaNeue-Light.woff b/old_version/font/HelveticaNeue-Light.woff deleted file mode 100644 index 29c1e858..00000000 Binary files a/old_version/font/HelveticaNeue-Light.woff and /dev/null differ diff --git a/old_version/font/HelveticaNeue-Medium.eot b/old_version/font/HelveticaNeue-Medium.eot deleted file mode 100644 index 9ea7378f..00000000 Binary files a/old_version/font/HelveticaNeue-Medium.eot and /dev/null differ diff --git a/old_version/font/HelveticaNeue-Medium.svg b/old_version/font/HelveticaNeue-Medium.svg deleted file mode 100644 index 6e73185f..00000000 --- a/old_version/font/HelveticaNeue-Medium.svg +++ /dev/null @@ -1,4040 +0,0 @@ - - - - -Created by FontPrep 20130207 at Tue Feb 25 15:57:41 2014 - By Michael Teeuw -Part of the digitally encoded machine readable outline data for producing the Typefaces provided is copyrighted (c) 2003 - 2006 Linotype GmbH, www.linotype.com. All rights reserved. This software is the property of Linotype GmbH, and may not be reproduced, modified, disclosed or transferred without the express written approval of Linotype GmbH. Copyright (c) 1988, 1990, 1993 Adobe Systems Incorporated. All Rights Reserved. Helvetica is a trademark of Heidelberger Druckmaschinen AG, exclusively licensed through Linotype GmbH, and may be registered in certain jurisdictions. This typeface is original artwork of Linotype Design Studio. The design may be protected in certain jurisdictions. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/old_version/font/HelveticaNeue-Medium.ttf b/old_version/font/HelveticaNeue-Medium.ttf deleted file mode 100644 index be07dfd7..00000000 Binary files a/old_version/font/HelveticaNeue-Medium.ttf and /dev/null differ diff --git a/old_version/font/HelveticaNeue-Medium.woff b/old_version/font/HelveticaNeue-Medium.woff deleted file mode 100644 index 9eff4b21..00000000 Binary files a/old_version/font/HelveticaNeue-Medium.woff and /dev/null differ diff --git a/old_version/font/HelveticaNeue-UltraLight.eot b/old_version/font/HelveticaNeue-UltraLight.eot deleted file mode 100644 index 12c5d9ee..00000000 Binary files a/old_version/font/HelveticaNeue-UltraLight.eot and /dev/null differ diff --git a/old_version/font/HelveticaNeue-UltraLight.svg b/old_version/font/HelveticaNeue-UltraLight.svg deleted file mode 100644 index c06a02ba..00000000 --- a/old_version/font/HelveticaNeue-UltraLight.svg +++ /dev/null @@ -1,4414 +0,0 @@ - - - - -Created by FontPrep 20130207 at Tue Feb 25 16:02:04 2014 - By Michael Teeuw -Copyright (c) 1981, 1982, 1983, 1989 and 1993, Linotype Library GmbH or its affiliated Linotype-Hell companies. All rights reserved. - -The digitally encoded machine readable software for producing the Typefaces licensed to you is now the property of Heidelberger Druckmaschinen AG and its licensors, and may not be reproduced, used, displayed, modified, disclosed or transferred without the express written approval of Heidelberger Druckmaschinen AG. - -Copyright (c) 1988, 1990, 1993 Adobe Systems Incorporated. All Rights Reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/old_version/font/HelveticaNeue-UltraLight.ttf b/old_version/font/HelveticaNeue-UltraLight.ttf deleted file mode 100644 index a29ac622..00000000 Binary files a/old_version/font/HelveticaNeue-UltraLight.ttf and /dev/null differ diff --git a/old_version/font/HelveticaNeue-UltraLight.woff b/old_version/font/HelveticaNeue-UltraLight.woff deleted file mode 100644 index 1b4786a9..00000000 Binary files a/old_version/font/HelveticaNeue-UltraLight.woff and /dev/null differ diff --git a/old_version/font/weathericons-regular-webfont.eot b/old_version/font/weathericons-regular-webfont.eot deleted file mode 100755 index d9f8a717..00000000 Binary files a/old_version/font/weathericons-regular-webfont.eot and /dev/null differ diff --git a/old_version/font/weathericons-regular-webfont.svg b/old_version/font/weathericons-regular-webfont.svg deleted file mode 100755 index 9c8d899a..00000000 --- a/old_version/font/weathericons-regular-webfont.svg +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/old_version/font/weathericons-regular-webfont.ttf b/old_version/font/weathericons-regular-webfont.ttf deleted file mode 100755 index e10fbc83..00000000 Binary files a/old_version/font/weathericons-regular-webfont.ttf and /dev/null differ diff --git a/old_version/font/weathericons-regular-webfont.woff b/old_version/font/weathericons-regular-webfont.woff deleted file mode 100755 index af1d7bbf..00000000 Binary files a/old_version/font/weathericons-regular-webfont.woff and /dev/null differ diff --git a/old_version/index.php b/old_version/index.php deleted file mode 100644 index aa0c876f..00000000 --- a/old_version/index.php +++ /dev/null @@ -1,39 +0,0 @@ - - - Magic Mirror - - - - - - - - -
-
-
-
-
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/old_version/js/calendar/calendar.js b/old_version/js/calendar/calendar.js deleted file mode 100644 index 5d3f3573..00000000 --- a/old_version/js/calendar/calendar.js +++ /dev/null @@ -1,139 +0,0 @@ -var calendar = { - eventList: [], - calendarLocation: '.calendar', - updateInterval: 1000, - updateDataInterval: 60000, - fadeInterval: 1000, - intervalId: null, - dataIntervalId: null, - maximumEntries: config.calendar.maximumEntries || 10 -} - -calendar.updateData = function (callback) { - - new ical_parser("controllers/calendar.php" + "?url="+encodeURIComponent(config.calendar.url), function(cal) { - var events = cal.getEvents(); - this.eventList = []; - - for (var i in events) { - - var e = events[i]; - for (var key in e) { - var value = e[key]; - var seperator = key.search(';'); - if (seperator >= 0) { - var mainKey = key.substring(0,seperator); - var subKey = key.substring(seperator+1); - - var dt; - if (subKey == 'VALUE=DATE') { - //date - dt = new Date(value.substring(0,4), value.substring(4,6) - 1, value.substring(6,8)); - } else { - //time - dt = new Date(value.substring(0,4), value.substring(4,6) - 1, value.substring(6,8), value.substring(9,11), value.substring(11,13), value.substring(13,15)); - } - - if (mainKey == 'DTSTART') e.startDate = dt; - if (mainKey == 'DTEND') e.endDate = dt; - } - } - - if (e.startDate == undefined){ - //some old events in Gmail Calendar is "start_date" - //FIXME: problems with Gmail's TimeZone - var days = moment(e.DTSTART).diff(moment(), 'days'); - var seconds = moment(e.DTSTART).diff(moment(), 'seconds'); - var startDate = moment(e.DTSTART); - } else { - var days = moment(e.startDate).diff(moment(), 'days'); - var seconds = moment(e.startDate).diff(moment(), 'seconds'); - var startDate = moment(e.startDate); - } - - //only add fututre events, days doesn't work, we need to check seconds - if (seconds >= 0) { - if (seconds <= 60*60*5 || seconds >= 60*60*24*2) { - var time_string = moment(startDate).fromNow(); - }else { - var time_string = moment(startDate).calendar() - } - if (!e.RRULE) { - this.eventList.push({'description':e.SUMMARY,'seconds':seconds,'days':time_string}); - } - e.seconds = seconds; - } - - // Special handling for rrule events - if (e.RRULE) { - var options = new RRule.parseString(e.RRULE); - options.dtstart = e.startDate; - var rule = new RRule(options); - - var oneYear = new Date(); - oneYear.setFullYear(oneYear.getFullYear() + 1); - - var dates = rule.between(new Date(), oneYear, true, function (date, i){return i < 10}); - for (date in dates) { - var dt = new Date(dates[date]); - var days = moment(dt).diff(moment(), 'days'); - var seconds = moment(dt).diff(moment(), 'seconds'); - var startDate = moment(dt); - if (seconds >= 0) { - if (seconds <= 60*60*5 || seconds >= 60*60*24*2) { - var time_string = moment(dt).fromNow(); - } else { - var time_string = moment(dt).calendar() - } - this.eventList.push({'description':e.SUMMARY,'seconds':seconds,'days':time_string}); - } - } - } - }; - - this.eventList = this.eventList.sort(function(a,b){return a.seconds-b.seconds}); - - // Limit the number of entries. - this.eventList = this.eventList.slice(0, calendar.maximumEntries); - - if (callback !== undefined && Object.prototype.toString.call(callback) === '[object Function]') { - callback(this.eventList); - } - - }.bind(this)); - -} - -calendar.updateCalendar = function (eventList) { - - table = $('').addClass('xsmall').addClass('calendar-table'); - opacity = 1; - - for (var i in eventList) { - var e = eventList[i]; - - var row = $('').css('opacity',opacity); - row.append($('
').html(e.description).addClass('description')); - row.append($('').html(e.days).addClass('days dimmed')); - table.append(row); - - opacity -= 1 / eventList.length; - } - - $(this.calendarLocation).updateWithText(table, this.fadeInterval); - -} - -calendar.init = function () { - - this.updateData(this.updateCalendar.bind(this)); - - this.intervalId = setInterval(function () { - this.updateCalendar(this.eventList) - }.bind(this), this.updateInterval); - - this.dataIntervalId = setInterval(function () { - this.updateData(this.updateCalendar.bind(this)); - }.bind(this), this.updateDataInterval); - -} diff --git a/old_version/js/compliments/compliments.js b/old_version/js/compliments/compliments.js deleted file mode 100644 index 04953fba..00000000 --- a/old_version/js/compliments/compliments.js +++ /dev/null @@ -1,70 +0,0 @@ -var compliments = { - complimentLocation: '.compliment', - currentCompliment: '', - complimentList: { - 'morning': config.compliments.morning, - 'afternoon': config.compliments.afternoon, - 'evening': config.compliments.evening - }, - updateInterval: config.compliments.interval || 30000, - fadeInterval: config.compliments.fadeInterval || 4000, - intervalId: null -}; - -/** - * Changes the compliment visible on the screen - */ -compliments.updateCompliment = function () { - - - - var _list = []; - - var hour = moment().hour(); - - // In the followign if statement we use .slice() on the - // compliments array to make a copy by value. - // This way the original array of compliments stays in tact. - - if (hour >= 3 && hour < 12) { - // Morning compliments - _list = compliments.complimentList['morning'].slice(); - } else if (hour >= 12 && hour < 17) { - // Afternoon compliments - _list = compliments.complimentList['afternoon'].slice(); - } else if (hour >= 17 || hour < 3) { - // Evening compliments - _list = compliments.complimentList['evening'].slice(); - } else { - // Edge case in case something weird happens - // This will select a compliment from all times of day - Object.keys(compliments.complimentList).forEach(function (_curr) { - _list = _list.concat(compliments.complimentList[_curr]).slice(); - }); - } - - // Search for the location of the current compliment in the list - var _spliceIndex = _list.indexOf(compliments.currentCompliment); - - // If it exists, remove it so we don't see it again - if (_spliceIndex !== -1) { - _list.splice(_spliceIndex, 1); - } - - // Randomly select a location - var _randomIndex = Math.floor(Math.random() * _list.length); - compliments.currentCompliment = _list[_randomIndex]; - - $('.compliment').updateWithText(compliments.currentCompliment, compliments.fadeInterval); - -} - -compliments.init = function () { - - this.updateCompliment(); - - this.intervalId = setInterval(function () { - this.updateCompliment(); - }.bind(this), this.updateInterval) - -} \ No newline at end of file diff --git a/old_version/js/config.js b/old_version/js/config.js deleted file mode 100755 index 335f14dd..00000000 --- a/old_version/js/config.js +++ /dev/null @@ -1,43 +0,0 @@ -var config = { - lang: 'nl', - time: { - timeFormat: 12 - }, - weather: { - //change weather params here: - //units: metric or imperial - params: { - q: 'Baarn,Netherlands', - units: 'metric', - // if you want a different lang for the weather that what is set above, change it here - lang: 'nl', - APPID: '38f485725346a5f0fd84a3567f91f490' - } - }, - compliments: { - interval: 30000, - fadeInterval: 4000, - morning: [ - 'Good morning, handsome!', - 'Enjoy your day!', - 'How was your sleep?' - ], - afternoon: [ - 'Hello, beauty!', - 'You look sexy!', - 'Looking good today!' - ], - evening: [ - 'Wow, you look hot!', - 'You look nice!', - 'Hi, sexy!' - ] - }, - calendar: { - maximumEntries: 10, - url: "https://p01-calendarws.icloud.com/ca/subscribe/1/n6x7Farxpt7m9S8bHg1TGArSj7J6kanm_2KEoJPL5YIAk3y70FpRo4GyWwO-6QfHSY5mXtHcRGVxYZUf7U3HPDOTG5x0qYnno1Zr_VuKH2M" - }, - news: { - feed: 'http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml' - } -} diff --git a/old_version/js/ical_parser.js b/old_version/js/ical_parser.js deleted file mode 100644 index 292f670d..00000000 --- a/old_version/js/ical_parser.js +++ /dev/null @@ -1,224 +0,0 @@ -/** - * Javascript ical Parser - * Proof of concept method of reading icalendar (.ics) files with javascript. - * - * @author: Carl Saggs - * @source: https://github.com/thybag/ - * @version: 0.2 - */ -function ical_parser(feed_url, callback){ - //store of unproccesed data. - this.raw_data = null; - //Store of proccessed data. - this.events = []; - - /** - * loadFile - * Using AJAX to load the requested .ics file, passing it to the callback when completed. - * @param url URL of .ics file - * @param callback Function to call on completion. - */ - this.loadFile = function(url, callback){ - //Create request object - try {xmlhttp = window.XMLHttpRequest?new XMLHttpRequest(): new ActiveXObject("Microsoft.XMLHTTP");} catch (e) { } - //Grab file - xmlhttp.onreadystatechange = function(){ - if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) { - //On success, run callback. - callback(xmlhttp.responseText); - } - } - xmlhttp.open("GET", url, true); - xmlhttp.send(null); - } - - /** - * makeDate - * Convert the dateformat used by ICalendar in to one more suitable for javascript. - * @param String ical_date - * @return dt object, includes javascript Date + day name, hour/minutes/day/month/year etc. - */ - this.makeDate = function(ical_date){ - //break date apart - var dtutc = { - year: ical_date.substr(0,4), - month: ical_date.substr(4,2), - day: ical_date.substr(6,2), - hour: ical_date.substr(9,2), - minute: ical_date.substr(11,2) - } - //Create JS date (months start at 0 in JS - don't ask) - var utcdatems = Date.UTC(dtutc.year, (dtutc.month-1), dtutc.day, dtutc.hour, dtutc.minute); - var dt = {}; - dt.date = new Date(utcdatems); - - dt.year = dt.date.getFullYear(); - dt.month = ('0' + (dt.date.getMonth()+1)).slice(-2); - dt.day = ('0' + dt.date.getDate()).slice(-2); - dt.hour = ('0' + dt.date.getHours()).slice(-2); - dt.minute = ('0' + dt.date.getMinutes()).slice(-2); - - //Get the full name of the given day - dt.dayname =["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][dt.date.getDay()]; - dt.monthname = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ][dt.date.getMonth()] ; - - return dt; - } - - /** - * parseICAL - * Convert the ICAL format in to a number of javascript objects (Each representing a date) - * - * @param data Raw ICAL data - */ - this.parseICAL = function(data){ - //Ensure cal is empty - this.events = []; - - //Clean string and split the file so we can handle it (line by line) - cal_array = data.replace(new RegExp( "\\r", "g" ), "").replace(/\n /g,"").split("\n"); - - //Keep track of when we are activly parsing an event - var in_event = false; - //Use as a holder for the current event being proccessed. - var cur_event = null; - for(var i=0;i') - .replace(/\\n/g,'
') - .replace(/\\,/g,','); - } - - //Add the value to our event object. - cur_event[type] = val; - } - } - //Run this to finish proccessing our Events. - this.complete(); - } - /** - * complete - * Sort all events in to a sensible order and run the original callback - */ - this.complete = function(){ - //Sort the data so its in date order. - this.events.sort(function(a,b){ - return a.DTSTART-b.DTSTART; - }); - //Run callback method, if was defined. (return self) - if(typeof callback == 'function') callback(this); - } - /** - * getEvents - * return all events found in the ical file. - * - * @return list of events objects - */ - this.getEvents = function(){ - return this.events; - } - - /** - * getFutureEvents - * return all events sheduled to take place after the current date. - * - * @return list of events objects - */ - this.getFutureEvents = function(){ - var future_events = [], current_date = new Date(); - - this.events.forEach(function(itm){ - //If the event ends after the current time, add it to the array to return. - if(itm.DTEND > current_date) future_events.push(itm); - }); - return future_events; - } - - /** - * getPastEvents - * return all events sheduled to take place before the current date. - * - * @return list of events objects - */ - this.getPastEvents = function(){ - var past_events = [], current_date = new Date(); - - this.events.forEach(function(itm){ - //If the event ended before the current time, add it to the array to return. - if(itm.DTEND <= current_date) past_events.push(itm); - }); - return past_events.reverse(); - } - - /** - * load - * load a new ICAL file. - * - * @param ical file url - */ - this.load = function(ical_file){ - var tmp_this = this; - this.raw_data = null; - this.loadFile(ical_file, function(data){ - //if the file loads, store the data and invoke the parser - tmp_this.raw_data = data; - tmp_this.parseICAL(data); - }); - } - - //Store this so we can use it in the callback from the load function. - var tmp_this = this; - //Store the feed url - this.feed_url = feed_url; - //Load the file - this.load(this.feed_url); -} diff --git a/old_version/js/jquery.feedToJSON.js b/old_version/js/jquery.feedToJSON.js deleted file mode 100755 index 7855a462..00000000 --- a/old_version/js/jquery.feedToJSON.js +++ /dev/null @@ -1,32 +0,0 @@ -//jQuery extension to fetch an rss feed and return it as json via YQL -//created by dboz@airshp.com -(function($) { - - $.extend({ - feedToJson: function(options, callback) { - if ($.isFunction(options)) { - callback = options; - options = null; - } - options = $.extend($.feedToJson.defaults,options); - var url = options.yqlURL + options.yqlQS + "'" + encodeURIComponent(options.feed) + "'" + "&_nocache=" + options.cacheBuster; - return $.getJSON(url, function(data){ - //console.log(data.query.results); - data = data.query.results; - $.isFunction(callback) && callback(data); //allows the callback function to be the only option - $.isFunction(options.success) && options.success(data); - }); - } - }); - - //defaults - $.feedToJson.defaults = { - yqlURL : 'https://query.yahooapis.com/v1/public/yql', //yql - yqlQS : '?format=json&callback=?&q=select%20*%20from%20rss%20where%20url%3D', //yql query string - feed:'http://instagr.am/tags/tacos/feed/recent.rss', //instagram recent posts tagged 'tacos' - cachebuster: Math.floor((new Date().getTime()) / 1200 / 1000), //yql caches feeds, so we change the feed url every 20min - success:null //success callback - }; - -})(jQuery); -// eo feedToJson \ No newline at end of file diff --git a/old_version/js/jquery.js b/old_version/js/jquery.js deleted file mode 100644 index cbe6abe5..00000000 --- a/old_version/js/jquery.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v2.1.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m=a.document,n="2.1.0",o=function(a,b){return new o.fn.init(a,b)},p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};o.fn=o.prototype={jquery:n,constructor:o,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=o.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return o.each(this,a,b)},map:function(a){return this.pushStack(o.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},o.extend=o.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||o.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(o.isPlainObject(d)||(e=o.isArray(d)))?(e?(e=!1,f=c&&o.isArray(c)?c:[]):f=c&&o.isPlainObject(c)?c:{},g[b]=o.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},o.extend({expando:"jQuery"+(n+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===o.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isPlainObject:function(a){if("object"!==o.type(a)||a.nodeType||o.isWindow(a))return!1;try{if(a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(b){return!1}return!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=o.trim(a),a&&(1===a.indexOf("use strict")?(b=m.createElement("script"),b.text=a,m.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":k.call(a)},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?o.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),o.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||o.guid++,f):void 0},now:Date.now,support:l}),o.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=o.type(a);return"function"===c||o.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);o.find=t,o.expr=t.selectors,o.expr[":"]=o.expr.pseudos,o.unique=t.uniqueSort,o.text=t.getText,o.isXMLDoc=t.isXML,o.contains=t.contains;var u=o.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(o.isFunction(b))return o.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return o.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return o.filter(b,a,c);b=o.filter(b,a)}return o.grep(a,function(a){return g.call(b,a)>=0!==c})}o.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?o.find.matchesSelector(d,a)?[d]:[]:o.find.matches(a,o.grep(b,function(a){return 1===a.nodeType}))},o.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(o(a).filter(function(){for(b=0;c>b;b++)if(o.contains(e[b],this))return!0}));for(b=0;c>b;b++)o.find(a,e[b],d);return d=this.pushStack(c>1?o.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?o(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=o.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof o?b[0]:b,o.merge(this,o.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:m,!0)),v.test(c[1])&&o.isPlainObject(b))for(c in b)o.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=m.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=m,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):o.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(o):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),o.makeArray(a,this))};A.prototype=o.fn,y=o(m);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};o.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&o(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),o.fn.extend({has:function(a){var b=o(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(o.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?o(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&o.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?o.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(o(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(o.unique(o.merge(this.get(),o(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}o.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return o.dir(a,"parentNode")},parentsUntil:function(a,b,c){return o.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return o.dir(a,"nextSibling")},prevAll:function(a){return o.dir(a,"previousSibling")},nextUntil:function(a,b,c){return o.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return o.dir(a,"previousSibling",c)},siblings:function(a){return o.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return o.sibling(a.firstChild)},contents:function(a){return a.contentDocument||o.merge([],a.childNodes)}},function(a,b){o.fn[a]=function(c,d){var e=o.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=o.filter(d,e)),this.length>1&&(C[a]||o.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return o.each(a.match(E)||[],function(a,c){b[c]=!0}),b}o.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):o.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){o.each(b,function(b,c){var d=o.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&o.each(arguments,function(a,b){var c;while((c=o.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?o.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},o.extend({Deferred:function(a){var b=[["resolve","done",o.Callbacks("once memory"),"resolved"],["reject","fail",o.Callbacks("once memory"),"rejected"],["notify","progress",o.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return o.Deferred(function(c){o.each(b,function(b,f){var g=o.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&o.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?o.extend(a,d):d}},e={};return d.pipe=d.then,o.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&o.isFunction(a.promise)?e:0,g=1===f?a:o.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&o.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;o.fn.ready=function(a){return o.ready.promise().done(a),this},o.extend({isReady:!1,readyWait:1,holdReady:function(a){a?o.readyWait++:o.ready(!0)},ready:function(a){(a===!0?--o.readyWait:o.isReady)||(o.isReady=!0,a!==!0&&--o.readyWait>0||(H.resolveWith(m,[o]),o.fn.trigger&&o(m).trigger("ready").off("ready")))}});function I(){m.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),o.ready()}o.ready.promise=function(b){return H||(H=o.Deferred(),"complete"===m.readyState?setTimeout(o.ready):(m.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},o.ready.promise();var J=o.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===o.type(c)){e=!0;for(h in c)o.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,o.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(o(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};o.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=o.expando+Math.random()}K.uid=1,K.accepts=o.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,o.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(o.isEmptyObject(f))o.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,o.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{o.isArray(b)?d=b.concat(b.map(o.camelCase)):(e=o.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!o.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?o.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}o.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),o.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length; -while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=o.camelCase(d.slice(5)),P(f,d,e[d]));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=o.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),o.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||o.isArray(c)?d=L.access(a,b,o.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=o.queue(a,b),d=c.length,e=c.shift(),f=o._queueHooks(a,b),g=function(){o.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:o.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),o.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";l.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return m.activeElement}catch(a){}}o.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=o.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof o!==U&&o.event.triggered!==b.type?o.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],n=q=h[1],p=(h[2]||"").split(".").sort(),n&&(l=o.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=o.event.special[n]||{},k=o.extend({type:n,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&o.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(n,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),o.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],n=q=h[1],p=(h[2]||"").split(".").sort(),n){l=o.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||o.removeEvent(a,n,r.handle),delete i[n])}else for(n in i)o.event.remove(a,n+b[j],c,d,!0);o.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,p=[d||m],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||m,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+o.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[o.expando]?b:new o.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:o.makeArray(c,[b]),n=o.event.special[q]||{},e||!n.trigger||n.trigger.apply(d,c)!==!1)){if(!e&&!n.noBubble&&!o.isWindow(d)){for(i=n.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||m)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:n.bindType||q,l=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),l&&l.apply(g,c),l=k&&g[k],l&&l.apply&&o.acceptData(g)&&(b.result=l.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||n._default&&n._default.apply(p.pop(),c)!==!1||!o.acceptData(d)||k&&o.isFunction(d[q])&&!o.isWindow(d)&&(h=d[k],h&&(d[k]=null),o.event.triggered=q,d[q](),o.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=o.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=o.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=o.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((o.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?o(e,this).index(i)>=0:o.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return o.nodeName(a,"table")&&o.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)o.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=o.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&o.nodeName(a,b)?o.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}o.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=o.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||o.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;n>m;m++)if(e=a[m],e||0===e)if("object"===o.type(e))o.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;o.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===o.inArray(e,d))&&(i=o.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f,g,h=o.event.special,i=0;void 0!==(c=a[i]);i++){if(o.acceptData(c)&&(f=c[L.expando],f&&(b=L.cache[f]))){if(d=Object.keys(b.events||{}),d.length)for(g=0;void 0!==(e=d[g]);g++)h[e]?o.event.remove(c,e):o.removeEvent(c,e,b.handle);L.cache[f]&&delete L.cache[f]}delete M.cache[c[M.expando]]}}}),o.fn.extend({text:function(a){return J(this,function(a){return void 0===a?o.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?o.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||o.cleanData(ob(c)),c.parentNode&&(b&&o.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(o.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return o.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(o.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,o.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,n=k-1,p=a[0],q=o.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(c=o.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=o.map(ob(c,"script"),kb),g=f.length;k>j;j++)h=c,j!==n&&(h=o.clone(h,!0,!0),g&&o.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,o.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&o.contains(i,h)&&(h.src?o._evalUrl&&o._evalUrl(h.src):o.globalEval(h.textContent.replace(hb,"")))}return this}}),o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){o.fn[a]=function(a){for(var c,d=[],e=o(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),o(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d=o(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:o.css(d[0],"display");return d.detach(),e}function tb(a){var b=m,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||o("